diff --git a/.changeset/README.md b/.changeset/README.md index 4f3b76b096..6c68425e59 100644 --- a/.changeset/README.md +++ b/.changeset/README.md @@ -6,3 +6,58 @@ find the full documentation for it [in our repository](https://github.com/change We have a quick list of common questions to get you started engaging with this project in [our documentation](https://github.com/changesets/changesets/blob/master/docs/common-questions.md) + +--- + +## Backstage UI Changesets + +For `@backstage/ui` changesets, use this format: + +```markdown +--- +'@backstage/ui': patch +--- + +Brief summary + +Optional description with code examples. + +**Migration:** + +Migration instructions (breaking changes only). + +**Affected components:** button, card +``` + +**Required:** + +- End with `**Affected components:**` + comma-separated component names +- For breaking changes: Add `**Migration:**` section +- No headings (`##`, `###`) inside - use bold markers + +**Examples:** + +```markdown +Fixed button hover state + +**Affected components:** button +``` + +````markdown +**BREAKING**: New Table API + +**Migration:** + +Update imports: + +```diff +- import { Table } from '@backstage/ui'; ++ import { Table, type ColumnConfig } from '@backstage/ui'; +``` +```` + +**Affected components:** table + +``` + +``` diff --git a/.changeset/afraid-rats-invent.md b/.changeset/afraid-rats-invent.md new file mode 100644 index 0000000000..0caa57d81c --- /dev/null +++ b/.changeset/afraid-rats-invent.md @@ -0,0 +1,14 @@ +--- +'@backstage/ui': patch +--- + +Added a new `FullPage` component that fills the remaining viewport height below the `Header`. + +```tsx +
+ + {/* content fills remaining height */} + +``` + +**Affected components:** FullPage diff --git a/.changeset/alert-remove-surface.md b/.changeset/alert-remove-surface.md new file mode 100644 index 0000000000..fcdd9303e5 --- /dev/null +++ b/.changeset/alert-remove-surface.md @@ -0,0 +1,14 @@ +--- +'@backstage/ui': minor +--- + +**BREAKING**: Alert no longer accepts a `surface` prop + +The Alert component's background is now driven entirely by its `status` prop. The `surface` prop has been removed. + +```diff +- ++ +``` + +**Affected components:** Alert diff --git a/.changeset/angry-hornets-clap.md b/.changeset/angry-hornets-clap.md new file mode 100644 index 0000000000..bd590e71d9 --- /dev/null +++ b/.changeset/angry-hornets-clap.md @@ -0,0 +1,30 @@ +--- +'@backstage/ui': minor +--- + +**BREAKING**: Removed gray scale tokens and renamed background surface tokens to neutral tokens + +The `--bui-gray-1` through `--bui-gray-8` tokens have been removed. The `--bui-bg-surface-*` and `--bui-bg-neutral-on-surface-*` tokens have been replaced by a unified `--bui-bg-neutral-*` scale. + +**Migration:** + +Replace surface tokens directly: + +```diff +- background: var(--bui-bg-surface-0); ++ background: var(--bui-bg-neutral-0); +``` + +Replace on-surface tokens shifted by +1: + +```diff +- background: var(--bui-bg-neutral-on-surface-0); ++ background: var(--bui-bg-neutral-1); +``` + +Replace gray tokens 1-4 with neutral equivalents (`--bui-gray-5` through `--bui-gray-8` have no direct replacement): + +```diff +- background: var(--bui-gray-1); ++ background: var(--bui-bg-neutral-1); +``` diff --git a/.changeset/api-override-conflict-error-defaults.md b/.changeset/api-override-conflict-error-defaults.md new file mode 100644 index 0000000000..703f76fb6e --- /dev/null +++ b/.changeset/api-override-conflict-error-defaults.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-defaults': minor +--- + +**BREAKING**: The `API_FACTORY_CONFLICT` warning is now treated as an error and will prevent the app from starting. diff --git a/.changeset/api-override-conflict-error.md b/.changeset/api-override-conflict-error.md new file mode 100644 index 0000000000..ed88452ccf --- /dev/null +++ b/.changeset/api-override-conflict-error.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-app-api': minor +--- + +**BREAKING**: Updated the behavior of the new API override logic to reject the override and block app startup instead of just logging a deprecation warning. diff --git a/.changeset/api-override-test-utils.md b/.changeset/api-override-test-utils.md new file mode 100644 index 0000000000..6ea60f9e1b --- /dev/null +++ b/.changeset/api-override-test-utils.md @@ -0,0 +1,41 @@ +--- +'@backstage/frontend-test-utils': patch +--- + +Added an `apis` option to `createExtensionTester`, `renderInTestApp`, and `renderTestApp` to override APIs when testing extensions. Use the `mockApis` helpers to create mock implementations: + +```typescript +import { identityApiRef } from '@backstage/frontend-plugin-api'; +import { mockApis } from '@backstage/frontend-test-utils'; + +// Override APIs in createExtensionTester +const tester = createExtensionTester(myExtension, { + apis: [ + [ + identityApiRef, + mockApis.identity({ userEntityRef: 'user:default/guest' }), + ], + ], +}); + +// Override APIs in renderInTestApp +renderInTestApp(, { + apis: [ + [ + identityApiRef, + mockApis.identity({ userEntityRef: 'user:default/guest' }), + ], + ], +}); + +// Override APIs in renderTestApp +renderTestApp({ + extensions: [myExtension], + apis: [ + [ + identityApiRef, + mockApis.identity({ userEntityRef: 'user:default/guest' }), + ], + ], +}); +``` diff --git a/.changeset/backend-process-listener-cleanup.md b/.changeset/backend-process-listener-cleanup.md new file mode 100644 index 0000000000..eb4dc52937 --- /dev/null +++ b/.changeset/backend-process-listener-cleanup.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-app-api': patch +--- + +Fixed memory leak by properly cleaning up process event listeners on backend shutdown. diff --git a/.changeset/backend-test-utils-create-service-mock.md b/.changeset/backend-test-utils-create-service-mock.md new file mode 100644 index 0000000000..b35b647fd8 --- /dev/null +++ b/.changeset/backend-test-utils-create-service-mock.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-test-utils': minor +--- + +Added `createServiceMock`, a public utility for creating `ServiceMock` instances for custom service refs. This allows plugin authors to define mock creators for their own services following the same pattern as the built-in `mockServices` mocks. diff --git a/.changeset/backend-test-utils-extension-points.md b/.changeset/backend-test-utils-extension-points.md new file mode 100644 index 0000000000..fb26a282e3 --- /dev/null +++ b/.changeset/backend-test-utils-extension-points.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-test-utils': patch +--- + +Updated `startTestBackend` to support factory-based extension points (v1.1 format) in addition to the existing direct implementation format. diff --git a/.changeset/beige-crabs-share.md b/.changeset/beige-crabs-share.md new file mode 100644 index 0000000000..6a1a42ffd8 --- /dev/null +++ b/.changeset/beige-crabs-share.md @@ -0,0 +1,5 @@ +--- +'@backstage/frontend-test-utils': minor +--- + +**BREAKING**: Removed the `TestApiRegistry` class, use `TestApiProvider` directly instead, storing reused APIs in a variable, e.g. `const apis = [...] as const`. diff --git a/.changeset/better-eggs-slide.md b/.changeset/better-eggs-slide.md new file mode 100644 index 0000000000..cf3856bb86 --- /dev/null +++ b/.changeset/better-eggs-slide.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-gitlab': patch +--- + +Allow setting optional description on group creation diff --git a/.changeset/big-rabbits-think.md b/.changeset/big-rabbits-think.md new file mode 100644 index 0000000000..bd0ae32b5e --- /dev/null +++ b/.changeset/big-rabbits-think.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': patch +--- + +Fixes a bug where the `EntityListProvider` would not correctly hydrate query parameters if more than 20 were provided for the same key. diff --git a/.changeset/bright-pans-greet.md b/.changeset/bright-pans-greet.md new file mode 100644 index 0000000000..89ac3a8bc6 --- /dev/null +++ b/.changeset/bright-pans-greet.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-app-visualizer': patch +--- + +Bump react-aria-components to v1.14.0 diff --git a/.changeset/brown-grapes-fold.md b/.changeset/brown-grapes-fold.md new file mode 100644 index 0000000000..d8ab0a23f3 --- /dev/null +++ b/.changeset/brown-grapes-fold.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend-module-auth0-provider': patch +--- + +Add support for organizational invites in auth0 strategy diff --git a/.changeset/calm-knives-glow.md b/.changeset/calm-knives-glow.md new file mode 100644 index 0000000000..f2e1d5805c --- /dev/null +++ b/.changeset/calm-knives-glow.md @@ -0,0 +1,6 @@ +--- +'@backstage/integration': patch +'@backstage/plugin-catalog-backend-module-azure': patch +--- + +Added support for `{org}.visualstudio.com` domains used by Azure DevOps diff --git a/.changeset/catalog-graph-test-deps.md b/.changeset/catalog-graph-test-deps.md new file mode 100644 index 0000000000..3c47695696 --- /dev/null +++ b/.changeset/catalog-graph-test-deps.md @@ -0,0 +1,7 @@ +--- +'@backstage/plugin-api-docs': patch +'@backstage/plugin-catalog-graph': patch +'@backstage/plugin-org': patch +--- + +Added `@backstage/frontend-test-utils` dev dependency. diff --git a/.changeset/catalog-modules-update-extension-points.md b/.changeset/catalog-modules-update-extension-points.md new file mode 100644 index 0000000000..dba229482f --- /dev/null +++ b/.changeset/catalog-modules-update-extension-points.md @@ -0,0 +1,23 @@ +--- +'@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-gcp': 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-github-org': patch +'@backstage/plugin-catalog-backend-module-gitlab': patch +'@backstage/plugin-catalog-backend-module-gitlab-org': 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-openapi': patch +'@backstage/plugin-catalog-backend-module-puppetdb': patch +'@backstage/plugin-catalog-backend-module-scaffolder-entity-model': patch +--- + +Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. diff --git a/.changeset/catalog-node-extension-points-to-stable.md b/.changeset/catalog-node-extension-points-to-stable.md new file mode 100644 index 0000000000..7e8e22dfc5 --- /dev/null +++ b/.changeset/catalog-node-extension-points-to-stable.md @@ -0,0 +1,13 @@ +--- +'@backstage/plugin-catalog-node': minor +--- + +Promoted stable catalog extension points from alpha to main export. The following extension points are now exported from `@backstage/plugin-catalog-node` instead of `@backstage/plugin-catalog-node/alpha`: + +- `catalogLocationsExtensionPoint` and `CatalogLocationsExtensionPoint` +- `catalogProcessingExtensionPoint` and `CatalogProcessingExtensionPoint` +- `catalogAnalysisExtensionPoint` and `CatalogAnalysisExtensionPoint` + +The old alpha exports for these extension points are now deprecated with `@deprecated` markers pointing to the new stable exports. Please update your imports from `@backstage/plugin-catalog-node/alpha` to `@backstage/plugin-catalog-node`. + +Note: The `catalogModelExtensionPoint`, `catalogPermissionExtensionPoint`, and related types remain in alpha. diff --git a/.changeset/catalog-node-use-create-service-mock.md b/.changeset/catalog-node-use-create-service-mock.md new file mode 100644 index 0000000000..5032484ebb --- /dev/null +++ b/.changeset/catalog-node-use-create-service-mock.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-node': patch +--- + +Updated `catalogServiceMock.mock` to use `createServiceMock` from `@backstage/backend-test-utils`, replacing the internal copy of `simpleMock`. Added `@backstage/backend-test-utils` as an optional peer dependency. diff --git a/.changeset/catalog-provider-module-failures.md b/.changeset/catalog-provider-module-failures.md new file mode 100644 index 0000000000..c7cb5a3571 --- /dev/null +++ b/.changeset/catalog-provider-module-failures.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': minor +--- + +Failures to connect catalog providers are now attributed to the module that provided the failing provider. This means that such failures will be reported as module startup failures rather than a failure to start the catalog plugin, and will therefore respect `onPluginModuleBootFailure` configuration instead. diff --git a/.changeset/catalog-react-catalog-api-mock-shorthand.md b/.changeset/catalog-react-catalog-api-mock-shorthand.md new file mode 100644 index 0000000000..0761dffa0e --- /dev/null +++ b/.changeset/catalog-react-catalog-api-mock-shorthand.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': patch +--- + +The `catalogApiMock` test utility now returns a `MockWithApiFactory`, allowing it to be passed directly to test utilities like `renderTestApp` and `TestApiProvider` without needing the `[catalogApiRef, catalogApiMock()]` tuple. diff --git a/.changeset/chatty-tips-stop.md b/.changeset/chatty-tips-stop.md new file mode 100644 index 0000000000..7b4c435ffc --- /dev/null +++ b/.changeset/chatty-tips-stop.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend-module-auth0-provider': minor +--- + +feat: Added organization option to authorization params of the strategy diff --git a/.changeset/chubby-suns-film.md b/.changeset/chubby-suns-film.md new file mode 100644 index 0000000000..440d65d707 --- /dev/null +++ b/.changeset/chubby-suns-film.md @@ -0,0 +1,5 @@ +--- +'@backstage/ui': patch +--- + +Fixed dark theme `--bui-fg-secondary` and `--bui-fg-disabled` tokens using black-based `oklch(0% ...)` instead of white-based `oklch(100% ...)`, making secondary and disabled text visible on dark backgrounds. diff --git a/.changeset/clean-bags-occur.md b/.changeset/clean-bags-occur.md new file mode 100644 index 0000000000..ea4ae25aa6 --- /dev/null +++ b/.changeset/clean-bags-occur.md @@ -0,0 +1,94 @@ +--- +'@backstage/ui': minor +--- + +**BREAKING**: Replaced `Surface` / `onSurface` system with new provider/consumer background system + +The old `Surface` type (`'0'`–`'3'`, `'auto'`) and its associated props (`surface`, `onSurface`) have been replaced by a provider/consumer `bg` architecture. + +**Types:** + +- `ContainerBg` — `'neutral-1'` | `'neutral-2'` | `'neutral-3'` | `'danger'` | `'warning'` | `'success'` +- `ProviderBg` — `ContainerBg | 'neutral-auto'` + +Consumer components (e.g. Button) inherit the parent's `bg` via `data-on-bg`, and CSS handles the visual step-up. See "Neutral level capping" below for details on how levels are bounded. + +**Hooks:** + +- `useBgProvider(bg?)` — for provider components. Returns `{ bg: undefined }` when no `bg` is given (transparent). Supports `'neutral-auto'` to auto-increment from the parent context. +- `useBgConsumer()` — for consumer components. Returns the parent container's `bg` unchanged. + +**Component roles:** + +- **Provider-only** (Box, Flex, Grid): set `data-bg`, wrap children in `BgProvider`. **Transparent by default** — they do _not_ auto-increment; pass `bg="neutral-auto"` explicitly if you want automatic neutral stepping. +- **Consumer-only** (Button, ButtonIcon, ButtonLink): set `data-on-bg`, inherit the parent container's `bg` unchanged. +- **Provider + Consumer** (Card): sets both `data-bg` and `data-on-bg`, wraps children. Card passes `bg="neutral-auto"` to its inner Box, so it auto-increments from the parent context. + +**Neutral level capping:** + +Provider components cap at `neutral-3`. There is no `neutral-4` prop value. The `neutral-4` level exists only in consumer component CSS — for example, a Button sitting on a `neutral-3` surface uses `neutral-4` tokens internally via `data-on-bg`. + +**Migration:** + +Rename the `surface` prop to `bg` on provider components and update values: + +```diff +- ++ + +- ++ + +- ++ + +- ++ +``` + +Remove `onSurface` from consumer components — they now always inherit from the parent container: + +```diff +- ++ +``` + +**Affected components:** Button diff --git a/.changeset/tired-sides-share.md b/.changeset/tired-sides-share.md new file mode 100644 index 0000000000..661a7aee50 --- /dev/null +++ b/.changeset/tired-sides-share.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-app-react': patch +--- + +Internal refactor to move implementation of blueprints from `@backstage/frontend-plugin-api` to this package. diff --git a/.changeset/tricky-beans-watch.md b/.changeset/tricky-beans-watch.md new file mode 100644 index 0000000000..770efffb48 --- /dev/null +++ b/.changeset/tricky-beans-watch.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-events-backend-module-google-pubsub': minor +--- + +Added an optional `filter` property to PubSub consumers/publishers diff --git a/.changeset/twelve-dolls-tap.md b/.changeset/twelve-dolls-tap.md new file mode 100644 index 0000000000..33c184b39d --- /dev/null +++ b/.changeset/twelve-dolls-tap.md @@ -0,0 +1,5 @@ +--- +'@backstage/ui': patch +--- + +Fixed React 17 compatibility by using `useId` from `react-aria` instead of the built-in React hook which is only available in React 18+. diff --git a/.changeset/twenty-clubs-itch.md b/.changeset/twenty-clubs-itch.md new file mode 100644 index 0000000000..c69aabec7d --- /dev/null +++ b/.changeset/twenty-clubs-itch.md @@ -0,0 +1,7 @@ +--- +'@backstage/ui': patch +--- + +Fixed Switch component disabled state styling to show `not-allowed` cursor and disabled text color. + +**Affected components:** Switch diff --git a/.changeset/ui-standard-build.md b/.changeset/ui-standard-build.md new file mode 100644 index 0000000000..d0d8bd7f65 --- /dev/null +++ b/.changeset/ui-standard-build.md @@ -0,0 +1,5 @@ +--- +'@backstage/ui': patch +--- + +Migrated to use the standard `backstage-cli package build` for CSS bundling instead of a custom build script. diff --git a/.changeset/vast-rockets-dig.md b/.changeset/vast-rockets-dig.md new file mode 100644 index 0000000000..3340fabb2c --- /dev/null +++ b/.changeset/vast-rockets-dig.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-auth-backend-module-gitlab-provider': minor +'@backstage/plugin-catalog-backend-module-gitlab': minor +--- + +Added the `{gitlab-integration-host}/user-id` annotation to store GitLab's user ID (immutable) in user entities. Also includes addition of the `userIdMatchingUserEntityAnnotation` sign-in resolver that matches users by the new ID. diff --git a/.changeset/warm-colts-admire.md b/.changeset/warm-colts-admire.md new file mode 100644 index 0000000000..08fe3de363 --- /dev/null +++ b/.changeset/warm-colts-admire.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-node': minor +--- + +Introduced the `catalogScmEventsServiceRef`, along with `CatalogScmEventsService` and associated types. These allow communicating a unified set of events, that parts of the catalog can react to. diff --git a/.changeset/wet-cups-juggle.md b/.changeset/wet-cups-juggle.md new file mode 100644 index 0000000000..5e1185f7df --- /dev/null +++ b/.changeset/wet-cups-juggle.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Removed link styles from LinkButton to avoid styling inconsistencies related to import order. diff --git a/.changeset/wicked-walls-accept.md b/.changeset/wicked-walls-accept.md new file mode 100644 index 0000000000..6f16088ed9 --- /dev/null +++ b/.changeset/wicked-walls-accept.md @@ -0,0 +1,59 @@ +--- +'@backstage/ui': minor +--- + +**BREAKING**: Removed link and tint color tokens, added new status foreground tokens, and improved Link component styling + +The following color tokens have been removed: + +- `--bui-fg-link` (and all related tokens: `-hover`, `-pressed`, `-disabled`) +- `--bui-fg-tint` (and all related tokens: `-hover`, `-pressed`, `-disabled`) +- `--bui-bg-tint` (and all related tokens: `-hover`, `-pressed`, `-disabled`) +- `--bui-border-tint` (and all related tokens) + +**New Status Tokens:** + +Added dedicated tokens for status colors that distinguish between usage on status backgrounds vs. standalone usage: + +- `--bui-fg-danger-on-bg` / `--bui-fg-danger` +- `--bui-fg-warning-on-bg` / `--bui-fg-warning` +- `--bui-fg-success-on-bg` / `--bui-fg-success` +- `--bui-fg-info-on-bg` / `--bui-fg-info` + +The `-on-bg` variants are designed for text on colored backgrounds, while the base variants are for standalone status indicators with improved visibility and contrast. + +**Migration:** + +For link colors, migrate to one of the following alternatives: + +```diff +.custom-link { +- color: var(--bui-fg-link); ++ color: var(--bui-fg-info); /* For informational links */ ++ /* or */ ++ color: var(--bui-fg-primary); /* For standard text links */ +} +``` + +For tint colors (backgrounds, foregrounds, borders), migrate to appropriate status or neutral colors: + +```diff +.info-section { +- background: var(--bui-bg-tint); ++ background: var(--bui-bg-info); /* For informational sections */ ++ /* or */ ++ background: var(--bui-bg-neutral-1); /* For neutral emphasis */ +} +``` + +If you're using status foreground colors on colored backgrounds, update to the new `-on-bg` tokens: + +```diff +.error-badge { +- color: var(--bui-fg-danger); ++ color: var(--bui-fg-danger-on-bg); + background: var(--bui-bg-danger); +} +``` + +**Affected components:** Link diff --git a/.changeset/wild-emus-write.md b/.changeset/wild-emus-write.md new file mode 100644 index 0000000000..5c86a1d07d --- /dev/null +++ b/.changeset/wild-emus-write.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': patch +--- + +Migrated `EntityRelationWarning` and `EntityProcessingErrorsPanel` components from Material UI to Backstage UI. diff --git a/.changeset/wise-rabbits-double.md b/.changeset/wise-rabbits-double.md new file mode 100644 index 0000000000..6164c6e95c --- /dev/null +++ b/.changeset/wise-rabbits-double.md @@ -0,0 +1,5 @@ +--- +'@backstage/filter-predicates': minor +--- + +Introduced package, basically as the extracted predicate types from `@backstage/plugin-catalog-react/alpha` diff --git a/.changeset/yellow-ties-dream.md b/.changeset/yellow-ties-dream.md new file mode 100644 index 0000000000..8326b28319 --- /dev/null +++ b/.changeset/yellow-ties-dream.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Migrate audit events reference docs to http://backstage.io/docs. diff --git a/.changeset/yellow-years-run.md b/.changeset/yellow-years-run.md new file mode 100644 index 0000000000..fc57664911 --- /dev/null +++ b/.changeset/yellow-years-run.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-dynamic-feature-service': patch +--- + +Updated README for backend-dynamic-feature-service diff --git a/.changeset/young-pens-wash.md b/.changeset/young-pens-wash.md new file mode 100644 index 0000000000..0deeb40a65 --- /dev/null +++ b/.changeset/young-pens-wash.md @@ -0,0 +1,50 @@ +--- +'@backstage/plugin-auth-backend-module-cloudflare-access-provider': patch +'@backstage/plugin-auth-backend-module-bitbucket-server-provider': patch +'@backstage/plugin-auth-backend-module-azure-easyauth-provider': patch +'@backstage/plugin-auth-backend-module-oauth2-proxy-provider': patch +'@backstage/plugin-scaffolder-backend-module-bitbucket-cloud': patch +'@backstage/plugin-auth-backend-module-atlassian-provider': patch +'@backstage/plugin-auth-backend-module-bitbucket-provider': patch +'@backstage/plugin-auth-backend-module-microsoft-provider': patch +'@backstage/plugin-auth-backend-module-onelogin-provider': patch +'@backstage/plugin-auth-backend-module-aws-alb-provider': patch +'@backstage/plugin-auth-backend-module-gcp-iap-provider': patch +'@backstage/plugin-auth-backend-module-github-provider': patch +'@backstage/plugin-auth-backend-module-gitlab-provider': patch +'@backstage/plugin-auth-backend-module-google-provider': patch +'@backstage/plugin-auth-backend-module-oauth2-provider': patch +'@backstage/plugin-auth-backend-module-oidc-provider': patch +'@backstage/plugin-auth-backend-module-okta-provider': patch +'@backstage/plugin-scaffolder-backend-module-github': patch +'@backstage/plugin-scaffolder-backend-module-gitlab': patch +'@backstage/frontend-plugin-api': patch +'@backstage/frontend-test-utils': patch +'@backstage/backend-plugin-api': patch +'@backstage/backend-test-utils': patch +'@backstage/plugin-mcp-actions-backend': patch +'@backstage/plugin-permission-backend': patch +'@backstage/plugin-scaffolder-backend': patch +'@backstage/backend-defaults': patch +'@backstage/frontend-app-api': patch +'@backstage/plugin-permission-common': patch +'@backstage/core-compat-api': patch +'@backstage/core-components': patch +'@backstage/core-plugin-api': patch +'@backstage/plugin-scaffolder-react': patch +'@backstage/plugin-catalog-backend': patch +'@backstage/plugin-permission-node': patch +'@backstage/plugin-scaffolder-node': patch +'@backstage/plugin-search-backend': patch +'@backstage/core-app-api': patch +'@backstage/plugin-catalog-react': patch +'@backstage/repo-tools': patch +'@backstage/plugin-scaffolder': patch +'@backstage/cli-node': patch +'@backstage/plugin-auth-node': patch +'@backstage/cli': patch +'@backstage/plugin-home': patch +'@backstage/plugin-app': patch +--- + +Bump to latest zod to ensure it has the latest features diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md new file mode 100644 index 0000000000..170a4eb868 --- /dev/null +++ b/.claude/CLAUDE.md @@ -0,0 +1 @@ +Follow the instructions at /.github/copilot-instructions.md diff --git a/.cursor/rules/general.mdc b/.cursor/rules/general.mdc new file mode 100644 index 0000000000..3a81a0cb5f --- /dev/null +++ b/.cursor/rules/general.mdc @@ -0,0 +1,7 @@ +--- +description: General project guidelines for Backstage development +globs: +alwaysApply: true +--- + +Follow the instructions at /.github/copilot-instructions.md diff --git a/contrib/.devcontainer/Dockerfile b/.devcontainer/Dockerfile similarity index 78% rename from contrib/.devcontainer/Dockerfile rename to .devcontainer/Dockerfile index 6407aa26dd..9fcd4ba572 100644 --- a/contrib/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/devcontainers/typescript-node:20 +FROM mcr.microsoft.com/devcontainers/typescript-node:22 RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ && apt-get -y install chromium \ diff --git a/.devcontainer/devcontainer.env b/.devcontainer/devcontainer.env new file mode 100644 index 0000000000..65350b61d4 --- /dev/null +++ b/.devcontainer/devcontainer.env @@ -0,0 +1 @@ +NODE_OPTIONS=--no-node-snapshot diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000000..e1cece8896 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,61 @@ +{ + "name": "Backstage", + "forwardPorts": [3000, 7007], + "build": { "dockerfile": "Dockerfile" }, + "features": { + "ghcr.io/devcontainers/features/common-utils:2.5.6": {}, + "ghcr.io/devcontainers-contrib/features/mkdocs:2": {} + }, + "postCreateCommand": "bash .devcontainer/setup.sh", + "hostRequirements": { + "cpus": 2, + "memory": "4gb", + "storage": "32gb" + }, + "runArgs": [ + "--env-file", + ".devcontainer/devcontainer.env", + "--sysctl", + "net.ipv6.conf.all.disable_ipv6=1" + ], + "portsAttributes": { + "3000": { + "label": "Frontend port", + "onAutoForward": "silent", + "requireLocalPort": true + }, + "7007": { + "label": "Backend port", + "onAutoForward": "silent", + "requireLocalPort": true + }, + "9464": { + "onAutoForward": "silent" + } + }, + "customizations": { + "vscode": { + "extensions": [ + "esbenp.prettier-vscode", + "dbaeumer.vscode-eslint", + "Intility.vscode-backstage" + ], + "settings": { + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "eslint.validate": [ + "javascript", + "javascriptreact", + "typescript", + "typescriptreact" + ], + "files.eol": "\n", + "prettier.endOfLine": "lf", + "editor.codeActionsOnSave": { + "source.fixAll": "explicit", + "source.sortMembers": "explicit" + } + } + } + } +} diff --git a/.devcontainer/setup.sh b/.devcontainer/setup.sh new file mode 100755 index 0000000000..7615e2b3cc --- /dev/null +++ b/.devcontainer/setup.sh @@ -0,0 +1,28 @@ +#!/bin/bash +echo "Installing Backstage dependencies..." + +yarn install +export VIRTUAL_ENV=$HOME/venv +python3 -m venv $VIRTUAL_ENV +export PATH="$VIRTUAL_ENV/bin:$PATH" +python3 -m pip install mkdocs-techdocs-core + +echo "" +echo "╔════════════════════════════════════════════════════════╗ " +echo "║ 🚀 Setup Complete! Ready to launch Backstage! ║ " +echo "╠════════════════════════════════════════════════════════╣ " +echo "║ ║ " +echo "║ Open a new terminal and run: ║ " +echo "║ ║ " +echo "║ yarn start ║ " +echo "║ ║ " +echo "║ Then access Backstage at: ║ " +echo "║ ║ " +echo "║ http://localhost:3000 ║ " +echo "║ ║ " +echo "║ You might need to refresh the page once backend ║ " +echo "║ is ready. ║ " +echo "║ ║ " +echo "║ Happy coding! 🎉 ║ " +echo "╚════════════════════════════════════════════════════════╝ " +echo "" \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js index 54f9e69576..4f7c5afa5e 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -14,12 +14,13 @@ * limitations under the License. */ -var path = require('path'); +var path = require('node:path'); module.exports = { root: true, - plugins: ['@spotify', 'notice', 'react', 'testing-library', '@backstage'], + plugins: ['@spotify', 'notice', 'react', 'testing-library', '@backstage', 'node-import'], rules: { + 'node-import/prefer-node-protocol': 1, '@backstage/no-mixed-plugin-imports': [ 'error', { diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 40c09a9362..725c6c676b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,13 +4,13 @@ # The last matching pattern takes precedence. # https://help.github.com/articles/about-codeowners/ -* @backstage/maintainers @backstage/reviewers +* @backstage/maintainers yarn.lock @backstage/maintainers @backstage-service */yarn.lock @backstage/maintainers @backstage-service /.changeset @backstage/operations-maintainers /.changeset/*.md /.github @backstage/operations-maintainers -/.github/vale @backstage/documentation-maintainers +/.github/vale @backstage/maintainers @backstage/documentation-maintainers /.patches @backstage/operations-maintainers /beps/0001-notifications-system @backstage/maintainers @backstage/notifications-maintainers /docs @backstage/maintainers @backstage/documentation-maintainers @@ -25,11 +25,11 @@ yarn.lock @backstage/maintainers @backst /docs/plugins/integrating-search-into-plugins.md @backstage/search-maintainers /docs/releases @backstage/operations-maintainers /docs/tooling @backstage/tooling-maintainers -/microsite @backstage/documentation-maintainers +/microsite @backstage/maintainers @backstage/documentation-maintainers /microsite/data/plugins @backstage/maintainers /microsite/static @backstage/maintainers @backstage/documentation-maintainers /packages @backstage/framework-maintainers -/packages/backend-openapi-utils @backstage/maintainers @backstage/reviewers @backstage/openapi-tooling-maintainers +/packages/backend-openapi-utils @backstage/maintainers @backstage/openapi-tooling-maintainers /packages/catalog-client @backstage/catalog-maintainers /packages/catalog-model @backstage/catalog-maintainers /packages/cli @backstage/tooling-maintainers @@ -47,21 +47,21 @@ yarn.lock @backstage/maintainers @backst /plugins/app-* @backstage/framework-maintainers /plugins/auth @backstage/auth-maintainers /plugins/auth-* @backstage/auth-maintainers -/plugins/api-docs @backstage/maintainers @backstage/reviewers @backstage/sda-se-reviewers -/plugins/bitbucket-cloud-common @backstage/maintainers @backstage/reviewers @pjungermann -/plugins/catalog @backstage/maintainers @backstage/reviewers @backstage/catalog-maintainers -/plugins/catalog-* @backstage/maintainers @backstage/reviewers @backstage/catalog-maintainers -/plugins/catalog-backend-module-aws @backstage/maintainers @backstage/reviewers @backstage/catalog-maintainers @pjungermann -/plugins/catalog-backend-module-bitbucket-cloud @backstage/maintainers @backstage/reviewers @backstage/catalog-maintainers @pjungermann -/plugins/catalog-backend-module-backstage-openapi @backstage/maintainers @backstage/reviewers @backstage/openapi-tooling-maintainers -/plugins/catalog-backend-module-gitea @backstage/maintainers @backstage/reviewers @backstage/catalog-maintainers -/plugins/catalog-backend-module-msgraph @backstage/maintainers @backstage/reviewers @backstage/catalog-maintainers @pjungermann -/plugins/catalog-backend-module-puppetdb @backstage/maintainers @backstage/reviewers @backstage/catalog-maintainers -/plugins/catalog-graph @backstage/maintainers @backstage/reviewers @backstage/catalog-maintainers @backstage/sda-se-reviewers -/plugins/devtools @backstage/maintainers @backstage/reviewers @awanlin -/plugins/devtools-backend @backstage/maintainers @backstage/reviewers @awanlin -/plugins/devtools-common @backstage/maintainers @backstage/reviewers @awanlin -/plugins/events-* @backstage/maintainers @backstage/reviewers @backstage/events-maintainers +/plugins/api-docs @backstage/maintainers @backstage/sda-se-reviewers +/plugins/bitbucket-cloud-common @backstage/maintainers @pjungermann +/plugins/catalog @backstage/maintainers @backstage/catalog-maintainers +/plugins/catalog-* @backstage/maintainers @backstage/catalog-maintainers +/plugins/catalog-backend-module-aws @backstage/maintainers @backstage/catalog-maintainers @pjungermann +/plugins/catalog-backend-module-bitbucket-cloud @backstage/maintainers @backstage/catalog-maintainers @pjungermann +/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-puppetdb @backstage/maintainers @backstage/catalog-maintainers +/plugins/catalog-graph @backstage/maintainers @backstage/catalog-maintainers @backstage/sda-se-reviewers +/plugins/devtools @backstage/maintainers @awanlin +/plugins/devtools-backend @backstage/maintainers @awanlin +/plugins/devtools-common @backstage/maintainers @awanlin +/plugins/events-* @backstage/maintainers @backstage/events-maintainers /plugins/home @backstage/home-maintainers /plugins/home-* @backstage/home-maintainers /plugins/kubernetes @backstage/kubernetes-maintainers @@ -70,17 +70,17 @@ yarn.lock @backstage/maintainers @backst /plugins/notifications-* @backstage/maintainers @backstage/notifications-maintainers /plugins/scaffolder-backend-module-notifications @backstage/maintainers @backstage/notifications-maintainers /plugins/permission-* @backstage/permission-maintainers -/plugins/scaffolder @backstage/maintainers @backstage/reviewers @backstage/scaffolder-maintainers -/plugins/scaffolder-* @backstage/maintainers @backstage/reviewers @backstage/scaffolder-maintainers +/plugins/scaffolder @backstage/maintainers @backstage/scaffolder-maintainers +/plugins/scaffolder-* @backstage/maintainers @backstage/scaffolder-maintainers /plugins/search @backstage/search-maintainers /plugins/search-* @backstage/search-maintainers /plugins/signals @backstage/maintainers @backstage/notifications-maintainers /plugins/signals-* @backstage/maintainers @backstage/notifications-maintainers /plugins/techdocs @backstage/techdocs-maintainers /plugins/techdocs-* @backstage/techdocs-maintainers -/plugins/user-settings @backstage/maintainers @backstage/reviewers @backstage/sda-se-reviewers -/plugins/user-settings-backend @backstage/maintainers @backstage/reviewers @backstage/sda-se-reviewers -/plugins/user-settings-common @backstage/maintainers @backstage/reviewers @backstage/sda-se-reviewers +/plugins/user-settings @backstage/maintainers @backstage/sda-se-reviewers +/plugins/user-settings-backend @backstage/maintainers @backstage/sda-se-reviewers +/plugins/user-settings-common @backstage/maintainers @backstage/sda-se-reviewers /scripts @backstage/operations-maintainers diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 98073c5128..2157025b7b 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,11 +1,23 @@ -This is a TypeScript project structured as a monorepo using Yarn workspaces. +Backstage is an open platform for building developer portals. This is a TypeScript monorepo using Yarn workspaces. + +## Key Directories + +- `/packages`: Core framework packages (prefixed `@backstage/`) +- `/plugins`: Plugin packages (prefixed `@backstage/plugin-*`) +- `/packages/app` and `/packages/backend`: Example app for local development +- `/packages/app`: Main example app using the new frontend system +- `/packages/app-legacy`: Example app using the old frontend system +- `/docs`: Documentation files + +Packages prefixed with `core-` (e.g., `@backstage/core-plugin-api`) are part of the old frontend system. Packages prefixed with `frontend-` (e.g., `@backstage/frontend-plugin-api`) are part of the new frontend system (NFS). Packages prefixed with `backend-` (e.g., `@backstage/backend-plugin-api`) are part of the backend system. ## Code Standards The following files contain guidelines for the project: +- `/CONTRIBUTING.md`: comprehensive contribution guidelines. - `/STYLE.md`: guidelines for code style. -- `/REVIEWING.md`: guidelines for pull requests. +- `/REVIEWING.md`: guidelines for pull requests and writing changesets. - `/SECURITY.md`: guidelines for security. - `/docs/architecture-decisions/`: contains the architecture decisions for the project. @@ -19,13 +31,27 @@ Before any of these commands can be run, you need to run `yarn install` in the p - Code formatting: Use `yarn prettier --write ` to format code. - Lint: Use `yarn lint --fix` in the project root to run the linter. - API reports: Before submitting a pull request with changes to any package in the workspace, run `yarn build:api-reports` in the project root to generate API reports for all packages. +- Dev server: Use `yarn start` to run the example app locally (frontend on :3000, backend on :7007). +- Create: Use `yarn new` to scaffold new plugins, packages, or modules. You MUST NOT create a release by running `yarn changesets version` or `yarn release` as part of any changes. Releases are created by separate workflows. -All changes that affect the published version of packages in the `/packages` and `/plugins` directories must be accompanied by a changeset. See the guidelines in `/REVIEWING.md` for information on how to write good changesets. Changesets are stored in the `/.changeset` directory. Breaking changes must be accompanied by a `minor` version bump for packages that below version `1.0.0`, or a `major` version bump for packages that are at version `1.0.0` or higher. +All changes that affect the published version of packages in the `/packages` and `/plugins` directories must be accompanied by a changeset. Only non-private packages require changesets. See the guidelines in `/CONTRIBUTING.md#creating-changesets` for information on how to write good changesets. Changesets are stored in the `/.changeset` directory. Breaking changes must be accompanied by a `minor` version bump for packages below version `1.0.0`, or a `major` version bump for packages at version `1.0.0` or higher. Never update ESLint, Prettier, or TypeScript configuration files unless specifically requested. ## Repository Structure See `/docs/contribute/project-structure.md` for a detailed description of the repository structure. + +## Pull Request Reviews + +When reviewing a pull request you MUST calculate a priority score between 0 and 100, where a higher score indicates higher priority. You MUST include the score as an HTML comment at the very beginning of the "PR Overview" section, using the following format: ``. + +The score MUST be calculated as a sum of the following: + +- **60% Guideline Adherence**: How well does the pull request follow the project guidelines in `/STYLE.md`, `/REVIEWING.md`, `/CONTRIBUTING.md`, and `/SECURITY.md`? A pull request that fully adheres to all guidelines scores 60 points, while one that violates multiple guidelines scores closer to 0. + +- **40% Complexity**: How straightforward is the pull request? A simple bug fix or documentation update scores the full 40 points. A complex API change, new feature, or architectural modification scores closer to 0. + +Higher priority pull requests (higher scores) are those that are both well-crafted according to project standards AND easy to review and merge quickly. diff --git a/.github/vale/config/vocabularies/Backstage/accept.txt b/.github/vale/config/vocabularies/Backstage/accept.txt index 44ee42a25a..779cc00cf7 100644 --- a/.github/vale/config/vocabularies/Backstage/accept.txt +++ b/.github/vale/config/vocabularies/Backstage/accept.txt @@ -53,7 +53,6 @@ Chai Chainguard changeset changesets -Changesets chanwit Chanwit CI/CD @@ -68,12 +67,10 @@ Cobertura codeblocks Codecov codehilite -Codehilite codemod codemods codeowners codescene -CodeScene composability composable config @@ -99,6 +96,7 @@ dataflow dataloader dayjs debounce +debounced debounces debuggability declaratively @@ -124,7 +122,6 @@ devs dialogs disambiguator discoverability -Discoverability dls Dockerfile dockerfiles @@ -135,7 +132,6 @@ Dominik DOMPurify don'ts dynatrace -Dynatrace dyno ecco elasticsearch @@ -156,12 +152,10 @@ faqs featureful Figma firehydrant -FireHydrant Firekube Firestore Fiverr flightcontrol -Flightcontrol Francesco Frontside Gaurav @@ -187,7 +181,6 @@ haproxy hardcoded hardcoding harness -Harness Helidon Henneke Heroku @@ -280,7 +273,6 @@ microsite microtasks middleware minikube -Minikube Minio misattributed misconfiguration @@ -289,7 +281,6 @@ mkdocs Mkdocs modularization monorepo -Monorepo monorepos monospace morgan @@ -326,7 +317,6 @@ Olausson Oldsberg onboarded onboarding -Onboarding onelogin openapi OpenSearch @@ -334,7 +324,6 @@ OpenShift openssl orgs overridable -Overridable padding paddings pagerduty @@ -344,12 +333,13 @@ parallelization param params parseable +passthrough +passwordless Patrik pattison Peloton PEP performant -Performant periskop Periskop permissioned @@ -523,11 +513,15 @@ transpile transpiled transpiler transpilers +trixie truthy tsconfig +TTLs +Turbopack TSDoc typeahead ui +unassign unbreak Unconference undici @@ -537,6 +531,7 @@ unmount unregister unregistering unregistration +unreviewed unstarred untemplated untracked @@ -552,6 +547,7 @@ validator validators Valkey varchar +viewport vite VMware Vodafone @@ -577,3 +573,4 @@ zoomable zsh resizable enums +LLMs diff --git a/.github/workflows/api-breaking-changes-comment.yml b/.github/workflows/api-breaking-changes-comment.yml index 654d73b4d4..aca727743a 100644 --- a/.github/workflows/api-breaking-changes-comment.yml +++ b/.github/workflows/api-breaking-changes-comment.yml @@ -23,7 +23,7 @@ jobs: comment-cache-key: ${{ steps.hash.outputs.COMMENT_FILE_HASH }} steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: disable-sudo: true egress-policy: block @@ -74,7 +74,7 @@ jobs: - name: Cache Comment if: ${{ steps.event.outputs.ACTION != 'closed' }} - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 + uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 with: path: comment.md key: ${{ steps.hash.outputs.COMMENT_FILE_HASH }} @@ -99,11 +99,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: Fetch cached Manifests File id: cache - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5 with: path: comment.md key: ${{ needs.setup.outputs.comment-cache-key }} @@ -115,13 +115,13 @@ jobs: with: issue-number: ${{ needs.setup.outputs.pr-number }} comment-author: 'github-actions[bot]' - body-includes: API changes + body-includes: api-breaking-changes-comment direction: last - name: Create or Update Comment with API Changes uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4 with: comment-id: ${{ steps.find-comment.outputs.comment-id }} - issue-number: ${{ github.event.pull_request.number }} + issue-number: ${{ needs.setup.outputs.pr-number }} body-path: comment.md edit-mode: replace diff --git a/.github/workflows/api-breaking-changes.yml b/.github/workflows/api-breaking-changes.yml index 934add0716..1c9e001c5e 100644 --- a/.github/workflows/api-breaking-changes.yml +++ b/.github/workflows/api-breaking-changes.yml @@ -14,11 +14,11 @@ jobs: if: ${{ github.event_name != 'pull_request' || github.event.action != 'closed' }} steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: # Fetch the commit that's merged into the base rather than the target ref # This will let us diff only the contents of the PR, without fetching more history @@ -27,19 +27,20 @@ jobs: run: git fetch --depth 1 origin ${{ github.base_ref }} - name: setup-node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 22.x registry-url: https://registry.npmjs.org/ - name: yarn install - uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + uses: backstage/actions/yarn-install@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: cache-prefix: linux-v22 - name: breaking changes check run: | yarn backstage-repo-tools repo schema openapi diff --since origin/${{ github.base_ref }} > comment.md + echo "" >> comment.md - name: clone artifacts to current directory run: | diff --git a/.github/workflows/automate_area-labels.yml b/.github/workflows/automate_area-labels.yml index e85a9cf11f..cdf4a28b55 100644 --- a/.github/workflows/automate_area-labels.yml +++ b/.github/workflows/automate_area-labels.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit diff --git a/.github/workflows/automate_changeset_feedback.yml b/.github/workflows/automate_changeset_feedback.yml index 257db3929a..343eb9725b 100644 --- a/.github/workflows/automate_changeset_feedback.yml +++ b/.github/workflows/automate_changeset_feedback.yml @@ -23,18 +23,18 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: # Fetch the commit that's merged into the base rather than the target ref # This will let us diff only the contents of the PR, without fetching more history ref: 'refs/pull/${{ github.event.pull_request.number }}/merge' - name: fetch base run: git fetch --depth 1 origin ${{ github.base_ref }} - - uses: backstage/actions/changeset-feedback@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + - uses: backstage/actions/changeset-feedback@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 name: Generate feedback with: diff-ref: 'origin/master' diff --git a/.github/workflows/automate_merge_message.yml b/.github/workflows/automate_merge_message.yml index 83a1e32fcf..c1ecde9194 100644 --- a/.github/workflows/automate_merge_message.yml +++ b/.github/workflows/automate_merge_message.yml @@ -24,11 +24,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: '${{ github.event.pull_request.merge_commit_sha }}' diff --git a/.github/workflows/automate_stale.yml b/.github/workflows/automate_stale.yml index a7eef4fae4..c9ee8f8078 100644 --- a/.github/workflows/automate_stale.yml +++ b/.github/workflows/automate_stale.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit diff --git a/.github/workflows/ci-noop.yml b/.github/workflows/ci-noop.yml index 12aafe18ee..d9851778c6 100644 --- a/.github/workflows/ci-noop.yml +++ b/.github/workflows/ci-noop.yml @@ -40,7 +40,7 @@ jobs: name: Test ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 36b4114efe..aeddfcea1d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,20 +28,32 @@ jobs: name: Install ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + # Store the PR number for the Sync Pull Requests workflow + - name: Save PR context + if: matrix.node-version == '22.x' + run: | + mkdir -p ./context + echo "${{ github.event.pull_request.number }}" > ./context/pr-number + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + if: matrix.node-version == '22.x' + with: + name: pr-context + path: context/ + + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: use node.js ${{ matrix.node-version }} - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + uses: backstage/actions/yarn-install@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} @@ -64,20 +76,20 @@ jobs: name: Verify ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: use node.js ${{ matrix.node-version }} - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + uses: backstage/actions/yarn-install@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} @@ -121,12 +133,19 @@ jobs: - name: verify doc links run: node scripts/verify-links.js + - name: verify plugin directory + run: node scripts/verify-plugin-directory.js - name: build all packages run: yarn backstage-cli repo build --all - # For now BUI has a custom build script and needs to be built separately - - name: build BUI - run: yarn --cwd packages/ui build + # Build docs-ui to ensure documentation site builds successfully + - name: install docs-ui dependencies + working-directory: docs-ui + run: yarn install + + - name: build docs-ui + working-directory: docs-ui + run: yarn build - name: verify type dependencies run: yarn lint:type-deps @@ -210,7 +229,7 @@ jobs: INTEGRATION_TEST_AZURE_TOKEN: ${{ secrets.INTEGRATION_TEST_AZURE_TOKEN }} steps: - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: fetch master branch run: git fetch origin master @@ -220,13 +239,13 @@ jobs: run: git fetch origin ${{ github.event.pull_request.base.ref }} - name: use node.js ${{ matrix.node-version }} - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + uses: backstage/actions/yarn-install@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} @@ -236,7 +255,7 @@ jobs: # Use the lower-level cache actions for the success cache, so that we can store the cache even on failed builds - name: restore backstage-cli cache - uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5 with: path: .cache/backstage-cli key: ${{ runner.os }}-v${{ matrix.node-version }}-backstage-cli-${{ github.run_id }} @@ -260,7 +279,7 @@ jobs: # Always save success cache even if there were failures, that way it can be used in re-triggered builds - name: save backstage-cli cache - uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + uses: actions/cache/save@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5 if: always() with: path: .cache/backstage-cli diff --git a/.github/workflows/cleanup_patch-files.yml b/.github/workflows/cleanup_patch-files.yml deleted file mode 100644 index 3dc0e27837..0000000000 --- a/.github/workflows/cleanup_patch-files.yml +++ /dev/null @@ -1,160 +0,0 @@ -name: Cleanup Patch Files -on: - push: - branches: - - 'patch/v*' - -concurrency: - group: cleanup-patch-files - cancel-in-progress: false - -jobs: - cleanup: - name: Cleanup Patch Files - runs-on: ubuntu-latest - if: github.repository == 'backstage/backstage' - permissions: - contents: write - steps: - - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 - with: - egress-policy: audit - - - name: Checkout - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - with: - fetch-depth: 0 - token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} - - - name: Configure Git - run: | - git config --global user.email noreply@backstage.io - git config --global user.name 'Github patch cleanup workflow' - - - name: Extract PR numbers from commit messages - id: extract-pr-numbers - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 - with: - github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} - script: | - const { execSync } = require('child_process'); - - // Extract PR numbers from commits pushed to the patch branch - // Commits have messages in format: "Patch from PR #123" - const beforeSha = context.payload.before; - const afterSha = context.payload.after; - - let commitRange; - if (beforeSha && beforeSha !== '0000000000000000000000000000000000000000') { - commitRange = `${beforeSha}..${afterSha}`; - } else { - // First push to branch, check recent commits - commitRange = `-n 20 ${afterSha}`; - } - - // Get commit messages from git log - let commitMessages; - try { - commitMessages = execSync( - `git log --format=%B ${commitRange}`, - { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] } - ); - } catch (error) { - console.log('No commits found in range'); - commitMessages = ''; - } - - // Extract PR numbers from commit messages matching "Patch from PR #123" - const prNumbers = new Set(); - const prPattern = /Patch from PR #(\d+)/g; - let match; - - while ((match = prPattern.exec(commitMessages)) !== null) { - prNumbers.add(parseInt(match[1], 10)); - } - - // Convert to sorted array - const prNumbersArray = Array.from(prNumbers).sort((a, b) => a - b); - - if (prNumbersArray.length > 0) { - console.log(`Found PR numbers: ${prNumbersArray.join(', ')}`); - core.setOutput('pr_numbers', JSON.stringify(prNumbersArray)); - core.setOutput('has_pr_numbers', 'true'); - } else { - console.log('No PR numbers found in commit messages'); - core.setOutput('pr_numbers', '[]'); - core.setOutput('has_pr_numbers', 'false'); - } - - - name: Checkout master - if: steps.extract-pr-numbers.outputs.has_pr_numbers == 'true' - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - with: - ref: master - token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} - - - name: Delete patch files - if: steps.extract-pr-numbers.outputs.has_pr_numbers == 'true' - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 - env: - PR_NUMBERS: ${{ steps.extract-pr-numbers.outputs.pr_numbers }} - REF_NAME: ${{ github.ref_name }} - with: - github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} - script: | - const { execSync } = require('child_process'); - const fs = require('fs'); - const path = require('path'); - - const prNumbers = JSON.parse(process.env.PR_NUMBERS); - const patchesDir = path.join(process.cwd(), '.patches'); - - if (!fs.existsSync(patchesDir)) { - console.log('No .patches directory found, nothing to clean up'); - return; - } - - const deletedFiles = []; - - // Delete patch files for each PR number - for (const prNum of prNumbers) { - const patchFile = path.join(patchesDir, `pr-${prNum}.txt`); - if (fs.existsSync(patchFile)) { - fs.unlinkSync(patchFile); - deletedFiles.push(patchFile); - console.log(`Deleted ${patchFile}`); - } else { - console.log(`Patch file ${patchFile} not found, skipping`); - } - } - - if (deletedFiles.length === 0) { - console.log('No patch files to delete'); - return; - } - - - name: Commit and push changes - if: steps.extract-pr-numbers.outputs.has_pr_numbers == 'true' - run: | - # Check if there are any changes to commit - if git diff --quiet && git diff --cached --quiet; then - echo "No changes to commit" - exit 0 - fi - - git add .patches/ - git commit -m "chore: remove applied patch files after patch release merge - - Removed patch files for PRs included in patch release to ${{ github.ref_name }}" - - git push origin master - - - name: Summary - if: steps.extract-pr-numbers.outputs.has_pr_numbers == 'true' - run: | - echo "## Patch Files Cleanup Summary" >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "Patch release to ${{ github.ref_name }} has been merged." >> $GITHUB_STEP_SUMMARY - echo "" >> $GITHUB_STEP_SUMMARY - echo "Patch files have been removed from the master branch." >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/cron.yml b/.github/workflows/cron.yml index b695c88c90..d12d844c66 100644 --- a/.github/workflows/cron.yml +++ b/.github/workflows/cron.yml @@ -10,11 +10,11 @@ jobs: timeout-minutes: 10 steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - - uses: backstage/actions/cron@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + - uses: backstage/actions/cron@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: app-id: ${{ secrets.BACKSTAGE_GOALIE_APPLICATION_ID }} private-key: ${{ secrets.BACKSTAGE_GOALIE_PRIVATE_KEY }} diff --git a/.github/workflows/deploy_docker-image.yml b/.github/workflows/deploy_docker-image.yml index 0cf49b4b8a..2accec861a 100644 --- a/.github/workflows/deploy_docker-image.yml +++ b/.github/workflows/deploy_docker-image.yml @@ -20,24 +20,24 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - name: checkout - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: path: backstage ref: ${{ github.event.client_payload.version && env.RELEASE_VERSION || github.ref }} - name: use node.js ${{ matrix.node-version }} - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + uses: backstage/actions/yarn-install@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} @@ -52,14 +52,14 @@ jobs: working-directory: ./example-app - name: Login to GitHub Container Registry - uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0 + uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Set up Docker Buildx - uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 + uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0 - name: Build and push uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 diff --git a/.github/workflows/deploy_microsite.yml b/.github/workflows/deploy_microsite.yml index 08f349c7ec..bd963252b4 100644 --- a/.github/workflows/deploy_microsite.yml +++ b/.github/workflows/deploy_microsite.yml @@ -23,7 +23,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit @@ -54,55 +54,44 @@ jobs: result-encoding: string - name: checkout latest release - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: refs/tags/${{ steps.find-release.outputs.result }} - name: Use Node.js 22.x - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + uses: backstage/actions/yarn-install@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: cache-prefix: ${{ runner.os }}-v22.x - - name: build API reference - run: yarn build:api-docs - - - name: upload API reference - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 - with: - name: stable-reference - path: docs/reference/ - if-no-files-found: error - retention-days: 1 - # Use the lower-level cache actions for the success cache, so that we can store the cache even on failed builds - name: restore package-docs cache - uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5 with: path: .cache/package-docs key: ${{ runner.os }}-v${{ matrix.node-version }}-package-docs-stable-${{ github.run_id }} restore-keys: | ${{ runner.os }}-v${{ matrix.node-version }}-package-docs-stable- - - name: build API reference (beta) + - name: build API reference run: yarn backstage-repo-tools package-docs - - name: upload API reference (beta) + - name: upload API reference uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: - name: stable-reference-beta + name: stable-reference path: type-docs/ if-no-files-found: error retention-days: 1 # Always save success cache even if there were failures, that way it can be used in re-triggered builds - name: save package-docs cache - uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + uses: actions/cache/save@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5 if: always() with: path: .cache/package-docs @@ -135,58 +124,47 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - name: checkout master - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Use Node.js 22.x - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + uses: backstage/actions/yarn-install@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: cache-prefix: ${{ runner.os }}-v22.x - - name: build API reference - run: yarn build:api-docs - - - name: upload API reference - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 - with: - name: next-reference - path: docs/reference/ - if-no-files-found: error - retention-days: 1 - # Use the lower-level cache actions for the success cache, so that we can store the cache even on failed builds - name: restore package-docs cache - uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5 with: path: .cache/package-docs key: ${{ runner.os }}-v${{ matrix.node-version }}-package-docs-${{ github.run_id }} restore-keys: | ${{ runner.os }}-v${{ matrix.node-version }}-package-docs- - - name: build API reference (beta) + - name: build API reference run: yarn backstage-repo-tools package-docs - - name: upload API reference (beta) + - name: upload API reference uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: - name: next-reference-beta + name: next-reference path: type-docs/ if-no-files-found: error retention-days: 1 # Always save success cache even if there were failures, that way it can be used in re-triggered builds - name: save package-docs cache - uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + uses: actions/cache/save@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5 if: always() with: path: .cache/package-docs @@ -240,19 +218,19 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - name: Use Node.js 22.x - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth # Stable docs - name: checkout latest release - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: refs/tags/${{ needs.stable.outputs.release }} @@ -260,23 +238,31 @@ jobs: run: yarn install --immutable working-directory: microsite - - name: download stable reference - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 - with: - name: stable-reference - path: docs/reference - - name: download stable OpenAPI API docs uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: stable-openapi-docs path: docs - - name: grab lastest releases docs + - name: grab latest releases docs run: | git fetch origin master --depth 1 git checkout FETCH_HEAD -- docs/releases + - name: create missing generated file + run: | + mkdir -p docs/reference + cat > docs/reference/index.md < ./pr/pr_number - - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 - with: - name: pr_number-${{ github.event.pull_request.number }} - path: pr/ - overwrite: true diff --git a/.github/workflows/pr-review-comment.yaml b/.github/workflows/pr-review-comment.yaml deleted file mode 100644 index bb7bd26c53..0000000000 --- a/.github/workflows/pr-review-comment.yaml +++ /dev/null @@ -1,49 +0,0 @@ -# This workflow is triggered by "PR Review Comment Trigger" - -name: PR Review Comment -on: - workflow_run: - workflows: [PR Review Comment Trigger] - types: - - completed - -jobs: - re-review: - runs-on: ubuntu-latest - - # The triggering workflow will report success if the PR needs re-review - if: github.repository == 'backstage/backstage' && github.event.workflow_run.conclusion == 'success' - - steps: - # Inspired by https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#using-data-from-the-triggering-workflow - - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 - with: - egress-policy: audit - - - name: Read PR Number - id: pr-number - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ - owner: context.repo.owner, - repo: context.repo.repo, - run_id: context.payload.workflow_run.id, - }); - const [artifact] = allArtifacts.data.artifacts.filter(artifact => artifact.name.startsWith('pr_number-')) - if (!artifact) { - throw new Error('No PR Number artifact available') - } - - const prNumber = artifact.name.slice('pr_number-'.length) - core.setOutput('pr-number', prNumber); - - - uses: backstage/actions/re-review@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 - with: - app-id: ${{ secrets.BACKSTAGE_GOALIE_APPLICATION_ID }} - private-key: ${{ secrets.BACKSTAGE_GOALIE_PRIVATE_KEY }} - installation-id: ${{ secrets.BACKSTAGE_GOALIE_INSTALLATION_ID }} - project-id: PVT_kwDOBFKqdc02LQ - issue-number: ${{ steps.pr-number.outputs.pr-number }} diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml deleted file mode 100644 index 36988f7d07..0000000000 --- a/.github/workflows/pr.yaml +++ /dev/null @@ -1,34 +0,0 @@ -name: PR -on: - pull_request_target: - types: - - opened - - synchronize - - reopened - - closed - issue_comment: - types: - - created - -jobs: - sync: - runs-on: ubuntu-latest - - # Avoid running on issue comments - if: github.repository == 'backstage/backstage' && ( github.event.pull_request || github.event.issue.pull_request ) - steps: - - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 - with: - egress-policy: audit - - - name: PR sync - uses: backstage/actions/pr-sync@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 - with: - github-token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} - app-id: ${{ secrets.BACKSTAGE_GOALIE_APPLICATION_ID }} - private-key: ${{ secrets.BACKSTAGE_GOALIE_PRIVATE_KEY }} - installation-id: ${{ secrets.BACKSTAGE_GOALIE_INSTALLATION_ID }} - project-id: PVT_kwDOBFKqdc02LQ - auto-assign: false - owning-teams: '@backstage/techdocs-core' diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 077eb2d856..9e76652668 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -29,12 +29,12 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - name: 'Checkout code' - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false @@ -67,6 +67,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@f47c8e6a9bd05ef3ee422fc8d8663be7fe4bdc61 # v3.31.8 + uses: github/codeql-action/upload-sarif@2588666de8825e1e9dc4e2329a4c985457d55b32 # v3.32.1 with: sarif_file: results.sarif diff --git a/.github/workflows/sync_canon.yml b/.github/workflows/sync_bui-docs.yml similarity index 76% rename from .github/workflows/sync_canon.yml rename to .github/workflows/sync_bui-docs.yml index 9da6c80b98..6acdc48cc7 100644 --- a/.github/workflows/sync_canon.yml +++ b/.github/workflows/sync_bui-docs.yml @@ -8,26 +8,26 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - name: Checkout - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Use Node.js 22.x - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + uses: backstage/actions/yarn-install@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: cache-prefix: ${{ runner.os }}-v22.x - name: Checkout backstage/docs-ui - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: repository: backstage/docs-ui path: bui-external-docs diff --git a/.github/workflows/sync_code-formatting.yml b/.github/workflows/sync_code-formatting.yml index 9719a34886..fb82722b71 100644 --- a/.github/workflows/sync_code-formatting.yml +++ b/.github/workflows/sync_code-formatting.yml @@ -10,22 +10,22 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: # Fetch changes to previous commit - required for 'only_changed' in Prettier action fetch-depth: 0 - name: use node.js ${{ matrix.node-version }} - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + uses: backstage/actions/yarn-install@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/sync_dependabot-changesets.yml b/.github/workflows/sync_dependabot-changesets.yml index 9e894631cc..fb51949fd1 100644 --- a/.github/workflows/sync_dependabot-changesets.yml +++ b/.github/workflows/sync_dependabot-changesets.yml @@ -11,12 +11,12 @@ jobs: if: github.actor == 'dependabot[bot]' && github.repository == 'backstage/backstage' steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - name: Checkout - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 2 ref: ${{ github.head_ref }} diff --git a/.github/workflows/sync_patch-release.yml b/.github/workflows/sync_patch-release.yml index bdf93aa8a0..e126fe2ab9 100644 --- a/.github/workflows/sync_patch-release.yml +++ b/.github/workflows/sync_patch-release.yml @@ -5,11 +5,6 @@ on: - master paths: - '.patches/**' - pull_request: - branches: - - master - paths: - - '.patches/**' concurrency: group: sync-patch-release @@ -25,19 +20,19 @@ jobs: pull-requests: write steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - name: Checkout - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 20000 fetch-tags: true token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} - name: Use Node.js 22.x - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth diff --git a/.github/workflows/sync_pull-requests-trigger.yml b/.github/workflows/sync_pull-requests-trigger.yml new file mode 100644 index 0000000000..152837b811 --- /dev/null +++ b/.github/workflows/sync_pull-requests-trigger.yml @@ -0,0 +1,51 @@ +name: Sync Pull Requests Trigger + +on: + pull_request_target: + types: + - opened + - closed + - reopened + - synchronize + - labeled + - unlabeled + - ready_for_review + - converted_to_draft + pull_request_review: + types: [submitted, dismissed] + issue_comment: + types: [created] + +jobs: + trigger: + if: > + github.repository == 'backstage/backstage' && + github.event.sender.type != 'Bot' && + (github.event.pull_request || github.event.issue.pull_request) + runs-on: ubuntu-latest + steps: + - name: Harden Runner + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 + with: + egress-policy: audit + + - name: Save PR context + env: + PR_NUMBER: ${{ github.event.pull_request.number || github.event.issue.number }} + LABEL_ADDED: ${{ github.event.action == 'labeled' && github.event.label.name || '' }} + REVIEW_STATE: ${{ github.event.review.state }} + ACTOR: ${{ github.actor }} + ACTION: ${{ github.event.action }} + run: | + mkdir -p ./context + echo "$PR_NUMBER" > ./context/pr-number + echo "$LABEL_ADDED" > ./context/label-added + echo "$REVIEW_STATE" > ./context/review-state + echo "$ACTOR" > ./context/actor + echo "$ACTION" > ./context/action + + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: pr-context + path: context/ + overwrite: true diff --git a/.github/workflows/sync_pull-requests.yml b/.github/workflows/sync_pull-requests.yml new file mode 100644 index 0000000000..7868415af5 --- /dev/null +++ b/.github/workflows/sync_pull-requests.yml @@ -0,0 +1,70 @@ +name: Sync Pull Requests + +on: + workflow_run: + workflows: ['Sync Pull Requests Trigger', 'CI', 'E2E Linux'] + types: + - completed + +jobs: + run: + runs-on: ubuntu-latest + # Only run on the trigger workflow, or if the source workflow was triggered by a pull request + if: > + github.event.workflow_run.name == 'Sync Pull Requests Trigger' || + github.event.workflow_run.event == 'pull_request' + steps: + - name: Harden Runner + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 + with: + egress-policy: audit + + - name: Download PR context + id: download + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + continue-on-error: true + with: + name: pr-context + path: ./context + github-token: ${{ secrets.GITHUB_TOKEN }} + run-id: ${{ github.event.workflow_run.id }} + + - name: Read context + if: steps.download.outcome == 'success' + id: context + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 + with: + script: | + const fs = require('fs'); + function read(path, fallback) { + try { return fs.readFileSync(path, 'utf8').trim(); } + catch { return fallback; } + } + core.setOutput('pr-number', read('./context/pr-number', '')); + core.setOutput('label-added', read('./context/label-added', '')); + core.setOutput('review-state', read('./context/review-state', '')); + core.setOutput('actor', read('./context/actor', '')); + core.setOutput('action', read('./context/action', 'synchronize')); + + - name: Backstage PR automation + if: steps.context.outputs.pr-number + uses: backstage/actions/pr-automation@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 + with: + app-id: ${{ secrets.BACKSTAGE_GOALIE_APPLICATION_ID }} + private-key: ${{ secrets.BACKSTAGE_GOALIE_PRIVATE_KEY }} + installation-id: ${{ secrets.BACKSTAGE_GOALIE_INSTALLATION_ID }} + project-owner: backstage + project-number: '14' + pr-number: ${{ steps.context.outputs.pr-number }} + label-added: ${{ steps.context.outputs.label-added }} + review-state: ${{ steps.context.outputs.review-state }} + actor: ${{ steps.context.outputs.actor }} + action: ${{ steps.context.outputs.action }} + required-checks: | + DCO + E2E Linux 22.x + E2E Linux 24.x + Test 22.x + Test 24.x + Verify 22.x + Verify 24.x diff --git a/.github/workflows/sync_release-manifest.yml b/.github/workflows/sync_release-manifest.yml index 7452505a22..86ec13f487 100644 --- a/.github/workflows/sync_release-manifest.yml +++ b/.github/workflows/sync_release-manifest.yml @@ -8,24 +8,24 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - name: Checkout - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: # 'v' prefix is added here for the tag, we keep it out of the manifest logic ref: v${{ github.event.client_payload.version }} - name: Use Node.js 22.x - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + uses: backstage/actions/yarn-install@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: cache-prefix: ${{ runner.os }}-v22.x @@ -35,7 +35,7 @@ jobs: # Checkout backstage/versions into /backstage/versions, which is where store the output - name: Checkout versions - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: repository: backstage/versions path: versions diff --git a/.github/workflows/sync_renovate-changesets.yml b/.github/workflows/sync_renovate-changesets.yml index 07f2e24697..8575cab760 100644 --- a/.github/workflows/sync_renovate-changesets.yml +++ b/.github/workflows/sync_renovate-changesets.yml @@ -11,12 +11,12 @@ jobs: if: github.actor == 'renovate[bot]' && github.repository == 'backstage/backstage' steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - name: Checkout - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 2 ref: ${{ github.head_ref }} diff --git a/.github/workflows/sync_snyk-github-issues.yml b/.github/workflows/sync_snyk-github-issues.yml index 97f7e8ed14..34d73e1043 100644 --- a/.github/workflows/sync_snyk-github-issues.yml +++ b/.github/workflows/sync_snyk-github-issues.yml @@ -12,19 +12,19 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Use Node.js 22.x - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + uses: backstage/actions/yarn-install@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: cache-prefix: ${{ runner.os }}-v22.x diff --git a/.github/workflows/sync_snyk-monitor.yml b/.github/workflows/sync_snyk-monitor.yml index 632d03c35d..6b91c1b9dd 100644 --- a/.github/workflows/sync_snyk-monitor.yml +++ b/.github/workflows/sync_snyk-monitor.yml @@ -25,11 +25,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Monitor and Synchronize Snyk Policies uses: snyk/actions/node@9adf32b1121593767fc3c057af55b55db032dc04 # master with: @@ -58,6 +58,6 @@ jobs: SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }} NODE_OPTIONS: --max-old-space-size=7168 - name: Upload Snyk report - uses: github/codeql-action/upload-sarif@f47c8e6a9bd05ef3ee422fc8d8663be7fe4bdc61 # v3.31.8 + uses: github/codeql-action/upload-sarif@2588666de8825e1e9dc4e2329a4c985457d55b32 # v3.32.1 with: sarif_file: snyk.sarif diff --git a/.github/workflows/sync_version-packages.yml b/.github/workflows/sync_version-packages.yml index 683d527e45..7df18100b0 100644 --- a/.github/workflows/sync_version-packages.yml +++ b/.github/workflows/sync_version-packages.yml @@ -13,20 +13,24 @@ jobs: name: Create Changeset PR runs-on: ubuntu-latest + env: + CI: true + NODE_OPTIONS: --max-old-space-size=8192 + steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 20000 fetch-tags: true token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }} - name: Use Node.js 22.x - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth diff --git a/.github/workflows/verify_accessibility-noop.yml b/.github/workflows/verify_accessibility-noop.yml index ee696ebc7f..51caba5acd 100644 --- a/.github/workflows/verify_accessibility-noop.yml +++ b/.github/workflows/verify_accessibility-noop.yml @@ -26,7 +26,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit diff --git a/.github/workflows/verify_accessibility.yml b/.github/workflows/verify_accessibility.yml index 82d26ca510..033d325313 100644 --- a/.github/workflows/verify_accessibility.yml +++ b/.github/workflows/verify_accessibility.yml @@ -20,17 +20,17 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Use Node.js 22.x - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 22.x - name: yarn install - uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + uses: backstage/actions/yarn-install@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: cache-prefix: ${{ runner.os }}-v22.x - name: run Lighthouse CI diff --git a/.github/workflows/verify_chromatic-noop.yml b/.github/workflows/verify_chromatic-noop.yml index 35015def52..cb4c96902a 100644 --- a/.github/workflows/verify_chromatic-noop.yml +++ b/.github/workflows/verify_chromatic-noop.yml @@ -20,7 +20,7 @@ jobs: name: Chromatic steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit diff --git a/.github/workflows/verify_chromatic.yml b/.github/workflows/verify_chromatic.yml index a9d83b01e3..c84aa692ca 100644 --- a/.github/workflows/verify_chromatic.yml +++ b/.github/workflows/verify_chromatic.yml @@ -24,23 +24,23 @@ jobs: name: Chromatic steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - name: Checkout code - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 10000 # Required to retrieve git history - name: Use node.js ${{ matrix.node-version }} - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: Install dependencies - uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + uses: backstage/actions/yarn-install@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/verify_codeql.yml b/.github/workflows/verify_codeql.yml index 5d976f8583..fd531c2be8 100644 --- a/.github/workflows/verify_codeql.yml +++ b/.github/workflows/verify_codeql.yml @@ -42,12 +42,12 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - name: Checkout repository - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: # We must fetch at least the immediate parents so that if this is # a pull request then we can checkout the head. @@ -55,7 +55,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@f47c8e6a9bd05ef3ee422fc8d8663be7fe4bdc61 # v3.31.8 + uses: github/codeql-action/init@2588666de8825e1e9dc4e2329a4c985457d55b32 # v3.32.1 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -66,7 +66,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@f47c8e6a9bd05ef3ee422fc8d8663be7fe4bdc61 # v3.31.8 + uses: github/codeql-action/autobuild@2588666de8825e1e9dc4e2329a4c985457d55b32 # v3.32.1 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -80,4 +80,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@f47c8e6a9bd05ef3ee422fc8d8663be7fe4bdc61 # v3.31.8 + uses: github/codeql-action/analyze@2588666de8825e1e9dc4e2329a4c985457d55b32 # v3.32.1 diff --git a/.github/workflows/verify_docs-quality.yml b/.github/workflows/verify_docs-quality.yml index 8810f05a16..af42f25390 100644 --- a/.github/workflows/verify_docs-quality.yml +++ b/.github/workflows/verify_docs-quality.yml @@ -12,11 +12,11 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 # Vale does not support file excludes, so we use the script to generate a list of files instead # The action also does not allow args or a local config file to be passed in, so the files array diff --git a/.github/workflows/verify_e2e-linux-noop.yml b/.github/workflows/verify_e2e-linux-noop.yml index 152f4cc2c0..38ee55f72c 100644 --- a/.github/workflows/verify_e2e-linux-noop.yml +++ b/.github/workflows/verify_e2e-linux-noop.yml @@ -29,7 +29,7 @@ jobs: name: E2E Linux ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-linux.yml b/.github/workflows/verify_e2e-linux.yml index 436995ddc2..5a5d637a9e 100644 --- a/.github/workflows/verify_e2e-linux.yml +++ b/.github/workflows/verify_e2e-linux.yml @@ -43,11 +43,23 @@ jobs: name: E2E Linux ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + # Store the PR number for the Sync Pull Requests workflow + - name: Save PR context + if: matrix.node-version == '22.x' && github.event_name == 'pull_request' + run: | + mkdir -p ./context + echo "${{ github.event.pull_request.number }}" > ./context/pr-number + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + if: matrix.node-version == '22.x' && github.event_name == 'pull_request' + with: + name: pr-context + path: context/ + + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Configure Git run: | @@ -55,12 +67,12 @@ jobs: git config --global user.name 'GitHub e2e user' - name: use node.js ${{ matrix.node-version }} - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + uses: backstage/actions/yarn-install@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/verify_e2e-techdocs.yml b/.github/workflows/verify_e2e-techdocs.yml index 07c751e098..45b713aab5 100644 --- a/.github/workflows/verify_e2e-techdocs.yml +++ b/.github/workflows/verify_e2e-techdocs.yml @@ -32,21 +32,21 @@ jobs: name: Techdocs steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: '3.9' - name: use node.js ${{ matrix.node-version }} - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: ${{ matrix.node-version }} - name: yarn install - uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + uses: backstage/actions/yarn-install@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/verify_e2e-windows-noop.yml b/.github/workflows/verify_e2e-windows-noop.yml index f04748a950..4759555905 100644 --- a/.github/workflows/verify_e2e-windows-noop.yml +++ b/.github/workflows/verify_e2e-windows-noop.yml @@ -25,7 +25,7 @@ jobs: name: E2E Windows ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit diff --git a/.github/workflows/verify_e2e-windows.yml b/.github/workflows/verify_e2e-windows.yml index f63eb5d61b..c9e2246d64 100644 --- a/.github/workflows/verify_e2e-windows.yml +++ b/.github/workflows/verify_e2e-windows.yml @@ -33,7 +33,7 @@ jobs: name: E2E Windows ${{ matrix.node-version }} steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit @@ -44,7 +44,7 @@ jobs: git config --global core.autocrlf false git config --global core.eol lf - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Configure Git run: | @@ -52,13 +52,13 @@ jobs: git config --global user.name 'GitHub e2e user' - name: use node.js ${{ matrix.node-version }} - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: ${{ matrix.node-version }} registry-url: https://registry.npmjs.org/ # Needed for auth - name: setup python - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: '3.10' @@ -80,7 +80,7 @@ jobs: uses: browser-actions/setup-chrome@803ef6dfb4fdf22089c9563225d95e4a515820a0 # latest - name: yarn install - uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + uses: backstage/actions/yarn-install@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: cache-prefix: ${{ runner.os }}-v${{ matrix.node-version }} diff --git a/.github/workflows/verify_fossa.yml b/.github/workflows/verify_fossa.yml index 681ac2c07a..84d666f00e 100644 --- a/.github/workflows/verify_fossa.yml +++ b/.github/workflows/verify_fossa.yml @@ -14,12 +14,12 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - name: Checkout - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install Fossa run: "curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install.sh | bash" diff --git a/.github/workflows/verify_microsite-noop.yml b/.github/workflows/verify_microsite-noop.yml index 70686e3bd9..acab96962c 100644 --- a/.github/workflows/verify_microsite-noop.yml +++ b/.github/workflows/verify_microsite-noop.yml @@ -21,7 +21,7 @@ jobs: name: Microsite steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit diff --git a/.github/workflows/verify_microsite.yml b/.github/workflows/verify_microsite.yml index 20a6e705cd..d4441c3ea9 100644 --- a/.github/workflows/verify_microsite.yml +++ b/.github/workflows/verify_microsite.yml @@ -28,7 +28,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit @@ -59,53 +59,42 @@ jobs: result-encoding: string - name: checkout latest release - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: ref: refs/tags/${{ steps.find-release.outputs.result }} - name: Use Node.js 22.x - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + uses: backstage/actions/yarn-install@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: cache-prefix: ${{ runner.os }}-v22.x - - name: build API reference - run: yarn build:api-docs - - - name: upload API reference - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 - with: - name: stable-reference - path: docs/reference/ - if-no-files-found: error - retention-days: 1 - # Use the lower-level cache actions for the success cache, so that we can store the cache even on failed builds - name: restore package-docs cache - uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5 with: path: .cache/package-docs key: ${{ runner.os }}-v${{ matrix.node-version }}-package-docs-stable-${{ github.run_id }} restore-keys: | ${{ runner.os }}-v${{ matrix.node-version }}-package-docs-stable- - - name: build API reference (beta) + - name: build API reference run: yarn backstage-repo-tools package-docs - - name: upload API reference (beta) + - name: upload API reference uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: - name: stable-reference-beta + name: stable-reference path: type-docs/ # Always save success cache even if there were failures, that way it can be used in re-triggered builds - name: save package-docs cache - uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + uses: actions/cache/save@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5 if: always() with: path: .cache/package-docs @@ -137,56 +126,45 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - name: checkout master - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Use Node.js 22.x - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 22.x registry-url: https://registry.npmjs.org/ # Needed for auth - name: yarn install - uses: backstage/actions/yarn-install@b3c1841fd69e1658ac631afafd0fb140a2309024 # v0.6.17 + uses: backstage/actions/yarn-install@c3038aa5576b9cd845ccc518ef854d3660e8cb40 # v0.7.6 with: cache-prefix: ${{ runner.os }}-v22.x - - name: build API reference - run: yarn build:api-docs - - - name: upload API reference - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 - with: - name: next-reference - path: docs/reference/ - if-no-files-found: error - retention-days: 1 - # Use the lower-level cache actions for the success cache, so that we can store the cache even on failed builds - name: restore package-docs cache - uses: actions/cache/restore@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5 with: path: .cache/package-docs key: ${{ runner.os }}-v${{ matrix.node-version }}-package-docs-next-${{ github.run_id }} restore-keys: | ${{ runner.os }}-v${{ matrix.node-version }}-package-docs-next- - - name: build API reference (beta) + - name: build API reference run: yarn backstage-repo-tools package-docs - - name: upload API reference (beta) + - name: upload API reference uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: - name: next-reference-beta + name: next-reference path: type-docs/ # Always save success cache even if there were failures, that way it can be used in re-triggered builds - name: save package-docs cache - uses: actions/cache/save@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 + uses: actions/cache/save@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5 if: always() with: path: .cache/package-docs @@ -234,17 +212,17 @@ jobs: name: Microsite steps: - name: Harden Runner - uses: step-security/harden-runner@df199fb7be9f65074067a9eb93f12bb4c5547cf2 # v2.13.3 + uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2 with: egress-policy: audit - - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Use Node.js 22.x - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 + uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0 with: node-version: 22.x - - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 with: python-version: '3.9' @@ -267,23 +245,31 @@ jobs: - name: verify yarn dependency duplicates run: node scripts/verify-lockfile-duplicates.js - - name: download stable reference - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 - with: - name: stable-reference - path: docs/reference - - name: download stable OpenAPI API docs uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: name: stable-openapi-docs path: docs - - name: grab lastest releases docs + - name: grab latest releases docs run: | git fetch origin master --depth 1 git checkout FETCH_HEAD -- docs/releases + - name: create missing generated file + run: | + mkdir -p docs/reference + cat > docs/reference/index.md < ` in the root of the repository. +Once a patch has been applied and merged, manually delete the corresponding patch file from this directory. The patch script will automatically skip patches that have already been applied to the target branch, so it's safe to re-run the script even if some patches are already present. + ## GitHub Workflow A GitHub workflow automatically keeps a "Patch Release" PR in sync with the patches listed in this directory. When you add, modify, or remove patch files, the workflow will: diff --git a/.patches/create-pr-patch.js b/.patches/create-pr-patch.js index 528d4fc404..381810a6ff 100755 --- a/.patches/create-pr-patch.js +++ b/.patches/create-pr-patch.js @@ -1,7 +1,7 @@ #!/usr/bin/env node -const fs = require('fs'); -const path = require('path'); +const fs = require('node:fs'); +const path = require('node:path'); const prNumber = process.argv[2]; const description = process.argv.slice(3).join(' '); diff --git a/.patches/pr-32149.txt b/.patches/pr-32149.txt deleted file mode 100644 index f7274692bf..0000000000 --- a/.patches/pr-32149.txt +++ /dev/null @@ -1 +0,0 @@ -This release bumps the swc version for es2023/2024 support \ No newline at end of file diff --git a/.patches/pr-32409.txt b/.patches/pr-32409.txt new file mode 100644 index 0000000000..a14d9feb37 --- /dev/null +++ b/.patches/pr-32409.txt @@ -0,0 +1 @@ +Fixes a deprecation warning for Router extension in tests \ No newline at end of file diff --git a/.patches/pr-32428.txt b/.patches/pr-32428.txt new file mode 100644 index 0000000000..77136cf4c8 --- /dev/null +++ b/.patches/pr-32428.txt @@ -0,0 +1 @@ +fix(ui): restore React 17 compatibility for useId \ No newline at end of file diff --git a/.patches/pr-32524.txt b/.patches/pr-32524.txt new file mode 100644 index 0000000000..d5aa035f3f --- /dev/null +++ b/.patches/pr-32524.txt @@ -0,0 +1 @@ +Depend on a version of the zod library that has the version 3 and 4 exports \ No newline at end of file diff --git a/.storybook/main.ts b/.storybook/main.ts index 98f274486f..f891cd9692 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -1,7 +1,7 @@ // This file has been automatically migrated to valid ESM format by Storybook. +import { defineMain } from '@storybook/react-vite/node'; import { fileURLToPath } from 'node:url'; import { createRequire } from 'node:module'; -import type { StorybookConfig } from '@storybook/react-vite'; import { join, dirname, posix } from 'path'; @@ -26,23 +26,21 @@ const allStories = isChromatic ]; const rootPath = '../'; -const storiesSrcMdx = 'src/**/*.mdx'; const storiesSrcGlob = 'src/**/*.stories.@(js|jsx|mjs|ts|tsx)'; const getStoriesPath = (element: string, pattern: string) => posix.join(rootPath, element, pattern); -const stories = allStories.flatMap(element => [ - getStoriesPath(element, storiesSrcMdx), +const stories = allStories.map(element => getStoriesPath(element, storiesSrcGlob), -]); +); // Resolve absolute path of a package. Needed in monorepos. function getAbsolutePath(value: string): any { return dirname(require.resolve(join(value, 'package.json'))); } -const config: StorybookConfig = { +export default defineMain({ stories, addons: [ getAbsolutePath('@storybook/addon-links'), @@ -50,11 +48,16 @@ const config: StorybookConfig = { getAbsolutePath('@storybook/addon-docs'), getAbsolutePath('@storybook/addon-a11y'), getAbsolutePath('@storybook/addon-vitest'), + getAbsolutePath('@storybook/addon-mcp'), ], framework: { name: getAbsolutePath('@storybook/react-vite'), options: {}, }, + features: { + experimentalComponentsManifest: true, + experimentalCodeExamples: true, // optional + }, viteFinal: async (config, { configType }) => { // Add Node.js polyfills for browser compatibility // @@ -130,6 +133,4 @@ const config: StorybookConfig = { return config; }, -}; - -export default config; +}); diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index 9ce26b8cf5..6a0177cafe 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -1,8 +1,12 @@ -import React, { useEffect } from 'react'; +import addonA11y from '@storybook/addon-a11y'; +import addonDocs from '@storybook/addon-docs'; +import addonThemes from '@storybook/addon-themes'; +import addonLinks from '@storybook/addon-links'; +import { definePreview } from '@storybook/react-vite'; +import { useEffect } from 'react'; import { TestApiProvider } from '@backstage/test-utils'; -import { Content, AlertDisplay } from '@backstage/core-components'; +import { AlertDisplay } from '@backstage/core-components'; import { apis } from './support/apis'; -import type { Decorator, Preview } from '@storybook/react-vite'; import { useGlobals } from 'storybook/preview-api'; import { UnifiedThemeProvider, themes } from '@backstage/theme'; import { allModes } from './modes'; @@ -16,7 +20,8 @@ import './storybook.css'; // Custom themes import './themes/spotify.css'; -const preview: Preview = { +export default definePreview({ + tags: ['manifest'], globalTypes: { themeMode: { name: 'Theme Mode', @@ -28,7 +33,6 @@ const preview: Preview = { { value: 'light', icon: 'circlehollow', title: 'Light' }, { value: 'dark', icon: 'circle', title: 'Dark' }, ], - showName: true, dynamicTitle: true, }, }, @@ -42,20 +46,19 @@ const preview: Preview = { { value: 'backstage', title: 'Backstage' }, { value: 'spotify', title: 'Spotify' }, ], - showName: true, dynamicTitle: true, }, }, }, + initialGlobals: { themeMode: 'light', themeName: 'backstage', }, - parameters: { - layout: 'fullscreen', + parameters: { backgrounds: { - disabled: true, + disable: true, }, controls: { @@ -101,7 +104,15 @@ const preview: Preview = { // 'dark spotify': allModes['dark spotify'], }, }, + + a11y: { + // 'todo' - show a11y violations in the test UI only + // 'error' - fail CI on a11y violations + // 'off' - skip a11y checks entirely + test: 'todo', + }, }, + decorators: [ Story => { const [globals] = useGlobals(); @@ -121,10 +132,10 @@ const preview: Preview = { }; }, [selectedTheme, selectedThemeName]); - document.body.style.backgroundColor = 'var(--bui-bg)'; + document.body.style.backgroundColor = 'var(--bui-bg-app)'; const docsStoryElements = document.getElementsByClassName('docs-story'); Array.from(docsStoryElements).forEach(element => { - (element as HTMLElement).style.backgroundColor = 'var(--bui-bg)'; + (element as HTMLElement).style.backgroundColor = 'var(--bui-bg-app)'; }); return ( @@ -132,14 +143,12 @@ const preview: Preview = { {/* @ts-ignore */} - - - + ); }, ], -}; -export default preview; + addons: [addonLinks(), addonThemes(), addonDocs(), addonA11y()], +}); diff --git a/.storybook/storybook.css b/.storybook/storybook.css index e69c4a8eb1..e0f0b68678 100644 --- a/.storybook/storybook.css +++ b/.storybook/storybook.css @@ -5,15 +5,15 @@ --sb-panel-left: 0; --sb-panel-right: 0; --sb-sidebar-border: none; - --sb-sidebar-border-right: 1px solid var(--bui-border); + --sb-sidebar-border-right: 1px solid var(--bui-border-2); --sb-sidebar-bg: #000; --sb-options-border: none; - --sb-options-border-left: 1px solid var(--bui-border); + --sb-options-border-left: 1px solid var(--bui-border-2); --sb-content-padding-inline: 250px; } [data-theme-mode='dark'] { - --sb-sidebar-bg: var(--bui-bg-surface-1); + --sb-sidebar-bg: var(--bui-bg-neutral-1); } [data-theme-name='spotify'] { @@ -24,15 +24,15 @@ --sb-panel-right: 8px; --sb-sidebar-border: none; --sb-sidebar-border-right: none; - --sb-sidebar-bg: var(--bui-bg-surface-1); + --sb-sidebar-bg: var(--bui-bg-neutral-1); --sb-options-border: none; --sb-options-border-left: none; --sb-content-padding-inline: 258px; } [data-theme-name='spotify'][data-theme-mode='light'] { - --sb-sidebar-border: 1px solid var(--bui-border); - --sb-sidebar-border-right: 1px solid var(--bui-border); - --sb-options-border: 1px solid var(--bui-border); - --sb-options-border-left: 1px solid var(--bui-border); + --sb-sidebar-border: 1px solid var(--bui-border-2); + --sb-sidebar-border-right: 1px solid var(--bui-border-2); + --sb-options-border: 1px solid var(--bui-border-2); + --sb-options-border-left: 1px solid var(--bui-border-2); } diff --git a/.storybook/themes/spotify.css b/.storybook/themes/spotify.css index bcb1ded9ff..b72683f53e 100644 --- a/.storybook/themes/spotify.css +++ b/.storybook/themes/spotify.css @@ -174,7 +174,7 @@ } .bui-TableHeader .bui-TableRow { - border-bottom: 1px solid var(--bui-border); + border-bottom: 1px solid var(--bui-border-2); } .bui-TableHead { @@ -216,22 +216,17 @@ } [data-theme-mode='light'][data-theme-name='spotify'] { - --bui-bg: var(--bui-gray-1); - --bui-bg-surface-1: var(--bui-white); - --bui-bg-surface-2: var(--bui-gray-2); --bui-bg-solid: #1ed760; --bui-bg-solid-hover: #3be477; --bui-bg-solid-pressed: #1abc54; - --bui-bg-solid-disabled: var(--bui-gray-2); + --bui-bg-solid-disabled: #0f6c30; --bui-fg-primary: var(--bui-black); - --bui-fg-secondary: var(--bui-gray-7); + --bui-fg-secondary: #757575; --bui-fg-solid: var(--bui-black); + --bui-fg-solid-disabled: #62ab7c; - --bui-border: var(--bui-gray-3); - --bui-border-hover: rgba(0, 0, 0, 0.3); - --bui-border-pressed: rgba(0, 0, 0, 0.5); - --bui-border-disabled: rgba(0, 0, 0, 0.1); + --bui-border-2: #d9d9d9; --bui-border-danger: #f87a7a; --bui-border-warning: #e36d05; --bui-border-success: #53db83; @@ -239,47 +234,36 @@ --bui-ring: rgba(0, 0, 0, 0.2); .bui-HeaderToolbarWrapper { - border: 1px solid var(--bui-border); + border: 1px solid var(--bui-border-2); } .bui-HeaderTabsWrapper { - border: 1px solid var(--bui-border); + border: 1px solid var(--bui-border-2); } } [data-theme-mode='dark'][data-theme-name='spotify'] { - --bui-bg: var(--bui-black); - --bui-bg-surface-1: var(--bui-gray-1); - --bui-bg-surface-2: var(--bui-gray-2); + --bui-bg-app: var(--bui-black); + --bui-bg-solid: #1ed760; --bui-bg-solid-hover: #3be477; --bui-bg-solid-pressed: #1abc54; --bui-bg-solid-disabled: #0f6c30; - --bui-bg-tint: #242424; - --bui-bg-tint-hover: #202020; - --bui-bg-tint-pressed: #292929; - --bui-bg-tint-disabled: rgba(255, 255, 255, 0.8); + --bui-bg-danger: #3b1219; --bui-bg-warning: #302008; --bui-bg-success: #132d21; --bui-fg-primary: var(--bui-white); - --bui-fg-secondary: var(--bui-gray-7); - --bui-fg-link: var(--bui-white); - --bui-fg-link-hover: var(--bui-white); - --bui-fg-disabled: var(--bui-gray-5); + --bui-fg-secondary: #9e9e9e; + --bui-fg-disabled: #575757; --bui-fg-solid: var(--bui-black); - --bui-fg-solid-disabled: #083618; - --bui-fg-tint: var(--bui-white); - --bui-fg-tint-disabled: var(--bui-gray-5); + --bui-fg-solid-disabled: #072f15; --bui-fg-danger: #e22b2b; --bui-fg-warning: #e36d05; --bui-fg-success: #1db954; - --bui-border: var(--bui-gray-3); - --bui-border-hover: rgba(255, 255, 255, 0.4); - --bui-border-pressed: rgba(255, 255, 255, 0.5); - --bui-border-disabled: rgba(255, 255, 255, 0.2); + --bui-border-2: #373737; --bui-border-danger: #f87a7a; --bui-border-warning: #e36d05; --bui-border-success: #53db83; diff --git a/ADOPTERS.md b/ADOPTERS.md index 2b3cad0b25..9a0e2fb0fd 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -91,7 +91,7 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [HP Inc](https://www.hp.com) | [Damon Kaswell](https://github.com/dekoding) | DevEx engagement hub (dev portal: docs, standards, Q&A) and extensive assets catalog (APIs, services, code, data, etc.) for the pan-HP internal developer community. | | [VMware](https://www.vmware.com) | [Waldir Montoya](https://github.com/waldirmontoya25), [Kris Applegate](https://github.com/krisapplegate), [Jamie Klassen](https://github.com/jamieklassen) | Part of [Tanzu Application Platform](https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/index.html) offering; internal developer portal | | [Ualá](https://www.uala.com.ar/) | [Santiago Bernal](https://github.com/sabernal) | Initial work being done to centralize documentation for all our microservices and APIs, as well as scaffolding new services and tracking code quality | -| [IKEA IT AB](https://www.ingka.com) | [@bjornramberg](https://github.com/bjornramberg), [@supriyachitale](https://github.com/supriyachitale) | Supporting engineers at scale with self serve access and connecting the dots of our engineering platform and services, enabling product teams to move faster and go further, and unleashing innovation, reuse and co-creation across the organisation. | +| [IKEA Retail](https://www.ingka.com) | [Björn Ramberg](https://github.com/bjornramberg), [Martin Norin](https://github.com/martin-norin) | Centralized developer portal, supporting the internal engineering community with self serve access, documentation, templates, catalog and more. | | [Invitae](https://www.invitae.com/en) | [@ryan-hanchett](https://github.com/ryan-hanchett), [@gmandler42](https://github.com/gmandler42) | Centralized Developer Experience portal, putting all of our tooling behind a single pane of glass and creating a living service catalog. | | [Fortum](https://www.fortum.com/) | [@brunoamaroalmeida](https://github.com/brunoamaroalmeida), [@dhaval-vithalani](https://github.com/dhaval-vithalani), [@sunilkumarmohanty](https://github.com/sunilkumarmohanty) | A central portal containing information about our applications, services, processes and other software assets to be used by Fortum software engineering community. | | [Procore](https://www.procore.com/jobs/engineering) | [@shayon](https://github.com/Shayon), [@kurtaking](https://github.com/kurtaking), [@pc-bob](https://github.com/pc-bob) | Developer portal - centralized software catalog and templates to enable self serve and reduce cognitive load. | @@ -288,3 +288,5 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/ | [Sophotech](https://sopho.tech) | [@archy-rock3t-cloud](https://github.com/archy-rock3t-cloud), [Artem Muterko](mailto:artem@sopho.tech) | Custom Developer Platform based on Backstage, providing a service catalog, infrastructure templates, and integrated tooling to give developers a self-service experience. | | [Swiss Mobiliar Insurance Company Ltd.](https://www.mobiliar.ch/) | [Patrick Wyler](mailto:patrick.wyler@mobiliar.ch) and [Beat Winistörfer](mailto:beat.winistoerfer@mobiliar.ch) | The portal provides a unified interface for accessing all relevant DevOps information previously scattered across various locations, enhancing accessibility and clarity for all IT employees. It relies on an internal graph database that enhances the Backstage software catalog with many additional elements. Significant effort has been invested in the visual representation of information through graphs and diagrams, facilitating analysis and improving the understanding of dependencies. | | [DB Systel GmbH](https://www.dbsystel.de/dbsystel-en/) | [DB Systel GmbH](https://github.com/dbsystel) | Deutsche Bahn's Internal Developer Portal leverages Backstage and Crossplane.io to deliver a fully GitOps-driven onboarding experience for engineering teams across the company. Our Scaffolder ecosystem accelerates platform setup (Artifactory, GitLab, OpenShift), service bootstrapping, automated testing, AI-ready backends, and modern frontend development. We also make heavy use of custom catalog modules and frontend plugins that support developers in checking their provisioned resources or security and compliance of their code. | +| [Danske StatsBaner (DSB)](https://www.dsb.dk/om-dsb/job-og-karriere/) | [Isaac Livingston](mailto:isjl@dsb.dk), [Paula-Catalina Curca](mailto:PACU@DSB.DK), [Muhammad Salman Khan](mailto:MUSK@DSB.DK) | DSB's portal is a central catalog of all our microservices, APIs, and systems. Developers can easily create new components with templates that run in our CNCF based developer platform | +| [NN Group](https://www.nn-group.com/) | [Flavia Naezer (Product Owner)](mailto:flavia.naezer@nn-group.com), [Vijai Ramcharan (Principal Engineer)](mailto:vijai.ramcharan@nn-group.com) | Our Backstage powered IDP supports engineers and other makers and shapers in our large financial enterprise with the Software Catalog, a Store for infrastructure, TechDocs and Portal Platform with mini App-Store.| \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ba40be86c8..adf04c48e2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,6 +17,7 @@ If you need help, just jump into our [Discord chatroom](https://discord.gg/backs - [Accessibility](#accessibility) - [Get Started!](#get-started) - [Coding Guidelines](#coding-guidelines) +- [AI Use Policy and Guidelines](#ai-use-policy-and-guidelines) - [Documentation Guidelines](#documentation-guidelines) - [Package Scripts](#package-scripts) - [Local configuration](#local-configuration) @@ -128,6 +129,37 @@ If there are any updates in `markdown` file please make sure to run `yarn run li The Backstage development environment does not require any specific editor, but it is intended to be used with one that has built-in linting and type-checking. The development server does not include any checks by default, but they can be enabled using the `--check` flag. Note that using the flag may consume more system resources and slow things down. +## AI Use Policy and Guidelines + +Our goal in the Backstage project is to develop an excellent software system. This requires careful attention to detail in every change we integrate. Maintainer time and attention is very limited, so it's important that changes you ask us to review represent your _best_ work. + +You are encouraged to use tools that help you write good code, including AI tools. However, you always need to understand and explain the changes you're proposing to make, whether or not you used an LLM as part of your process to produce them. The answer to "Why did you make change X?" should never be "I'm not sure. The AI did it." + +**Do not submit an AI-generated PR you haven't personally understood and tested**, as this wastes maintainers' time. PRs that appear to violate this guideline will be closed without review. If you do submit a largely AI-generated PR, clearly mark it as such in the description—maintainers may still close it without further review if it does not seem worthwhile. + +### Using AI as a Coding Assistant + +1. Don't skip **becoming familiar with the part of the codebase** you're working on. This will let you write better prompts and validate their output if you use an LLM. Code assistants can be a useful search engine/discovery tool in this process, but don't trust claims they make about how Backstage works. LLMs are often wrong, even about details that are clearly answered in the [Backstage documentation](https://backstage.io/docs). +2. Split up your changes into **coherent commits**, even if an LLM generates them all in one go. See our section on [Creating Changesets](#creating-changesets) for guidance on documenting your changes. +3. Don't simply ask an LLM to add **code comments**, as it will likely produce a bunch of text that unnecessarily explains what's already clear from the code. If using an LLM to generate comments, be really specific in your request, demand succinctness, and carefully edit the result. + +### Using AI for Communication + +Backstage contributors are expected to communicate with intention, to avoid wasting maintainer time with long, sloppy writing. We strongly prefer clear and concise communication about points that actually require discussion over long AI-generated comments. + +When you use an LLM to write a message for you, it remains **your responsibility** to read through the whole thing and make sure that it makes sense to you and represents your ideas concisely. A good rule of thumb is that if you can't make yourself carefully read some LLM output that you generated, nobody else wants to read it either. + +Here are some concrete guidelines for using LLMs as part of your communication workflows: + +1. When writing a pull request description, **do not include anything that's obvious** from looking at your changes directly (e.g., files changed, functions updated, etc.). Instead, focus on the _why_ behind your changes. Don't ask an LLM to generate a PR description on your behalf based on your code changes, as it will simply regurgitate the information that's already there. +2. Similarly, when responding to a pull request comment, **explain _your_ reasoning**. Don't prompt an LLM to re-describe what can already be seen from the code. +3. Verify that **everything you write is accurate**, whether or not an LLM generated any part of it. Backstage's maintainers will be unable to review your contributions if you misrepresent your work (e.g., wrongly describing your code changes, their effect, or your testing process). +4. Complete all parts of the **PR description template**, including screenshots and the checklist. Don't simply overwrite the template with LLM output. +5. **Clarity and succinctness** are much more important than perfect grammar, so you shouldn't feel obliged to pass your writing through an LLM. If you do ask an LLM to clean up your writing style, be sure it does _not_ make it longer in the process. Demand succinctness in your prompt. +6. Quoting an LLM answer is usually less helpful than linking to **relevant primary sources**, like source code, [Backstage documentation](https://backstage.io/docs), or reference materials. If you do need to quote an LLM answer in a discussion, clearly distinguish LLM output from your own thoughts. + +If you have questions about AI usage or need help, feel free to ask in [Discord](https://discord.gg/backstage-687207715902193673). + ## Documentation Guidelines Contributing to the docs is one of the best ways to start getting involved with Backstage. The documentation site is often the first stop for anyone using or exploring Backstage, so even small improvements can have a big impact! @@ -349,7 +381,7 @@ Or from the Settings UI look for the "Git: Always Sign Off" setting and check th ## API Reports -Backstage uses [API Extractor](https://api-extractor.com/) and TSDoc comments to generate API Reports in Markdown format. These reports are what drive the [API Reference documentation](https://backstage.io/docs/reference/). What this means is that if you are making changes to the API or adding a new plugin then you will need either generate a new API Report or update an existing API Report. If you don't do this the CI build will fail when you create your Pull Request. +Backstage uses [API Extractor](https://api-extractor.com/) and TSDoc comments to generate API Reports in Markdown format. What this means is that if you are making changes to the API or adding a new plugin then you will need either generate a new API Report or update an existing API Report. If you don't do this the CI build will fail when you create your Pull Request. There are two ways you can do this: @@ -400,7 +432,7 @@ Once you've submitted a Pull Request (PR) the various bots will come out and do - checking for commits for their DCO (Developer Certificate of Origin) - kick off the various CI builds -Once these steps are completed, it's just a matter of being patient. As the reviewers have time, they will begin reviewing your PR. When the review process begins, there may be a few layers to this, but the general rule is that you need approval from one of the core maintainers and one from the specific area impacted by your PR. You may also have someone from the community review your changes. This can really help speed things up as they may catch some early items making the review for the maintainers simpler. Once you have the two (2) approvals, it's ready to be merged, a task that is also performed by the maintainers. +Once these steps are completed, it's just a matter of being patient. Reviews are coordinated by maintainers and reviewers based on project area ownership. Prioritization is driven by a number of different factors, but some important ones are size (smaller get higher priority) and alignment with current roadmap priorities. Timely responses to review comments also help keep the pull request moving faster. You may also have someone from the reviewers group review your pull request and request changes. Approval from a member of the reviewers group will greatly increase the priority of your pull request. ### Review Tips diff --git a/LABELS.md b/LABELS.md index f1af06d4fa..cd2d19e6d5 100644 --- a/LABELS.md +++ b/LABELS.md @@ -97,6 +97,27 @@ These labels indicate a workflow status for the owners. - `stale` - The issue or pull request has not seen any activity for a while and will be closed if no further activity is seen. - `no stale` - The issue or pull request should not be closed due to inactivity. +## Pull Request Labels + +The following labels indicate the status of a pull request: + +- `waiting-for:review` - The pull request needs a review and will be visible in the review queue unless already assigned an owner. +- `waiting-for:author` - Changes have been requested by a reviewer and the pull request will not receive a review until the changes are made. A comment made on the pull request by the author will also push it back into the review queue. +- `waiting-for:decision` - The pull request has been marked as more complex and needs a decision from the owners. Progress can still be made and discussion can continue, but expect the review to take longer. These pull requests are often good candidates to bring to a [SIG](https://github.com/backstage/community/tree/main/sigs) meeting. +- `waiting-for:merge` - The pull request has been approved and is awaiting merge. If you have write access and authored the pull request you can merge it yourself. If you do not have access to merge and the pull request has not been merged within a day of approval, please notify the assigned reviewer. + +The following labels indicate the size of a pull request: + +- `size:tiny` - Tiny pull requests receive a higher priority for reviews. +- `size:small` - Small pull requests receive a slightly higher priority for reviews. +- `size:medium` - Medium-sized pull requests receive no change in priority for reviews. +- `size:large` - Large pull requests receive a slightly lower priority for reviews. +- `size:huge` - Huge pull requests receive a lower priority for reviews. + +The following additional labels also apply to pull requests: + +- `reviewer-approved` - The pull request has been approved by a member of the reviewers group. This pull request receives a much higher priority for reviews. + ## Common Issue Filters This is a collection of common issue filters that can help you find issues that you are looking for or that match your interests and skills. @@ -106,7 +127,7 @@ This is a collection of common issue filters that can help you find issues that These issues are ideal for new contributors to get started and don't require much familiarity with Backstage. - [Backend](https://github.com/backstage/backstage/issues?q=is%3Aopen%20is%3Aissue%20label%3A%22good%20first%20issue%22%20label%3A%22domain%3Abackend%22%20) -- [Documentation](https://github.com/backstage/backstage/issues?q=is%3Aopen%20is%3Aissue%20label%3A%22good%20first%20issue%22%20label%3A%22domain%3Adocs%22%20) +- [Documentation](https://github.com/backstage/backstage/issues?q=is%3Aopen%20is%3Aissue%20label%3A%22good%20first%20issue%22%20label%3A%22area%3Adocumentation%22) - [Tooling](https://github.com/backstage/backstage/issues?q=is%3Aopen%20is%3Aissue%20label%3A%22good%20first%20issue%22%20label%3A%22domain%3Atooling%22%20) - [Web](https://github.com/backstage/backstage/issues?q=is%3Aopen%20is%3Aissue%20label%3A%22good%20first%20issue%22%20label%3A%22domain%3Aweb%22%20) @@ -115,7 +136,7 @@ These issues are ideal for new contributors to get started and don't require muc These issues generally require some familiarity with Backstage and the codebase, and are either open for or require contributions from the community. - [Backend]() -- [Documentation]() +- [Documentation]() - [Tooling]() - [Web]() diff --git a/OWNERS.md b/OWNERS.md index 764237d9c1..e09a0a24c3 100644 --- a/OWNERS.md +++ b/OWNERS.md @@ -19,7 +19,7 @@ These are the separate project areas of Backstage, each with their own project a ### Auth -Team: @backstage/auth-maintainers +Team: @backstage/auth-maintainers — [Review board](https://github.com/orgs/backstage/projects/14/views/1?filterQuery=no%3Aassignee+reviewers%3Aauth-maintainers) Scope: The Backstage auth plugin and modules, as well as client-side implementations. @@ -34,7 +34,7 @@ Scope: The Backstage auth plugin and modules, as well as client-side implementat ### Catalog -Team: @backstage/catalog-maintainers +Team: @backstage/catalog-maintainers — [Review board](https://github.com/orgs/backstage/projects/14/views/1?filterQuery=no%3Aassignee+reviewers%3Acatalog-maintainers) Scope: The catalog plugin and catalog model @@ -63,7 +63,7 @@ Scope: Tooling and Community Repo Maintainers for the Backstage [Community Plugi ### Design System -Team: @backstage/design-system-maintainers +Team: @backstage/design-system-maintainers — [Review board](https://github.com/orgs/backstage/projects/14/views/1?filterQuery=no%3Aassignee+reviewers%3Adesign-system-maintainers) Scope: The Backstage design system, component library, as well as surrounding tooling such as Storybook. @@ -71,10 +71,11 @@ Scope: The Backstage design system, component library, as well as surrounding to | ------------------- | ------------ | ------------- | --------------------------------------------- | ------------- | | Charles de Dreuille | Spotify | | [cdedreuille](https://github.com/cdedreuille) | `cdedreuille` | | Patrik Oldsberg | Spotify | Cubic Belugas | [Rugvip](https://github.com/Rugvip) | `Rugvip` | +| Johan Persson | Spotify | | [Naycon](https://github.com/Naycon) | `naycon` | ### Documentation -Team: @backstage/documentation-maintainers +Team: @backstage/documentation-maintainers — [Review board](https://github.com/orgs/backstage/projects/14/views/1?filterQuery=no%3Aassignee+reviewers%3Adocumentation-maintainers) Scope: The Backstage Documentation and Microsite, excluding the plugins listing @@ -86,7 +87,7 @@ Scope: The Backstage Documentation and Microsite, excluding the plugins listing ### Framework -Team: @backstage/framework-maintainers +Team: @backstage/framework-maintainers — [Review board](https://github.com/orgs/backstage/projects/14/views/1?filterQuery=no%3Aassignee+reviewers%3Aframework-maintainers) Scope: The Backstage core framework, including all revisions of the frontend and backend systems, as well as the App plugin. @@ -113,7 +114,7 @@ Scope: The Backstage [Helm Chart(s)](https://github.com/backstage/charts). ### Home -Team: @backstage/home-maintainers +Team: @backstage/home-maintainers — [Review board](https://github.com/orgs/backstage/projects/14/views/1?filterQuery=no%3Aassignee+reviewers%3Ahome-maintainers) Scope: The Backstage home page and information architecture @@ -128,7 +129,7 @@ Scope: The Backstage home page and information architecture ### Kubernetes -Team: @backstage/kubernetes-maintainers +Team: @backstage/kubernetes-maintainers — [Review board](https://github.com/orgs/backstage/projects/14/views/1?filterQuery=no%3Aassignee+reviewers%3Akubernetes-maintainers) Scope: The Kubernetes plugin and the base it provides for other plugins to build upon. @@ -138,7 +139,7 @@ Scope: The Kubernetes plugin and the base it provides for other plugins to build ### Operations -Team: @backstage/operations-maintainers +Team: @backstage/operations-maintainers — [Review board](https://github.com/orgs/backstage/projects/14/views/1?filterQuery=no%3Aassignee+reviewers%3Aoperations-maintainers) Scope: The management and operation of the main Backstage repository and release process, along with the surrounding tooling. @@ -153,7 +154,7 @@ Scope: The management and operation of the main Backstage repository and release ### Permission Framework -Team: @backstage/permission-maintainers +Team: @backstage/permission-maintainers — [Review board](https://github.com/orgs/backstage/projects/14/views/1?filterQuery=no%3Aassignee+reviewers%3Apermission-maintainers) Scope: The Permission Framework and plugins integrating with the permission framework @@ -168,7 +169,7 @@ Scope: The Permission Framework and plugins integrating with the permission fram ### Search -Team: @backstage/search-maintainers +Team: @backstage/search-maintainers — [Review board](https://github.com/orgs/backstage/projects/14/views/1?filterQuery=no%3Aassignee+reviewers%3Asearch-maintainers) Scope: The Backstage Search plugin @@ -180,7 +181,7 @@ Scope: The Backstage Search plugin ### TechDocs -Team: @backstage/techdocs-maintainers +Team: @backstage/techdocs-maintainers — [Review board](https://github.com/orgs/backstage/projects/14/views/1?filterQuery=no%3Aassignee+reviewers%3Atechdocs-maintainers) Scope: The TechDocs plugin and related tooling @@ -194,7 +195,7 @@ Scope: The TechDocs plugin and related tooling ### Tooling -Team: @backstage/tooling-maintainers +Team: @backstage/tooling-maintainers — [Review board](https://github.com/orgs/backstage/projects/14/views/1?filterQuery=no%3Aassignee+reviewers%3Atooling-maintainers) Scope: All published Backstage CLI tools in the main `backstage` repository that do not belong to other areas, including `@backstage/cli` and `@backstage/repo-tools`. @@ -214,7 +215,7 @@ These incubating project areas have shared ownership with @backstage/maintainers ### Auditor -Team: @backstage/auditor-maintainers +Team: @backstage/auditor-maintainers — [Review board](https://github.com/orgs/backstage/projects/14/views/1?filterQuery=no%3Aassignee+reviewers%3Aauditor-maintainers) Scope: The auditor core service, along with auditor usage in the main repository @@ -224,7 +225,7 @@ Scope: The auditor core service, along with auditor usage in the main repository ### Events -Team: @backstage/events-maintainers +Team: @backstage/events-maintainers — [Review board](https://github.com/orgs/backstage/projects/14/views/1?filterQuery=no%3Aassignee+reviewers%3Aevents-maintainers) Scope: The Events plugin and library, along with events modules in the main repository @@ -234,7 +235,7 @@ Scope: The Events plugin and library, along with events modules in the main repo ### Notifications -Team: @backstage/notifications-maintainers +Team: @backstage/notifications-maintainers — [Review board](https://github.com/orgs/backstage/projects/14/views/1?filterQuery=no%3Aassignee+reviewers%3Anotifications-maintainers) Scope: The Notifications and Signals plugins and libraries @@ -244,7 +245,7 @@ Scope: The Notifications and Signals plugins and libraries ### OpenAPI Tooling -Team: @backstage/openapi-tooling-maintainers +Team: @backstage/openapi-tooling-maintainers — [Review board](https://github.com/orgs/backstage/projects/14/views/1?filterQuery=no%3Aassignee+reviewers%3Aopenapi-tooling-maintainers) Scope: Tooling for frontend and backend schema-first OpenAPI development. @@ -254,7 +255,7 @@ Scope: Tooling for frontend and backend schema-first OpenAPI development. ### Scaffolder -Team: @backstage/scaffolder-maintainers +Team: @backstage/scaffolder-maintainers — [Review board](https://github.com/orgs/backstage/projects/14/views/1?filterQuery=no%3Aassignee+reviewers%3Ascaffolder-maintainers) Scope: The Scaffolder frontend and backend plugins, and related tooling. @@ -282,6 +283,7 @@ Scope: The Scaffolder frontend and backend plugins, and related tooling. | Carlos Esteban Lopez Jaramillo | VMWare | [luchillo17](https://github.com/luchillo17) | `luchillo17#8777` | | David Tuite | Roadie.io | [dtuite](https://github.com/dtuite) | `David Tuite (roadie.io)#1010` | | Deepankumar Loganathan | | [deepan10](https://github.com/deepan10) | `deepan10` | +| Gabriel Dugny | Believe | [GabDug](https://github.com/GabDug) | `GabDug` | | Heikki Hellgren | OP Financial Group | [drodil](https://github.com/drodil) | `deathammer` | | Himanshu Mishra | Harness.io | [OrkoHunter](https://github.com/OrkoHunter) | `OrkoHunter#1520` | | Irma Solakovic | Roadie.io | [Irma12](https://github.com/Irma12) | `Irma#7629` | diff --git a/README-fr_FR.md b/README-fr_FR.md index 27a7cd1153..50646617c4 100644 --- a/README-fr_FR.md +++ b/README-fr_FR.md @@ -10,7 +10,6 @@ Français \| [English](README.md) \| [한국어](README-ko_kr.md) \| [中文版] ![Code style](https://img.shields.io/badge/code_style-prettier-ff69b4.svg) [![Codecov](https://img.shields.io/codecov/c/github/backstage/backstage)](https://codecov.io/gh/backstage/backstage) [![](https://img.shields.io/github/v/release/backstage/backstage)](https://github.com/backstage/backstage/releases) -[![Uffizzi](https://img.shields.io/endpoint?url=https%3A%2F%2Fapp.uffizzi.com%2Fapi%2Fv1%2Fpublic%2Fshields%2Fgithub.com%2Fbackstage%2Fbackstage)](https://app.uffizzi.com/ephemeral-environments/backstage/backstage) [![OpenSSF Best Practices](https://bestpractices.coreinfrastructure.org/projects/7678/badge)](https://bestpractices.coreinfrastructure.org/projects/7678) [![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/backstage/backstage/badge)](https://securityscorecards.dev/viewer/?uri=github.com/backstage/backstage) @@ -56,7 +55,7 @@ Si vous voulez contribuer et vous impliquer dans notre communauté, voici les re - [Discord chatroom](https://discord.gg/backstage-687207715902193673) - Pour obtenir de l'aide ou discuter du projet - [Contributing to Backstage](https://github.com/backstage/backstage/blob/master/CONTRIBUTING.md) - Rendez-vous ici si vous souhaitez contribuer - [RFCs](https://github.com/backstage/backstage/labels/rfc) - Contribuez à définir la direction technique -- [FAQ](https://backstage.io/docs/FAQ) +- [FAQ](https://backstage.io/docs/faq) - [Code of Conduct](CODE_OF_CONDUCT.md) - C'est comme ça qu'on fonctionne - [Adopters](ADOPTERS.md) - Les entreprises utilisant déjà Backstage - [Blog](https://backstage.io/blog/) - Annonces et mises à jour @@ -66,7 +65,7 @@ Si vous voulez contribuer et vous impliquer dans notre communauté, voici les re ## Licence -Copyright 2020-2025 © Les auteurs de Backstage. Tous droits réservés. La Linux Foundation détient des marques déposées et utilise des marques commerciales. Pour une liste des marques de commerce de la Linux Foundation, veuillez consulter notre page d'utilisation des marques: https://www.linuxfoundation.org/trademark-usage +Copyright 2020-2026 © Les auteurs de Backstage. Tous droits réservés. La Linux Foundation détient des marques déposées et utilise des marques commerciales. Pour une liste des marques de commerce de la Linux Foundation, veuillez consulter notre page d'utilisation des marques: https://www.linuxfoundation.org/trademark-usage Sous licence Apache, version 2.0: http://www.apache.org/licenses/LICENSE-2.0 diff --git a/README-ko_kr.md b/README-ko_kr.md index e43aa60c43..2b063a39e7 100644 --- a/README-ko_kr.md +++ b/README-ko_kr.md @@ -2,7 +2,7 @@ # [Backstage](https://backstage.io) -[English](README.md) \| 한국어 +한국어 \| [English](README.md) \| [中文版](README-zh_Hans.md) \| [Français](README-fr_FR.md) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![CNCF Status](https://img.shields.io/badge/cncf%20status-incubation-blue.svg)](https://www.cncf.io/projects) @@ -65,7 +65,7 @@ Backstage의 문서는 다음을 포함합니다: ## License -Copyright 2020-2025 © The Backstage Authors. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page: https://www.linuxfoundation.org/trademark-usage +Copyright 2020-2026 © The Backstage Authors. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page: https://www.linuxfoundation.org/trademark-usage Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 diff --git a/README-zh_Hans.md b/README-zh_Hans.md index 4661564725..cb8a4bc38f 100644 --- a/README-zh_Hans.md +++ b/README-zh_Hans.md @@ -2,7 +2,7 @@ # [Backstage](https://backstage.io) -简体中文\| [English](README.md) \| [한국어](README-ko_kr.md) +简体中文 \| [English](README.md) \| [한국어](README-ko_kr.md) \| [Français](README-fr_FR.md) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) [![CNCF Status](https://img.shields.io/badge/cncf%20status-incubation-blue.svg)](https://www.cncf.io/projects) @@ -55,7 +55,7 @@ Backstage 的文档包括: - [Discord 聊天室](https://discord.gg/backstage-687207715902193673) - 获得支持或讨论项目 - [参与贡献 Backstage](https://github.com/backstage/backstage/blob/master/CONTRIBUTING.md) - 如果您想做出贡献,请从这里开始 - [RFCs](https://github.com/backstage/backstage/labels/rfc) - 帮助制定技术方向 -- [FAQ](https://backstage.io/docs/FAQ) - 常问问题 +- [FAQ](https://backstage.io/docs/faq) - 常问问题 - [行为准则](CODE_OF_CONDUCT.md) - 这是我们的行事方式 - [采纳者](ADOPTERS.md) - 已经在使用 Backstage 的公司 - [博客](https://backstage.io/blog/) - 公告和更新 @@ -65,7 +65,7 @@ Backstage 的文档包括: ## 许可 -版权所有 2020-2025 © Backstage 作者。版权所有。Linux 基金会已注册商标并使用商标。有关 Linux 基金会的商标列表,请参阅我们的商标使用页面:https://www.linuxfoundation.org/trademark-usage +版权所有 2020-2026 © Backstage 作者。版权所有。Linux 基金会已注册商标并使用商标。有关 Linux 基金会的商标列表,请参阅我们的商标使用页面:https://www.linuxfoundation.org/trademark-usage 采用 Apache v2.0 许可:http://www.apache.org/licenses/LICENSE-2.0 diff --git a/README.md b/README.md index e3e9bd77dd..68931a3fde 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ See the [GOVERNANCE.md](https://github.com/backstage/community/blob/main/GOVERNA ## License -Copyright 2020-2025 © The Backstage Authors. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page: https://www.linuxfoundation.org/trademark-usage +Copyright 2020-2026 © The Backstage Authors. All rights reserved. The Linux Foundation has registered trademarks and uses trademarks. For a list of trademarks of The Linux Foundation, please see our Trademark Usage page: https://www.linuxfoundation.org/trademark-usage Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0 diff --git a/REVIEWING.md b/REVIEWING.md index 66af880f43..75f6a67eeb 100644 --- a/REVIEWING.md +++ b/REVIEWING.md @@ -2,6 +2,85 @@ This file provides pointers for reviewing pull requests. While the main audience are reviewers, this can also be useful if you are contributing to this repository. +## Quick Links + +- [Incoming Reviews](https://github.com/orgs/backstage/projects/14/views/1) +- [Personal Reviews](https://github.com/orgs/backstage/projects/14/views/2) +- Project area boards in [OWNERS.md](./OWNERS.md) + +## Review Workflow + +Pull request reviews are coordinated by maintainers and reviewers based on project area ownership. Reviews are prioritized and tracked using automated labels and a GitHub Project board. This review process applies to all pull requests in the [main Backstage repository](https://github.com/backstage/backstage), other repositories may have their own review processes. + +All incoming pull request reviews are tracked on the [Incoming Reviews board](https://github.com/orgs/backstage/projects/14/views/1). This board can be used by members of the `@backstage/reviewers` group to find pull requests to review, as well as maintainers that want an overview of all incoming pull requests. + +Project area maintainers can use the same board but with additional filters applied to only show incoming pull requests for their project area. These filtered boards are linked to for each project area in [OWNERS.md](./OWNERS.md). There is also a [personal review board](https://github.com/orgs/backstage/projects/14/views/2) that can be used to track reviews that you have been assigned to. + +### Submitting Reviews + +When reviewing a pull request, always submit a formal review using either **"Approve"** or **"Request changes"**. Do not use "Comment" as a substitute for either of these — the review automation relies on the review state to manage labels and the review board, and only formal approvals and change requests are tracked. + +- Use **"Approve"** when you are satisfied with the changes and believe they are ready to be merged (for your area, at least). +- Use **"Request changes"** when changes are necessary before the pull request can be merged. This signals clearly to the author what is expected and moves the pull request out of the review queue until the author responds. +- Use **"Comment"** only to contribute to discussion, ask questions, or leave optional or minor suggestions that do not block the pull request. + +Being explicit with "Approve" or "Request changes" is important both for transparent communication with the author and for the automation to function correctly. The automation reads these review states to update labels and the review board accordingly, meaning a "Comment" review will not cause any status change. + +### Closing Pull Requests + +Pull requests that have been superseded, are no longer relevant, or otherwise are not worth moving forward should be closed with a comment explaining why. Closed pull requests are automatically removed from the review board by the automation. + +### Review Process for @backstage/reviewers + +Members of the `@backstage/reviewers` do not have any specific areas that they should focus on. They can choose to filter and focus on reviews from any part of the project. They do not assign themselves specific pull requests, but instead leave reviews directly on pull requests without any further process. + +Reviews from this group still have meaningful impact on the review process, as they are picked up by the automation. Approving reviews from a member of this group will add the `reviewer-approved` label to the pull request, which greatly increases its priority and visibility for project area maintainers. Likewise, requesting changes will add the `waiting-for:author` label to the pull request, removing it from the review queue until the author has commented or pushed new changes. + +As a reward for helping out with reviews, members who actively review pull requests will have their own pull requests prioritized higher on the review board. The more reviews you contribute, the higher the priority boost your own pull requests receive. + +### Review Process for Project Area Maintainers + +Project area maintainers are responsible for reviewing and ultimately merging or closing pull requests that target their project area. They should use the global or filtered board for their project area to find pull requests to review. When they find a pull request that they want to review, they should assign themselves to the pull request, removing it from the review queue and placing it on their personal review board. + +Once a pull request has been assigned a single owner, it is their responsibility to review and eventually merge or close the pull request. They manage all ongoing requests on their personal review board, typically prioritizing the ones at the top of the board marked with `waiting-for:review`. If a pull request remains assigned but unreviewed for 14 days, the automation will automatically unassign the reviewer and return the pull request to the review queue. + +### Merging Pull Requests + +When a pull request has been approved, the way it gets merged depends on who the author is: + +- **Outside contributions:** Project area maintainers and core maintainers should merge the pull request themselves once approved, since outside contributors do not have merge access. +- **Maintainer contributions:** Within maintainer teams, it is common to let the author choose when to merge the pull request themselves, unless there is a reason to merge it immediately. The `waiting-for:merge` label will be applied automatically when the pull request is approved. + +### Cross-Area Pull Requests + +Some pull requests may require review from multiple project areas. In these cases the most relevant owner should assign themselves and coordinate with the other owners for additional reviews. If the most relevant owner is not clear, this is preferably solved in a discussion among the owners. Frequent conflicts should lead to a discussion whether `CODEOWNERS` should be updated to simplify the review process. If some owners are currently unavailable, other owners can assign themselves to the pull request and bring it to the point where they approve the changes for their area, and then send the pull request back to the review queue. + +## Pull Request Automation + +Pull request labels and the [review board](https://github.com/orgs/backstage/projects/14) are fully managed by automation. All fields on the review board are computed automatically and **should never be updated manually**. Likewise, pull request labels that are part of the automation should not be added or removed by hand, with one exception described below. + +The automation is triggered by pull request events (opened, updated, reopened, labeled, unlabeled), pull request reviews (submitted, dismissed), issue comments, and CI workflow completions. The source code is available in the [`backstage/actions`](https://github.com/backstage/actions) repository, with the workflow definitions in [`.github/workflows/sync_pull-requests-trigger.yml`](.github/workflows/sync_pull-requests-trigger.yml) and [`.github/workflows/sync_pull-requests.yml`](.github/workflows/sync_pull-requests.yml). + +### Labels + +The `waiting-for:*` status labels, `reviewer-approved` label, and `size:*` labels are all **automated** based on pull request reviews, author activity, and pull request size. See [LABELS.md](./LABELS.md#pull-request-labels) for the meaning of each label. + +The only exception is `waiting-for:decision`, which can and should be set **manually**. Use it when discussion or a decision is needed before the pull request can move forward, for example when the approach needs to be discussed in a [SIG](https://github.com/backstage/community/tree/main/sigs) meeting. Once set, this label will **stick until manually removed** — the automation will not override it. Only remove it once a decision has been made and the pull request is ready to proceed. + +### Review Board Priority + +The priority field on the review board is a number calculated automatically by the automation. It determines the sort order of pull requests on the board. The priority is influenced by several factors: + +- **Pull request size** — Smaller pull requests receive higher priority, where the priority reduces significantly for roughly every 500 lines added. +- **Reviewer approval** — Pull requests with the `reviewer-approved` label receive a large priority boost. +- **Author review contributions** — Authors who have themselves reviewed other pull requests in the repository receive a priority boost proportional to their review activity. +- **Draft status** — Draft pull requests receive significantly reduced priority. +- **CI status** — Pull requests where required CI checks are failing or still pending receive reduced priority. The required checks include DCO, tests, verification, and E2E tests. + +### Stale Review Handling + +If a pull request with the `waiting-for:review` label has been assigned to a reviewer but has not received a review for 14 days, the automation will automatically unassign the reviewer and return the pull request to the review queue. This ensures that pull requests do not get stuck due to reviewer unavailability. + ## Code Style See our code style documented at [STYLE.md](./STYLE.md). @@ -62,6 +141,37 @@ Some things that changeset should NOT contain are: - Documentation - changesets can describe new features, but it should not be relied on for documenting them. Documentation should either be placed in [TSDoc](https://tsdoc.org) comments, package README, or [./docs/](./docs/). - Diffs of internal code, for example mirroring what the pull request changes _inside_ a plugin rather than public surfaces. This is not of interest to the reader of a package changelog. Sometimes, however, a small and concise diff can be used in a changeset to illustrate changes that the user will have to make in _their own_ Backstage installation as part of an upgrade, specifically when breaking changes are made to a package. +### Backstage UI Changeset Format + +Changesets for `@backstage/ui` must follow a standardized format to enable proper documentation generation. See [`.changeset/README.md`](.changeset/README.md#backstage-ui-changeset-format) for the complete guide. + +**Required structure:** + +```markdown +--- +'@backstage/ui': patch +--- + +Brief one-line summary of the change + +Optional detailed description with any markdown content. + +**Migration:** + +Migration instructions (only for breaking changes) + +**Affected components:** Button, ButtonIcon +``` + +**Key requirements:** + +1. **Affected components marker** - Must end with `**Affected components:**` followed by comma-separated component names +2. **Migration marker** - Use `**Migration:**` (bold, with colon) for breaking changes only +3. **No headings** - Never use `##`, `###`, or `####` inside changeset entries (these break semantic structure when the entry becomes a list item in CHANGELOG.md) +4. **Bold markers** - Use bold text markers, not plain text, for reliable parsing + +These markers enable the documentation system to extract metadata for per-component changelogs and separate migration guides. + ### When is a changeset needed? In general our changeset feedback bot will take care of informing whether a changeset is needed or not, but there are some edge cases. Whether a changeset is needed depends mostly on what files have been changed, but sometimes also on the kind of change that has been made. diff --git a/SECURITY.md b/SECURITY.md index 5c6c8106d5..46f36f0a67 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -8,7 +8,7 @@ See our [Release & Versioning Policy](https://backstage.io/docs/overview/version Please report sensitive security issues via Spotify's [bug-bounty program](https://hackerone.com/spotify) rather than GitHub. -If you have questions about a potential vulnerability, please reach out on Discord by asking for a maintainer in the `#support` channel, or via direct message to a maintainer. +If you have questions about a potential vulnerability, please reach out on Discord by asking for a maintainer in the `#security` channel, or via direct message to a maintainer. ## Remediation and Notification Process diff --git a/app-config.yaml b/app-config.yaml index 54ece44da3..ac66d223b4 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -189,15 +189,9 @@ catalog: target: ../catalog-model/examples/acme-corp.yaml rules: - allow: [User, Group] - # Example component for github-actions and TechDocs - - type: file - target: ../../plugins/github-actions/examples/sample.yaml # Example component for TechDocs - type: file target: ../../plugins/techdocs-backend/examples/documented-component/catalog-info.yaml - # Example component for ADRs - - type: file - target: ../../plugins/adr/examples/component/catalog-info.yaml # Backstage example templates - type: file target: ../../plugins/scaffolder-backend/sample-templates/all-templates.yaml diff --git a/beps/0001-notifications-system/notifications-architecture.drawio.svg b/beps/0001-notifications-system/notifications-architecture.drawio.svg index 9c6bb00119..25b27642ca 100644 --- a/beps/0001-notifications-system/notifications-architecture.drawio.svg +++ b/beps/0001-notifications-system/notifications-architecture.drawio.svg @@ -1,537 +1 @@ - - - - - - - - - - -
-
-
- Notification Backend -
-
-
-
- - Notification Backend - -
-
- - - - - - - - -
-
-
- Notification Frontend -
-
-
-
- - Notification Frontend - -
-
- - - - -
-
-
- Signal Backend -
-
-
-
- - Signal Backend - -
-
- - - - - - - - - - -
-
-
- Signal Frontend -
-
-
-
- - Signal Frontend - -
-
- - - - - - -
-
-
- Plugin X Backend -
-
-
-
- - Plugin X Backend - -
-
- - - - -
-
-
- Plugin X Frontend -
-
-
-
- - Plugin X Frontend - -
-
- - - - - - - - - - - - -
-
-
- EventsService -
-
-
-
- - EventsService - -
-
- - - - - - -
-
-
- ... -
-
-
-
- - ... - -
-
- - - - -
-
-
- ... -
-
-
-
- - ... - -
-
- - - - -
-
-
- publish event -
-
-
-
- - publish event - -
-
- - - - -
-
-
- broadcast -
-
-
-
- - broadcast - -
-
- - - - -
-
-
- ??? -
-
-
-
- - ??? - -
-
- - - - -
-
-
- server push -
-
-
-
- - server push - -
-
- - - - -
-
-
- POST -
-
-
-
- - POST - -
-
- - - - - - -
-
-
- External System -
-
-
-
- - External System - -
-
- - - - -
-
-
- email/slack/teams, etc. -
-
-
-
- - email/slack/teams, etc. - -
-
- - - - -
-
-
- Render -
-
-
-
- - Render - -
-
- - - - -
-
-
- - Processor - -
-
-
-
- - Processor - -
-
- - - - -
-
-
- GET -
-
-
-
- - GET - -
-
- - - - -
-
-
- 1 -
-
-
-
- - 1 - -
-
- - - - -
-
-
- 3 -
-
-
-
- - 3 - -
-
- - - - -
-
-
- 1b -
-
-
-
- - 1b - -
-
- - - - -
-
-
- 4 -
-
-
-
- - 4 - -
-
- - - - -
-
-
- 5 -
-
-
-
- - 5 - -
-
- - - - -
-
-
- 6 -
-
-
-
- - 6 - -
-
- - - - -
-
-
- 7b -
-
-
-
- - 7b - -
-
- - - - -
-
-
- 7 -
-
-
-
- - 7 - -
-
- - - - - - -
-
-
- 2 -
-
-
-
- - 2 - -
-
- - - - -
-
-
- Channel Callback -
-
-
-
- - Channel Callback - -
-
-
- - - - - Text is not SVG - cannot display - - - -
+
Notification Backend
Notification Backend
Notification Frontend
Notification Frontend
Signal Backend
Signal Backend
Signal Frontend
Signal Frontend
Plugin X Backend
Plugin X Backend
Plugin X Frontend
Plugin X Frontend
EventsService
EventsService
...
...
...
...
publish event
publish event
broadcast
broadcast
???
???
server push
server push
POST
POST
External System
External System
email/slack/teams, etc.
email/slack/teams, etc.
Render
Render
Processor
Processor
GET
GET
1
1
3
3
1b
1b
4
4
5
5
6
6
7b
7b
7
7
2
2
Channel Callback
Channel Callback
Text is not SVG - cannot display
\ No newline at end of file diff --git a/beps/0002-dynamic-frontend-plugins/README.md b/beps/0002-dynamic-frontend-plugins/README.md index 4787f0fb7a..c783cf052e 100644 --- a/beps/0002-dynamic-frontend-plugins/README.md +++ b/beps/0002-dynamic-frontend-plugins/README.md @@ -301,7 +301,7 @@ An example of [integration with scalprum](https://github.com/backstage/backstage **Dynamic Feature configuration** -The dynamic remote loading can be added directly into the [`createApp`](https://backstage.io/docs/reference/frontend-defaults.createapp) function. +The dynamic remote loading can be added directly into the [`createApp`](https://backstage.io/api/stable/functions/_backstage_frontend-defaults.createApp.html) function. The current `feature` type can be expanded with a `DynamicFrontendFeature` type: @@ -351,7 +351,7 @@ const scalprum = initialize({ }); ``` -Because the [`appLoader`](https://backstage.io/docs/reference/frontend-defaults.createapp) is already async, it is a perfect place to load the plugin registry and init the dynamic plugins. +Because the [`appLoader`](https://backstage.io/api/stable/functions/_backstage_frontend-defaults.createApp.html) is already async, it is a perfect place to load the plugin registry and init the dynamic plugins. Initializing the dynamic feature is just a case of mapping the `DynamicFrontendFeature` to `FrontendFeature` via Scalprum: diff --git a/beps/0003-auth-architecture-evolution/token-sequence-cookie.drawio.svg b/beps/0003-auth-architecture-evolution/token-sequence-cookie.drawio.svg index b20b528c35..29d95b44bf 100644 --- a/beps/0003-auth-architecture-evolution/token-sequence-cookie.drawio.svg +++ b/beps/0003-auth-architecture-evolution/token-sequence-cookie.drawio.svg @@ -1,203 +1 @@ - - - - - - - - -
-
-
- cookie flow -
-
-
-
- - cookie flow - -
-
- - - - - -
-
-
- Browser -
-
-
-
- - Browser - -
-
- - - - - - -
-
-
- Techdocs -
- Backend -
-
-
-
- - Techdocs... - -
-
- - - - - - -
-
-
- GET /cookie -
-
-
-
- - GET /cookie - -
-
- - - - - -
-
-
- set cookie on response -
-
-
-
- - set cookie on response - -
-
- - - - - -
-
-
- browser static content requests -
-
-
-
- - browser static content requests - -
-
- - - - -
-
-
- cookie token -
-
-
-
- - cookie token - -
-
- - - - -
-
-
- cookie token -
-
-
-
- - cookie token - -
-
- - - - -
-
-
- user identity token -
-
-
-
- - user identity token - -
-
- - - - - -
-
-
- - acquire cookie token -
- based on user token -
-
-
-
-
-
- - acquire cookie token... - -
-
- - - - -
- - - - - Text is not SVG - cannot display - - - -
+
cookie flow
cookie flow
Browser
Browser
Techdocs
Backend
Techdocs...
GET /cookie
GET /cookie
set cookie on response
set cookie on response
browser static content requests
browser static content requests
cookie token
cookie token
cookie token
cookie token
user identity token
user identity token
acquire cookie token
based on user token
acquire cookie token...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/beps/0003-auth-architecture-evolution/token-sequence-obo.drawio.svg b/beps/0003-auth-architecture-evolution/token-sequence-obo.drawio.svg index f337f8b572..517d2c4d19 100644 --- a/beps/0003-auth-architecture-evolution/token-sequence-obo.drawio.svg +++ b/beps/0003-auth-architecture-evolution/token-sequence-obo.drawio.svg @@ -1,203 +1 @@ - - - - - - - - -
-
-
- Browser -
-
-
-
- - Browser - -
-
- - - - - - -
-
-
- Scaffolder -
- Backend -
-
-
-
- - Scaffolder... - -
-
- - - - - - -
-
-
- - acquire service obo token -
- based on user token -
-
-
-
-
-
- - acquire service obo token... - -
-
- - - - - -
-
-
- POST /tasks -
-
-
-
- - POST /tasks - -
-
- - - - - -
-
-
- success -
-
-
-
- - success - -
-
- - - - - -
-
-
- Catalog -
- Backend -
-
-
-
- - Catalog... - -
-
- - - - - - -
-
-
- GET /entities/... -
-
-
-
- - GET /entities/... - -
-
- - - - - -
-
-
- template entity -
-
-
-
- - template entity - -
-
- - - - -
-
-
- user identity token -
-
-
-
- - user identity token - -
-
- - - - -
-
-
- service obo token -
-
-
-
- - service obo token - -
-
-
- - - - - Text is not SVG - cannot display - - - -
+
Browser
Browser
Scaffolder
Backend
Scaffolder...
acquire service obo token
based on user token
acquire service obo token...
POST /tasks
POST /tasks
success
success
Catalog
Backend
Catalog...
GET /entities/...
GET /entities/...
template entity
template entity
user identity token
user identity token
service obo token
service obo token
Text is not SVG - cannot display
\ No newline at end of file diff --git a/contrib/.devcontainer/README.md b/contrib/.devcontainer/README.md deleted file mode 100644 index 4fca39b3ad..0000000000 --- a/contrib/.devcontainer/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Devcontainer Configuration - -[Devcontainer](https://code.visualstudio.com/docs/devcontainers/containers) is a VSCode feature that allows developers -to share a common workspace definition, by leveraging Docker to run the workspace, and using VSCode Remote Development extension, you can make sure the developer experience is the same across different computers - -## Benefits - -- Developers only need to have VSCode and Docker installed -- All dependencies necessary to work in the repository are contained in the docker image -- Makes it easier for new developers to start contributing to the project -- No extra setup required - -## Known Issues - -- Performance is a known issue. Working inside devcontainers require developers to have a powerful computer. See [System Requirements](https://code.visualstudio.com/docs/devcontainers/containers#_system-requirements) - -## Usage - -Just copy the .devcontainer folder to the root of the directory, and VSCode will automatically detect the configuration and suggest that you re-open the repository using Devcontainer diff --git a/contrib/.devcontainer/devcontainer.json b/contrib/.devcontainer/devcontainer.json deleted file mode 100644 index 14e7d7f0ae..0000000000 --- a/contrib/.devcontainer/devcontainer.json +++ /dev/null @@ -1,27 +0,0 @@ -// For format details, see https://aka.ms/devcontainer.json. For config options, see the -// README at: https://github.com/devcontainers/templates/tree/main/src/typescript-node -{ - "name": "Base Backstage Workspace", - "build": { "dockerfile": "Dockerfile" }, - "features": { - "ghcr.io/devcontainers/features/common-utils:1": {}, - "ghcr.io/devcontainers/features/docker-from-docker:1": {}, - "ghcr.io/devcontainers-contrib/features/mkdocs:2": {} - }, - - // Use 'forwardPorts' to make a list of ports inside the container available locally. - "forwardPorts": [3000, 7007], - - // Use 'postCreateCommand' to run commands after the container is created. - "postCreateCommand": "bash .devcontainer/postCreate.sh", - - // Configure tool-specific properties. - "customizations": { - "vscode": { - "extensions": ["Intility.vscode-backstage"] - } - } - - // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. - // "remoteUser": "root" -} diff --git a/contrib/.devcontainer/postCreate.sh b/contrib/.devcontainer/postCreate.sh deleted file mode 100755 index 88f403de5e..0000000000 --- a/contrib/.devcontainer/postCreate.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -yarn install -export VIRTUAL_ENV=$HOME/venv -python3 -m venv $VIRTUAL_ENV -export PATH="$VIRTUAL_ENV/bin:$PATH" -python3 -m pip install mkdocs-techdocs-core \ No newline at end of file diff --git a/contrib/catalog/ImmediateEntityProvider.ts b/contrib/catalog/ImmediateEntityProvider.ts index 9f9f986567..ba17f19c9d 100644 --- a/contrib/catalog/ImmediateEntityProvider.ts +++ b/contrib/catalog/ImmediateEntityProvider.ts @@ -16,7 +16,7 @@ import { EntityProviderConnection, } from '@backstage/plugin-catalog-node'; import { parseEntityYaml } from '@backstage/plugin-catalog-node'; -import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; +import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node'; import bodyParser from 'body-parser'; import express from 'express'; import Router from 'express-promise-router'; diff --git a/docs-ui/.eslintrc.json b/docs-ui/.eslintrc.json deleted file mode 100644 index be99640f75..0000000000 --- a/docs-ui/.eslintrc.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": ["next/core-web-vitals", "next/typescript"], - "rules": { - "notice/notice": "off", - "react/forbid-elements": "off", - "jsx-a11y/alt-text": "off" - } -} diff --git a/docs-ui/eslint.config.mjs b/docs-ui/eslint.config.mjs new file mode 100644 index 0000000000..2cb66fd509 --- /dev/null +++ b/docs-ui/eslint.config.mjs @@ -0,0 +1,16 @@ +import { defineConfig, globalIgnores } from 'eslint/config'; +import nextCoreWebVitals from 'eslint-config-next/core-web-vitals'; + +const eslintConfig = defineConfig([ + ...nextCoreWebVitals, + globalIgnores(['.next/**', 'dist/**', 'node_modules/**']), + { + rules: { + 'notice/notice': 'off', + 'react/forbid-elements': 'off', + 'jsx-a11y/alt-text': 'off', + }, + }, +]); + +export default eslintConfig; diff --git a/docs-ui/package.json b/docs-ui/package.json index d6dcb4830a..bb0b1a393d 100644 --- a/docs-ui/package.json +++ b/docs-ui/package.json @@ -5,17 +5,18 @@ "scripts": { "prebuild": "yarn sync:css", "build": "next build", - "lint": "next lint", + "lint": "eslint .", "prestart": "yarn sync:css", "start": "next dev", "sync:changelog": "node scripts/sync-changelog.mjs", "sync:changelog:dry-run": "node scripts/sync-changelog.mjs --dry-run", + "sync:changelog:force": "node scripts/sync-changelog.mjs --force", "sync:css": "node scripts/sync-css.js", "sync:css:watch": "node scripts/sync-css.js --watch" }, "resolutions": { - "@types/react": "19.1.9", - "@types/react-dom": "19.1.7" + "@types/react": "19.2.10", + "@types/react-dom": "19.2.3" }, "dependencies": { "@base-ui-components/react": "^1.0.0-beta.4", @@ -24,32 +25,30 @@ "@lezer/highlight": "^1.2.1", "@mdx-js/loader": "^3.1.0", "@mdx-js/react": "^3.1.0", - "@next/mdx": "15.5.7", + "@next/mdx": "16.1.6", "@remixicon/react": "^4.6.0", - "@storybook/react": "^8.6.12", "@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": "15.5.9", + "next": "16.1.6", "next-mdx-remote-client": "^2.1.2", "prop-types": "^15.8.1", - "react": "19.1.1", - "react-dom": "19.1.1", - "shiki": "^3.13.0", - "storybook": "^8.6.12" + "react": "19.2.4", + "react-dom": "19.2.4", + "shiki": "^3.13.0" }, "devDependencies": { "@octokit/rest": "^22.0.1", "@shikijs/transformers": "^3.13.0", "@types/mdx": "^2.0.13", "@types/node": "^22.13.14", - "@types/react": "19.1.9", - "@types/react-dom": "19.1.7", + "@types/react": "19.2.10", + "@types/react-dom": "19.2.3", "chokidar": "^3.6.0", - "eslint": "^8", - "eslint-config-next": "15.5.7", + "eslint": "^9", + "eslint-config-next": "16.1.6", "lightningcss": "^1.28.2", "typescript": "^5", "unified": "^11.0.4" diff --git a/docs-ui/public/theme-backstage.css b/docs-ui/public/theme-backstage.css deleted file mode 100644 index 59a5b986be..0000000000 --- a/docs-ui/public/theme-backstage.css +++ /dev/null @@ -1 +0,0 @@ -@layer tokens{:root{--bui-font-regular:system-ui;--bui-font-monospace:ui-monospace,"Menlo","Monaco","Consolas","Liberation Mono","Courier New",monospace;--bui-font-weight-regular:400;--bui-font-weight-bold:600;--bui-font-size-1:.625rem;--bui-font-size-2:.75rem;--bui-font-size-3:.875rem;--bui-font-size-4:1rem;--bui-font-size-5:1.25rem;--bui-font-size-6:1.5rem;--bui-font-size-7:2rem;--bui-font-size-8:3rem;--bui-font-size-9:4rem;--bui-font-size-10:5.75rem;--bui-space:.25rem;--bui-space-0_5:calc(var(--bui-space)*.5);--bui-space-1:var(--bui-space);--bui-space-1_5:calc(var(--bui-space)*1.5);--bui-space-2:calc(var(--bui-space)*2);--bui-space-3:calc(var(--bui-space)*3);--bui-space-4:calc(var(--bui-space)*4);--bui-space-5:calc(var(--bui-space)*5);--bui-space-6:calc(var(--bui-space)*6);--bui-space-7:calc(var(--bui-space)*7);--bui-space-8:calc(var(--bui-space)*8);--bui-space-9:calc(var(--bui-space)*9);--bui-space-10:calc(var(--bui-space)*10);--bui-space-11:calc(var(--bui-space)*11);--bui-space-12:calc(var(--bui-space)*12);--bui-space-13:calc(var(--bui-space)*13);--bui-space-14:calc(var(--bui-space)*14);--bui-radius-1:calc(.125rem);--bui-radius-2:calc(.25rem);--bui-radius-3:calc(.5rem);--bui-radius-4:calc(.75rem);--bui-radius-5:calc(1rem);--bui-radius-6:calc(1.25rem);--bui-radius-full:9999px;--bui-black:#000;--bui-white:#fff;--bui-gray-1:#f8f8f8;--bui-gray-2:#ececec;--bui-gray-3:#d9d9d9;--bui-gray-4:#c1c1c1;--bui-gray-5:#9e9e9e;--bui-gray-6:#8c8c8c;--bui-gray-7:#757575;--bui-gray-8:#595959;--bui-bg:var(--bui-gray-1);--bui-bg-surface-1:var(--bui-white);--bui-bg-surface-2:var(--bui-gray-2);--bui-bg-solid:#1f5493;--bui-bg-solid-hover:#163a66;--bui-bg-solid-pressed:#0f2b4e;--bui-bg-solid-disabled:#ebebeb;--bui-bg-tint:transparent;--bui-bg-tint-hover:#1f549366;--bui-bg-tint-pressed:#1f549399;--bui-bg-tint-disabled:#ebebeb;--bui-bg-danger:#feebe7;--bui-bg-warning:#fff2b2;--bui-bg-success:#e6f6eb;--bui-fg-primary:var(--bui-black);--bui-fg-secondary:var(--bui-gray-7);--bui-fg-link:#1f5493;--bui-fg-link-hover:#1f2d5c;--bui-fg-disabled:#9e9e9e;--bui-fg-solid:var(--bui-white);--bui-fg-solid-disabled:#9c9c9c;--bui-fg-tint:#1f5493;--bui-fg-tint-disabled:var(--bui-gray-5);--bui-fg-danger:#e22b2b;--bui-fg-warning:#e36d05;--bui-fg-success:#1db954;--bui-border:#0000001a;--bui-border-hover:#0003;--bui-border-pressed:#0006;--bui-border-disabled:#0000001a;--bui-border-danger:#f87a7a;--bui-border-warning:#e36d05;--bui-border-success:#53db83;--bui-ring:#1f5493;--bui-scrollbar:#a0a0a03b;--bui-scrollbar-thumb:#a0a0a0;--bui-animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite}[data-theme-mode=dark]{--bui-gray-1:#191919;--bui-gray-2:#242424;--bui-gray-3:#373737;--bui-gray-4:#464646;--bui-gray-5:#575757;--bui-gray-6:#7b7b7b;--bui-gray-7:#9e9e9e;--bui-gray-8:#b4b4b4;--bui-bg:#333;--bui-bg-surface-1:#424242;--bui-bg-surface-2:var(--bui-gray-2);--bui-bg-solid:#9cc9ff;--bui-bg-solid-hover:#83b9fd;--bui-bg-solid-pressed:#83b9fd;--bui-bg-solid-disabled:#222;--bui-bg-tint:transparent;--bui-bg-tint-hover:#9cc9ff1f;--bui-bg-tint-pressed:#9cc9ff29;--bui-bg-tint-disabled:transparent;--bui-bg-danger:#3b1219;--bui-bg-warning:#302008;--bui-bg-success:#132d21;--bui-fg-primary:var(--bui-white);--bui-fg-secondary:var(--bui-gray-7);--bui-fg-link:#9cc9ff;--bui-fg-link-hover:#7eb5f7;--bui-fg-disabled:var(--bui-gray-7);--bui-fg-solid:#101821;--bui-fg-solid-disabled:var(--bui-gray-5);--bui-fg-tint:#9cc9ff;--bui-fg-tint-disabled:var(--bui-gray-5);--bui-fg-danger:#e22b2b;--bui-fg-warning:#e36d05;--bui-fg-success:#1db954;--bui-border:#ffffff1f;--bui-border-hover:#fff6;--bui-border-pressed:#ffffff80;--bui-border-disabled:#fff3;--bui-border-danger:#f87a7a;--bui-border-warning:#e36d05;--bui-border-success:#53db83;--bui-ring:#1f5493;--bui-scrollbar:#3636363a;--bui-scrollbar-thumb:#575757}}@layer base{*,:before,:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;tab-size:4;font-family:system-ui,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;line-height:1.15}body{margin:0}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{border-color:currentColor}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:100%;line-height:1.15}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}legend{padding:0}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}:where(a){color:inherit;text-decoration:none}@keyframes pulse{50%{opacity:.5}}body{background-color:var(--bui-bg);color:var(--bui-fg-primary);font-family:var(--bui-font-regular);font-weight:var(--bui-font-weight-regular);font-size:var(--bui-font-size-3);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}}@layer components;@layer utilities{.bui-p{padding:var(--p)}.bui-p-0\.5{padding:var(--bui-space-0_5)}.bui-p-1{padding:var(--bui-space-1)}.bui-p-1\.5{padding:var(--bui-space-1_5)}.bui-p-2{padding:var(--bui-space-2)}.bui-p-3{padding:var(--bui-space-3)}.bui-p-4{padding:var(--bui-space-4)}.bui-p-5{padding:var(--bui-space-5)}.bui-p-6{padding:var(--bui-space-6)}.bui-p-7{padding:var(--bui-space-7)}.bui-p-8{padding:var(--bui-space-8)}.bui-p-9{padding:var(--bui-space-9)}.bui-p-10{padding:var(--bui-space-10)}.bui-p-11{padding:var(--bui-space-11)}.bui-p-12{padding:var(--bui-space-12)}.bui-p-13{padding:var(--bui-space-13)}.bui-p-14{padding:var(--bui-space-14)}@media (width>=640px){.xs\:bui-p{padding:var(--p-xs)}.xs\:bui-p-0\.5{padding:var(--bui-space-0_5)}.xs\:bui-p-1{padding:var(--bui-space-1)}.xs\:bui-p-1\.5{padding:var(--bui-space-1_5)}.xs\:bui-p-2{padding:var(--bui-space-2)}.xs\:bui-p-3{padding:var(--bui-space-3)}.xs\:bui-p-4{padding:var(--bui-space-4)}.xs\:bui-p-5{padding:var(--bui-space-5)}.xs\:bui-p-6{padding:var(--bui-space-6)}.xs\:bui-p-7{padding:var(--bui-space-7)}.xs\:bui-p-8{padding:var(--bui-space-8)}.xs\:bui-p-9{padding:var(--bui-space-9)}.xs\:bui-p-10{padding:var(--bui-space-10)}.xs\:bui-p-11{padding:var(--bui-space-11)}.xs\:bui-p-12{padding:var(--bui-space-12)}.xs\:bui-p-13{padding:var(--bui-space-13)}.xs\:bui-p-14{padding:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-p{padding:var(--p-sm)}.sm\:bui-p-0\.5{padding:var(--bui-space-0_5)}.sm\:bui-p-1{padding:var(--bui-space-1)}.sm\:bui-p-1\.5{padding:var(--bui-space-1_5)}.sm\:bui-p-2{padding:var(--bui-space-2)}.sm\:bui-p-3{padding:var(--bui-space-3)}.sm\:bui-p-4{padding:var(--bui-space-4)}.sm\:bui-p-5{padding:var(--bui-space-5)}.sm\:bui-p-6{padding:var(--bui-space-6)}.sm\:bui-p-7{padding:var(--bui-space-7)}.sm\:bui-p-8{padding:var(--bui-space-8)}.sm\:bui-p-9{padding:var(--bui-space-9)}.sm\:bui-p-10{padding:var(--bui-space-10)}.sm\:bui-p-11{padding:var(--bui-space-11)}.sm\:bui-p-12{padding:var(--bui-space-12)}.sm\:bui-p-13{padding:var(--bui-space-13)}.sm\:bui-p-14{padding:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-p{padding:var(--p-md)}.md\:bui-p-0\.5{padding:var(--bui-space-0_5)}.md\:bui-p-1{padding:var(--bui-space-1)}.md\:bui-p-1\.5{padding:var(--bui-space-1_5)}.md\:bui-p-2{padding:var(--bui-space-2)}.md\:bui-p-3{padding:var(--bui-space-3)}.md\:bui-p-4{padding:var(--bui-space-4)}.md\:bui-p-5{padding:var(--bui-space-5)}.md\:bui-p-6{padding:var(--bui-space-6)}.md\:bui-p-7{padding:var(--bui-space-7)}.md\:bui-p-8{padding:var(--bui-space-8)}.md\:bui-p-9{padding:var(--bui-space-9)}.md\:bui-p-10{padding:var(--bui-space-10)}.md\:bui-p-11{padding:var(--bui-space-11)}.md\:bui-p-12{padding:var(--bui-space-12)}.md\:bui-p-13{padding:var(--bui-space-13)}.md\:bui-p-14{padding:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-p{padding:var(--p-lg)}.lg\:bui-p-0\.5{padding:var(--bui-space-0_5)}.lg\:bui-p-1{padding:var(--bui-space-1)}.lg\:bui-p-1\.5{padding:var(--bui-space-1_5)}.lg\:bui-p-2{padding:var(--bui-space-2)}.lg\:bui-p-3{padding:var(--bui-space-3)}.lg\:bui-p-4{padding:var(--bui-space-4)}.lg\:bui-p-5{padding:var(--bui-space-5)}.lg\:bui-p-6{padding:var(--bui-space-6)}.lg\:bui-p-7{padding:var(--bui-space-7)}.lg\:bui-p-8{padding:var(--bui-space-8)}.lg\:bui-p-9{padding:var(--bui-space-9)}.lg\:bui-p-10{padding:var(--bui-space-10)}.lg\:bui-p-11{padding:var(--bui-space-11)}.lg\:bui-p-12{padding:var(--bui-space-12)}.lg\:bui-p-13{padding:var(--bui-space-13)}.lg\:bui-p-14{padding:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-p{padding:var(--p-xl)}.xl\:bui-p-0\.5{padding:var(--bui-space-0_5)}.xl\:bui-p-1{padding:var(--bui-space-1)}.xl\:bui-p-1\.5{padding:var(--bui-space-1_5)}.xl\:bui-p-2{padding:var(--bui-space-2)}.xl\:bui-p-3{padding:var(--bui-space-3)}.xl\:bui-p-4{padding:var(--bui-space-4)}.xl\:bui-p-5{padding:var(--bui-space-5)}.xl\:bui-p-6{padding:var(--bui-space-6)}.xl\:bui-p-7{padding:var(--bui-space-7)}.xl\:bui-p-8{padding:var(--bui-space-8)}.xl\:bui-p-9{padding:var(--bui-space-9)}.xl\:bui-p-10{padding:var(--bui-space-10)}.xl\:bui-p-11{padding:var(--bui-space-11)}.xl\:bui-p-12{padding:var(--bui-space-12)}.xl\:bui-p-13{padding:var(--bui-space-13)}.xl\:bui-p-14{padding:var(--bui-space-14)}}.bui-pl{padding-left:var(--pl)}.bui-pl-0\.5{padding-left:var(--bui-space-0_5)}.bui-pl-1{padding-left:var(--bui-space-1)}.bui-pl-1\.5{padding-left:var(--bui-space-1_5)}.bui-pl-2{padding-left:var(--bui-space-2)}.bui-pl-3{padding-left:var(--bui-space-3)}.bui-pl-4{padding-left:var(--bui-space-4)}.bui-pl-5{padding-left:var(--bui-space-5)}.bui-pl-6{padding-left:var(--bui-space-6)}.bui-pl-7{padding-left:var(--bui-space-7)}.bui-pl-8{padding-left:var(--bui-space-8)}.bui-pl-9{padding-left:var(--bui-space-9)}.bui-pl-10{padding-left:var(--bui-space-10)}.bui-pl-11{padding-left:var(--bui-space-11)}.bui-pl-12{padding-left:var(--bui-space-12)}.bui-pl-13{padding-left:var(--bui-space-13)}.bui-pl-14{padding-left:var(--bui-space-14)}@media (width>=640px){.xs\:bui-pl{padding-left:var(--pl-xs)}.xs\:bui-pl-0\.5{padding-left:var(--bui-space-0_5)}.xs\:bui-pl-1{padding-left:var(--bui-space-1)}.xs\:bui-pl-1\.5{padding-left:var(--bui-space-1_5)}.xs\:bui-pl-2{padding-left:var(--bui-space-2)}.xs\:bui-pl-3{padding-left:var(--bui-space-3)}.xs\:bui-pl-4{padding-left:var(--bui-space-4)}.xs\:bui-pl-5{padding-left:var(--bui-space-5)}.xs\:bui-pl-6{padding-left:var(--bui-space-6)}.xs\:bui-pl-7{padding-left:var(--bui-space-7)}.xs\:bui-pl-8{padding-left:var(--bui-space-8)}.xs\:bui-pl-9{padding-left:var(--bui-space-9)}.xs\:bui-pl-10{padding-left:var(--bui-space-10)}.xs\:bui-pl-11{padding-left:var(--bui-space-11)}.xs\:bui-pl-12{padding-left:var(--bui-space-12)}.xs\:bui-pl-13{padding-left:var(--bui-space-13)}.xs\:bui-pl-14{padding-left:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-pl{padding-left:var(--pl-sm)}.sm\:bui-pl-0\.5{padding-left:var(--bui-space-0_5)}.sm\:bui-pl-1{padding-left:var(--bui-space-1)}.sm\:bui-pl-1\.5{padding-left:var(--bui-space-1_5)}.sm\:bui-pl-2{padding-left:var(--bui-space-2)}.sm\:bui-pl-3{padding-left:var(--bui-space-3)}.sm\:bui-pl-4{padding-left:var(--bui-space-4)}.sm\:bui-pl-5{padding-left:var(--bui-space-5)}.sm\:bui-pl-6{padding-left:var(--bui-space-6)}.sm\:bui-pl-7{padding-left:var(--bui-space-7)}.sm\:bui-pl-8{padding-left:var(--bui-space-8)}.sm\:bui-pl-9{padding-left:var(--bui-space-9)}.sm\:bui-pl-10{padding-left:var(--bui-space-10)}.sm\:bui-pl-11{padding-left:var(--bui-space-11)}.sm\:bui-pl-12{padding-left:var(--bui-space-12)}.sm\:bui-pl-13{padding-left:var(--bui-space-13)}.sm\:bui-pl-14{padding-left:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-pl{padding-left:var(--pl-md)}.md\:bui-pl-0\.5{padding-left:var(--bui-space-0_5)}.md\:bui-pl-1{padding-left:var(--bui-space-1)}.md\:bui-pl-1\.5{padding-left:var(--bui-space-1_5)}.md\:bui-pl-2{padding-left:var(--bui-space-2)}.md\:bui-pl-3{padding-left:var(--bui-space-3)}.md\:bui-pl-4{padding-left:var(--bui-space-4)}.md\:bui-pl-5{padding-left:var(--bui-space-5)}.md\:bui-pl-6{padding-left:var(--bui-space-6)}.md\:bui-pl-7{padding-left:var(--bui-space-7)}.md\:bui-pl-8{padding-left:var(--bui-space-8)}.md\:bui-pl-9{padding-left:var(--bui-space-9)}.md\:bui-pl-10{padding-left:var(--bui-space-10)}.md\:bui-pl-11{padding-left:var(--bui-space-11)}.md\:bui-pl-12{padding-left:var(--bui-space-12)}.md\:bui-pl-13{padding-left:var(--bui-space-13)}.md\:bui-pl-14{padding-left:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-pl{padding-left:var(--pl-lg)}.lg\:bui-pl-0\.5{padding-left:var(--bui-space-0_5)}.lg\:bui-pl-1{padding-left:var(--bui-space-1)}.lg\:bui-pl-1\.5{padding-left:var(--bui-space-1_5)}.lg\:bui-pl-2{padding-left:var(--bui-space-2)}.lg\:bui-pl-3{padding-left:var(--bui-space-3)}.lg\:bui-pl-4{padding-left:var(--bui-space-4)}.lg\:bui-pl-5{padding-left:var(--bui-space-5)}.lg\:bui-pl-6{padding-left:var(--bui-space-6)}.lg\:bui-pl-7{padding-left:var(--bui-space-7)}.lg\:bui-pl-8{padding-left:var(--bui-space-8)}.lg\:bui-pl-9{padding-left:var(--bui-space-9)}.lg\:bui-pl-10{padding-left:var(--bui-space-10)}.lg\:bui-pl-11{padding-left:var(--bui-space-11)}.lg\:bui-pl-12{padding-left:var(--bui-space-12)}.lg\:bui-pl-13{padding-left:var(--bui-space-13)}.lg\:bui-pl-14{padding-left:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-pl{padding-left:var(--pl-xl)}.xl\:bui-pl-0\.5{padding-left:var(--bui-space-0_5)}.xl\:bui-pl-1{padding-left:var(--bui-space-1)}.xl\:bui-pl-1\.5{padding-left:var(--bui-space-1_5)}.xl\:bui-pl-2{padding-left:var(--bui-space-2)}.xl\:bui-pl-3{padding-left:var(--bui-space-3)}.xl\:bui-pl-4{padding-left:var(--bui-space-4)}.xl\:bui-pl-5{padding-left:var(--bui-space-5)}.xl\:bui-pl-6{padding-left:var(--bui-space-6)}.xl\:bui-pl-7{padding-left:var(--bui-space-7)}.xl\:bui-pl-8{padding-left:var(--bui-space-8)}.xl\:bui-pl-9{padding-left:var(--bui-space-9)}.xl\:bui-pl-10{padding-left:var(--bui-space-10)}.xl\:bui-pl-11{padding-left:var(--bui-space-11)}.xl\:bui-pl-12{padding-left:var(--bui-space-12)}.xl\:bui-pl-13{padding-left:var(--bui-space-13)}.xl\:bui-pl-14{padding-left:var(--bui-space-14)}}.bui-pr{padding-right:var(--pr)}.bui-pr-0\.5{padding-right:var(--bui-space-0_5)}.bui-pr-1{padding-right:var(--bui-space-1)}.bui-pr-1\.5{padding-right:var(--bui-space-1_5)}.bui-pr-2{padding-right:var(--bui-space-2)}.bui-pr-3{padding-right:var(--bui-space-3)}.bui-pr-4{padding-right:var(--bui-space-4)}.bui-pr-5{padding-right:var(--bui-space-5)}.bui-pr-6{padding-right:var(--bui-space-6)}.bui-pr-7{padding-right:var(--bui-space-7)}.bui-pr-8{padding-right:var(--bui-space-8)}.bui-pr-9{padding-right:var(--bui-space-9)}.bui-pr-10{padding-right:var(--bui-space-10)}.bui-pr-11{padding-right:var(--bui-space-11)}.bui-pr-12{padding-right:var(--bui-space-12)}.bui-pr-13{padding-right:var(--bui-space-13)}.bui-pr-14{padding-right:var(--bui-space-14)}@media (width>=640px){.xs\:bui-pr{padding-right:var(--pr-xs)}.xs\:bui-pr-0\.5{padding-right:var(--bui-space-0_5)}.xs\:bui-pr-1{padding-right:var(--bui-space-1)}.xs\:bui-pr-1\.5{padding-right:var(--bui-space-1_5)}.xs\:bui-pr-2{padding-right:var(--bui-space-2)}.xs\:bui-pr-3{padding-right:var(--bui-space-3)}.xs\:bui-pr-4{padding-right:var(--bui-space-4)}.xs\:bui-pr-5{padding-right:var(--bui-space-5)}.xs\:bui-pr-6{padding-right:var(--bui-space-6)}.xs\:bui-pr-7{padding-right:var(--bui-space-7)}.xs\:bui-pr-8{padding-right:var(--bui-space-8)}.xs\:bui-pr-9{padding-right:var(--bui-space-9)}.xs\:bui-pr-10{padding-right:var(--bui-space-10)}.xs\:bui-pr-11{padding-right:var(--bui-space-11)}.xs\:bui-pr-12{padding-right:var(--bui-space-12)}.xs\:bui-pr-13{padding-right:var(--bui-space-13)}.xs\:bui-pr-14{padding-right:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-pr{padding-right:var(--pr-sm)}.sm\:bui-pr-0\.5{padding-right:var(--bui-space-0_5)}.sm\:bui-pr-1{padding-right:var(--bui-space-1)}.sm\:bui-pr-1\.5{padding-right:var(--bui-space-1_5)}.sm\:bui-pr-2{padding-right:var(--bui-space-2)}.sm\:bui-pr-3{padding-right:var(--bui-space-3)}.sm\:bui-pr-4{padding-right:var(--bui-space-4)}.sm\:bui-pr-5{padding-right:var(--bui-space-5)}.sm\:bui-pr-6{padding-right:var(--bui-space-6)}.sm\:bui-pr-7{padding-right:var(--bui-space-7)}.sm\:bui-pr-8{padding-right:var(--bui-space-8)}.sm\:bui-pr-9{padding-right:var(--bui-space-9)}.sm\:bui-pr-10{padding-right:var(--bui-space-10)}.sm\:bui-pr-11{padding-right:var(--bui-space-11)}.sm\:bui-pr-12{padding-right:var(--bui-space-12)}.sm\:bui-pr-13{padding-right:var(--bui-space-13)}.sm\:bui-pr-14{padding-right:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-pr{padding-right:var(--pr-md)}.md\:bui-pr-0\.5{padding-right:var(--bui-space-0_5)}.md\:bui-pr-1{padding-right:var(--bui-space-1)}.md\:bui-pr-1\.5{padding-right:var(--bui-space-1_5)}.md\:bui-pr-2{padding-right:var(--bui-space-2)}.md\:bui-pr-3{padding-right:var(--bui-space-3)}.md\:bui-pr-4{padding-right:var(--bui-space-4)}.md\:bui-pr-5{padding-right:var(--bui-space-5)}.md\:bui-pr-6{padding-right:var(--bui-space-6)}.md\:bui-pr-7{padding-right:var(--bui-space-7)}.md\:bui-pr-8{padding-right:var(--bui-space-8)}.md\:bui-pr-9{padding-right:var(--bui-space-9)}.md\:bui-pr-10{padding-right:var(--bui-space-10)}.md\:bui-pr-11{padding-right:var(--bui-space-11)}.md\:bui-pr-12{padding-right:var(--bui-space-12)}.md\:bui-pr-13{padding-right:var(--bui-space-13)}.md\:bui-pr-14{padding-right:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-pr{padding-right:var(--pr-lg)}.lg\:bui-pr-0\.5{padding-right:var(--bui-space-0_5)}.lg\:bui-pr-1{padding-right:var(--bui-space-1)}.lg\:bui-pr-1\.5{padding-right:var(--bui-space-1_5)}.lg\:bui-pr-2{padding-right:var(--bui-space-2)}.lg\:bui-pr-3{padding-right:var(--bui-space-3)}.lg\:bui-pr-4{padding-right:var(--bui-space-4)}.lg\:bui-pr-5{padding-right:var(--bui-space-5)}.lg\:bui-pr-6{padding-right:var(--bui-space-6)}.lg\:bui-pr-7{padding-right:var(--bui-space-7)}.lg\:bui-pr-8{padding-right:var(--bui-space-8)}.lg\:bui-pr-9{padding-right:var(--bui-space-9)}.lg\:bui-pr-10{padding-right:var(--bui-space-10)}.lg\:bui-pr-11{padding-right:var(--bui-space-11)}.lg\:bui-pr-12{padding-right:var(--bui-space-12)}.lg\:bui-pr-13{padding-right:var(--bui-space-13)}.lg\:bui-pr-14{padding-right:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-pr{padding-right:var(--pr-xl)}.xl\:bui-pr-0\.5{padding-right:var(--bui-space-0_5)}.xl\:bui-pr-1{padding-right:var(--bui-space-1)}.xl\:bui-pr-1\.5{padding-right:var(--bui-space-1_5)}.xl\:bui-pr-2{padding-right:var(--bui-space-2)}.xl\:bui-pr-3{padding-right:var(--bui-space-3)}.xl\:bui-pr-4{padding-right:var(--bui-space-4)}.xl\:bui-pr-5{padding-right:var(--bui-space-5)}.xl\:bui-pr-6{padding-right:var(--bui-space-6)}.xl\:bui-pr-7{padding-right:var(--bui-space-7)}.xl\:bui-pr-8{padding-right:var(--bui-space-8)}.xl\:bui-pr-9{padding-right:var(--bui-space-9)}.xl\:bui-pr-10{padding-right:var(--bui-space-10)}.xl\:bui-pr-11{padding-right:var(--bui-space-11)}.xl\:bui-pr-12{padding-right:var(--bui-space-12)}.xl\:bui-pr-13{padding-right:var(--bui-space-13)}.xl\:bui-pr-14{padding-right:var(--bui-space-14)}}.bui-pt{padding-top:var(--pt)}.bui-pt-0\.5{padding-top:var(--bui-space-0_5)}.bui-pt-1{padding-top:var(--bui-space-1)}.bui-pt-1\.5{padding-top:var(--bui-space-1_5)}.bui-pt-2{padding-top:var(--bui-space-2)}.bui-pt-3{padding-top:var(--bui-space-3)}.bui-pt-4{padding-top:var(--bui-space-4)}.bui-pt-5{padding-top:var(--bui-space-5)}.bui-pt-6{padding-top:var(--bui-space-6)}.bui-pt-7{padding-top:var(--bui-space-7)}.bui-pt-8{padding-top:var(--bui-space-8)}.bui-pt-9{padding-top:var(--bui-space-9)}.bui-pt-10{padding-top:var(--bui-space-10)}.bui-pt-11{padding-top:var(--bui-space-11)}.bui-pt-12{padding-top:var(--bui-space-12)}.bui-pt-13{padding-top:var(--bui-space-13)}.bui-pt-14{padding-top:var(--bui-space-14)}@media (width>=640px){.xs\:bui-pt{padding-top:var(--pt-xs)}.xs\:bui-pt-0\.5{padding-top:var(--bui-space-0_5)}.xs\:bui-pt-1{padding-top:var(--bui-space-1)}.xs\:bui-pt-1\.5{padding-top:var(--bui-space-1_5)}.xs\:bui-pt-2{padding-top:var(--bui-space-2)}.xs\:bui-pt-3{padding-top:var(--bui-space-3)}.xs\:bui-pt-4{padding-top:var(--bui-space-4)}.xs\:bui-pt-5{padding-top:var(--bui-space-5)}.xs\:bui-pt-6{padding-top:var(--bui-space-6)}.xs\:bui-pt-7{padding-top:var(--bui-space-7)}.xs\:bui-pt-8{padding-top:var(--bui-space-8)}.xs\:bui-pt-9{padding-top:var(--bui-space-9)}.xs\:bui-pt-10{padding-top:var(--bui-space-10)}.xs\:bui-pt-11{padding-top:var(--bui-space-11)}.xs\:bui-pt-12{padding-top:var(--bui-space-12)}.xs\:bui-pt-13{padding-top:var(--bui-space-13)}.xs\:bui-pt-14{padding-top:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-pt{padding-top:var(--pt-sm)}.sm\:bui-pt-0\.5{padding-top:var(--bui-space-0_5)}.sm\:bui-pt-1{padding-top:var(--bui-space-1)}.sm\:bui-pt-1\.5{padding-top:var(--bui-space-1_5)}.sm\:bui-pt-2{padding-top:var(--bui-space-2)}.sm\:bui-pt-3{padding-top:var(--bui-space-3)}.sm\:bui-pt-4{padding-top:var(--bui-space-4)}.sm\:bui-pt-5{padding-top:var(--bui-space-5)}.sm\:bui-pt-6{padding-top:var(--bui-space-6)}.sm\:bui-pt-7{padding-top:var(--bui-space-7)}.sm\:bui-pt-8{padding-top:var(--bui-space-8)}.sm\:bui-pt-9{padding-top:var(--bui-space-9)}.sm\:bui-pt-10{padding-top:var(--bui-space-10)}.sm\:bui-pt-11{padding-top:var(--bui-space-11)}.sm\:bui-pt-12{padding-top:var(--bui-space-12)}.sm\:bui-pt-13{padding-top:var(--bui-space-13)}.sm\:bui-pt-14{padding-top:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-pt{padding-top:var(--pt-md)}.md\:bui-pt-0\.5{padding-top:var(--bui-space-0_5)}.md\:bui-pt-1{padding-top:var(--bui-space-1)}.md\:bui-pt-1\.5{padding-top:var(--bui-space-1_5)}.md\:bui-pt-2{padding-top:var(--bui-space-2)}.md\:bui-pt-3{padding-top:var(--bui-space-3)}.md\:bui-pt-4{padding-top:var(--bui-space-4)}.md\:bui-pt-5{padding-top:var(--bui-space-5)}.md\:bui-pt-6{padding-top:var(--bui-space-6)}.md\:bui-pt-7{padding-top:var(--bui-space-7)}.md\:bui-pt-8{padding-top:var(--bui-space-8)}.md\:bui-pt-9{padding-top:var(--bui-space-9)}.md\:bui-pt-10{padding-top:var(--bui-space-10)}.md\:bui-pt-11{padding-top:var(--bui-space-11)}.md\:bui-pt-12{padding-top:var(--bui-space-12)}.md\:bui-pt-13{padding-top:var(--bui-space-13)}.md\:bui-pt-14{padding-top:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-pt{padding-top:var(--pt-lg)}.lg\:bui-pt-0\.5{padding-top:var(--bui-space-0_5)}.lg\:bui-pt-1{padding-top:var(--bui-space-1)}.lg\:bui-pt-1\.5{padding-top:var(--bui-space-1_5)}.lg\:bui-pt-2{padding-top:var(--bui-space-2)}.lg\:bui-pt-3{padding-top:var(--bui-space-3)}.lg\:bui-pt-4{padding-top:var(--bui-space-4)}.lg\:bui-pt-5{padding-top:var(--bui-space-5)}.lg\:bui-pt-6{padding-top:var(--bui-space-6)}.lg\:bui-pt-7{padding-top:var(--bui-space-7)}.lg\:bui-pt-8{padding-top:var(--bui-space-8)}.lg\:bui-pt-9{padding-top:var(--bui-space-9)}.lg\:bui-pt-10{padding-top:var(--bui-space-10)}.lg\:bui-pt-11{padding-top:var(--bui-space-11)}.lg\:bui-pt-12{padding-top:var(--bui-space-12)}.lg\:bui-pt-13{padding-top:var(--bui-space-13)}.lg\:bui-pt-14{padding-top:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-pt{padding-top:var(--pt-xl)}.xl\:bui-pt-0\.5{padding-top:var(--bui-space-0_5)}.xl\:bui-pt-1{padding-top:var(--bui-space-1)}.xl\:bui-pt-1\.5{padding-top:var(--bui-space-1_5)}.xl\:bui-pt-2{padding-top:var(--bui-space-2)}.xl\:bui-pt-3{padding-top:var(--bui-space-3)}.xl\:bui-pt-4{padding-top:var(--bui-space-4)}.xl\:bui-pt-5{padding-top:var(--bui-space-5)}.xl\:bui-pt-6{padding-top:var(--bui-space-6)}.xl\:bui-pt-7{padding-top:var(--bui-space-7)}.xl\:bui-pt-8{padding-top:var(--bui-space-8)}.xl\:bui-pt-9{padding-top:var(--bui-space-9)}.xl\:bui-pt-10{padding-top:var(--bui-space-10)}.xl\:bui-pt-11{padding-top:var(--bui-space-11)}.xl\:bui-pt-12{padding-top:var(--bui-space-12)}.xl\:bui-pt-13{padding-top:var(--bui-space-13)}.xl\:bui-pt-14{padding-top:var(--bui-space-14)}}.bui-pb{padding-bottom:var(--pb)}.bui-pb-0\.5{padding-bottom:var(--bui-space-0_5)}.bui-pb-1{padding-bottom:var(--bui-space-1)}.bui-pb-1\.5{padding-bottom:var(--bui-space-1_5)}.bui-pb-2{padding-bottom:var(--bui-space-2)}.bui-pb-3{padding-bottom:var(--bui-space-3)}.bui-pb-4{padding-bottom:var(--bui-space-4)}.bui-pb-5{padding-bottom:var(--bui-space-5)}.bui-pb-6{padding-bottom:var(--bui-space-6)}.bui-pb-7{padding-bottom:var(--bui-space-7)}.bui-pb-8{padding-bottom:var(--bui-space-8)}.bui-pb-9{padding-bottom:var(--bui-space-9)}.bui-pb-10{padding-bottom:var(--bui-space-10)}.bui-pb-11{padding-bottom:var(--bui-space-11)}.bui-pb-12{padding-bottom:var(--bui-space-12)}.bui-pb-13{padding-bottom:var(--bui-space-13)}.bui-pb-14{padding-bottom:var(--bui-space-14)}@media (width>=640px){.xs\:bui-pb{padding-bottom:var(--pb-xs)}.xs\:bui-pb-0\.5{padding-bottom:var(--bui-space-0_5)}.xs\:bui-pb-1{padding-bottom:var(--bui-space-1)}.xs\:bui-pb-1\.5{padding-bottom:var(--bui-space-1_5)}.xs\:bui-pb-2{padding-bottom:var(--bui-space-2)}.xs\:bui-pb-3{padding-bottom:var(--bui-space-3)}.xs\:bui-pb-4{padding-bottom:var(--bui-space-4)}.xs\:bui-pb-5{padding-bottom:var(--bui-space-5)}.xs\:bui-pb-6{padding-bottom:var(--bui-space-6)}.xs\:bui-pb-7{padding-bottom:var(--bui-space-7)}.xs\:bui-pb-8{padding-bottom:var(--bui-space-8)}.xs\:bui-pb-9{padding-bottom:var(--bui-space-9)}.xs\:bui-pb-10{padding-bottom:var(--bui-space-10)}.xs\:bui-pb-11{padding-bottom:var(--bui-space-11)}.xs\:bui-pb-12{padding-bottom:var(--bui-space-12)}.xs\:bui-pb-13{padding-bottom:var(--bui-space-13)}.xs\:bui-pb-14{padding-bottom:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-pb{padding-bottom:var(--pb-sm)}.sm\:bui-pb-0\.5{padding-bottom:var(--bui-space-0_5)}.sm\:bui-pb-1{padding-bottom:var(--bui-space-1)}.sm\:bui-pb-1\.5{padding-bottom:var(--bui-space-1_5)}.sm\:bui-pb-2{padding-bottom:var(--bui-space-2)}.sm\:bui-pb-3{padding-bottom:var(--bui-space-3)}.sm\:bui-pb-4{padding-bottom:var(--bui-space-4)}.sm\:bui-pb-5{padding-bottom:var(--bui-space-5)}.sm\:bui-pb-6{padding-bottom:var(--bui-space-6)}.sm\:bui-pb-7{padding-bottom:var(--bui-space-7)}.sm\:bui-pb-8{padding-bottom:var(--bui-space-8)}.sm\:bui-pb-9{padding-bottom:var(--bui-space-9)}.sm\:bui-pb-10{padding-bottom:var(--bui-space-10)}.sm\:bui-pb-11{padding-bottom:var(--bui-space-11)}.sm\:bui-pb-12{padding-bottom:var(--bui-space-12)}.sm\:bui-pb-13{padding-bottom:var(--bui-space-13)}.sm\:bui-pb-14{padding-bottom:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-pb{padding-bottom:var(--pb-md)}.md\:bui-pb-0\.5{padding-bottom:var(--bui-space-0_5)}.md\:bui-pb-1{padding-bottom:var(--bui-space-1)}.md\:bui-pb-1\.5{padding-bottom:var(--bui-space-1_5)}.md\:bui-pb-2{padding-bottom:var(--bui-space-2)}.md\:bui-pb-3{padding-bottom:var(--bui-space-3)}.md\:bui-pb-4{padding-bottom:var(--bui-space-4)}.md\:bui-pb-5{padding-bottom:var(--bui-space-5)}.md\:bui-pb-6{padding-bottom:var(--bui-space-6)}.md\:bui-pb-7{padding-bottom:var(--bui-space-7)}.md\:bui-pb-8{padding-bottom:var(--bui-space-8)}.md\:bui-pb-9{padding-bottom:var(--bui-space-9)}.md\:bui-pb-10{padding-bottom:var(--bui-space-10)}.md\:bui-pb-11{padding-bottom:var(--bui-space-11)}.md\:bui-pb-12{padding-bottom:var(--bui-space-12)}.md\:bui-pb-13{padding-bottom:var(--bui-space-13)}.md\:bui-pb-14{padding-bottom:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-pb{padding-bottom:var(--pb-lg)}.lg\:bui-pb-0\.5{padding-bottom:var(--bui-space-0_5)}.lg\:bui-pb-1{padding-bottom:var(--bui-space-1)}.lg\:bui-pb-1\.5{padding-bottom:var(--bui-space-1_5)}.lg\:bui-pb-2{padding-bottom:var(--bui-space-2)}.lg\:bui-pb-3{padding-bottom:var(--bui-space-3)}.lg\:bui-pb-4{padding-bottom:var(--bui-space-4)}.lg\:bui-pb-5{padding-bottom:var(--bui-space-5)}.lg\:bui-pb-6{padding-bottom:var(--bui-space-6)}.lg\:bui-pb-7{padding-bottom:var(--bui-space-7)}.lg\:bui-pb-8{padding-bottom:var(--bui-space-8)}.lg\:bui-pb-9{padding-bottom:var(--bui-space-9)}.lg\:bui-pb-10{padding-bottom:var(--bui-space-10)}.lg\:bui-pb-11{padding-bottom:var(--bui-space-11)}.lg\:bui-pb-12{padding-bottom:var(--bui-space-12)}.lg\:bui-pb-13{padding-bottom:var(--bui-space-13)}.lg\:bui-pb-14{padding-bottom:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-pb{padding-bottom:var(--pb-xl)}.xl\:bui-pb-0\.5{padding-bottom:var(--bui-space-0_5)}.xl\:bui-pb-1{padding-bottom:var(--bui-space-1)}.xl\:bui-pb-1\.5{padding-bottom:var(--bui-space-1_5)}.xl\:bui-pb-2{padding-bottom:var(--bui-space-2)}.xl\:bui-pb-3{padding-bottom:var(--bui-space-3)}.xl\:bui-pb-4{padding-bottom:var(--bui-space-4)}.xl\:bui-pb-5{padding-bottom:var(--bui-space-5)}.xl\:bui-pb-6{padding-bottom:var(--bui-space-6)}.xl\:bui-pb-7{padding-bottom:var(--bui-space-7)}.xl\:bui-pb-8{padding-bottom:var(--bui-space-8)}.xl\:bui-pb-9{padding-bottom:var(--bui-space-9)}.xl\:bui-pb-10{padding-bottom:var(--bui-space-10)}.xl\:bui-pb-11{padding-bottom:var(--bui-space-11)}.xl\:bui-pb-12{padding-bottom:var(--bui-space-12)}.xl\:bui-pb-13{padding-bottom:var(--bui-space-13)}.xl\:bui-pb-14{padding-bottom:var(--bui-space-14)}}.bui-py{padding-top:var(--py);padding-bottom:var(--py)}.bui-py-0\.5{padding-top:var(--bui-space-0_5);padding-bottom:var(--bui-space-0_5)}.bui-py-1{padding-top:var(--bui-space-1);padding-bottom:var(--bui-space-1)}.bui-py-1\.5{padding-top:var(--bui-space-1_5);padding-bottom:var(--bui-space-1_5)}.bui-py-2{padding-top:var(--bui-space-2);padding-bottom:var(--bui-space-2)}.bui-py-3{padding-top:var(--bui-space-3);padding-bottom:var(--bui-space-3)}.bui-py-4{padding-top:var(--bui-space-4);padding-bottom:var(--bui-space-4)}.bui-py-5{padding-top:var(--bui-space-5);padding-bottom:var(--bui-space-5)}.bui-py-6{padding-top:var(--bui-space-6);padding-bottom:var(--bui-space-6)}.bui-py-7{padding-top:var(--bui-space-7);padding-bottom:var(--bui-space-7)}.bui-py-8{padding-top:var(--bui-space-8);padding-bottom:var(--bui-space-8)}.bui-py-9{padding-top:var(--bui-space-9);padding-bottom:var(--bui-space-9)}.bui-py-10{padding-top:var(--bui-space-10);padding-bottom:var(--bui-space-10)}.bui-py-11{padding-top:var(--bui-space-11);padding-bottom:var(--bui-space-11)}.bui-py-12{padding-top:var(--bui-space-12);padding-bottom:var(--bui-space-12)}.bui-py-13{padding-top:var(--bui-space-13);padding-bottom:var(--bui-space-13)}.bui-py-14{padding-top:var(--bui-space-14);padding-bottom:var(--bui-space-14)}@media (width>=640px){.xs\:bui-py{padding-top:var(--py-xs);padding-bottom:var(--py-xs)}.xs\:bui-py-0\.5{padding-top:var(--bui-space-0_5);padding-bottom:var(--bui-space-0_5)}.xs\:bui-py-1{padding-top:var(--bui-space-1);padding-bottom:var(--bui-space-1)}.xs\:bui-py-1\.5{padding-top:var(--bui-space-1_5);padding-bottom:var(--bui-space-1_5)}.xs\:bui-py-2{padding-top:var(--bui-space-2);padding-bottom:var(--bui-space-2)}.xs\:bui-py-3{padding-top:var(--bui-space-3);padding-bottom:var(--bui-space-3)}.xs\:bui-py-4{padding-top:var(--bui-space-4);padding-bottom:var(--bui-space-4)}.xs\:bui-py-5{padding-top:var(--bui-space-5);padding-bottom:var(--bui-space-5)}.xs\:bui-py-6{padding-top:var(--bui-space-6);padding-bottom:var(--bui-space-6)}.xs\:bui-py-7{padding-top:var(--bui-space-7);padding-bottom:var(--bui-space-7)}.xs\:bui-py-8{padding-top:var(--bui-space-8);padding-bottom:var(--bui-space-8)}.xs\:bui-py-9{padding-top:var(--bui-space-9);padding-bottom:var(--bui-space-9)}.xs\:bui-py-10{padding-top:var(--bui-space-10);padding-bottom:var(--bui-space-10)}.xs\:bui-py-11{padding-top:var(--bui-space-11);padding-bottom:var(--bui-space-11)}.xs\:bui-py-12{padding-top:var(--bui-space-12);padding-bottom:var(--bui-space-12)}.xs\:bui-py-13{padding-top:var(--bui-space-13);padding-bottom:var(--bui-space-13)}.xs\:bui-py-14{padding-top:var(--bui-space-14);padding-bottom:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-py{padding-top:var(--py-sm);padding-bottom:var(--py-sm)}.sm\:bui-py-0\.5{padding-top:var(--bui-space-0_5);padding-bottom:var(--bui-space-0_5)}.sm\:bui-py-1{padding-top:var(--bui-space-1);padding-bottom:var(--bui-space-1)}.sm\:bui-py-1\.5{padding-top:var(--bui-space-1_5);padding-bottom:var(--bui-space-1_5)}.sm\:bui-py-2{padding-top:var(--bui-space-2);padding-bottom:var(--bui-space-2)}.sm\:bui-py-3{padding-top:var(--bui-space-3);padding-bottom:var(--bui-space-3)}.sm\:bui-py-4{padding-top:var(--bui-space-4);padding-bottom:var(--bui-space-4)}.sm\:bui-py-5{padding-top:var(--bui-space-5);padding-bottom:var(--bui-space-5)}.sm\:bui-py-6{padding-top:var(--bui-space-6);padding-bottom:var(--bui-space-6)}.sm\:bui-py-7{padding-top:var(--bui-space-7);padding-bottom:var(--bui-space-7)}.sm\:bui-py-8{padding-top:var(--bui-space-8);padding-bottom:var(--bui-space-8)}.sm\:bui-py-9{padding-top:var(--bui-space-9);padding-bottom:var(--bui-space-9)}.sm\:bui-py-10{padding-top:var(--bui-space-10);padding-bottom:var(--bui-space-10)}.sm\:bui-py-11{padding-top:var(--bui-space-11);padding-bottom:var(--bui-space-11)}.sm\:bui-py-12{padding-top:var(--bui-space-12);padding-bottom:var(--bui-space-12)}.sm\:bui-py-13{padding-top:var(--bui-space-13);padding-bottom:var(--bui-space-13)}.sm\:bui-py-14{padding-top:var(--bui-space-14);padding-bottom:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-py{padding-top:var(--py-md);padding-bottom:var(--py-md)}.md\:bui-py-0\.5{padding-top:var(--bui-space-0_5);padding-bottom:var(--bui-space-0_5)}.md\:bui-py-1{padding-top:var(--bui-space-1);padding-bottom:var(--bui-space-1)}.md\:bui-py-1\.5{padding-top:var(--bui-space-1_5);padding-bottom:var(--bui-space-1_5)}.md\:bui-py-2{padding-top:var(--bui-space-2);padding-bottom:var(--bui-space-2)}.md\:bui-py-3{padding-top:var(--bui-space-3);padding-bottom:var(--bui-space-3)}.md\:bui-py-4{padding-top:var(--bui-space-4);padding-bottom:var(--bui-space-4)}.md\:bui-py-5{padding-top:var(--bui-space-5);padding-bottom:var(--bui-space-5)}.md\:bui-py-6{padding-top:var(--bui-space-6);padding-bottom:var(--bui-space-6)}.md\:bui-py-7{padding-top:var(--bui-space-7);padding-bottom:var(--bui-space-7)}.md\:bui-py-8{padding-top:var(--bui-space-8);padding-bottom:var(--bui-space-8)}.md\:bui-py-9{padding-top:var(--bui-space-9);padding-bottom:var(--bui-space-9)}.md\:bui-py-10{padding-top:var(--bui-space-10);padding-bottom:var(--bui-space-10)}.md\:bui-py-11{padding-top:var(--bui-space-11);padding-bottom:var(--bui-space-11)}.md\:bui-py-12{padding-top:var(--bui-space-12);padding-bottom:var(--bui-space-12)}.md\:bui-py-13{padding-top:var(--bui-space-13);padding-bottom:var(--bui-space-13)}.md\:bui-py-14{padding-top:var(--bui-space-14);padding-bottom:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-py{padding-top:var(--py-lg);padding-bottom:var(--py-lg)}.lg\:bui-py-0\.5{padding-top:var(--bui-space-0_5);padding-bottom:var(--bui-space-0_5)}.lg\:bui-py-1{padding-top:var(--bui-space-1);padding-bottom:var(--bui-space-1)}.lg\:bui-py-1\.5{padding-top:var(--bui-space-1_5);padding-bottom:var(--bui-space-1_5)}.lg\:bui-py-2{padding-top:var(--bui-space-2);padding-bottom:var(--bui-space-2)}.lg\:bui-py-3{padding-top:var(--bui-space-3);padding-bottom:var(--bui-space-3)}.lg\:bui-py-4{padding-top:var(--bui-space-4);padding-bottom:var(--bui-space-4)}.lg\:bui-py-5{padding-top:var(--bui-space-5);padding-bottom:var(--bui-space-5)}.lg\:bui-py-6{padding-top:var(--bui-space-6);padding-bottom:var(--bui-space-6)}.lg\:bui-py-7{padding-top:var(--bui-space-7);padding-bottom:var(--bui-space-7)}.lg\:bui-py-8{padding-top:var(--bui-space-8);padding-bottom:var(--bui-space-8)}.lg\:bui-py-9{padding-top:var(--bui-space-9);padding-bottom:var(--bui-space-9)}.lg\:bui-py-10{padding-top:var(--bui-space-10);padding-bottom:var(--bui-space-10)}.lg\:bui-py-11{padding-top:var(--bui-space-11);padding-bottom:var(--bui-space-11)}.lg\:bui-py-12{padding-top:var(--bui-space-12);padding-bottom:var(--bui-space-12)}.lg\:bui-py-13{padding-top:var(--bui-space-13);padding-bottom:var(--bui-space-13)}.lg\:bui-py-14{padding-top:var(--bui-space-14);padding-bottom:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-py{padding-top:var(--py-xl);padding-bottom:var(--py-xl)}.xl\:bui-py-0\.5{padding-top:var(--bui-space-0_5);padding-bottom:var(--bui-space-0_5)}.xl\:bui-py-1{padding-top:var(--bui-space-1);padding-bottom:var(--bui-space-1)}.xl\:bui-py-1\.5{padding-top:var(--bui-space-1_5);padding-bottom:var(--bui-space-1_5)}.xl\:bui-py-2{padding-top:var(--bui-space-2);padding-bottom:var(--bui-space-2)}.xl\:bui-py-3{padding-top:var(--bui-space-3);padding-bottom:var(--bui-space-3)}.xl\:bui-py-4{padding-top:var(--bui-space-4);padding-bottom:var(--bui-space-4)}.xl\:bui-py-5{padding-top:var(--bui-space-5);padding-bottom:var(--bui-space-5)}.xl\:bui-py-6{padding-top:var(--bui-space-6);padding-bottom:var(--bui-space-6)}.xl\:bui-py-7{padding-top:var(--bui-space-7);padding-bottom:var(--bui-space-7)}.xl\:bui-py-8{padding-top:var(--bui-space-8);padding-bottom:var(--bui-space-8)}.xl\:bui-py-9{padding-top:var(--bui-space-9);padding-bottom:var(--bui-space-9)}.xl\:bui-py-10{padding-top:var(--bui-space-10);padding-bottom:var(--bui-space-10)}.xl\:bui-py-11{padding-top:var(--bui-space-11);padding-bottom:var(--bui-space-11)}.xl\:bui-py-12{padding-top:var(--bui-space-12);padding-bottom:var(--bui-space-12)}.xl\:bui-py-13{padding-top:var(--bui-space-13);padding-bottom:var(--bui-space-13)}.xl\:bui-py-14{padding-top:var(--bui-space-14);padding-bottom:var(--bui-space-14)}}.bui-px{padding-left:var(--px);padding-right:var(--px)}.bui-px-0\.5{padding-left:var(--bui-space-0_5);padding-right:var(--bui-space-0_5)}.bui-px-1{padding-left:var(--bui-space-1);padding-right:var(--bui-space-1)}.bui-px-1\.5{padding-left:var(--bui-space-1_5);padding-right:var(--bui-space-1_5)}.bui-px-2{padding-left:var(--bui-space-2);padding-right:var(--bui-space-2)}.bui-px-3{padding-left:var(--bui-space-3);padding-right:var(--bui-space-3)}.bui-px-4{padding-left:var(--bui-space-4);padding-right:var(--bui-space-4)}.bui-px-5{padding-left:var(--bui-space-5);padding-right:var(--bui-space-5)}.bui-px-6{padding-left:var(--bui-space-6);padding-right:var(--bui-space-6)}.bui-px-7{padding-left:var(--bui-space-7);padding-right:var(--bui-space-7)}.bui-px-8{padding-left:var(--bui-space-8);padding-right:var(--bui-space-8)}.bui-px-9{padding-left:var(--bui-space-9);padding-right:var(--bui-space-9)}.bui-px-10{padding-left:var(--bui-space-10);padding-right:var(--bui-space-10)}.bui-px-11{padding-left:var(--bui-space-11);padding-right:var(--bui-space-11)}.bui-px-12{padding-left:var(--bui-space-12);padding-right:var(--bui-space-12)}.bui-px-13{padding-left:var(--bui-space-13);padding-right:var(--bui-space-13)}.bui-px-14{padding-left:var(--bui-space-14);padding-right:var(--bui-space-14)}@media (width>=640px){.xs\:bui-px{padding-left:var(--px-xs);padding-right:var(--px-xs)}.xs\:bui-px-0\.5{padding-left:var(--bui-space-0_5);padding-right:var(--bui-space-0_5)}.xs\:bui-px-1{padding-left:var(--bui-space-1);padding-right:var(--bui-space-1)}.xs\:bui-px-1\.5{padding-left:var(--bui-space-1_5);padding-right:var(--bui-space-1_5)}.xs\:bui-px-2{padding-left:var(--bui-space-2);padding-right:var(--bui-space-2)}.xs\:bui-px-3{padding-left:var(--bui-space-3);padding-right:var(--bui-space-3)}.xs\:bui-px-4{padding-left:var(--bui-space-4);padding-right:var(--bui-space-4)}.xs\:bui-px-5{padding-left:var(--bui-space-5);padding-right:var(--bui-space-5)}.xs\:bui-px-6{padding-left:var(--bui-space-6);padding-right:var(--bui-space-6)}.xs\:bui-px-7{padding-left:var(--bui-space-7);padding-right:var(--bui-space-7)}.xs\:bui-px-8{padding-left:var(--bui-space-8);padding-right:var(--bui-space-8)}.xs\:bui-px-9{padding-left:var(--bui-space-9);padding-right:var(--bui-space-9)}.xs\:bui-px-10{padding-left:var(--bui-space-10);padding-right:var(--bui-space-10)}.xs\:bui-px-11{padding-left:var(--bui-space-11);padding-right:var(--bui-space-11)}.xs\:bui-px-12{padding-left:var(--bui-space-12);padding-right:var(--bui-space-12)}.xs\:bui-px-13{padding-left:var(--bui-space-13);padding-right:var(--bui-space-13)}.xs\:bui-px-14{padding-left:var(--bui-space-14);padding-right:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-px{padding-left:var(--px-sm);padding-right:var(--px-sm)}.sm\:bui-px-0\.5{padding-left:var(--bui-space-0_5);padding-right:var(--bui-space-0_5)}.sm\:bui-px-1{padding-left:var(--bui-space-1);padding-right:var(--bui-space-1)}.sm\:bui-px-1\.5{padding-left:var(--bui-space-1_5);padding-right:var(--bui-space-1_5)}.sm\:bui-px-2{padding-left:var(--bui-space-2);padding-right:var(--bui-space-2)}.sm\:bui-px-3{padding-left:var(--bui-space-3);padding-right:var(--bui-space-3)}.sm\:bui-px-4{padding-left:var(--bui-space-4);padding-right:var(--bui-space-4)}.sm\:bui-px-5{padding-left:var(--bui-space-5);padding-right:var(--bui-space-5)}.sm\:bui-px-6{padding-left:var(--bui-space-6);padding-right:var(--bui-space-6)}.sm\:bui-px-7{padding-left:var(--bui-space-7);padding-right:var(--bui-space-7)}.sm\:bui-px-8{padding-left:var(--bui-space-8);padding-right:var(--bui-space-8)}.sm\:bui-px-9{padding-left:var(--bui-space-9);padding-right:var(--bui-space-9)}.sm\:bui-px-10{padding-left:var(--bui-space-10);padding-right:var(--bui-space-10)}.sm\:bui-px-11{padding-left:var(--bui-space-11);padding-right:var(--bui-space-11)}.sm\:bui-px-12{padding-left:var(--bui-space-12);padding-right:var(--bui-space-12)}.sm\:bui-px-13{padding-left:var(--bui-space-13);padding-right:var(--bui-space-13)}.sm\:bui-px-14{padding-left:var(--bui-space-14);padding-right:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-px{padding-left:var(--px-md);padding-right:var(--px-md)}.md\:bui-px-0\.5{padding-left:var(--bui-space-0_5);padding-right:var(--bui-space-0_5)}.md\:bui-px-1{padding-left:var(--bui-space-1);padding-right:var(--bui-space-1)}.md\:bui-px-1\.5{padding-left:var(--bui-space-1_5);padding-right:var(--bui-space-1_5)}.md\:bui-px-2{padding-left:var(--bui-space-2);padding-right:var(--bui-space-2)}.md\:bui-px-3{padding-left:var(--bui-space-3);padding-right:var(--bui-space-3)}.md\:bui-px-4{padding-left:var(--bui-space-4);padding-right:var(--bui-space-4)}.md\:bui-px-5{padding-left:var(--bui-space-5);padding-right:var(--bui-space-5)}.md\:bui-px-6{padding-left:var(--bui-space-6);padding-right:var(--bui-space-6)}.md\:bui-px-7{padding-left:var(--bui-space-7);padding-right:var(--bui-space-7)}.md\:bui-px-8{padding-left:var(--bui-space-8);padding-right:var(--bui-space-8)}.md\:bui-px-9{padding-left:var(--bui-space-9);padding-right:var(--bui-space-9)}.md\:bui-px-10{padding-left:var(--bui-space-10);padding-right:var(--bui-space-10)}.md\:bui-px-11{padding-left:var(--bui-space-11);padding-right:var(--bui-space-11)}.md\:bui-px-12{padding-left:var(--bui-space-12);padding-right:var(--bui-space-12)}.md\:bui-px-13{padding-left:var(--bui-space-13);padding-right:var(--bui-space-13)}.md\:bui-px-14{padding-left:var(--bui-space-14);padding-right:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-px{padding-left:var(--px-lg);padding-right:var(--px-lg)}.lg\:bui-px-0\.5{padding-left:var(--bui-space-0_5);padding-right:var(--bui-space-0_5)}.lg\:bui-px-1{padding-left:var(--bui-space-1);padding-right:var(--bui-space-1)}.lg\:bui-px-1\.5{padding-left:var(--bui-space-1_5);padding-right:var(--bui-space-1_5)}.lg\:bui-px-2{padding-left:var(--bui-space-2);padding-right:var(--bui-space-2)}.lg\:bui-px-3{padding-left:var(--bui-space-3);padding-right:var(--bui-space-3)}.lg\:bui-px-4{padding-left:var(--bui-space-4);padding-right:var(--bui-space-4)}.lg\:bui-px-5{padding-left:var(--bui-space-5);padding-right:var(--bui-space-5)}.lg\:bui-px-6{padding-left:var(--bui-space-6);padding-right:var(--bui-space-6)}.lg\:bui-px-7{padding-left:var(--bui-space-7);padding-right:var(--bui-space-7)}.lg\:bui-px-8{padding-left:var(--bui-space-8);padding-right:var(--bui-space-8)}.lg\:bui-px-9{padding-left:var(--bui-space-9);padding-right:var(--bui-space-9)}.lg\:bui-px-10{padding-left:var(--bui-space-10);padding-right:var(--bui-space-10)}.lg\:bui-px-11{padding-left:var(--bui-space-11);padding-right:var(--bui-space-11)}.lg\:bui-px-12{padding-left:var(--bui-space-12);padding-right:var(--bui-space-12)}.lg\:bui-px-13{padding-left:var(--bui-space-13);padding-right:var(--bui-space-13)}.lg\:bui-px-14{padding-left:var(--bui-space-14);padding-right:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-px{padding-left:var(--px-xl);padding-right:var(--px-xl)}.xl\:bui-px-0\.5{padding-left:var(--bui-space-0_5);padding-right:var(--bui-space-0_5)}.xl\:bui-px-1{padding-left:var(--bui-space-1);padding-right:var(--bui-space-1)}.xl\:bui-px-1\.5{padding-left:var(--bui-space-1_5);padding-right:var(--bui-space-1_5)}.xl\:bui-px-2{padding-left:var(--bui-space-2);padding-right:var(--bui-space-2)}.xl\:bui-px-3{padding-left:var(--bui-space-3);padding-right:var(--bui-space-3)}.xl\:bui-px-4{padding-left:var(--bui-space-4);padding-right:var(--bui-space-4)}.xl\:bui-px-5{padding-left:var(--bui-space-5);padding-right:var(--bui-space-5)}.xl\:bui-px-6{padding-left:var(--bui-space-6);padding-right:var(--bui-space-6)}.xl\:bui-px-7{padding-left:var(--bui-space-7);padding-right:var(--bui-space-7)}.xl\:bui-px-8{padding-left:var(--bui-space-8);padding-right:var(--bui-space-8)}.xl\:bui-px-9{padding-left:var(--bui-space-9);padding-right:var(--bui-space-9)}.xl\:bui-px-10{padding-left:var(--bui-space-10);padding-right:var(--bui-space-10)}.xl\:bui-px-11{padding-left:var(--bui-space-11);padding-right:var(--bui-space-11)}.xl\:bui-px-12{padding-left:var(--bui-space-12);padding-right:var(--bui-space-12)}.xl\:bui-px-13{padding-left:var(--bui-space-13);padding-right:var(--bui-space-13)}.xl\:bui-px-14{padding-left:var(--bui-space-14);padding-right:var(--bui-space-14)}}.bui-m{margin:var(--m)}.bui-m-0\.5{margin:var(--bui-space-0_5)}.bui-m-1{margin:var(--bui-space-1)}.bui-m-1\.5{margin:var(--bui-space-1_5)}.bui-m-2{margin:var(--bui-space-2)}.bui-m-3{margin:var(--bui-space-3)}.bui-m-4{margin:var(--bui-space-4)}.bui-m-5{margin:var(--bui-space-5)}.bui-m-6{margin:var(--bui-space-6)}.bui-m-7{margin:var(--bui-space-7)}.bui-m-8{margin:var(--bui-space-8)}.bui-m-9{margin:var(--bui-space-9)}.bui-m-10{margin:var(--bui-space-10)}.bui-m-11{margin:var(--bui-space-11)}.bui-m-12{margin:var(--bui-space-12)}.bui-m-13{margin:var(--bui-space-13)}.bui-m-14{margin:var(--bui-space-14)}@media (width>=640px){.xs\:bui-m{margin:var(--p-xs)}.xs\:bui-m-0\.5{margin:var(--bui-space-0_5)}.xs\:bui-m-1{margin:var(--bui-space-1)}.xs\:bui-m-1\.5{margin:var(--bui-space-1_5)}.xs\:bui-m-2{margin:var(--bui-space-2)}.xs\:bui-m-3{margin:var(--bui-space-3)}.xs\:bui-m-4{margin:var(--bui-space-4)}.xs\:bui-m-5{margin:var(--bui-space-5)}.xs\:bui-m-6{margin:var(--bui-space-6)}.xs\:bui-m-7{margin:var(--bui-space-7)}.xs\:bui-m-8{margin:var(--bui-space-8)}.xs\:bui-m-9{margin:var(--bui-space-9)}.xs\:bui-m-10{margin:var(--bui-space-10)}.xs\:bui-m-11{margin:var(--bui-space-11)}.xs\:bui-m-12{margin:var(--bui-space-12)}.xs\:bui-m-13{margin:var(--bui-space-13)}.xs\:bui-m-14{margin:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-m{margin:var(--p-sm)}.sm\:bui-m-0\.5{margin:var(--bui-space-0_5)}.sm\:bui-m-1{margin:var(--bui-space-1)}.sm\:bui-m-1\.5{margin:var(--bui-space-1_5)}.sm\:bui-m-2{margin:var(--bui-space-2)}.sm\:bui-m-3{margin:var(--bui-space-3)}.sm\:bui-m-4{margin:var(--bui-space-4)}.sm\:bui-m-5{margin:var(--bui-space-5)}.sm\:bui-m-6{margin:var(--bui-space-6)}.sm\:bui-m-7{margin:var(--bui-space-7)}.sm\:bui-m-8{margin:var(--bui-space-8)}.sm\:bui-m-9{margin:var(--bui-space-9)}.sm\:bui-m-10{margin:var(--bui-space-10)}.sm\:bui-m-11{margin:var(--bui-space-11)}.sm\:bui-m-12{margin:var(--bui-space-12)}.sm\:bui-m-13{margin:var(--bui-space-13)}.sm\:bui-m-14{margin:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-m{margin:var(--p-md)}.md\:bui-m-0\.5{margin:var(--bui-space-0_5)}.md\:bui-m-1{margin:var(--bui-space-1)}.md\:bui-m-1\.5{margin:var(--bui-space-1_5)}.md\:bui-m-2{margin:var(--bui-space-2)}.md\:bui-m-3{margin:var(--bui-space-3)}.md\:bui-m-4{margin:var(--bui-space-4)}.md\:bui-m-5{margin:var(--bui-space-5)}.md\:bui-m-6{margin:var(--bui-space-6)}.md\:bui-m-7{margin:var(--bui-space-7)}.md\:bui-m-8{margin:var(--bui-space-8)}.md\:bui-m-9{margin:var(--bui-space-9)}.md\:bui-m-10{margin:var(--bui-space-10)}.md\:bui-m-11{margin:var(--bui-space-11)}.md\:bui-m-12{margin:var(--bui-space-12)}.md\:bui-m-13{margin:var(--bui-space-13)}.md\:bui-m-14{margin:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-m{margin:var(--p-lg)}.lg\:bui-m-0\.5{margin:var(--bui-space-0_5)}.lg\:bui-m-1{margin:var(--bui-space-1)}.lg\:bui-m-1\.5{margin:var(--bui-space-1_5)}.lg\:bui-m-2{margin:var(--bui-space-2)}.lg\:bui-m-3{margin:var(--bui-space-3)}.lg\:bui-m-4{margin:var(--bui-space-4)}.lg\:bui-m-5{margin:var(--bui-space-5)}.lg\:bui-m-6{margin:var(--bui-space-6)}.lg\:bui-m-7{margin:var(--bui-space-7)}.lg\:bui-m-8{margin:var(--bui-space-8)}.lg\:bui-m-9{margin:var(--bui-space-9)}.lg\:bui-m-10{margin:var(--bui-space-10)}.lg\:bui-m-11{margin:var(--bui-space-11)}.lg\:bui-m-12{margin:var(--bui-space-12)}.lg\:bui-m-13{margin:var(--bui-space-13)}.lg\:bui-m-14{margin:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-m{margin:var(--p-xl)}.xl\:bui-m-0\.5{margin:var(--bui-space-0_5)}.xl\:bui-m-1{margin:var(--bui-space-1)}.xl\:bui-m-1\.5{margin:var(--bui-space-1_5)}.xl\:bui-m-2{margin:var(--bui-space-2)}.xl\:bui-m-3{margin:var(--bui-space-3)}.xl\:bui-m-4{margin:var(--bui-space-4)}.xl\:bui-m-5{margin:var(--bui-space-5)}.xl\:bui-m-6{margin:var(--bui-space-6)}.xl\:bui-m-7{margin:var(--bui-space-7)}.xl\:bui-m-8{margin:var(--bui-space-8)}.xl\:bui-m-9{margin:var(--bui-space-9)}.xl\:bui-m-10{margin:var(--bui-space-10)}.xl\:bui-m-11{margin:var(--bui-space-11)}.xl\:bui-m-12{margin:var(--bui-space-12)}.xl\:bui-m-13{margin:var(--bui-space-13)}.xl\:bui-m-14{margin:var(--bui-space-14)}}.bui-ml{margin-left:var(--ml)}.bui-ml-0\.5{margin-left:var(--bui-space-0_5)}.bui-ml-1{margin-left:var(--bui-space-1)}.bui-ml-1\.5{margin-left:var(--bui-space-1_5)}.bui-ml-2{margin-left:var(--bui-space-2)}.bui-ml-3{margin-left:var(--bui-space-3)}.bui-ml-4{margin-left:var(--bui-space-4)}.bui-ml-5{margin-left:var(--bui-space-5)}.bui-ml-6{margin-left:var(--bui-space-6)}.bui-ml-7{margin-left:var(--bui-space-7)}.bui-ml-8{margin-left:var(--bui-space-8)}.bui-ml-9{margin-left:var(--bui-space-9)}.bui-ml-10{margin-left:var(--bui-space-10)}.bui-ml-11{margin-left:var(--bui-space-11)}.bui-ml-12{margin-left:var(--bui-space-12)}.bui-ml-13{margin-left:var(--bui-space-13)}.bui-ml-14{margin-left:var(--bui-space-14)}@media (width>=640px){.xs\:bui-ml{margin-left:var(--ml-xs)}.xs\:bui-ml-0\.5{margin-left:var(--bui-space-0_5)}.xs\:bui-ml-1{margin-left:var(--bui-space-1)}.xs\:bui-ml-1\.5{margin-left:var(--bui-space-1_5)}.xs\:bui-ml-2{margin-left:var(--bui-space-2)}.xs\:bui-ml-3{margin-left:var(--bui-space-3)}.xs\:bui-ml-4{margin-left:var(--bui-space-4)}.xs\:bui-ml-5{margin-left:var(--bui-space-5)}.xs\:bui-ml-6{margin-left:var(--bui-space-6)}.xs\:bui-ml-7{margin-left:var(--bui-space-7)}.xs\:bui-ml-8{margin-left:var(--bui-space-8)}.xs\:bui-ml-9{margin-left:var(--bui-space-9)}.xs\:bui-ml-10{margin-left:var(--bui-space-10)}.xs\:bui-ml-11{margin-left:var(--bui-space-11)}.xs\:bui-ml-12{margin-left:var(--bui-space-12)}.xs\:bui-ml-13{margin-left:var(--bui-space-13)}.xs\:bui-ml-14{margin-left:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-ml{margin-left:var(--ml-sm)}.sm\:bui-ml-0\.5{margin-left:var(--bui-space-0_5)}.sm\:bui-ml-1{margin-left:var(--bui-space-1)}.sm\:bui-ml-1\.5{margin-left:var(--bui-space-1_5)}.sm\:bui-ml-2{margin-left:var(--bui-space-2)}.sm\:bui-ml-3{margin-left:var(--bui-space-3)}.sm\:bui-ml-4{margin-left:var(--bui-space-4)}.sm\:bui-ml-5{margin-left:var(--bui-space-5)}.sm\:bui-ml-6{margin-left:var(--bui-space-6)}.sm\:bui-ml-7{margin-left:var(--bui-space-7)}.sm\:bui-ml-8{margin-left:var(--bui-space-8)}.sm\:bui-ml-9{margin-left:var(--bui-space-9)}.sm\:bui-ml-10{margin-left:var(--bui-space-10)}.sm\:bui-ml-11{margin-left:var(--bui-space-11)}.sm\:bui-ml-12{margin-left:var(--bui-space-12)}.sm\:bui-ml-13{margin-left:var(--bui-space-13)}.sm\:bui-ml-14{margin-left:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-ml{margin-left:var(--ml-md)}.md\:bui-ml-0\.5{margin-left:var(--bui-space-0_5)}.md\:bui-ml-1{margin-left:var(--bui-space-1)}.md\:bui-ml-1\.5{margin-left:var(--bui-space-1_5)}.md\:bui-ml-2{margin-left:var(--bui-space-2)}.md\:bui-ml-3{margin-left:var(--bui-space-3)}.md\:bui-ml-4{margin-left:var(--bui-space-4)}.md\:bui-ml-5{margin-left:var(--bui-space-5)}.md\:bui-ml-6{margin-left:var(--bui-space-6)}.md\:bui-ml-7{margin-left:var(--bui-space-7)}.md\:bui-ml-8{margin-left:var(--bui-space-8)}.md\:bui-ml-9{margin-left:var(--bui-space-9)}.md\:bui-ml-10{margin-left:var(--bui-space-10)}.md\:bui-ml-11{margin-left:var(--bui-space-11)}.md\:bui-ml-12{margin-left:var(--bui-space-12)}.md\:bui-ml-13{margin-left:var(--bui-space-13)}.md\:bui-ml-14{margin-left:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-ml{margin-left:var(--ml-lg)}.lg\:bui-ml-0\.5{margin-left:var(--bui-space-0_5)}.lg\:bui-ml-1{margin-left:var(--bui-space-1)}.lg\:bui-ml-1\.5{margin-left:var(--bui-space-1_5)}.lg\:bui-ml-2{margin-left:var(--bui-space-2)}.lg\:bui-ml-3{margin-left:var(--bui-space-3)}.lg\:bui-ml-4{margin-left:var(--bui-space-4)}.lg\:bui-ml-5{margin-left:var(--bui-space-5)}.lg\:bui-ml-6{margin-left:var(--bui-space-6)}.lg\:bui-ml-7{margin-left:var(--bui-space-7)}.lg\:bui-ml-8{margin-left:var(--bui-space-8)}.lg\:bui-ml-9{margin-left:var(--bui-space-9)}.lg\:bui-ml-10{margin-left:var(--bui-space-10)}.lg\:bui-ml-11{margin-left:var(--bui-space-11)}.lg\:bui-ml-12{margin-left:var(--bui-space-12)}.lg\:bui-ml-13{margin-left:var(--bui-space-13)}.lg\:bui-ml-14{margin-left:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-ml{margin-left:var(--ml-xl)}.xl\:bui-ml-0\.5{margin-left:var(--bui-space-0_5)}.xl\:bui-ml-1{margin-left:var(--bui-space-1)}.xl\:bui-ml-1\.5{margin-left:var(--bui-space-1_5)}.xl\:bui-ml-2{margin-left:var(--bui-space-2)}.xl\:bui-ml-3{margin-left:var(--bui-space-3)}.xl\:bui-ml-4{margin-left:var(--bui-space-4)}.xl\:bui-ml-5{margin-left:var(--bui-space-5)}.xl\:bui-ml-6{margin-left:var(--bui-space-6)}.xl\:bui-ml-7{margin-left:var(--bui-space-7)}.xl\:bui-ml-8{margin-left:var(--bui-space-8)}.xl\:bui-ml-9{margin-left:var(--bui-space-9)}.xl\:bui-ml-10{margin-left:var(--bui-space-10)}.xl\:bui-ml-11{margin-left:var(--bui-space-11)}.xl\:bui-ml-12{margin-left:var(--bui-space-12)}.xl\:bui-ml-13{margin-left:var(--bui-space-13)}.xl\:bui-ml-14{margin-left:var(--bui-space-14)}}.bui-mr{margin-right:var(--mr)}.bui-mr-0\.5{margin-right:var(--bui-space-0_5)}.bui-mr-1{margin-right:var(--bui-space-1)}.bui-mr-1\.5{margin-right:var(--bui-space-1_5)}.bui-mr-2{margin-right:var(--bui-space-2)}.bui-mr-3{margin-right:var(--bui-space-3)}.bui-mr-4{margin-right:var(--bui-space-4)}.bui-mr-5{margin-right:var(--bui-space-5)}.bui-mr-6{margin-right:var(--bui-space-6)}.bui-mr-7{margin-right:var(--bui-space-7)}.bui-mr-8{margin-right:var(--bui-space-8)}.bui-mr-9{margin-right:var(--bui-space-9)}.bui-mr-10{margin-right:var(--bui-space-10)}.bui-mr-11{margin-right:var(--bui-space-11)}.bui-mr-12{margin-right:var(--bui-space-12)}.bui-mr-13{margin-right:var(--bui-space-13)}.bui-mr-14{margin-right:var(--bui-space-14)}@media (width>=640px){.xs\:bui-mr{margin-right:var(--mr-xs)}.xs\:bui-mr-0\.5{margin-right:var(--bui-space-0_5)}.xs\:bui-mr-1{margin-right:var(--bui-space-1)}.xs\:bui-mr-1\.5{margin-right:var(--bui-space-1_5)}.xs\:bui-mr-2{margin-right:var(--bui-space-2)}.xs\:bui-mr-3{margin-right:var(--bui-space-3)}.xs\:bui-mr-4{margin-right:var(--bui-space-4)}.xs\:bui-mr-5{margin-right:var(--bui-space-5)}.xs\:bui-mr-6{margin-right:var(--bui-space-6)}.xs\:bui-mr-7{margin-right:var(--bui-space-7)}.xs\:bui-mr-8{margin-right:var(--bui-space-8)}.xs\:bui-mr-9{margin-right:var(--bui-space-9)}.xs\:bui-mr-10{margin-right:var(--bui-space-10)}.xs\:bui-mr-11{margin-right:var(--bui-space-11)}.xs\:bui-mr-12{margin-right:var(--bui-space-12)}.xs\:bui-mr-13{margin-right:var(--bui-space-13)}.xs\:bui-mr-14{margin-right:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-mr{margin-right:var(--mr-sm)}.sm\:bui-mr-0\.5{margin-right:var(--bui-space-0_5)}.sm\:bui-mr-1{margin-right:var(--bui-space-1)}.sm\:bui-mr-1\.5{margin-right:var(--bui-space-1_5)}.sm\:bui-mr-2{margin-right:var(--bui-space-2)}.sm\:bui-mr-3{margin-right:var(--bui-space-3)}.sm\:bui-mr-4{margin-right:var(--bui-space-4)}.sm\:bui-mr-5{margin-right:var(--bui-space-5)}.sm\:bui-mr-6{margin-right:var(--bui-space-6)}.sm\:bui-mr-7{margin-right:var(--bui-space-7)}.sm\:bui-mr-8{margin-right:var(--bui-space-8)}.sm\:bui-mr-9{margin-right:var(--bui-space-9)}.sm\:bui-mr-10{margin-right:var(--bui-space-10)}.sm\:bui-mr-11{margin-right:var(--bui-space-11)}.sm\:bui-mr-12{margin-right:var(--bui-space-12)}.sm\:bui-mr-13{margin-right:var(--bui-space-13)}.sm\:bui-mr-14{margin-right:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-mr{margin-right:var(--mr-md)}.md\:bui-mr-0\.5{margin-right:var(--bui-space-0_5)}.md\:bui-mr-1{margin-right:var(--bui-space-1)}.md\:bui-mr-1\.5{margin-right:var(--bui-space-1_5)}.md\:bui-mr-2{margin-right:var(--bui-space-2)}.md\:bui-mr-3{margin-right:var(--bui-space-3)}.md\:bui-mr-4{margin-right:var(--bui-space-4)}.md\:bui-mr-5{margin-right:var(--bui-space-5)}.md\:bui-mr-6{margin-right:var(--bui-space-6)}.md\:bui-mr-7{margin-right:var(--bui-space-7)}.md\:bui-mr-8{margin-right:var(--bui-space-8)}.md\:bui-mr-9{margin-right:var(--bui-space-9)}.md\:bui-mr-10{margin-right:var(--bui-space-10)}.md\:bui-mr-11{margin-right:var(--bui-space-11)}.md\:bui-mr-12{margin-right:var(--bui-space-12)}.md\:bui-mr-13{margin-right:var(--bui-space-13)}.md\:bui-mr-14{margin-right:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-mr{margin-right:var(--mr-lg)}.lg\:bui-mr-0\.5{margin-right:var(--bui-space-0_5)}.lg\:bui-mr-1{margin-right:var(--bui-space-1)}.lg\:bui-mr-1\.5{margin-right:var(--bui-space-1_5)}.lg\:bui-mr-2{margin-right:var(--bui-space-2)}.lg\:bui-mr-3{margin-right:var(--bui-space-3)}.lg\:bui-mr-4{margin-right:var(--bui-space-4)}.lg\:bui-mr-5{margin-right:var(--bui-space-5)}.lg\:bui-mr-6{margin-right:var(--bui-space-6)}.lg\:bui-mr-7{margin-right:var(--bui-space-7)}.lg\:bui-mr-8{margin-right:var(--bui-space-8)}.lg\:bui-mr-9{margin-right:var(--bui-space-9)}.lg\:bui-mr-10{margin-right:var(--bui-space-10)}.lg\:bui-mr-11{margin-right:var(--bui-space-11)}.lg\:bui-mr-12{margin-right:var(--bui-space-12)}.lg\:bui-mr-13{margin-right:var(--bui-space-13)}.lg\:bui-mr-14{margin-right:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-mr{margin-right:var(--mr-xl)}.xl\:bui-mr-0\.5{margin-right:var(--bui-space-0_5)}.xl\:bui-mr-1{margin-right:var(--bui-space-1)}.xl\:bui-mr-1\.5{margin-right:var(--bui-space-1_5)}.xl\:bui-mr-2{margin-right:var(--bui-space-2)}.xl\:bui-mr-3{margin-right:var(--bui-space-3)}.xl\:bui-mr-4{margin-right:var(--bui-space-4)}.xl\:bui-mr-5{margin-right:var(--bui-space-5)}.xl\:bui-mr-6{margin-right:var(--bui-space-6)}.xl\:bui-mr-7{margin-right:var(--bui-space-7)}.xl\:bui-mr-8{margin-right:var(--bui-space-8)}.xl\:bui-mr-9{margin-right:var(--bui-space-9)}.xl\:bui-mr-10{margin-right:var(--bui-space-10)}.xl\:bui-mr-11{margin-right:var(--bui-space-11)}.xl\:bui-mr-12{margin-right:var(--bui-space-12)}.xl\:bui-mr-13{margin-right:var(--bui-space-13)}.xl\:bui-mr-14{margin-right:var(--bui-space-14)}}.bui-mt{margin-top:var(--mt)}.bui-mt-0\.5{margin-top:var(--bui-space-0_5)}.bui-mt-1{margin-top:var(--bui-space-1)}.bui-mt-1\.5{margin-top:var(--bui-space-1_5)}.bui-mt-2{margin-top:var(--bui-space-2)}.bui-mt-3{margin-top:var(--bui-space-3)}.bui-mt-4{margin-top:var(--bui-space-4)}.bui-mt-5{margin-top:var(--bui-space-5)}.bui-mt-6{margin-top:var(--bui-space-6)}.bui-mt-7{margin-top:var(--bui-space-7)}.bui-mt-8{margin-top:var(--bui-space-8)}.bui-mt-9{margin-top:var(--bui-space-9)}.bui-mt-10{margin-top:var(--bui-space-10)}.bui-mt-11{margin-top:var(--bui-space-11)}.bui-mt-12{margin-top:var(--bui-space-12)}.bui-mt-13{margin-top:var(--bui-space-13)}.bui-mt-14{margin-top:var(--bui-space-14)}@media (width>=640px){.xs\:bui-mt{margin-top:var(--mt-xs)}.xs\:bui-mt-0\.5{margin-top:var(--bui-space-0_5)}.xs\:bui-mt-1{margin-top:var(--bui-space-1)}.xs\:bui-mt-1\.5{margin-top:var(--bui-space-1_5)}.xs\:bui-mt-2{margin-top:var(--bui-space-2)}.xs\:bui-mt-3{margin-top:var(--bui-space-3)}.xs\:bui-mt-4{margin-top:var(--bui-space-4)}.xs\:bui-mt-5{margin-top:var(--bui-space-5)}.xs\:bui-mt-6{margin-top:var(--bui-space-6)}.xs\:bui-mt-7{margin-top:var(--bui-space-7)}.xs\:bui-mt-8{margin-top:var(--bui-space-8)}.xs\:bui-mt-9{margin-top:var(--bui-space-9)}.xs\:bui-mt-10{margin-top:var(--bui-space-10)}.xs\:bui-mt-11{margin-top:var(--bui-space-11)}.xs\:bui-mt-12{margin-top:var(--bui-space-12)}.xs\:bui-mt-13{margin-top:var(--bui-space-13)}.xs\:bui-mt-14{margin-top:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-mt{margin-top:var(--mt-sm)}.sm\:bui-mt-0\.5{margin-top:var(--bui-space-0_5)}.sm\:bui-mt-1{margin-top:var(--bui-space-1)}.sm\:bui-mt-1\.5{margin-top:var(--bui-space-1_5)}.sm\:bui-mt-2{margin-top:var(--bui-space-2)}.sm\:bui-mt-3{margin-top:var(--bui-space-3)}.sm\:bui-mt-4{margin-top:var(--bui-space-4)}.sm\:bui-mt-5{margin-top:var(--bui-space-5)}.sm\:bui-mt-6{margin-top:var(--bui-space-6)}.sm\:bui-mt-7{margin-top:var(--bui-space-7)}.sm\:bui-mt-8{margin-top:var(--bui-space-8)}.sm\:bui-mt-9{margin-top:var(--bui-space-9)}.sm\:bui-mt-10{margin-top:var(--bui-space-10)}.sm\:bui-mt-11{margin-top:var(--bui-space-11)}.sm\:bui-mt-12{margin-top:var(--bui-space-12)}.sm\:bui-mt-13{margin-top:var(--bui-space-13)}.sm\:bui-mt-14{margin-top:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-mt{margin-top:var(--mt-md)}.md\:bui-mt-0\.5{margin-top:var(--bui-space-0_5)}.md\:bui-mt-1{margin-top:var(--bui-space-1)}.md\:bui-mt-1\.5{margin-top:var(--bui-space-1_5)}.md\:bui-mt-2{margin-top:var(--bui-space-2)}.md\:bui-mt-3{margin-top:var(--bui-space-3)}.md\:bui-mt-4{margin-top:var(--bui-space-4)}.md\:bui-mt-5{margin-top:var(--bui-space-5)}.md\:bui-mt-6{margin-top:var(--bui-space-6)}.md\:bui-mt-7{margin-top:var(--bui-space-7)}.md\:bui-mt-8{margin-top:var(--bui-space-8)}.md\:bui-mt-9{margin-top:var(--bui-space-9)}.md\:bui-mt-10{margin-top:var(--bui-space-10)}.md\:bui-mt-11{margin-top:var(--bui-space-11)}.md\:bui-mt-12{margin-top:var(--bui-space-12)}.md\:bui-mt-13{margin-top:var(--bui-space-13)}.md\:bui-mt-14{margin-top:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-mt{margin-top:var(--mt-lg)}.lg\:bui-mt-0\.5{margin-top:var(--bui-space-0_5)}.lg\:bui-mt-1{margin-top:var(--bui-space-1)}.lg\:bui-mt-1\.5{margin-top:var(--bui-space-1_5)}.lg\:bui-mt-2{margin-top:var(--bui-space-2)}.lg\:bui-mt-3{margin-top:var(--bui-space-3)}.lg\:bui-mt-4{margin-top:var(--bui-space-4)}.lg\:bui-mt-5{margin-top:var(--bui-space-5)}.lg\:bui-mt-6{margin-top:var(--bui-space-6)}.lg\:bui-mt-7{margin-top:var(--bui-space-7)}.lg\:bui-mt-8{margin-top:var(--bui-space-8)}.lg\:bui-mt-9{margin-top:var(--bui-space-9)}.lg\:bui-mt-10{margin-top:var(--bui-space-10)}.lg\:bui-mt-11{margin-top:var(--bui-space-11)}.lg\:bui-mt-12{margin-top:var(--bui-space-12)}.lg\:bui-mt-13{margin-top:var(--bui-space-13)}.lg\:bui-mt-14{margin-top:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-mt{margin-top:var(--mt-xl)}.xl\:bui-mt-0\.5{margin-top:var(--bui-space-0_5)}.xl\:bui-mt-1{margin-top:var(--bui-space-1)}.xl\:bui-mt-1\.5{margin-top:var(--bui-space-1_5)}.xl\:bui-mt-2{margin-top:var(--bui-space-2)}.xl\:bui-mt-3{margin-top:var(--bui-space-3)}.xl\:bui-mt-4{margin-top:var(--bui-space-4)}.xl\:bui-mt-5{margin-top:var(--bui-space-5)}.xl\:bui-mt-6{margin-top:var(--bui-space-6)}.xl\:bui-mt-7{margin-top:var(--bui-space-7)}.xl\:bui-mt-8{margin-top:var(--bui-space-8)}.xl\:bui-mt-9{margin-top:var(--bui-space-9)}.xl\:bui-mt-10{margin-top:var(--bui-space-10)}.xl\:bui-mt-11{margin-top:var(--bui-space-11)}.xl\:bui-mt-12{margin-top:var(--bui-space-12)}.xl\:bui-mt-13{margin-top:var(--bui-space-13)}.xl\:bui-mt-14{margin-top:var(--bui-space-14)}}.bui-mb{margin-bottom:var(--mb)}.bui-mb-0\.5{margin-bottom:var(--bui-space-0_5)}.bui-mb-1{margin-bottom:var(--bui-space-1)}.bui-mb-1\.5{margin-bottom:var(--bui-space-1_5)}.bui-mb-2{margin-bottom:var(--bui-space-2)}.bui-mb-3{margin-bottom:var(--bui-space-3)}.bui-mb-4{margin-bottom:var(--bui-space-4)}.bui-mb-5{margin-bottom:var(--bui-space-5)}.bui-mb-6{margin-bottom:var(--bui-space-6)}.bui-mb-7{margin-bottom:var(--bui-space-7)}.bui-mb-8{margin-bottom:var(--bui-space-8)}.bui-mb-9{margin-bottom:var(--bui-space-9)}.bui-mb-10{margin-bottom:var(--bui-space-10)}.bui-mb-11{margin-bottom:var(--bui-space-11)}.bui-mb-12{margin-bottom:var(--bui-space-12)}.bui-mb-13{margin-bottom:var(--bui-space-13)}.bui-mb-14{margin-bottom:var(--bui-space-14)}@media (width>=640px){.xs\:bui-mb{margin-bottom:var(--mb-xs)}.xs\:bui-mb-0\.5{margin-bottom:var(--bui-space-0_5)}.xs\:bui-mb-1{margin-bottom:var(--bui-space-1)}.xs\:bui-mb-1\.5{margin-bottom:var(--bui-space-1_5)}.xs\:bui-mb-2{margin-bottom:var(--bui-space-2)}.xs\:bui-mb-3{margin-bottom:var(--bui-space-3)}.xs\:bui-mb-4{margin-bottom:var(--bui-space-4)}.xs\:bui-mb-5{margin-bottom:var(--bui-space-5)}.xs\:bui-mb-6{margin-bottom:var(--bui-space-6)}.xs\:bui-mb-7{margin-bottom:var(--bui-space-7)}.xs\:bui-mb-8{margin-bottom:var(--bui-space-8)}.xs\:bui-mb-9{margin-bottom:var(--bui-space-9)}.xs\:bui-mb-10{margin-bottom:var(--bui-space-10)}.xs\:bui-mb-11{margin-bottom:var(--bui-space-11)}.xs\:bui-mb-12{margin-bottom:var(--bui-space-12)}.xs\:bui-mb-13{margin-bottom:var(--bui-space-13)}.xs\:bui-mb-14{margin-bottom:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-mb{margin-bottom:var(--mb-sm)}.sm\:bui-mb-0\.5{margin-bottom:var(--bui-space-0_5)}.sm\:bui-mb-1{margin-bottom:var(--bui-space-1)}.sm\:bui-mb-1\.5{margin-bottom:var(--bui-space-1_5)}.sm\:bui-mb-2{margin-bottom:var(--bui-space-2)}.sm\:bui-mb-3{margin-bottom:var(--bui-space-3)}.sm\:bui-mb-4{margin-bottom:var(--bui-space-4)}.sm\:bui-mb-5{margin-bottom:var(--bui-space-5)}.sm\:bui-mb-6{margin-bottom:var(--bui-space-6)}.sm\:bui-mb-7{margin-bottom:var(--bui-space-7)}.sm\:bui-mb-8{margin-bottom:var(--bui-space-8)}.sm\:bui-mb-9{margin-bottom:var(--bui-space-9)}.sm\:bui-mb-10{margin-bottom:var(--bui-space-10)}.sm\:bui-mb-11{margin-bottom:var(--bui-space-11)}.sm\:bui-mb-12{margin-bottom:var(--bui-space-12)}.sm\:bui-mb-13{margin-bottom:var(--bui-space-13)}.sm\:bui-mb-14{margin-bottom:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-mb{margin-bottom:var(--mb-md)}.md\:bui-mb-0\.5{margin-bottom:var(--bui-space-0_5)}.md\:bui-mb-1{margin-bottom:var(--bui-space-1)}.md\:bui-mb-1\.5{margin-bottom:var(--bui-space-1_5)}.md\:bui-mb-2{margin-bottom:var(--bui-space-2)}.md\:bui-mb-3{margin-bottom:var(--bui-space-3)}.md\:bui-mb-4{margin-bottom:var(--bui-space-4)}.md\:bui-mb-5{margin-bottom:var(--bui-space-5)}.md\:bui-mb-6{margin-bottom:var(--bui-space-6)}.md\:bui-mb-7{margin-bottom:var(--bui-space-7)}.md\:bui-mb-8{margin-bottom:var(--bui-space-8)}.md\:bui-mb-9{margin-bottom:var(--bui-space-9)}.md\:bui-mb-10{margin-bottom:var(--bui-space-10)}.md\:bui-mb-11{margin-bottom:var(--bui-space-11)}.md\:bui-mb-12{margin-bottom:var(--bui-space-12)}.md\:bui-mb-13{margin-bottom:var(--bui-space-13)}.md\:bui-mb-14{margin-bottom:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-mb{margin-bottom:var(--mb-lg)}.lg\:bui-mb-0\.5{margin-bottom:var(--bui-space-0_5)}.lg\:bui-mb-1{margin-bottom:var(--bui-space-1)}.lg\:bui-mb-1\.5{margin-bottom:var(--bui-space-1_5)}.lg\:bui-mb-2{margin-bottom:var(--bui-space-2)}.lg\:bui-mb-3{margin-bottom:var(--bui-space-3)}.lg\:bui-mb-4{margin-bottom:var(--bui-space-4)}.lg\:bui-mb-5{margin-bottom:var(--bui-space-5)}.lg\:bui-mb-6{margin-bottom:var(--bui-space-6)}.lg\:bui-mb-7{margin-bottom:var(--bui-space-7)}.lg\:bui-mb-8{margin-bottom:var(--bui-space-8)}.lg\:bui-mb-9{margin-bottom:var(--bui-space-9)}.lg\:bui-mb-10{margin-bottom:var(--bui-space-10)}.lg\:bui-mb-11{margin-bottom:var(--bui-space-11)}.lg\:bui-mb-12{margin-bottom:var(--bui-space-12)}.lg\:bui-mb-13{margin-bottom:var(--bui-space-13)}.lg\:bui-mb-14{margin-bottom:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-mb{margin-bottom:var(--mb-xl)}.xl\:bui-mb-0\.5{margin-bottom:var(--bui-space-0_5)}.xl\:bui-mb-1{margin-bottom:var(--bui-space-1)}.xl\:bui-mb-1\.5{margin-bottom:var(--bui-space-1_5)}.xl\:bui-mb-2{margin-bottom:var(--bui-space-2)}.xl\:bui-mb-3{margin-bottom:var(--bui-space-3)}.xl\:bui-mb-4{margin-bottom:var(--bui-space-4)}.xl\:bui-mb-5{margin-bottom:var(--bui-space-5)}.xl\:bui-mb-6{margin-bottom:var(--bui-space-6)}.xl\:bui-mb-7{margin-bottom:var(--bui-space-7)}.xl\:bui-mb-8{margin-bottom:var(--bui-space-8)}.xl\:bui-mb-9{margin-bottom:var(--bui-space-9)}.xl\:bui-mb-10{margin-bottom:var(--bui-space-10)}.xl\:bui-mb-11{margin-bottom:var(--bui-space-11)}.xl\:bui-mb-12{margin-bottom:var(--bui-space-12)}.xl\:bui-mb-13{margin-bottom:var(--bui-space-13)}.xl\:bui-mb-14{margin-bottom:var(--bui-space-14)}}.bui-my{margin-top:var(--my);margin-bottom:var(--my)}.bui-my-0\.5{margin-top:var(--bui-space-0_5);margin-bottom:var(--bui-space-0_5)}.bui-my-1{margin-top:var(--bui-space-1);margin-bottom:var(--bui-space-1)}.bui-my-1\.5{margin-top:var(--bui-space-1_5);margin-bottom:var(--bui-space-1_5)}.bui-my-2{margin-top:var(--bui-space-2);margin-bottom:var(--bui-space-2)}.bui-my-3{margin-top:var(--bui-space-3);margin-bottom:var(--bui-space-3)}.bui-my-4{margin-top:var(--bui-space-4);margin-bottom:var(--bui-space-4)}.bui-my-5{margin-top:var(--bui-space-5);margin-bottom:var(--bui-space-5)}.bui-my-6{margin-top:var(--bui-space-6);margin-bottom:var(--bui-space-6)}.bui-my-7{margin-top:var(--bui-space-7);margin-bottom:var(--bui-space-7)}.bui-my-8{margin-top:var(--bui-space-8);margin-bottom:var(--bui-space-8)}.bui-my-9{margin-top:var(--bui-space-9);margin-bottom:var(--bui-space-9)}.bui-my-10{margin-top:var(--bui-space-10);margin-bottom:var(--bui-space-10)}.bui-my-11{margin-top:var(--bui-space-11);margin-bottom:var(--bui-space-11)}.bui-my-12{margin-top:var(--bui-space-12);margin-bottom:var(--bui-space-12)}.bui-my-13{margin-top:var(--bui-space-13);margin-bottom:var(--bui-space-13)}.bui-my-14{margin-top:var(--bui-space-14);margin-bottom:var(--bui-space-14)}@media (width>=640px){.xs\:bui-my{margin-top:var(--my-xs);margin-bottom:var(--my-xs)}.xs\:bui-my-0\.5{margin-top:var(--bui-space-0_5);margin-bottom:var(--bui-space-0_5)}.xs\:bui-my-1{margin-top:var(--bui-space-1);margin-bottom:var(--bui-space-1)}.xs\:bui-my-1\.5{margin-top:var(--bui-space-1_5);margin-bottom:var(--bui-space-1_5)}.xs\:bui-my-2{margin-top:var(--bui-space-2);margin-bottom:var(--bui-space-2)}.xs\:bui-my-3{margin-top:var(--bui-space-3);margin-bottom:var(--bui-space-3)}.xs\:bui-my-4{margin-top:var(--bui-space-4);margin-bottom:var(--bui-space-4)}.xs\:bui-my-5{margin-top:var(--bui-space-5);margin-bottom:var(--bui-space-5)}.xs\:bui-my-6{margin-top:var(--bui-space-6);margin-bottom:var(--bui-space-6)}.xs\:bui-my-7{margin-top:var(--bui-space-7);margin-bottom:var(--bui-space-7)}.xs\:bui-my-8{margin-top:var(--bui-space-8);margin-bottom:var(--bui-space-8)}.xs\:bui-my-9{margin-top:var(--bui-space-9);margin-bottom:var(--bui-space-9)}.xs\:bui-my-10{margin-top:var(--bui-space-10);margin-bottom:var(--bui-space-10)}.xs\:bui-my-11{margin-top:var(--bui-space-11);margin-bottom:var(--bui-space-11)}.xs\:bui-my-12{margin-top:var(--bui-space-12);margin-bottom:var(--bui-space-12)}.xs\:bui-my-13{margin-top:var(--bui-space-13);margin-bottom:var(--bui-space-13)}.xs\:bui-my-14{margin-top:var(--bui-space-14);margin-bottom:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-my{margin-top:var(--my-sm);margin-bottom:var(--my-sm)}.sm\:bui-my-0\.5{margin-top:var(--bui-space-0_5);margin-bottom:var(--bui-space-0_5)}.sm\:bui-my-1{margin-top:var(--bui-space-1);margin-bottom:var(--bui-space-1)}.sm\:bui-my-1\.5{margin-top:var(--bui-space-1_5);margin-bottom:var(--bui-space-1_5)}.sm\:bui-my-2{margin-top:var(--bui-space-2);margin-bottom:var(--bui-space-2)}.sm\:bui-my-3{margin-top:var(--bui-space-3);margin-bottom:var(--bui-space-3)}.sm\:bui-my-4{margin-top:var(--bui-space-4);margin-bottom:var(--bui-space-4)}.sm\:bui-my-5{margin-top:var(--bui-space-5);margin-bottom:var(--bui-space-5)}.sm\:bui-my-6{margin-top:var(--bui-space-6);margin-bottom:var(--bui-space-6)}.sm\:bui-my-7{margin-top:var(--bui-space-7);margin-bottom:var(--bui-space-7)}.sm\:bui-my-8{margin-top:var(--bui-space-8);margin-bottom:var(--bui-space-8)}.sm\:bui-my-9{margin-top:var(--bui-space-9);margin-bottom:var(--bui-space-9)}.sm\:bui-my-10{margin-top:var(--bui-space-10);margin-bottom:var(--bui-space-10)}.sm\:bui-my-11{margin-top:var(--bui-space-11);margin-bottom:var(--bui-space-11)}.sm\:bui-my-12{margin-top:var(--bui-space-12);margin-bottom:var(--bui-space-12)}.sm\:bui-my-13{margin-top:var(--bui-space-13);margin-bottom:var(--bui-space-13)}.sm\:bui-my-14{margin-top:var(--bui-space-14);margin-bottom:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-my{margin-top:var(--my-md);margin-bottom:var(--my-md)}.md\:bui-my-0\.5{margin-top:var(--bui-space-0_5);margin-bottom:var(--bui-space-0_5)}.md\:bui-my-1{margin-top:var(--bui-space-1);margin-bottom:var(--bui-space-1)}.md\:bui-my-1\.5{margin-top:var(--bui-space-1_5);margin-bottom:var(--bui-space-1_5)}.md\:bui-my-2{margin-top:var(--bui-space-2);margin-bottom:var(--bui-space-2)}.md\:bui-my-3{margin-top:var(--bui-space-3);margin-bottom:var(--bui-space-3)}.md\:bui-my-4{margin-top:var(--bui-space-4);margin-bottom:var(--bui-space-4)}.md\:bui-my-5{margin-top:var(--bui-space-5);margin-bottom:var(--bui-space-5)}.md\:bui-my-6{margin-top:var(--bui-space-6);margin-bottom:var(--bui-space-6)}.md\:bui-my-7{margin-top:var(--bui-space-7);margin-bottom:var(--bui-space-7)}.md\:bui-my-8{margin-top:var(--bui-space-8);margin-bottom:var(--bui-space-8)}.md\:bui-my-9{margin-top:var(--bui-space-9);margin-bottom:var(--bui-space-9)}.md\:bui-my-10{margin-top:var(--bui-space-10);margin-bottom:var(--bui-space-10)}.md\:bui-my-11{margin-top:var(--bui-space-11);margin-bottom:var(--bui-space-11)}.md\:bui-my-12{margin-top:var(--bui-space-12);margin-bottom:var(--bui-space-12)}.md\:bui-my-13{margin-top:var(--bui-space-13);margin-bottom:var(--bui-space-13)}.md\:bui-my-14{margin-top:var(--bui-space-14);margin-bottom:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-my{margin-top:var(--my-lg);margin-bottom:var(--my-lg)}.lg\:bui-my-0\.5{margin-top:var(--bui-space-0_5);margin-bottom:var(--bui-space-0_5)}.lg\:bui-my-1{margin-top:var(--bui-space-1);margin-bottom:var(--bui-space-1)}.lg\:bui-my-1\.5{margin-top:var(--bui-space-1_5);margin-bottom:var(--bui-space-1_5)}.lg\:bui-my-2{margin-top:var(--bui-space-2);margin-bottom:var(--bui-space-2)}.lg\:bui-my-3{margin-top:var(--bui-space-3);margin-bottom:var(--bui-space-3)}.lg\:bui-my-4{margin-top:var(--bui-space-4);margin-bottom:var(--bui-space-4)}.lg\:bui-my-5{margin-top:var(--bui-space-5);margin-bottom:var(--bui-space-5)}.lg\:bui-my-6{margin-top:var(--bui-space-6);margin-bottom:var(--bui-space-6)}.lg\:bui-my-7{margin-top:var(--bui-space-7);margin-bottom:var(--bui-space-7)}.lg\:bui-my-8{margin-top:var(--bui-space-8);margin-bottom:var(--bui-space-8)}.lg\:bui-my-9{margin-top:var(--bui-space-9);margin-bottom:var(--bui-space-9)}.lg\:bui-my-10{margin-top:var(--bui-space-10);margin-bottom:var(--bui-space-10)}.lg\:bui-my-11{margin-top:var(--bui-space-11);margin-bottom:var(--bui-space-11)}.lg\:bui-my-12{margin-top:var(--bui-space-12);margin-bottom:var(--bui-space-12)}.lg\:bui-my-13{margin-top:var(--bui-space-13);margin-bottom:var(--bui-space-13)}.lg\:bui-my-14{margin-top:var(--bui-space-14);margin-bottom:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-my{margin-top:var(--my-xl);margin-bottom:var(--my-xl)}.xl\:bui-my-0\.5{margin-top:var(--bui-space-0_5);margin-bottom:var(--bui-space-0_5)}.xl\:bui-my-1{margin-top:var(--bui-space-1);margin-bottom:var(--bui-space-1)}.xl\:bui-my-1\.5{margin-top:var(--bui-space-1_5);margin-bottom:var(--bui-space-1_5)}.xl\:bui-my-2{margin-top:var(--bui-space-2);margin-bottom:var(--bui-space-2)}.xl\:bui-my-3{margin-top:var(--bui-space-3);margin-bottom:var(--bui-space-3)}.xl\:bui-my-4{margin-top:var(--bui-space-4);margin-bottom:var(--bui-space-4)}.xl\:bui-my-5{margin-top:var(--bui-space-5);margin-bottom:var(--bui-space-5)}.xl\:bui-my-6{margin-top:var(--bui-space-6);margin-bottom:var(--bui-space-6)}.xl\:bui-my-7{margin-top:var(--bui-space-7);margin-bottom:var(--bui-space-7)}.xl\:bui-my-8{margin-top:var(--bui-space-8);margin-bottom:var(--bui-space-8)}.xl\:bui-my-9{margin-top:var(--bui-space-9);margin-bottom:var(--bui-space-9)}.xl\:bui-my-10{margin-top:var(--bui-space-10);margin-bottom:var(--bui-space-10)}.xl\:bui-my-11{margin-top:var(--bui-space-11);margin-bottom:var(--bui-space-11)}.xl\:bui-my-12{margin-top:var(--bui-space-12);margin-bottom:var(--bui-space-12)}.xl\:bui-my-13{margin-top:var(--bui-space-13);margin-bottom:var(--bui-space-13)}.xl\:bui-my-14{margin-top:var(--bui-space-14);margin-bottom:var(--bui-space-14)}}.bui-mx{margin-left:var(--mx);margin-right:var(--mx)}.bui-mx-0\.5{margin-left:var(--bui-space-0_5);margin-right:var(--bui-space-0_5)}.bui-mx-1{margin-left:var(--bui-space-1);margin-right:var(--bui-space-1)}.bui-mx-1\.5{margin-left:var(--bui-space-1_5);margin-right:var(--bui-space-1_5)}.bui-mx-2{margin-left:var(--bui-space-2);margin-right:var(--bui-space-2)}.bui-mx-3{margin-left:var(--bui-space-3);margin-right:var(--bui-space-3)}.bui-mx-4{margin-left:var(--bui-space-4);margin-right:var(--bui-space-4)}.bui-mx-5{margin-left:var(--bui-space-5);margin-right:var(--bui-space-5)}.bui-mx-6{margin-left:var(--bui-space-6);margin-right:var(--bui-space-6)}.bui-mx-7{margin-left:var(--bui-space-7);margin-right:var(--bui-space-7)}.bui-mx-8{margin-left:var(--bui-space-8);margin-right:var(--bui-space-8)}.bui-mx-9{margin-left:var(--bui-space-9);margin-right:var(--bui-space-9)}.bui-mx-10{margin-left:var(--bui-space-10);margin-right:var(--bui-space-10)}.bui-mx-11{margin-left:var(--bui-space-11);margin-right:var(--bui-space-11)}.bui-mx-12{margin-left:var(--bui-space-12);margin-right:var(--bui-space-12)}.bui-mx-13{margin-left:var(--bui-space-13);margin-right:var(--bui-space-13)}.bui-mx-14{margin-left:var(--bui-space-14);margin-right:var(--bui-space-14)}@media (width>=640px){.xs\:bui-mx{margin-left:var(--mx-xs);margin-right:var(--mx-xs)}.xs\:bui-mx-0\.5{margin-left:var(--bui-space-0_5);margin-right:var(--bui-space-0_5)}.xs\:bui-mx-1{margin-left:var(--bui-space-1);margin-right:var(--bui-space-1)}.xs\:bui-mx-1\.5{margin-left:var(--bui-space-1_5);margin-right:var(--bui-space-1_5)}.xs\:bui-mx-2{margin-left:var(--bui-space-2);margin-right:var(--bui-space-2)}.xs\:bui-mx-3{margin-left:var(--bui-space-3);margin-right:var(--bui-space-3)}.xs\:bui-mx-4{margin-left:var(--bui-space-4);margin-right:var(--bui-space-4)}.xs\:bui-mx-5{margin-left:var(--bui-space-5);margin-right:var(--bui-space-5)}.xs\:bui-mx-6{margin-left:var(--bui-space-6);margin-right:var(--bui-space-6)}.xs\:bui-mx-7{margin-left:var(--bui-space-7);margin-right:var(--bui-space-7)}.xs\:bui-mx-8{margin-left:var(--bui-space-8);margin-right:var(--bui-space-8)}.xs\:bui-mx-9{margin-left:var(--bui-space-9);margin-right:var(--bui-space-9)}.xs\:bui-mx-10{margin-left:var(--bui-space-10);margin-right:var(--bui-space-10)}.xs\:bui-mx-11{margin-left:var(--bui-space-11);margin-right:var(--bui-space-11)}.xs\:bui-mx-12{margin-left:var(--bui-space-12);margin-right:var(--bui-space-12)}.xs\:bui-mx-13{margin-left:var(--bui-space-13);margin-right:var(--bui-space-13)}.xs\:bui-mx-14{margin-left:var(--bui-space-14);margin-right:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-mx{margin-left:var(--mx-sm);margin-right:var(--mx-sm)}.sm\:bui-mx-0\.5{margin-left:var(--bui-space-0_5);margin-right:var(--bui-space-0_5)}.sm\:bui-mx-1{margin-left:var(--bui-space-1);margin-right:var(--bui-space-1)}.sm\:bui-mx-1\.5{margin-left:var(--bui-space-1_5);margin-right:var(--bui-space-1_5)}.sm\:bui-mx-2{margin-left:var(--bui-space-2);margin-right:var(--bui-space-2)}.sm\:bui-mx-3{margin-left:var(--bui-space-3);margin-right:var(--bui-space-3)}.sm\:bui-mx-4{margin-left:var(--bui-space-4);margin-right:var(--bui-space-4)}.sm\:bui-mx-5{margin-left:var(--bui-space-5);margin-right:var(--bui-space-5)}.sm\:bui-mx-6{margin-left:var(--bui-space-6);margin-right:var(--bui-space-6)}.sm\:bui-mx-7{margin-left:var(--bui-space-7);margin-right:var(--bui-space-7)}.sm\:bui-mx-8{margin-left:var(--bui-space-8);margin-right:var(--bui-space-8)}.sm\:bui-mx-9{margin-left:var(--bui-space-9);margin-right:var(--bui-space-9)}.sm\:bui-mx-10{margin-left:var(--bui-space-10);margin-right:var(--bui-space-10)}.sm\:bui-mx-11{margin-left:var(--bui-space-11);margin-right:var(--bui-space-11)}.sm\:bui-mx-12{margin-left:var(--bui-space-12);margin-right:var(--bui-space-12)}.sm\:bui-mx-13{margin-left:var(--bui-space-13);margin-right:var(--bui-space-13)}.sm\:bui-mx-14{margin-left:var(--bui-space-14);margin-right:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-mx{margin-left:var(--mx-md);margin-right:var(--mx-md)}.md\:bui-mx-0\.5{margin-left:var(--bui-space-0_5);margin-right:var(--bui-space-0_5)}.md\:bui-mx-1{margin-left:var(--bui-space-1);margin-right:var(--bui-space-1)}.md\:bui-mx-1\.5{margin-left:var(--bui-space-1_5);margin-right:var(--bui-space-1_5)}.md\:bui-mx-2{margin-left:var(--bui-space-2);margin-right:var(--bui-space-2)}.md\:bui-mx-3{margin-left:var(--bui-space-3);margin-right:var(--bui-space-3)}.md\:bui-mx-4{margin-left:var(--bui-space-4);margin-right:var(--bui-space-4)}.md\:bui-mx-5{margin-left:var(--bui-space-5);margin-right:var(--bui-space-5)}.md\:bui-mx-6{margin-left:var(--bui-space-6);margin-right:var(--bui-space-6)}.md\:bui-mx-7{margin-left:var(--bui-space-7);margin-right:var(--bui-space-7)}.md\:bui-mx-8{margin-left:var(--bui-space-8);margin-right:var(--bui-space-8)}.md\:bui-mx-9{margin-left:var(--bui-space-9);margin-right:var(--bui-space-9)}.md\:bui-mx-10{margin-left:var(--bui-space-10);margin-right:var(--bui-space-10)}.md\:bui-mx-11{margin-left:var(--bui-space-11);margin-right:var(--bui-space-11)}.md\:bui-mx-12{margin-left:var(--bui-space-12);margin-right:var(--bui-space-12)}.md\:bui-mx-13{margin-left:var(--bui-space-13);margin-right:var(--bui-space-13)}.md\:bui-mx-14{margin-left:var(--bui-space-14);margin-right:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-mx{margin-left:var(--mx-lg);margin-right:var(--mx-lg)}.lg\:bui-mx-0\.5{margin-left:var(--bui-space-0_5);margin-right:var(--bui-space-0_5)}.lg\:bui-mx-1{margin-left:var(--bui-space-1);margin-right:var(--bui-space-1)}.lg\:bui-mx-1\.5{margin-left:var(--bui-space-1_5);margin-right:var(--bui-space-1_5)}.lg\:bui-mx-2{margin-left:var(--bui-space-2);margin-right:var(--bui-space-2)}.lg\:bui-mx-3{margin-left:var(--bui-space-3);margin-right:var(--bui-space-3)}.lg\:bui-mx-4{margin-left:var(--bui-space-4);margin-right:var(--bui-space-4)}.lg\:bui-mx-5{margin-left:var(--bui-space-5);margin-right:var(--bui-space-5)}.lg\:bui-mx-6{margin-left:var(--bui-space-6);margin-right:var(--bui-space-6)}.lg\:bui-mx-7{margin-left:var(--bui-space-7);margin-right:var(--bui-space-7)}.lg\:bui-mx-8{margin-left:var(--bui-space-8);margin-right:var(--bui-space-8)}.lg\:bui-mx-9{margin-left:var(--bui-space-9);margin-right:var(--bui-space-9)}.lg\:bui-mx-10{margin-left:var(--bui-space-10);margin-right:var(--bui-space-10)}.lg\:bui-mx-11{margin-left:var(--bui-space-11);margin-right:var(--bui-space-11)}.lg\:bui-mx-12{margin-left:var(--bui-space-12);margin-right:var(--bui-space-12)}.lg\:bui-mx-13{margin-left:var(--bui-space-13);margin-right:var(--bui-space-13)}.lg\:bui-mx-14{margin-left:var(--bui-space-14);margin-right:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-mx{margin-left:var(--mx-xl);margin-right:var(--mx-xl)}.xl\:bui-mx-0\.5{margin-left:var(--bui-space-0_5);margin-right:var(--bui-space-0_5)}.xl\:bui-mx-1{margin-left:var(--bui-space-1);margin-right:var(--bui-space-1)}.xl\:bui-mx-1\.5{margin-left:var(--bui-space-1_5);margin-right:var(--bui-space-1_5)}.xl\:bui-mx-2{margin-left:var(--bui-space-2);margin-right:var(--bui-space-2)}.xl\:bui-mx-3{margin-left:var(--bui-space-3);margin-right:var(--bui-space-3)}.xl\:bui-mx-4{margin-left:var(--bui-space-4);margin-right:var(--bui-space-4)}.xl\:bui-mx-5{margin-left:var(--bui-space-5);margin-right:var(--bui-space-5)}.xl\:bui-mx-6{margin-left:var(--bui-space-6);margin-right:var(--bui-space-6)}.xl\:bui-mx-7{margin-left:var(--bui-space-7);margin-right:var(--bui-space-7)}.xl\:bui-mx-8{margin-left:var(--bui-space-8);margin-right:var(--bui-space-8)}.xl\:bui-mx-9{margin-left:var(--bui-space-9);margin-right:var(--bui-space-9)}.xl\:bui-mx-10{margin-left:var(--bui-space-10);margin-right:var(--bui-space-10)}.xl\:bui-mx-11{margin-left:var(--bui-space-11);margin-right:var(--bui-space-11)}.xl\:bui-mx-12{margin-left:var(--bui-space-12);margin-right:var(--bui-space-12)}.xl\:bui-mx-13{margin-left:var(--bui-space-13);margin-right:var(--bui-space-13)}.xl\:bui-mx-14{margin-left:var(--bui-space-14);margin-right:var(--bui-space-14)}}.bui-display-none{display:none}.bui-display-inline{display:inline}.bui-display-inline-block{display:inline-block}.bui-display-block{display:block}@media (width>=640px){.xs\:bui-display-none{display:none}.xs\:bui-display-inline{display:inline}.xs\:bui-display-inline-block{display:inline-block}.xs\:bui-display-block{display:block}}@media (width>=768px){.sm\:bui-display-none{display:none}.sm\:bui-display-inline{display:inline}.sm\:bui-display-inline-block{display:inline-block}.sm\:bui-display-block{display:block}}@media (width>=1024px){.md\:bui-display-none{display:none}.md\:bui-display-inline{display:inline}.md\:bui-display-inline-block{display:inline-block}.md\:bui-display-block{display:block}}@media (width>=1280px){.lg\:bui-display-none{display:none}.lg\:bui-display-inline{display:inline}.lg\:bui-display-inline-block{display:inline-block}.lg\:bui-display-block{display:block}}@media (width>=1536px){.xl\:bui-display-none{display:none}.xl\:bui-display-inline{display:inline}.xl\:bui-display-inline-block{display:inline-block}.xl\:bui-display-block{display:block}}.bui-w{width:var(--width)}.bui-min-w{min-width:var(--min-width)}.bui-max-w{max-width:var(--max-width)}@media (width>=640px){.xs\:bui-w{width:var(--width)}.xs\:bui-min-w{min-width:var(--min-width)}.xs\:bui-max-w{max-width:var(--max-width)}}@media (width>=768px){.sm\:bui-w{width:var(--width)}.sm\:bui-min-w{min-width:var(--min-width)}.sm\:bui-max-w{max-width:var(--max-width)}}@media (width>=1024px){.md\:bui-w{width:var(--width)}.md\:bui-min-w{min-width:var(--min-width)}.md\:bui-max-w{max-width:var(--max-width)}}@media (width>=1280px){.lg\:bui-w{width:var(--width)}.lg\:bui-min-w{min-width:var(--min-width)}.lg\:bui-max-w{max-width:var(--max-width)}}@media (width>=1536px){.xl\:bui-w{width:var(--width)}.xl\:bui-min-w{min-width:var(--min-width)}.xl\:bui-max-w{max-width:var(--max-width)}}.bui-h{height:var(--height)}.bui-min-h{min-height:var(--min-height)}.bui-max-h{max-height:var(--max-height)}@media (width>=640px){.xs\:bui-h{height:var(--height)}.xs\:bui-min-h{min-height:var(--min-height)}.xs\:bui-max-h{max-height:var(--max-height)}}@media (width>=768px){.sm\:bui-h{height:var(--height)}.sm\:bui-min-h{min-height:var(--min-height)}.sm\:bui-max-h{max-height:var(--max-height)}}@media (width>=1024px){.md\:bui-h{height:var(--height)}.md\:bui-min-h{min-height:var(--min-height)}.md\:bui-max-h{max-height:var(--max-height)}}@media (width>=1280px){.lg\:bui-h{height:var(--height)}.lg\:bui-min-h{min-height:var(--min-height)}.lg\:bui-max-h{max-height:var(--max-height)}}@media (width>=1536px){.xl\:bui-h{height:var(--height)}.xl\:bui-min-h{min-height:var(--min-height)}.xl\:bui-max-h{max-height:var(--max-height)}}.bui-position-absolute{position:absolute}.bui-position-fixed{position:fixed}.bui-position-sticky{position:sticky}.bui-position-relative{position:relative}.bui-position-static{position:static}@media (width>=640px){.xs\:bui-position-absolute{position:absolute}.xs\:bui-position-fixed{position:fixed}.xs\:bui-position-sticky{position:sticky}.xs\:bui-position-relative{position:relative}.xs\:bui-position-static{position:static}}@media (width>=768px){.sm\:bui-position-absolute{position:absolute}.sm\:bui-position-fixed{position:fixed}.sm\:bui-position-sticky{position:sticky}.sm\:bui-position-relative{position:relative}.sm\:bui-position-static{position:static}}@media (width>=1024px){.md\:bui-position-absolute{position:absolute}.md\:bui-position-fixed{position:fixed}.md\:bui-position-sticky{position:sticky}.md\:bui-position-relative{position:relative}.md\:bui-position-static{position:static}}@media (width>=1280px){.lg\:bui-position-absolute{position:absolute}.lg\:bui-position-fixed{position:fixed}.lg\:bui-position-sticky{position:sticky}.lg\:bui-position-relative{position:relative}.lg\:bui-position-static{position:static}}@media (width>=1536px){.xl\:bui-position-absolute{position:absolute}.xl\:bui-position-fixed{position:fixed}.xl\:bui-position-sticky{position:sticky}.xl\:bui-position-relative{position:relative}.xl\:bui-position-static{position:static}}.bui-columns-1{grid-template-columns:repeat(1,minmax(0,1fr))}.bui-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}.bui-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}.bui-columns-4{grid-template-columns:repeat(4,minmax(0,1fr))}.bui-columns-5{grid-template-columns:repeat(5,minmax(0,1fr))}.bui-columns-6{grid-template-columns:repeat(6,minmax(0,1fr))}.bui-columns-7{grid-template-columns:repeat(7,minmax(0,1fr))}.bui-columns-8{grid-template-columns:repeat(8,minmax(0,1fr))}.bui-columns-9{grid-template-columns:repeat(9,minmax(0,1fr))}.bui-columns-10{grid-template-columns:repeat(10,minmax(0,1fr))}.bui-columns-11{grid-template-columns:repeat(11,minmax(0,1fr))}.bui-columns-12{grid-template-columns:repeat(12,minmax(0,1fr))}.bui-columns-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.bui-col-span-1{grid-column:span 1/span 1}.bui-col-span-2{grid-column:span 2/span 2}.bui-col-span-3{grid-column:span 3/span 3}.bui-col-span-4{grid-column:span 4/span 4}.bui-col-span-5{grid-column:span 5/span 5}.bui-col-span-6{grid-column:span 6/span 6}.bui-col-span-7{grid-column:span 7/span 7}.bui-col-span-8{grid-column:span 8/span 8}.bui-col-span-9{grid-column:span 9/span 9}.bui-col-span-10{grid-column:span 10/span 10}.bui-col-span-11{grid-column:span 11/span 11}.bui-col-span-12{grid-column:span 12/span 12}.bui-col-span-auto{grid-column:span auto/span auto}.bui-col-start-1{grid-column-start:1}.bui-col-start-2{grid-column-start:2}.bui-col-start-3{grid-column-start:3}.bui-col-start-4{grid-column-start:4}.bui-col-start-5{grid-column-start:5}.bui-col-start-6{grid-column-start:6}.bui-col-start-7{grid-column-start:7}.bui-col-start-8{grid-column-start:8}.bui-col-start-9{grid-column-start:9}.bui-col-start-10{grid-column-start:10}.bui-col-start-11{grid-column-start:11}.bui-col-start-12{grid-column-start:12}.bui-col-start-13{grid-column-start:13}.bui-col-start-auto{grid-column-start:auto}.bui-col-end-1{grid-column-end:1}.bui-col-end-2{grid-column-end:2}.bui-col-end-3{grid-column-end:3}.bui-col-end-4{grid-column-end:4}.bui-col-end-5{grid-column-end:5}.bui-col-end-6{grid-column-end:6}.bui-col-end-7{grid-column-end:7}.bui-col-end-8{grid-column-end:8}.bui-col-end-9{grid-column-end:9}.bui-col-end-10{grid-column-end:10}.bui-col-end-11{grid-column-end:11}.bui-col-end-12{grid-column-end:12}.bui-col-end-13{grid-column-end:13}.bui-col-end-auto{grid-column-end:auto}.bui-row-span-1{grid-row:span 1/span 1}.bui-row-span-2{grid-row:span 2/span 2}.bui-row-span-3{grid-row:span 3/span 3}.bui-row-span-4{grid-row:span 4/span 4}.bui-row-span-5{grid-row:span 5/span 5}.bui-row-span-6{grid-row:span 6/span 6}.bui-row-span-7{grid-row:span 7/span 7}.bui-row-span-8{grid-row:span 8/span 8}.bui-row-span-9{grid-row:span 9/span 9}.bui-row-span-10{grid-row:span 10/span 10}.bui-row-span-11{grid-row:span 11/span 11}.bui-row-span-12{grid-row:span 12/span 12}.bui-row-span-auto{grid-row:span auto/span auto}@media (width>=640px){.xs\:bui-columns-1{grid-template-columns:repeat(1,minmax(0,1fr))}.xs\:bui-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xs\:bui-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xs\:bui-columns-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xs\:bui-columns-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xs\:bui-columns-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xs\:bui-columns-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xs\:bui-columns-8{grid-template-columns:repeat(8,minmax(0,1fr))}.xs\:bui-columns-9{grid-template-columns:repeat(9,minmax(0,1fr))}.xs\:bui-columns-10{grid-template-columns:repeat(10,minmax(0,1fr))}.xs\:bui-columns-11{grid-template-columns:repeat(11,minmax(0,1fr))}.xs\:bui-columns-12{grid-template-columns:repeat(12,minmax(0,1fr))}.xs\:bui-columns-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.xs\:bui-col-span-1{grid-column:span 1/span 1}.xs\:bui-col-span-2{grid-column:span 2/span 2}.xs\:bui-col-span-3{grid-column:span 3/span 3}.xs\:bui-col-span-4{grid-column:span 4/span 4}.xs\:bui-col-span-5{grid-column:span 5/span 5}.xs\:bui-col-span-6{grid-column:span 6/span 6}.xs\:bui-col-span-7{grid-column:span 7/span 7}.xs\:bui-col-span-8{grid-column:span 8/span 8}.xs\:bui-col-span-9{grid-column:span 9/span 9}.xs\:bui-col-span-10{grid-column:span 10/span 10}.xs\:bui-col-span-11{grid-column:span 11/span 11}.xs\:bui-col-span-12{grid-column:span 12/span 12}.xs\:bui-col-span-auto{grid-column:span auto/span auto}.xs\:bui-col-start-1{grid-column-start:1}.xs\:bui-col-start-2{grid-column-start:2}.xs\:bui-col-start-3{grid-column-start:3}.xs\:bui-col-start-4{grid-column-start:4}.xs\:bui-col-start-5{grid-column-start:5}.xs\:bui-col-start-6{grid-column-start:6}.xs\:bui-col-start-7{grid-column-start:7}.xs\:bui-col-start-8{grid-column-start:8}.xs\:bui-col-start-9{grid-column-start:9}.xs\:bui-col-start-10{grid-column-start:10}.xs\:bui-col-start-11{grid-column-start:11}.xs\:bui-col-start-12{grid-column-start:12}.xs\:bui-col-start-13{grid-column-start:13}.xs\:bui-col-start-auto{grid-column-start:auto}.xs\:bui-col-end-1{grid-column-end:1}.xs\:bui-col-end-2{grid-column-end:2}.xs\:bui-col-end-3{grid-column-end:3}.xs\:bui-col-end-4{grid-column-end:4}.xs\:bui-col-end-5{grid-column-end:5}.xs\:bui-col-end-6{grid-column-end:6}.xs\:bui-col-end-7{grid-column-end:7}.xs\:bui-col-end-8{grid-column-end:8}.xs\:bui-col-end-9{grid-column-end:9}.xs\:bui-col-end-10{grid-column-end:10}.xs\:bui-col-end-11{grid-column-end:11}.xs\:bui-col-end-12{grid-column-end:12}.xs\:bui-col-end-13{grid-column-end:13}.xs\:bui-col-end-auto{grid-column-end:auto}.xs\:bui-row-span-1{grid-row:span 1/span 1}.xs\:bui-row-span-2{grid-row:span 2/span 2}.xs\:bui-row-span-3{grid-row:span 3/span 3}.xs\:bui-row-span-4{grid-row:span 4/span 4}.xs\:bui-row-span-5{grid-row:span 5/span 5}.xs\:bui-row-span-6{grid-row:span 6/span 6}.xs\:bui-row-span-7{grid-row:span 7/span 7}.xs\:bui-row-span-8{grid-row:span 8/span 8}.xs\:bui-row-span-9{grid-row:span 9/span 9}.xs\:bui-row-span-10{grid-row:span 10/span 10}.xs\:bui-row-span-11{grid-row:span 11/span 11}.xs\:bui-row-span-12{grid-row:span 12/span 12}.xs\:bui-row-span-auto{grid-row:span auto/span auto}}@media (width>=768px){.sm\:bui-columns-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:bui-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:bui-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:bui-columns-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:bui-columns-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:bui-columns-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:bui-columns-7{grid-template-columns:repeat(7,minmax(0,1fr))}.sm\:bui-columns-8{grid-template-columns:repeat(8,minmax(0,1fr))}.sm\:bui-columns-9{grid-template-columns:repeat(9,minmax(0,1fr))}.sm\:bui-columns-10{grid-template-columns:repeat(10,minmax(0,1fr))}.sm\:bui-columns-11{grid-template-columns:repeat(11,minmax(0,1fr))}.sm\:bui-columns-12{grid-template-columns:repeat(12,minmax(0,1fr))}.sm\:bui-columns-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.sm\:bui-col-span-1{grid-column:span 1/span 1}.sm\:bui-col-span-2{grid-column:span 2/span 2}.sm\:bui-col-span-3{grid-column:span 3/span 3}.sm\:bui-col-span-4{grid-column:span 4/span 4}.sm\:bui-col-span-5{grid-column:span 5/span 5}.sm\:bui-col-span-6{grid-column:span 6/span 6}.sm\:bui-col-span-7{grid-column:span 7/span 7}.sm\:bui-col-span-8{grid-column:span 8/span 8}.sm\:bui-col-span-9{grid-column:span 9/span 9}.sm\:bui-col-span-10{grid-column:span 10/span 10}.sm\:bui-col-span-11{grid-column:span 11/span 11}.sm\:bui-col-span-12{grid-column:span 12/span 12}.sm\:bui-col-span-auto{grid-column:span auto/span auto}.sm\:bui-col-start-1{grid-column-start:1}.sm\:bui-col-start-2{grid-column-start:2}.sm\:bui-col-start-3{grid-column-start:3}.sm\:bui-col-start-4{grid-column-start:4}.sm\:bui-col-start-5{grid-column-start:5}.sm\:bui-col-start-6{grid-column-start:6}.sm\:bui-col-start-7{grid-column-start:7}.sm\:bui-col-start-8{grid-column-start:8}.sm\:bui-col-start-9{grid-column-start:9}.sm\:bui-col-start-10{grid-column-start:10}.sm\:bui-col-start-11{grid-column-start:11}.sm\:bui-col-start-12{grid-column-start:12}.sm\:bui-col-start-13{grid-column-start:13}.sm\:bui-col-start-auto{grid-column-start:auto}.sm\:bui-col-end-1{grid-column-end:1}.sm\:bui-col-end-2{grid-column-end:2}.sm\:bui-col-end-3{grid-column-end:3}.sm\:bui-col-end-4{grid-column-end:4}.sm\:bui-col-end-5{grid-column-end:5}.sm\:bui-col-end-6{grid-column-end:6}.sm\:bui-col-end-7{grid-column-end:7}.sm\:bui-col-end-8{grid-column-end:8}.sm\:bui-col-end-9{grid-column-end:9}.sm\:bui-col-end-10{grid-column-end:10}.sm\:bui-col-end-11{grid-column-end:11}.sm\:bui-col-end-12{grid-column-end:12}.sm\:bui-col-end-13{grid-column-end:13}.sm\:bui-col-end-auto{grid-column-end:auto}.sm\:bui-row-span-1{grid-row:span 1/span 1}.sm\:bui-row-span-2{grid-row:span 2/span 2}.sm\:bui-row-span-3{grid-row:span 3/span 3}.sm\:bui-row-span-4{grid-row:span 4/span 4}.sm\:bui-row-span-5{grid-row:span 5/span 5}.sm\:bui-row-span-6{grid-row:span 6/span 6}.sm\:bui-row-span-7{grid-row:span 7/span 7}.sm\:bui-row-span-8{grid-row:span 8/span 8}.sm\:bui-row-span-9{grid-row:span 9/span 9}.sm\:bui-row-span-10{grid-row:span 10/span 10}.sm\:bui-row-span-11{grid-row:span 11/span 11}.sm\:bui-row-span-12{grid-row:span 12/span 12}.sm\:bui-row-span-auto{grid-row:span auto/span auto}}@media (width>=1024px){.md\:bui-columns-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:bui-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:bui-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:bui-columns-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:bui-columns-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:bui-columns-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:bui-columns-7{grid-template-columns:repeat(7,minmax(0,1fr))}.md\:bui-columns-8{grid-template-columns:repeat(8,minmax(0,1fr))}.md\:bui-columns-9{grid-template-columns:repeat(9,minmax(0,1fr))}.md\:bui-columns-10{grid-template-columns:repeat(10,minmax(0,1fr))}.md\:bui-columns-11{grid-template-columns:repeat(11,minmax(0,1fr))}.md\:bui-columns-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:bui-columns-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.md\:bui-col-span-1{grid-column:span 1/span 1}.md\:bui-col-span-2{grid-column:span 2/span 2}.md\:bui-col-span-3{grid-column:span 3/span 3}.md\:bui-col-span-4{grid-column:span 4/span 4}.md\:bui-col-span-5{grid-column:span 5/span 5}.md\:bui-col-span-6{grid-column:span 6/span 6}.md\:bui-col-span-7{grid-column:span 7/span 7}.md\:bui-col-span-8{grid-column:span 8/span 8}.md\:bui-col-span-9{grid-column:span 9/span 9}.md\:bui-col-span-10{grid-column:span 10/span 10}.md\:bui-col-span-11{grid-column:span 11/span 11}.md\:bui-col-span-12{grid-column:span 12/span 12}.md\:bui-col-span-auto{grid-column:span auto/span auto}.md\:bui-col-start-1{grid-column-start:1}.md\:bui-col-start-2{grid-column-start:2}.md\:bui-col-start-3{grid-column-start:3}.md\:bui-col-start-4{grid-column-start:4}.md\:bui-col-start-5{grid-column-start:5}.md\:bui-col-start-6{grid-column-start:6}.md\:bui-col-start-7{grid-column-start:7}.md\:bui-col-start-8{grid-column-start:8}.md\:bui-col-start-9{grid-column-start:9}.md\:bui-col-start-10{grid-column-start:10}.md\:bui-col-start-11{grid-column-start:11}.md\:bui-col-start-12{grid-column-start:12}.md\:bui-col-start-13{grid-column-start:13}.md\:bui-col-start-auto{grid-column-start:auto}.md\:bui-col-end-1{grid-column-end:1}.md\:bui-col-end-2{grid-column-end:2}.md\:bui-col-end-3{grid-column-end:3}.md\:bui-col-end-4{grid-column-end:4}.md\:bui-col-end-5{grid-column-end:5}.md\:bui-col-end-6{grid-column-end:6}.md\:bui-col-end-7{grid-column-end:7}.md\:bui-col-end-8{grid-column-end:8}.md\:bui-col-end-9{grid-column-end:9}.md\:bui-col-end-10{grid-column-end:10}.md\:bui-col-end-11{grid-column-end:11}.md\:bui-col-end-12{grid-column-end:12}.md\:bui-col-end-13{grid-column-end:13}.md\:bui-col-end-auto{grid-column-end:auto}.md\:bui-row-span-1{grid-row:span 1/span 1}.md\:bui-row-span-2{grid-row:span 2/span 2}.md\:bui-row-span-3{grid-row:span 3/span 3}.md\:bui-row-span-4{grid-row:span 4/span 4}.md\:bui-row-span-5{grid-row:span 5/span 5}.md\:bui-row-span-6{grid-row:span 6/span 6}.md\:bui-row-span-7{grid-row:span 7/span 7}.md\:bui-row-span-8{grid-row:span 8/span 8}.md\:bui-row-span-9{grid-row:span 9/span 9}.md\:bui-row-span-10{grid-row:span 10/span 10}.md\:bui-row-span-11{grid-row:span 11/span 11}.md\:bui-row-span-12{grid-row:span 12/span 12}.md\:bui-row-span-auto{grid-row:span auto/span auto}}@media (width>=1280px){.lg\:bui-columns-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:bui-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:bui-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:bui-columns-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:bui-columns-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:bui-columns-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:bui-columns-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:bui-columns-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:bui-columns-9{grid-template-columns:repeat(9,minmax(0,1fr))}.lg\:bui-columns-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lg\:bui-columns-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lg\:bui-columns-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:bui-columns-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.lg\:bui-col-span-1{grid-column:span 1/span 1}.lg\:bui-col-span-2{grid-column:span 2/span 2}.lg\:bui-col-span-3{grid-column:span 3/span 3}.lg\:bui-col-span-4{grid-column:span 4/span 4}.lg\:bui-col-span-5{grid-column:span 5/span 5}.lg\:bui-col-span-6{grid-column:span 6/span 6}.lg\:bui-col-span-7{grid-column:span 7/span 7}.lg\:bui-col-span-8{grid-column:span 8/span 8}.lg\:bui-col-span-9{grid-column:span 9/span 9}.lg\:bui-col-span-10{grid-column:span 10/span 10}.lg\:bui-col-span-11{grid-column:span 11/span 11}.lg\:bui-col-span-12{grid-column:span 12/span 12}.lg\:bui-col-span-auto{grid-column:span auto/span auto}.lg\:bui-col-start-1{grid-column-start:1}.lg\:bui-col-start-2{grid-column-start:2}.lg\:bui-col-start-3{grid-column-start:3}.lg\:bui-col-start-4{grid-column-start:4}.lg\:bui-col-start-5{grid-column-start:5}.lg\:bui-col-start-6{grid-column-start:6}.lg\:bui-col-start-7{grid-column-start:7}.lg\:bui-col-start-8{grid-column-start:8}.lg\:bui-col-start-9{grid-column-start:9}.lg\:bui-col-start-10{grid-column-start:10}.lg\:bui-col-start-11{grid-column-start:11}.lg\:bui-col-start-12{grid-column-start:12}.lg\:bui-col-start-13{grid-column-start:13}.lg\:bui-col-start-auto{grid-column-start:auto}.lg\:bui-col-end-1{grid-column-end:1}.lg\:bui-col-end-2{grid-column-end:2}.lg\:bui-col-end-3{grid-column-end:3}.lg\:bui-col-end-4{grid-column-end:4}.lg\:bui-col-end-5{grid-column-end:5}.lg\:bui-col-end-6{grid-column-end:6}.lg\:bui-col-end-7{grid-column-end:7}.lg\:bui-col-end-8{grid-column-end:8}.lg\:bui-col-end-9{grid-column-end:9}.lg\:bui-col-end-10{grid-column-end:10}.lg\:bui-col-end-11{grid-column-end:11}.lg\:bui-col-end-12{grid-column-end:12}.lg\:bui-col-end-13{grid-column-end:13}.lg\:bui-col-end-auto{grid-column-end:auto}.lg\:bui-row-span-1{grid-row:span 1/span 1}.lg\:bui-row-span-2{grid-row:span 2/span 2}.lg\:bui-row-span-3{grid-row:span 3/span 3}.lg\:bui-row-span-4{grid-row:span 4/span 4}.lg\:bui-row-span-5{grid-row:span 5/span 5}.lg\:bui-row-span-6{grid-row:span 6/span 6}.lg\:bui-row-span-7{grid-row:span 7/span 7}.lg\:bui-row-span-8{grid-row:span 8/span 8}.lg\:bui-row-span-9{grid-row:span 9/span 9}.lg\:bui-row-span-10{grid-row:span 10/span 10}.lg\:bui-row-span-11{grid-row:span 11/span 11}.lg\:bui-row-span-12{grid-row:span 12/span 12}.lg\:bui-row-span-auto{grid-row:span auto/span auto}}@media (width>=1536px){.xl\:bui-columns-1{grid-template-columns:repeat(1,minmax(0,1fr))}.xl\:bui-columns-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:bui-columns-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:bui-columns-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:bui-columns-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:bui-columns-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:bui-columns-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xl\:bui-columns-8{grid-template-columns:repeat(8,minmax(0,1fr))}.xl\:bui-columns-9{grid-template-columns:repeat(9,minmax(0,1fr))}.xl\:bui-columns-10{grid-template-columns:repeat(10,minmax(0,1fr))}.xl\:bui-columns-11{grid-template-columns:repeat(11,minmax(0,1fr))}.xl\:bui-columns-12{grid-template-columns:repeat(12,minmax(0,1fr))}.xl\:bui-columns-auto{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.xl\:bui-col-span-1{grid-column:span 1/span 1}.xl\:bui-col-span-2{grid-column:span 2/span 2}.xl\:bui-col-span-3{grid-column:span 3/span 3}.xl\:bui-col-span-4{grid-column:span 4/span 4}.xl\:bui-col-span-5{grid-column:span 5/span 5}.xl\:bui-col-span-6{grid-column:span 6/span 6}.xl\:bui-col-span-7{grid-column:span 7/span 7}.xl\:bui-col-span-8{grid-column:span 8/span 8}.xl\:bui-col-span-9{grid-column:span 9/span 9}.xl\:bui-col-span-10{grid-column:span 10/span 10}.xl\:bui-col-span-11{grid-column:span 11/span 11}.xl\:bui-col-span-12{grid-column:span 12/span 12}.xl\:bui-col-span-auto{grid-column:span auto/span auto}.xl\:bui-col-start-1{grid-column-start:1}.xl\:bui-col-start-2{grid-column-start:2}.xl\:bui-col-start-3{grid-column-start:3}.xl\:bui-col-start-4{grid-column-start:4}.xl\:bui-col-start-5{grid-column-start:5}.xl\:bui-col-start-6{grid-column-start:6}.xl\:bui-col-start-7{grid-column-start:7}.xl\:bui-col-start-8{grid-column-start:8}.xl\:bui-col-start-9{grid-column-start:9}.xl\:bui-col-start-10{grid-column-start:10}.xl\:bui-col-start-11{grid-column-start:11}.xl\:bui-col-start-12{grid-column-start:12}.xl\:bui-col-start-13{grid-column-start:13}.xl\:bui-col-start-auto{grid-column-start:auto}.xl\:bui-col-end-1{grid-column-end:1}.xl\:bui-col-end-2{grid-column-end:2}.xl\:bui-col-end-3{grid-column-end:3}.xl\:bui-col-end-4{grid-column-end:4}.xl\:bui-col-end-5{grid-column-end:5}.xl\:bui-col-end-6{grid-column-end:6}.xl\:bui-col-end-7{grid-column-end:7}.xl\:bui-col-end-8{grid-column-end:8}.xl\:bui-col-end-9{grid-column-end:9}.xl\:bui-col-end-10{grid-column-end:10}.xl\:bui-col-end-11{grid-column-end:11}.xl\:bui-col-end-12{grid-column-end:12}.xl\:bui-col-end-13{grid-column-end:13}.xl\:bui-col-end-auto{grid-column-end:auto}.xl\:bui-row-span-1{grid-row:span 1/span 1}.xl\:bui-row-span-2{grid-row:span 2/span 2}.xl\:bui-row-span-3{grid-row:span 3/span 3}.xl\:bui-row-span-4{grid-row:span 4/span 4}.xl\:bui-row-span-5{grid-row:span 5/span 5}.xl\:bui-row-span-6{grid-row:span 6/span 6}.xl\:bui-row-span-7{grid-row:span 7/span 7}.xl\:bui-row-span-8{grid-row:span 8/span 8}.xl\:bui-row-span-9{grid-row:span 9/span 9}.xl\:bui-row-span-10{grid-row:span 10/span 10}.xl\:bui-row-span-11{grid-row:span 11/span 11}.xl\:bui-row-span-12{grid-row:span 12/span 12}.xl\:bui-row-span-auto{grid-row:span auto/span auto}}.bui-gap{gap:var(--gap)}.bui-gap-0\.5{gap:var(--bui-space-0_5)}.bui-gap-1{gap:var(--bui-space-1)}.bui-gap-1\.5{gap:var(--bui-space-1_5)}.bui-gap-2{gap:var(--bui-space-2)}.bui-gap-3{gap:var(--bui-space-3)}.bui-gap-4{gap:var(--bui-space-4)}.bui-gap-5{gap:var(--bui-space-5)}.bui-gap-6{gap:var(--bui-space-6)}.bui-gap-7{gap:var(--bui-space-7)}.bui-gap-8{gap:var(--bui-space-8)}.bui-gap-9{gap:var(--bui-space-9)}.bui-gap-10{gap:var(--bui-space-10)}.bui-gap-11{gap:var(--bui-space-11)}.bui-gap-12{gap:var(--bui-space-12)}.bui-gap-13{gap:var(--bui-space-13)}.bui-gap-14{gap:var(--bui-space-14)}@media (width>=640px){.xs\:bui-gap{gap:var(--gap-xs)}.xs\:bui-gap-0\.5{gap:var(--bui-space-0_5)}.xs\:bui-gap-1{gap:var(--bui-space-1)}.xs\:bui-gap-1\.5{gap:var(--bui-space-1_5)}.xs\:bui-gap-2{gap:var(--bui-space-2)}.xs\:bui-gap-3{gap:var(--bui-space-3)}.xs\:bui-gap-4{gap:var(--bui-space-4)}.xs\:bui-gap-5{gap:var(--bui-space-5)}.xs\:bui-gap-6{gap:var(--bui-space-6)}.xs\:bui-gap-7{gap:var(--bui-space-7)}.xs\:bui-gap-8{gap:var(--bui-space-8)}.xs\:bui-gap-9{gap:var(--bui-space-9)}.xs\:bui-gap-10{gap:var(--bui-space-10)}.xs\:bui-gap-11{gap:var(--bui-space-11)}.xs\:bui-gap-12{gap:var(--bui-space-12)}.xs\:bui-gap-13{gap:var(--bui-space-13)}.xs\:bui-gap-14{gap:var(--bui-space-14)}}@media (width>=768px){.sm\:bui-gap{gap:var(--gap-sm)}.sm\:bui-gap-0\.5{gap:var(--bui-space-0_5)}.sm\:bui-gap-1{gap:var(--bui-space-1)}.sm\:bui-gap-1\.5{gap:var(--bui-space-1_5)}.sm\:bui-gap-2{gap:var(--bui-space-2)}.sm\:bui-gap-3{gap:var(--bui-space-3)}.sm\:bui-gap-4{gap:var(--bui-space-4)}.sm\:bui-gap-5{gap:var(--bui-space-5)}.sm\:bui-gap-6{gap:var(--bui-space-6)}.sm\:bui-gap-7{gap:var(--bui-space-7)}.sm\:bui-gap-8{gap:var(--bui-space-8)}.sm\:bui-gap-9{gap:var(--bui-space-9)}.sm\:bui-gap-10{gap:var(--bui-space-10)}.sm\:bui-gap-11{gap:var(--bui-space-11)}.sm\:bui-gap-12{gap:var(--bui-space-12)}.sm\:bui-gap-13{gap:var(--bui-space-13)}.sm\:bui-gap-14{gap:var(--bui-space-14)}}@media (width>=1024px){.md\:bui-gap{gap:var(--gap-md)}.md\:bui-gap-0\.5{gap:var(--bui-space-0_5)}.md\:bui-gap-1{gap:var(--bui-space-1)}.md\:bui-gap-1\.5{gap:var(--bui-space-1_5)}.md\:bui-gap-2{gap:var(--bui-space-2)}.md\:bui-gap-3{gap:var(--bui-space-3)}.md\:bui-gap-4{gap:var(--bui-space-4)}.md\:bui-gap-5{gap:var(--bui-space-5)}.md\:bui-gap-6{gap:var(--bui-space-6)}.md\:bui-gap-7{gap:var(--bui-space-7)}.md\:bui-gap-8{gap:var(--bui-space-8)}.md\:bui-gap-9{gap:var(--bui-space-9)}.md\:bui-gap-10{gap:var(--bui-space-10)}.md\:bui-gap-11{gap:var(--bui-space-11)}.md\:bui-gap-12{gap:var(--bui-space-12)}.md\:bui-gap-13{gap:var(--bui-space-13)}.md\:bui-gap-14{gap:var(--bui-space-14)}}@media (width>=1280px){.lg\:bui-gap{gap:var(--gap-lg)}.lg\:bui-gap-0\.5{gap:var(--bui-space-0_5)}.lg\:bui-gap-1{gap:var(--bui-space-1)}.lg\:bui-gap-1\.5{gap:var(--bui-space-1_5)}.lg\:bui-gap-2{gap:var(--bui-space-2)}.lg\:bui-gap-3{gap:var(--bui-space-3)}.lg\:bui-gap-4{gap:var(--bui-space-4)}.lg\:bui-gap-5{gap:var(--bui-space-5)}.lg\:bui-gap-6{gap:var(--bui-space-6)}.lg\:bui-gap-7{gap:var(--bui-space-7)}.lg\:bui-gap-8{gap:var(--bui-space-8)}.lg\:bui-gap-9{gap:var(--bui-space-9)}.lg\:bui-gap-10{gap:var(--bui-space-10)}.lg\:bui-gap-11{gap:var(--bui-space-11)}.lg\:bui-gap-12{gap:var(--bui-space-12)}.lg\:bui-gap-13{gap:var(--bui-space-13)}.lg\:bui-gap-14{gap:var(--bui-space-14)}}@media (width>=1536px){.xl\:bui-gap{gap:var(--gap-xl)}.xl\:bui-gap-0\.5{gap:var(--bui-space-0_5)}.xl\:bui-gap-1{gap:var(--bui-space-1)}.xl\:bui-gap-1\.5{gap:var(--bui-space-1_5)}.xl\:bui-gap-2{gap:var(--bui-space-2)}.xl\:bui-gap-3{gap:var(--bui-space-3)}.xl\:bui-gap-4{gap:var(--bui-space-4)}.xl\:bui-gap-5{gap:var(--bui-space-5)}.xl\:bui-gap-6{gap:var(--bui-space-6)}.xl\:bui-gap-7{gap:var(--bui-space-7)}.xl\:bui-gap-8{gap:var(--bui-space-8)}.xl\:bui-gap-9{gap:var(--bui-space-9)}.xl\:bui-gap-10{gap:var(--bui-space-10)}.xl\:bui-gap-11{gap:var(--bui-space-11)}.xl\:bui-gap-12{gap:var(--bui-space-12)}.xl\:bui-gap-13{gap:var(--bui-space-13)}.xl\:bui-gap-14{gap:var(--bui-space-14)}}.bui-align-start{align-items:start}.bui-align-center{align-items:center}.bui-align-end{align-items:end}.bui-align-baseline{align-items:baseline}.bui-align-stretch{align-items:stretch}.bui-jc-start{justify-content:start}.bui-jc-center{justify-content:center}.bui-jc-end{justify-content:end}.bui-jc-between{justify-content:space-between}.bui-fd-row{flex-direction:row}.bui-fd-column{flex-direction:column}.bui-fd-row-reverse{flex-direction:row-reverse}.bui-fd-column-reverse{flex-direction:column-reverse}@media (width>=640px){.xs\:bui-align-start{align-items:start}.xs\:bui-align-center{align-items:center}.xs\:bui-align-end{align-items:end}.xs\:bui-align-stretch{align-items:stretch}.xs\:bui-jc-start{justify-content:start}.xs\:bui-jc-center{justify-content:center}.xs\:bui-jc-end{justify-content:end}.xs\:bui-jc-between{justify-content:space-between}.xs\:bui-fd-row{flex-direction:row}.xs\:bui-fd-column{flex-direction:column}.xs\:bui-fd-row-reverse{flex-direction:row-reverse}.xs\:bui-fd-column-reverse{flex-direction:column-reverse}}@media (width>=768px){.sm\:bui-align-start{align-items:start}.sm\:bui-align-center{align-items:center}.sm\:bui-align-end{align-items:end}.sm\:bui-align-stretch{align-items:stretch}.sm\:bui-jc-start{justify-content:start}.sm\:bui-jc-center{justify-content:center}.sm\:bui-jc-end{justify-content:end}.sm\:bui-jc-between{justify-content:space-between}.sm\:bui-fd-row{flex-direction:row}.sm\:bui-fd-column{flex-direction:column}.sm\:bui-fd-row-reverse{flex-direction:row-reverse}.sm\:bui-fd-column-reverse{flex-direction:column-reverse}}@media (width>=1024px){.md\:bui-align-start{align-items:start}.md\:bui-align-center{align-items:center}.md\:bui-align-end{align-items:end}.md\:bui-align-stretch{align-items:stretch}.md\:bui-jc-start{justify-content:start}.md\:bui-jc-center{justify-content:center}.md\:bui-jc-end{justify-content:end}.md\:bui-jc-between{justify-content:space-between}.md\:bui-fd-row{flex-direction:row}.md\:bui-fd-column{flex-direction:column}.md\:bui-fd-row-reverse{flex-direction:row-reverse}.md\:bui-fd-column-reverse{flex-direction:column-reverse}}@media (width>=1280px){.lg\:bui-align-start{align-items:start}.lg\:bui-align-center{align-items:center}.lg\:bui-align-end{align-items:end}.lg\:bui-align-stretch{align-items:stretch}.lg\:bui-jc-start{justify-content:start}.lg\:bui-jc-center{justify-content:center}.lg\:bui-jc-end{justify-content:end}.lg\:bui-jc-between{justify-content:space-between}.lg\:bui-fd-row{flex-direction:row}.lg\:bui-fd-column{flex-direction:column}.lg\:bui-fd-row-reverse{flex-direction:row-reverse}.lg\:bui-fd-column-reverse{flex-direction:column-reverse}}@media (width>=1536px){.xl\:bui-align-start{align-items:start}.xl\:bui-align-center{align-items:center}.xl\:bui-align-end{align-items:end}.xl\:bui-align-stretch{align-items:stretch}.xl\:bui-jc-start{justify-content:start}.xl\:bui-jc-center{justify-content:center}.xl\:bui-jc-end{justify-content:end}.xl\:bui-jc-between{justify-content:space-between}.xl\:bui-fd-row{flex-direction:row}.xl\:bui-fd-column{flex-direction:column}.xl\:bui-fd-row-reverse{flex-direction:row-reverse}.xl\:bui-fd-column-reverse{flex-direction:column-reverse}}} \ No newline at end of file diff --git a/docs-ui/public/theme-spotify.css b/docs-ui/public/theme-spotify.css deleted file mode 100644 index b0bf517701..0000000000 --- a/docs-ui/public/theme-spotify.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:CircularSpTitle;font-weight:900;font-display:swap;unicode-range:U+0,U+D,U+20-7E,U+A0-17E,U+18F,U+192,U+1A0-1A1,U+1AF-1B0,U+1B5-1B6,U+1C4-1C6,U+1F1-1F3,U+1FA-1FF,U+218-21B,U+237,U+259,U+2BB-2BC,U+2C6-2C7,U+2C9,U+2D8-2DD,U+300-301,U+303,U+309,U+323,U+394,U+3A9,U+3BC,U+3C0,U+1E80-1E85,U+1E8A-1E8B,U+1EA0-1EF9,U+1FD6,U+2007-2008,U+200B,U+2010-2011,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2032-2033,U+2039-203A,U+2042,U+2044,U+2051,U+2070,U+2074-2079,U+2080-2089,U+20AB-20AC,U+2113,U+2117,U+2122,U+2126,U+2160-2169,U+216C-216F,U+2190-2193,U+2196-2199,U+21A9,U+21B0-21B5,U+21C6,U+2202,U+2206,U+220F,U+2211-2212,U+2215,U+2219-221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+22C5,U+24C5,U+25A0-25A1,U+25AF,U+25B2-25B3,U+25CA-25CB,U+25CF,U+262E,U+2713,U+2715,U+2780-2788,U+E000,U+E002,U+F6C3,U+FB00-FB04,U+FEFF,U+FF0C,U+FF0E,U+FF1A-FF1B,U+FFFF;src:url(https://encore.scdn.co/fonts/CircularSpTitle-Black-4588c99025b967475c31695b0743dd1a.woff2)format("woff2"),url(https://encore.scdn.co/fonts/CircularSpTitle-Black-506746f387a26f25aa3d023b3e501d34.woff)format("woff")}@font-face{font-family:CircularSpTitle;font-weight:700;font-display:swap;unicode-range:U+0,U+D,U+20-7E,U+A0-17E,U+18F,U+192,U+1A0-1A1,U+1AF-1B0,U+1B5-1B6,U+1C4-1C6,U+1F1-1F3,U+1FA-1FF,U+218-21B,U+237,U+259,U+2BB-2BC,U+2C6-2C7,U+2C9,U+2D8-2DD,U+300-301,U+303,U+309,U+323,U+394,U+3A9,U+3BC,U+3C0,U+1E80-1E85,U+1E8A-1E8B,U+1EA0-1EF9,U+1FD6,U+2007-2008,U+200B,U+2010-2011,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2032-2033,U+2039-203A,U+2042,U+2044,U+2051,U+2070,U+2074-2079,U+2080-2089,U+20AB-20AC,U+2113,U+2117,U+2122,U+2126,U+2160-2169,U+216C-216F,U+2190-2193,U+2196-2199,U+21A9,U+21B0-21B5,U+21C6,U+2202,U+2206,U+220F,U+2211-2212,U+2215,U+2219-221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+22C5,U+24C5,U+25A0-25A1,U+25AF,U+25B2-25B3,U+25CA-25CB,U+25CF,U+262E,U+2713,U+2715,U+2780-2788,U+E000,U+E002,U+F6C3,U+FB00-FB04,U+FEFF,U+FF0C,U+FF0E,U+FF1A-FF1B,U+FFFF;src:url(https://encore.scdn.co/fonts/CircularSpTitle-Bold-b2586b06a2e1522e9d879d84c2792a58.woff2)format("woff2"),url(https://encore.scdn.co/fonts/CircularSpTitle-Bold-1624fb2df28c20d7203d7fb86ce8b481.woff)format("woff")}@font-face{font-family:CircularSp;font-weight:700;font-display:swap;unicode-range:U+0,U+D,U+20-7E,U+A0-17E,U+18F,U+192,U+1A0-1A1,U+1AF-1B0,U+1B5-1B6,U+1C4-1C6,U+1F1-1F3,U+1FA-1FF,U+218-21B,U+237,U+259,U+2BB-2BC,U+2C6-2C7,U+2C9,U+2D8-2DD,U+300-301,U+303,U+309,U+323,U+394,U+3A9,U+3BC,U+3C0,U+1E80-1E85,U+1E8A-1E8B,U+1EA0-1EF9,U+1FD6,U+2007-2008,U+200B,U+2010-2011,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2032-2033,U+2039-203A,U+2042,U+2044,U+2051,U+2070,U+2074-2079,U+2080-2089,U+20AB-20AC,U+2113,U+2117,U+2122,U+2126,U+2160-2169,U+216C-216F,U+2190-2193,U+2196-2199,U+21A9,U+21B0-21B5,U+21C6,U+2202,U+2206,U+220F,U+2211-2212,U+2215,U+2219-221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+22C5,U+24C5,U+25A0-25A1,U+25AF,U+25B2-25B3,U+25CA-25CB,U+25CF,U+262E,U+2713,U+2715,U+2780-2788,U+E000,U+E002,U+F6C3,U+FB00-FB04,U+FEFF,U+FF0C,U+FF0E,U+FF1A-FF1B,U+FFFF;src:url(https://encore.scdn.co/fonts/CircularSp-Bold-602e7aefc706aa36c6ec1324b9bbc461.woff2)format("woff2"),url(https://encore.scdn.co/fonts/CircularSp-Bold-856afe2da4ba4e61239b129e2c16d633.woff)format("woff")}@font-face{font-family:CircularSp;font-weight:400;font-display:swap;unicode-range:U+0,U+D,U+20-7E,U+A0-17E,U+18F,U+192,U+1A0-1A1,U+1AF-1B0,U+1B5-1B6,U+1C4-1C6,U+1F1-1F3,U+1FA-1FF,U+218-21B,U+237,U+259,U+2BB-2BC,U+2C6-2C7,U+2C9,U+2D8-2DD,U+300-301,U+303,U+309,U+323,U+394,U+3A9,U+3BC,U+3C0,U+1E80-1E85,U+1E8A-1E8B,U+1EA0-1EF9,U+1FD6,U+2007-2008,U+200B,U+2010-2011,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2032-2033,U+2039-203A,U+2042,U+2044,U+2051,U+2070,U+2074-2079,U+2080-2089,U+20AB-20AC,U+2113,U+2117,U+2122,U+2126,U+2160-2169,U+216C-216F,U+2190-2193,U+2196-2199,U+21A9,U+21B0-21B5,U+21C6,U+2202,U+2206,U+220F,U+2211-2212,U+2215,U+2219-221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+22C5,U+24C5,U+25A0-25A1,U+25AF,U+25B2-25B3,U+25CA-25CB,U+25CF,U+262E,U+2713,U+2715,U+2780-2788,U+E000,U+E002,U+F6C3,U+FB00-FB04,U+FEFF,U+FF0C,U+FF0E,U+FF1A-FF1B,U+FFFF;src:url(https://encore.scdn.co/fonts/CircularSp-Book-a00e99ef9996a3a157fb6b746856d04f.woff2)format("woff2"),url(https://encore.scdn.co/fonts/CircularSp-Book-3f73da7d35bd81c706bce7bbb84964de.woff)format("woff")}@font-face{font-family:CircularSp;font-weight:700;font-display:swap;unicode-range:U+0,U+D,U+20-7E,U+A0-17E,U+18F,U+192,U+1A0-1A1,U+1AF-1B0,U+1B5-1B6,U+1C4-1C6,U+1F1-1F3,U+1FA-1FF,U+218-21B,U+237,U+259,U+2BB-2BC,U+2C6-2C7,U+2C9,U+2D8-2DD,U+300-301,U+303,U+309,U+323,U+394,U+3A9,U+3BC,U+3C0,U+1E80-1E85,U+1E8A-1E8B,U+1EA0-1EF9,U+1FD6,U+2007-2008,U+200B,U+2010-2011,U+2013-2014,U+2018-201A,U+201C-201E,U+2020-2022,U+2026,U+2030,U+2032-2033,U+2039-203A,U+2042,U+2044,U+2051,U+2070,U+2074-2079,U+2080-2089,U+20AB-20AC,U+2113,U+2117,U+2122,U+2126,U+2160-2169,U+216C-216F,U+2190-2193,U+2196-2199,U+21A9,U+21B0-21B5,U+21C6,U+2202,U+2206,U+220F,U+2211-2212,U+2215,U+2219-221A,U+221E,U+222B,U+2248,U+2260,U+2264-2265,U+22C5,U+24C5,U+25A0-25A1,U+25AF,U+25B2-25B3,U+25CA-25CB,U+25CF,U+262E,U+2713,U+2715,U+2780-2788,U+E000,U+E002,U+F6C3,U+FB00-FB04,U+FEFF,U+FF0C,U+FF0E,U+FF1A-FF1B,U+FFFF;src:url(https://encore.scdn.co/fonts/CircularSp-Bold-602e7aefc706aa36c6ec1324b9bbc461.woff2)format("woff2"),url(https://encore.scdn.co/fonts/CircularSp-Bold-856afe2da4ba4e61239b129e2c16d633.woff)format("woff")}[data-theme-name=spotify]{--bui-font-text:CircularSp,CircularSp-Arab,CircularSp-Hebr,CircularSp-Cyrl,CircularSp-Grek,CircularSp-Deva;--bui-font-title:CircularSpTitle,CircularSp-Arab,CircularSp-Hebr,CircularSp-Cyrl,CircularSp-Grek,CircularSp-Deva;--bui-font-regular:CircularSp,CircularSp-Arab,CircularSp-Hebr,CircularSp-Cyrl,CircularSp-Grek,CircularSp-Deva;& .bui-Button{border-radius:var(--bui-radius-3);padding-inline:var(--bui-space-3)}& .bui-ButtonIcon{padding:0}& .bui-MenuPopup{box-sizing:border-box;max-width:21.25rem}& .bui-MenuSubmenuTrigger,& .bui-MenuItem{height:auto;min-height:2rem}& .bui-Text{font-family:var(--bui-font-text)}& .bui-Heading{font-family:var(--bui-font-title)}& .bui-TableRow{border-radius:var(--bui-radius-4);border:none}& .bui-TableRow:hover td:first-child{border-top-left-radius:var(--bui-radius-2);border-bottom-left-radius:var(--bui-radius-2)}& .bui-TableRow:hover td:last-child{border-top-right-radius:var(--bui-radius-2);border-bottom-right-radius:var(--bui-radius-2)}& .bui-TableBody:before,& .bui-TableBody:after{line-height:var(--bui-space-1);content:"‌";display:block}& .bui-TableHeader .bui-TableRow{border-bottom:1px solid var(--bui-border)}& .bui-TableHead{font-size:var(--bui-font-size-2);color:var(--bui-fg-secondary);font-weight:var(--bui-font-weight-regular)}& .bui-HeaderToolbar{padding-top:var(--bui-space-2);padding-inline:var(--bui-space-2)}& .bui-HeaderToolbarWrapper{border-radius:var(--bui-radius-3);padding-inline:var(--bui-space-3);border:none}& .bui-HeaderToolbarControls{right:calc(var(--bui-space-3) - 1px)}& .bui-HeaderTabsWrapper{margin-top:var(--bui-space-2);margin-inline:var(--bui-space-2);border-radius:var(--bui-radius-3);padding-inline:var(--bui-space-1);border:none}& .bui-Input{border-radius:var(--bui-radius-3)}& .bui-Tag{border-radius:var(--bui-radius-full)}}[data-theme-mode=light][data-theme-name=spotify]{--bui-bg:var(--bui-gray-1);--bui-bg-surface-1:var(--bui-white);--bui-bg-surface-2:var(--bui-gray-2);--bui-bg-solid:#1ed760;--bui-bg-solid-hover:#3be477;--bui-bg-solid-pressed:#1abc54;--bui-bg-solid-disabled:var(--bui-gray-2);--bui-fg-primary:var(--bui-black);--bui-fg-secondary:var(--bui-gray-7);--bui-fg-solid:var(--bui-black);--bui-border:var(--bui-gray-3);--bui-border-hover:#0000004d;--bui-border-pressed:#00000080;--bui-border-disabled:#0000001a;--bui-border-danger:#f87a7a;--bui-border-warning:#e36d05;--bui-border-success:#53db83;--bui-ring:#0003;& .bui-HeaderToolbarWrapper,& .bui-HeaderTabsWrapper{border:1px solid var(--bui-border)}}[data-theme-mode=dark][data-theme-name=spotify]{--bui-bg:var(--bui-black);--bui-bg-surface-1:var(--bui-gray-1);--bui-bg-surface-2:var(--bui-gray-2);--bui-bg-solid:#1ed760;--bui-bg-solid-hover:#3be477;--bui-bg-solid-pressed:#1abc54;--bui-bg-solid-disabled:#0f6c30;--bui-bg-tint:#242424;--bui-bg-tint-hover:#202020;--bui-bg-tint-pressed:#292929;--bui-bg-tint-disabled:#fffc;--bui-bg-danger:#3b1219;--bui-bg-warning:#302008;--bui-bg-success:#132d21;--bui-fg-primary:var(--bui-white);--bui-fg-secondary:var(--bui-gray-7);--bui-fg-link:var(--bui-white);--bui-fg-link-hover:var(--bui-white);--bui-fg-disabled:var(--bui-gray-5);--bui-fg-solid:var(--bui-black);--bui-fg-solid-disabled:#083618;--bui-fg-tint:var(--bui-white);--bui-fg-tint-disabled:var(--bui-gray-5);--bui-fg-danger:#e22b2b;--bui-fg-warning:#e36d05;--bui-fg-success:#1db954;--bui-border:var(--bui-gray-3);--bui-border-hover:#fff6;--bui-border-pressed:#ffffff80;--bui-border-disabled:#fff3;--bui-border-danger:#f87a7a;--bui-border-warning:#e36d05;--bui-border-success:#53db83;--bui-ring:#fff3} \ No newline at end of file diff --git a/docs-ui/scripts/sync-changelog.mjs b/docs-ui/scripts/sync-changelog.mjs index 5eab3616dd..fa59db741b 100644 --- a/docs-ui/scripts/sync-changelog.mjs +++ b/docs-ui/scripts/sync-changelog.mjs @@ -1,5 +1,4 @@ #!/usr/bin/env node -/* eslint-disable no-restricted-syntax */ import fs from 'fs'; import path from 'path'; @@ -13,22 +12,18 @@ const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); /** - * Compare two semantic versions. + * Compare two semantic versions for sorting. * Returns: 1 if versionA > versionB, -1 if versionA < versionB, 0 if equal - * Handles pre-release versions (e.g., "0.9.0-next.2") + * Example: compareVersions("0.11.0", "0.10.0") => 1 */ function compareVersions(versionA, versionB) { // Strip 'v' prefix if present versionA = versionA.replace(/^v/, ''); versionB = versionB.replace(/^v/, ''); - // Split into [major.minor.patch, prerelease] - const [versionABase, versionAPre] = versionA.split('-'); - const [versionBBase, versionBPre] = versionB.split('-'); - - // Compare base versions - const versionAParts = versionABase.split('.').map(Number); - const versionBParts = versionBBase.split('.').map(Number); + // Compare major.minor.patch versions + const versionAParts = versionA.split('.').map(Number); + const versionBParts = versionB.split('.').map(Number); for ( let i = 0; @@ -42,13 +37,7 @@ function compareVersions(versionA, versionB) { if (versionAPart < versionBPart) return -1; } - // If base versions equal, compare pre-release - if (!versionAPre && !versionBPre) return 0; - if (!versionAPre) return 1; // versionA is release, versionB is pre-release - if (!versionBPre) return -1; // versionA is pre-release, versionB is release - - // Both have pre-release, compare them - return versionAPre.localeCompare(versionBPre); + return 0; } /** @@ -58,15 +47,6 @@ function isNewerVersion(versionA, versionB) { return compareVersions(versionA, versionB) > 0; } -/** - * Normalize version to base version (remove pre-release suffix) - * "0.9.0-next.3" → "0.9.0" - * "0.9.0" → "0.9.0" - */ -function normalizeVersion(version) { - return version.split('-')[0]; -} - /** * Read the existing changelog.ts and find the highest version number * by scanning the changelogs/ directory for version files @@ -169,6 +149,7 @@ function getValidComponents(changelogPath) { /** * Parse CHANGELOG.md and extract entries newer than sinceVersion + * Only processes main release versions (e.g., 0.11.0), skips pre-releases (e.g., 0.11.0-next.1) */ async function parseChangelogMd(changelogPath, sinceVersion, validComponents) { const content = fs.readFileSync(changelogPath, 'utf-8'); @@ -181,14 +162,17 @@ async function parseChangelogMd(changelogPath, sinceVersion, validComponents) { // Walk through the markdown AST async function walk(node, depth = 0) { - // Version headers (## 0.9.0) + // Version headers (## 0.11.0) if (node.type === 'heading' && node.depth === 2) { const versionText = extractText(node).trim(); - // Validate that this is actually a version number (X.Y.Z or X.Y.Z-pre.N) - // Skip headings that are just markdown content within changelog entries - if (/^\d+\.\d+\.\d+/.test(versionText)) { + // Only process main release versions (X.Y.Z format) + if (/^\d+\.\d+\.\d+$/.test(versionText)) { currentVersion = versionText; currentSection = null; + } else { + // Skip pre-release versions (e.g., 0.11.0-next.1) and non-version headings + currentVersion = null; + currentSection = null; } return; } @@ -301,9 +285,11 @@ async function parseListItem( // Remove the commit SHA prefix from markdown let description = fullMarkdown.replace(/^-?\s*[a-f0-9]+:\s*/, '').trim(); - // Auto-detect components from "Affected components:" line + // Extract components using bold marker (standard format) let components = []; - const componentMatch = description.match(/Affected components?:\s*([^\n]+)/i); + const componentMatch = description.match( + /\*\*Affected components:\*\*\s*([^\n]+)/, + ); if (componentMatch) { const componentNames = componentMatch[1] .split(',') @@ -314,52 +300,64 @@ async function parseListItem( .map(name => mapComponentName(name, validComponents)) .filter(Boolean); - // Optionally strip "Affected components:" line from description + // Strip "**Affected components:**" line from description description = description - .replace(/\n*Affected components?:[ \t]*[^\n]+/i, '') + .replace(/\n*\*\*Affected components:\*\*[ \t]*[^\n]+/g, '') + .trim(); + } + + // Extract migration notes using bold marker (standard format) + let migration = null; + const migrationMatch = description.match( + /\*\*Migration:\*\*\s*\n([\s\S]+?)(?=\n\s*$|$)/, + ); + if (migrationMatch) { + // Clean up indentation from list format (remove leading 2 spaces from each line) + migration = migrationMatch[1] + .split('\n') + .map(line => line.replace(/^ /, '')) + .join('\n') + .trim(); + // Strip migration section from description + description = description + .replace(/\n*\*\*Migration:\*\*[\s\S]+$/, '') .trim(); } const prs = []; // Will be populated later by fetchPRNumbers() - // Infer type from section and description - const type = inferChangeType(section, description, version); + // Check if this is a breaking change + const breaking = isBreakingChange(section, description, version); return { - version: normalizeVersion(version), + version, section, commitSha, description, components, prs, - type, + breaking, + migration, }; } /** - * Infer change type from section and description + * Determine if a change is breaking based on semver rules + * Breaking change rules (semver): + * - version >= 1.0.0: Major changes are breaking + * - version < 1.0.0: Major and Minor changes are breaking */ -function inferChangeType(section, description, version) { - const isPre1 = version.startsWith('0.'); +function isBreakingChange(section, description, version) { + // Parse version to determine breaking change rules based on semver + const [major] = version.split('.').map(Number); - // Check description keywords first - if (description.match(/^(New|Add(ed)?)\s/i)) { - return 'new'; - } - if (description.includes('BREAKING')) { - return 'breaking'; + // Version >= 1.0.0: Only Major Changes are breaking + if (major >= 1) { + return section === 'Major Changes'; } - // Infer from section - if (section === 'Minor Changes') { - return isPre1 ? 'breaking' : undefined; - } else if (section === 'Major Changes') { - return 'breaking'; - } else if (section === 'Patch Changes') { - return 'fix'; - } - - return undefined; + // Version < 1.0.0: Both Major and Minor Changes are breaking + return section === 'Major Changes' || section === 'Minor Changes'; } /** @@ -414,8 +412,13 @@ async function fetchPRNumbers(entries, dryRun = false) { /** * Generate per-version changelog files in changelogs/ directory */ -async function generateVersionFiles(entries, changelogsDir, dryRun = false) { - // Group entries by normalized version +async function generateVersionFiles( + entries, + changelogsDir, + dryRun = false, + force = false, +) { + // Group entries by version const byVersion = {}; entries.forEach(entry => { const version = entry.version; @@ -434,8 +437,8 @@ async function generateVersionFiles(entries, changelogsDir, dryRun = false) { const filePath = path.join(changelogsDir, fileName); const varName = `changelog_${version.replace(/\./g, '_')}`; - // Check if file already exists - skip if it does - if (fs.existsSync(filePath)) { + // Check if file already exists - skip if it does (unless force flag) + if (fs.existsSync(filePath) && !force) { skippedVersions.push(version); // Still add to versionFiles array so main changelog.ts can import it versionFiles.push({ @@ -456,7 +459,7 @@ async function generateVersionFiles(entries, changelogsDir, dryRun = false) { .map(c => `'${c}'`) .join(', ')}]`; const prsStr = `[${entry.prs.map(pr => `'${pr}'`).join(', ')}]`; - const typeStr = entry.type ? `type: '${entry.type}',` : ''; + const breakingStr = entry.breaking ? `breaking: true,` : ''; const shaStr = entry.commitSha ? `commitSha: '${entry.commitSha}',` : ''; @@ -467,12 +470,20 @@ async function generateVersionFiles(entries, changelogsDir, dryRun = false) { .replace(/`/g, '\\`') .replace(/\${/g, '\\${'); + // Escape migration notes if present + const migrationStr = entry.migration + ? `migration: \`${entry.migration + .replace(/\\/g, '\\\\') + .replace(/`/g, '\\`') + .replace(/\${/g, '\\${')}\`,\n ` + : ''; + return ` { components: ${componentsStr}, version: '${entry.version}', prs: ${prsStr}, description: \`${descEscaped}\`, - ${typeStr} + ${migrationStr}${breakingStr} ${shaStr} }`; }) @@ -802,6 +813,7 @@ async function findPRNumber(commitSha) { async function main() { const args = process.argv.slice(2); const dryRun = args.includes('--dry-run'); + const force = args.includes('--force'); const changelogTsPath = path.join(__dirname, '../src/utils/changelog.ts'); const changelogMdPath = path.join( @@ -818,10 +830,15 @@ async function main() { } console.log('📋 Syncing UI component changelogs...\n'); + if (force) { + console.log('⚠️ Force mode: Will overwrite existing version files\n'); + } - // Get last synced version - const lastVersion = getLastSyncedVersion(changelogTsPath); - console.log(`Last synced version: ${lastVersion || '(none)'}`); + // Get last synced version (null if force mode to process all) + const lastVersion = force ? null : getLastSyncedVersion(changelogTsPath); + console.log( + `Last synced version: ${lastVersion || '(none - processing all versions)'}`, + ); // Get valid components const validComponents = getValidComponents(changelogTsPath); @@ -834,26 +851,26 @@ async function main() { lastVersion, validComponents, ); - console.log(`Found ${allEntries.length} total entries since ${lastVersion}`); + console.log( + `Found ${allEntries.length} total entries${ + force ? '' : ` since ${lastVersion}` + }`, + ); // Read existing changelog content for duplicate detection const existingContent = fs.readFileSync(changelogTsPath, 'utf-8'); // Filter to only new, non-duplicate entries - const relevantEntries = allEntries.filter(e => { - const hasComponents = e.components.length > 0 || e.components.length === 0; - const notDuplicate = !isDuplicate(e, existingContent); - return hasComponents && notDuplicate; - }); + const relevantEntries = allEntries.filter( + e => !isDuplicate(e, existingContent), + ); const duplicatesCount = allEntries.length - relevantEntries.length; if (duplicatesCount > 0) { console.log(`Skipped ${duplicatesCount} duplicate entries`); } - console.log( - `Relevant entries (with or without components): ${relevantEntries.length}`, - ); + console.log(`Relevant entries: ${relevantEntries.length}`); if (relevantEntries.length === 0) { console.log('\n✅ No new entries to sync'); @@ -920,6 +937,7 @@ async function main() { relevantEntries, changelogsDir, dryRun, + force, ); // Generate main changelog.ts diff --git a/docs-ui/scripts/sync-css.js b/docs-ui/scripts/sync-css.js index 4763fdecc1..a9c228ac27 100644 --- a/docs-ui/scripts/sync-css.js +++ b/docs-ui/scripts/sync-css.js @@ -1,12 +1,12 @@ -const fs = require('fs'); -const path = require('path'); +const fs = require('node:fs'); +const path = require('node:path'); const { bundle } = require('lightningcss'); const chokidar = require('chokidar'); // Configuration const config = { UIPath: '../../packages/ui', - publicPath: '../public', + outputPath: '../src/css', files: [ { source: 'css/styles.css', @@ -24,13 +24,13 @@ const config = { class CSSSync { constructor() { this.UIPath = path.resolve(__dirname, config.UIPath); - this.publicPath = path.resolve(__dirname, config.publicPath); + this.outputPath = path.resolve(__dirname, config.outputPath); this.isWatching = process.argv.includes('--watch'); } async syncFile(fileConfig) { const sourcePath = path.join(this.UIPath, fileConfig.source); - const destPath = path.join(this.publicPath, fileConfig.destination); + const destPath = path.join(this.outputPath, fileConfig.destination); try { // Check if source file exists @@ -76,9 +76,9 @@ class CSSSync { ); if (successCount > 0) { - console.log('\n📁 Available CSS files in public/:'); + console.log('\n📁 Available CSS files in src/css/:'); config.files.forEach(file => { - const destPath = path.join(this.publicPath, file.destination); + const destPath = path.join(this.outputPath, file.destination); if (fs.existsSync(destPath)) { const stats = fs.statSync(destPath); const size = (stats.size / 1024).toFixed(2); @@ -129,7 +129,7 @@ class CSSSync { async run() { console.log('🎨 BUI CSS Sync Tool\n'); console.log(`📂 BUI path: ${this.UIPath}`); - console.log(`📂 Public path: ${this.publicPath}\n`); + console.log(`📂 Output path: ${this.outputPath}\n`); // Initial sync await this.syncAll(); diff --git a/docs-ui/src/app/components/[slug]/page.tsx b/docs-ui/src/app/components/[slug]/page.tsx deleted file mode 100644 index 1422334471..0000000000 --- a/docs-ui/src/app/components/[slug]/page.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { components, layoutComponents } from '@/utils/data'; - -export default async function Page({ - params, -}: { - params: Promise<{ slug: string }>; -}) { - const { slug } = await params; - - const { default: Component } = await import(`@/content/${slug}.mdx`); - - return ; -} - -export function generateStaticParams() { - const list = [...components, ...layoutComponents]; - - return list.map(component => ({ - slug: component.slug, - })); -} - -export const dynamicParams = false; diff --git a/docs-ui/src/app/components/accordion/components.tsx b/docs-ui/src/app/components/accordion/components.tsx new file mode 100644 index 0000000000..95b312d17c --- /dev/null +++ b/docs-ui/src/app/components/accordion/components.tsx @@ -0,0 +1,130 @@ +'use client'; + +import { + Accordion, + AccordionTrigger, + AccordionPanel, + AccordionGroup, +} from '../../../../../packages/ui/src/components/Accordion/Accordion'; +import { Box } from '../../../../../packages/ui/src/components/Box/Box'; +import { Text } from '../../../../../packages/ui/src/components/Text/Text'; + +const Content = () => ( + + + It's the edge of the world and all of Western civilization + + + The sun may rise in the East, at least it settled in a final location + + + It's understood that Hollywood sells Californication + + +); + +export const Default = () => { + return ( + + + + + + + ); +}; + +export const WithSubtitle = () => { + return ( + + + + + + + ); +}; + +export const CustomTrigger = () => { + return ( + + + + + Custom Multi-line Trigger + + + Click to expand additional details and configuration options + + + + + + + + ); +}; + +export const DefaultExpanded = () => { + return ( + + + + + + + ); +}; + +export const GroupSingleOpen = () => { + return ( + + + + + + + + + + + + + + + + + + + + + ); +}; + +export const GroupMultipleOpen = () => { + return ( + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/docs-ui/src/content/accordion.mdx b/docs-ui/src/app/components/accordion/page.mdx similarity index 52% rename from docs-ui/src/content/accordion.mdx rename to docs-ui/src/app/components/accordion/page.mdx index fc4bad1f8e..486c93ec80 100644 --- a/docs-ui/src/content/accordion.mdx +++ b/docs-ui/src/app/components/accordion/page.mdx @@ -1,35 +1,51 @@ import { PropsTable } from '@/components/PropsTable'; import { Snippet } from '@/components/Snippet'; import { CodeBlock } from '@/components/CodeBlock'; -import { AccordionSnippet } from '@/snippets/stories-snippets'; import { accordionPropDefs, accordionTriggerPropDefs, accordionPanelPropDefs, accordionGroupPropDefs, +} from './props-definition'; +import { accordionUsageSnippet, - accordionWithSubtitleSnippet, - accordionCustomTriggerSnippet, - accordionDefaultExpandedSnippet, - accordionGroupSingleOpenSnippet, - accordionGroupMultipleOpenSnippet, -} from './accordion.props'; + defaultSnippet, + withSubtitleSnippet, + customTriggerSnippet, + defaultExpandedSnippet, + groupSingleOpenSnippet, + groupMultipleOpenSnippet, +} from './snippets'; +import { + Default, + WithSubtitle, + CustomTrigger, + DefaultExpanded, + GroupSingleOpen, + GroupMultipleOpen, +} from './components'; import { PageTitle } from '@/components/PageTitle'; import { Theming } from '@/components/Theming'; -import { AccordionDefinition } from '../utils/definitions'; +import { AccordionDefinition } from '../../../utils/definitions'; import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; + +export const reactAriaUrls = { + disclosure: 'https://react-aria.adobe.com/Disclosure', + disclosureGroup: 'https://react-aria.adobe.com/DisclosureGroup', +}; } - code={accordionUsageSnippet} + preview={} + code={defaultSnippet} /> ## Usage @@ -44,6 +60,8 @@ Root container for the accordion. Renders a `
` element. + + ### AccordionTrigger Trigger component with built-in animated chevron icon. Renders a heading element (defaults to `

`, configurable via `level` prop) wrapping a ` + } + /> + } + aria-label="Close" + /> + } + /> + + ); +}; + +export const WithActionsAndDescriptions = () => { + return ( + + + + + } + /> + ); +}; + +export const LoadingStates = () => { + return ( + + + + + + ); +}; + +export const WithoutIcons = () => { + return ( + + + + + ); +}; + +export const CustomIcon = () => { + return ( + } + title="This alert uses a custom cloud icon instead of the default info icon." + /> + ); +}; diff --git a/docs-ui/src/app/components/alert/page.mdx b/docs-ui/src/app/components/alert/page.mdx new file mode 100644 index 0000000000..cdfdf184e0 --- /dev/null +++ b/docs-ui/src/app/components/alert/page.mdx @@ -0,0 +1,120 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { CodeBlock } from '@/components/CodeBlock'; +import { alertPropDefs } from './props-definition'; +import { + alertUsageSnippet, + defaultSnippet, + statusVariantsSnippet, + withDescriptionSnippet, + withActionsSnippet, + loadingStatesSnippet, + withoutIconsSnippet, + customIconSnippet, +} from './snippets'; +import { + Default, + StatusVariants, + WithDescription, + WithActions, + LoadingStates, + WithoutIcons, + CustomIcon, +} from './components'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { AlertDefinition } from '../../../utils/definitions'; + + + +} code={defaultSnippet} /> + +## Usage + + + +## API reference + + + +## Examples + +### Status Variants + +The Alert component supports four status variants, each with its own color theme. + +} + code={statusVariantsSnippet} +/> + +### With Description + +Add a description to provide additional context or details. + +} + code={withDescriptionSnippet} +/> + +### With Actions + +Include custom actions like buttons for interactive alerts. + +} + code={withActionsSnippet} +/> + +### Loading States + +The loading spinner replaces the icon to indicate an ongoing process. + +} + code={loadingStatesSnippet} +/> + +### Without Icons + +Disable icons for a simpler appearance. + +} + code={withoutIconsSnippet} +/> + +### Custom Icon + +Provide a custom icon element instead of the default status icon. + +} + code={customIconSnippet} +/> + + + + diff --git a/docs-ui/src/app/components/alert/props-definition.ts b/docs-ui/src/app/components/alert/props-definition.ts new file mode 100644 index 0000000000..6f2650fe42 --- /dev/null +++ b/docs-ui/src/app/components/alert/props-definition.ts @@ -0,0 +1,76 @@ +import { + classNamePropDefs, + stylePropDefs, + type PropDef, +} from '@/utils/propDefs'; + +export const alertPropDefs: Record = { + status: { + type: 'enum', + values: ['info', 'success', 'warning', 'danger'], + responsive: true, + default: 'info', + }, + icon: { + type: 'enum', + values: ['boolean', 'React.ReactElement'], + responsive: false, + }, + loading: { + type: 'enum', + values: ['boolean'], + responsive: false, + }, + title: { + type: 'enum', + values: ['React.ReactNode'], + responsive: false, + }, + description: { + type: 'enum', + values: ['React.ReactNode'], + responsive: false, + }, + customActions: { + type: 'enum', + values: ['React.ReactNode'], + responsive: false, + }, + m: { + type: 'enum', + values: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], + responsive: true, + }, + mx: { + type: 'enum', + values: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], + responsive: true, + }, + my: { + type: 'enum', + values: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], + responsive: true, + }, + mt: { + type: 'enum', + values: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], + responsive: true, + }, + mb: { + type: 'enum', + values: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], + responsive: true, + }, + ml: { + type: 'enum', + values: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], + responsive: true, + }, + mr: { + type: 'enum', + values: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], + responsive: true, + }, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/app/components/alert/snippets.ts b/docs-ui/src/app/components/alert/snippets.ts new file mode 100644 index 0000000000..739dfde9db --- /dev/null +++ b/docs-ui/src/app/components/alert/snippets.ts @@ -0,0 +1,131 @@ +export const alertUsageSnippet = `import { Alert } from '@backstage/ui'; + +`; + +export const defaultSnippet = ``; + +export const statusVariantsSnippet = ` + + + + +`; + +export const withDescriptionSnippet = ` + + + + +`; + +export const withActionsSnippet = ` + + Dismiss + + } + /> + } + aria-label="Close" + /> + } + /> +`; + +export const withActionsAndDescriptionsSnippet = ` + + + + } +/>`; + +export const loadingStatesSnippet = ` + + + +`; + +export const withoutIconsSnippet = ` + + +`; + +export const customIconSnippet = `import { RiCloudLine } from '@remixicon/react'; + +} + title="This alert uses a custom cloud icon instead of the default info icon." +/>`; diff --git a/docs-ui/src/app/components/avatar/components.tsx b/docs-ui/src/app/components/avatar/components.tsx new file mode 100644 index 0000000000..da257f13b9 --- /dev/null +++ b/docs-ui/src/app/components/avatar/components.tsx @@ -0,0 +1,100 @@ +'use client'; + +import { Avatar } from '../../../../../packages/ui/src/components/Avatar/Avatar'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; +import { Text } from '../../../../../packages/ui/src/components/Text/Text'; + +export const Default = () => { + return ( + + ); +}; + +export const Fallback = () => { + return ( + + ); +}; + +export const Sizes = () => { + return ( + + + + + + + + + + + + + + + + + ); +}; + +export const Purpose = () => { + return ( + + + Informative (default) + + Use when avatar appears alone. Announced as "Charles de + Dreuille" to screen readers: + + + + + + + Decoration + + Use when avatar appears with adjacent text. Hidden from screen + readers: + + + + Charles de Dreuille + + + + ); +}; diff --git a/docs-ui/src/content/avatar.mdx b/docs-ui/src/app/components/avatar/page.mdx similarity index 50% rename from docs-ui/src/content/avatar.mdx rename to docs-ui/src/app/components/avatar/page.mdx index 047485c2cc..7020eb90c4 100644 --- a/docs-ui/src/content/avatar.mdx +++ b/docs-ui/src/app/components/avatar/page.mdx @@ -1,39 +1,37 @@ import { PropsTable } from '@/components/PropsTable'; import { Snippet } from '@/components/Snippet'; import { CodeBlock } from '@/components/CodeBlock'; -import { AvatarSnippet } from '@/snippets/stories-snippets'; +import { avatarPropDefs } from './props-definition'; import { - avatarPropDefs, - snippetUsage, - snippetSizes, - snippetFallback, - snippetPurpose, -} from './avatar.props'; + avatarUsageSnippet, + defaultSnippet, + sizesSnippet, + fallbackSnippet, + purposeSnippet, +} from './snippets'; +import { Default, Sizes, Fallback, Purpose } from './components'; import { PageTitle } from '@/components/PageTitle'; import { Theming } from '@/components/Theming'; -import { AvatarDefinition } from '../utils/definitions'; +import { AvatarDefinition } from '../../../utils/definitions'; import { ChangelogComponent } from '@/components/ChangelogComponent'; -} - code={``} -/> +} code={defaultSnippet} /> ## Usage - + ## API reference +Avatar also accepts all standard HTML div attributes (`onClick`, `onMouseEnter`, etc.) since it extends `React.ComponentPropsWithoutRef<'div'>`. + ## Examples ### Sizes @@ -44,8 +42,9 @@ Avatar sizes can be set using the `size` prop. align="center" py={4} open - preview={} - code={snippetSizes} + preview={} + code={sizesSnippet} + layout="side-by-side" /> ### Fallback @@ -56,20 +55,16 @@ If the image is not available, the avatar will show the initials of the name. align="center" py={4} open - preview={} - code={snippetFallback} + preview={} + code={fallbackSnippet} + layout="side-by-side" /> ### The `purpose` prop Control how the avatar is announced to screen readers using the `purpose` prop. -} - code={snippetPurpose} -/> +} code={purposeSnippet} /> diff --git a/docs-ui/src/app/components/avatar/props-definition.tsx b/docs-ui/src/app/components/avatar/props-definition.tsx new file mode 100644 index 0000000000..4b56b94be5 --- /dev/null +++ b/docs-ui/src/app/components/avatar/props-definition.tsx @@ -0,0 +1,41 @@ +import { + classNamePropDefs, + stylePropDefs, + type PropDef, +} from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const avatarPropDefs: Record = { + src: { + type: 'string', + description: + 'URL of the image to display. Pass an empty string to show initials fallback. Falls back to initials if the image fails to load.', + }, + name: { + type: 'string', + required: true, + description: + 'Name of the person. Used for generating initials fallback and accessibility label.', + }, + size: { + type: 'enum', + values: ['x-small', 'small', 'medium', 'large', 'x-large'], + default: 'medium', + responsive: true, + description: + 'Visual size. Smaller sizes show 1 initial, larger sizes show 2.', + }, + purpose: { + type: 'enum', + values: ['informative', 'decoration'], + default: 'informative', + description: ( + <> + Accessibility behavior. Use decoration when name appears in + adjacent text. + + ), + }, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/app/components/avatar/snippets.ts b/docs-ui/src/app/components/avatar/snippets.ts new file mode 100644 index 0000000000..2deb8037a6 --- /dev/null +++ b/docs-ui/src/app/components/avatar/snippets.ts @@ -0,0 +1,52 @@ +export const avatarUsageSnippet = `import { Avatar } from '@backstage/ui'; + +`; + +export const defaultSnippet = ``; + +export const fallbackSnippet = ``; + +export const sizesSnippet = ` + + + + + + + + + + + + + + +`; + +export const purposeSnippet = ` + + Informative (default) + + Use when avatar appears alone. Announced as "Charles de Dreuille" to screen readers: + + + + + + + Decoration + + Use when avatar appears with adjacent text. Hidden from screen readers: + + + + Charles de Dreuille + + +`; diff --git a/docs-ui/src/app/components/box/components.tsx b/docs-ui/src/app/components/box/components.tsx new file mode 100644 index 0000000000..dac66f1f59 --- /dev/null +++ b/docs-ui/src/app/components/box/components.tsx @@ -0,0 +1,43 @@ +'use client'; + +import { Box } from '../../../../../packages/ui/src/components/Box/Box'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; +import { DecorativeBox } from '@/components/DecorativeBox'; + +export const Default = () => { + return ( + + + + ); +}; + +export const Surface = () => { + return ( + + + Surface 0 + + + Surface 1 + + + Surface 2 + + + Surface 3 + + + ); +}; + +export const Responsive = () => { + return ( + + Resize to see change + + ); +}; diff --git a/docs-ui/src/app/components/box/page.mdx b/docs-ui/src/app/components/box/page.mdx new file mode 100644 index 0000000000..9b60e5244a --- /dev/null +++ b/docs-ui/src/app/components/box/page.mdx @@ -0,0 +1,53 @@ +import { CodeBlock } from '@/components/CodeBlock'; +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { boxPropDefs } from './props-definition'; +import { + snippetUsage, + defaultSnippet, + boxSurfaceSnippet, + boxResponsiveSnippet, +} from './snippets'; +import { Default, Surface, Responsive } from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { BoxDefinition } from '../../../utils/definitions'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; + + + +} code={defaultSnippet} align="center" /> + +## Usage + + + +## API reference + + + +## Examples + +### Surface + +Use surface levels to create visual hierarchy. + +} code={boxSurfaceSnippet} layout="side-by-side" /> + +### Responsive props + +Props can accept breakpoint objects for responsive behavior. + +} + code={boxResponsiveSnippet} + layout="side-by-side" +/> + + + + diff --git a/docs-ui/src/app/components/box/props-definition.tsx b/docs-ui/src/app/components/box/props-definition.tsx new file mode 100644 index 0000000000..3809bb9993 --- /dev/null +++ b/docs-ui/src/app/components/box/props-definition.tsx @@ -0,0 +1,48 @@ +import { + classNamePropDefs, + heightPropDefs, + positionPropDefs, + stylePropDefs, + widthPropDefs, + spacingGroupAll, + type PropDef, +} from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const boxPropDefs: Record = { + as: { + type: 'string', + default: 'div', + description: + 'HTML element to render. Accepts any valid HTML tag (div, span, section, etc.).', + }, + surface: { + type: 'enum', + values: ['0', '1', '2', '3', 'danger', 'warning', 'success', 'auto'], + responsive: true, + description: + 'Background surface level for visual hierarchy. Higher numbers create elevation.', + }, + children: { + type: 'enum', + values: ['ReactNode'], + description: 'Content to render inside the box.', + }, + ...widthPropDefs, + ...heightPropDefs, + ...positionPropDefs, + display: { + type: 'enum', + values: ['none', 'flex', 'block', 'inline'], + responsive: true, + description: ( + <> + Controls layout behavior. Use flex for flexbox layouts,{' '} + none to hide. + + ), + }, + ...classNamePropDefs, + ...stylePropDefs, + spacing: spacingGroupAll, +}; diff --git a/docs-ui/src/app/components/box/snippets.ts b/docs-ui/src/app/components/box/snippets.ts new file mode 100644 index 0000000000..e9af07dec5 --- /dev/null +++ b/docs-ui/src/app/components/box/snippets.ts @@ -0,0 +1,23 @@ +export const snippetUsage = `import { Box } from '@backstage/ui'; + + + Content with padding and background +`; + +export const defaultSnippet = ` + +`; + +export const boxSurfaceSnippet = ` + Surface 0 + Surface 1 + Surface 2 + Surface 3 +`; + +export const boxResponsiveSnippet = ` + Content +`; diff --git a/docs-ui/src/app/components/button-icon/components.tsx b/docs-ui/src/app/components/button-icon/components.tsx new file mode 100644 index 0000000000..3ed421289c --- /dev/null +++ b/docs-ui/src/app/components/button-icon/components.tsx @@ -0,0 +1,68 @@ +'use client'; + +import { ButtonIcon } from '../../../../../packages/ui/src/components/ButtonIcon/ButtonIcon'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; +import { RiCloudLine } from '@remixicon/react'; + +export const Variants = () => { + return ( + + } variant="primary" aria-label="Cloud" /> + } + variant="secondary" + aria-label="Cloud" + /> + } + variant="tertiary" + aria-label="Cloud" + /> + + ); +}; + +export const Sizes = () => { + return ( + + } size="small" aria-label="Cloud" /> + } size="medium" aria-label="Cloud" /> + + ); +}; + +export const Disabled = () => { + return ( + + } + variant="primary" + aria-label="Cloud" + /> + } + variant="secondary" + aria-label="Cloud" + /> + } + variant="tertiary" + aria-label="Cloud" + /> + + ); +}; + +export const Loading = () => { + return ( + } + variant="primary" + loading + 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 new file mode 100644 index 0000000000..51ff0ea5a0 --- /dev/null +++ b/docs-ui/src/app/components/button-icon/page.mdx @@ -0,0 +1,80 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { CodeBlock } from '@/components/CodeBlock'; +import { buttonIconPropDefs } from './props-definition'; +import { + buttonIconUsageSnippet, + variantsSnippet, + sizesSnippet, + disabledSnippet, + loadingSnippet, +} from './snippets'; +import { Variants, Sizes, Disabled, Loading } from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { ButtonIconDefinition } from '../../../utils/definitions'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; + +export const reactAriaUrls = { + button: 'https://react-aria.adobe.com/Button', +}; + + + +} code={variantsSnippet} /> + +## Usage + + + +## API reference + + + + + +## Examples + +### Variants + +} + code={variantsSnippet} +/> + +### Sizes + +} code={sizesSnippet} /> + +### Disabled + +} + code={disabledSnippet} +/> + +### Loading + +Shows a spinner during async operations. + +} + code={loadingSnippet} +/> + + + + diff --git a/docs-ui/src/app/components/button-icon/props-definition.tsx b/docs-ui/src/app/components/button-icon/props-definition.tsx new file mode 100644 index 0000000000..05917cc2b4 --- /dev/null +++ b/docs-ui/src/app/components/button-icon/props-definition.tsx @@ -0,0 +1,64 @@ +import { + classNamePropDefs, + stylePropDefs, + type PropDef, +} from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const buttonIconPropDefs: Record = { + variant: { + type: 'enum', + values: ['primary', 'secondary', 'tertiary'], + default: 'primary', + responsive: true, + description: ( + <> + Visual style. Use primary for main actions,{' '} + secondary for alternatives, tertiary for + low-emphasis. + + ), + }, + size: { + type: 'enum', + values: ['small', 'medium'], + default: 'small', + responsive: true, + description: ( + <> + Button size. Use small for toolbars, medium{' '} + for standalone actions. + + ), + }, + icon: { + type: 'enum', + values: ['ReactElement'], + description: + 'Icon element to display. Required for accessibility via aria-label.', + }, + isDisabled: { + type: 'boolean', + default: 'false', + description: 'Prevents interaction and applies disabled styling.', + }, + loading: { + type: 'boolean', + default: 'false', + description: 'Shows a spinner and disables the button.', + }, + type: { + type: 'enum', + values: ['button', 'submit', 'reset'], + default: 'button', + description: 'HTML button type attribute.', + }, + onSurface: { + type: 'enum', + values: ['0', '1', '2', '3', 'danger', 'warning', 'success', 'auto'], + responsive: true, + description: 'Surface context for correct color contrast.', + }, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/app/components/button-icon/snippets.ts b/docs-ui/src/app/components/button-icon/snippets.ts new file mode 100644 index 0000000000..b1ab27b77b --- /dev/null +++ b/docs-ui/src/app/components/button-icon/snippets.ts @@ -0,0 +1,23 @@ +export const buttonIconUsageSnippet = `import { ButtonIcon } from '@backstage/ui'; +import { RiCloseLine } from '@remixicon/react'; + +} aria-label="Close" />`; + +export const variantsSnippet = ` + } variant="primary" aria-label="Cloud" /> + } variant="secondary" aria-label="Cloud" /> + } variant="tertiary" aria-label="Cloud" /> +`; + +export const sizesSnippet = ` + } size="small" aria-label="Cloud" /> + } size="medium" aria-label="Cloud" /> +`; + +export const disabledSnippet = ` + } variant="primary" aria-label="Cloud" /> + } variant="secondary" aria-label="Cloud" /> + } variant="tertiary" aria-label="Cloud" /> +`; + +export const loadingSnippet = `} variant="primary" loading aria-label="Cloud" />`; diff --git a/docs-ui/src/app/components/button-link/components.tsx b/docs-ui/src/app/components/button-link/components.tsx new file mode 100644 index 0000000000..4282ebf7dd --- /dev/null +++ b/docs-ui/src/app/components/button-link/components.tsx @@ -0,0 +1,122 @@ +'use client'; + +import { ButtonLink } from '../../../../../packages/ui/src/components/ButtonLink/ButtonLink'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; +import { MemoryRouter } from 'react-router-dom'; +import { RiArrowRightSLine, RiCloudLine } from '@remixicon/react'; + +export const Variants = () => { + return ( + + + } + variant="primary" + href="https://ui.backstage.io" + target="_blank" + > + Button + + } + variant="secondary" + href="https://ui.backstage.io" + target="_blank" + > + Button + + } + variant="tertiary" + href="https://ui.backstage.io" + target="_blank" + > + Button + + + + ); +}; + +export const Sizes = () => { + return ( + + + + Small + + + Medium + + + + ); +}; + +export const WithIcons = () => { + return ( + + + } + href="https://ui.backstage.io" + target="_blank" + > + Button + + } + href="https://ui.backstage.io" + target="_blank" + > + Button + + } + iconEnd={} + href="https://ui.backstage.io" + target="_blank" + > + Button + + + + ); +}; + +export const Disabled = () => { + return ( + + + + Primary + + + Secondary + + + Tertiary + + + + ); +}; diff --git a/docs-ui/src/app/components/button-link/page.mdx b/docs-ui/src/app/components/button-link/page.mdx new file mode 100644 index 0000000000..35e4de68c5 --- /dev/null +++ b/docs-ui/src/app/components/button-link/page.mdx @@ -0,0 +1,68 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { CodeBlock } from '@/components/CodeBlock'; +import { buttonLinkPropDefs } from './props-definition'; +import { + buttonLinkUsageSnippet, + variantsSnippet, + sizesSnippet, + withIconsSnippet, + disabledSnippet, +} from './snippets'; +import { Variants, Sizes, WithIcons, Disabled } from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { ButtonLinkDefinition } from '../../../utils/definitions'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; + +export const reactAriaUrls = { + link: 'https://react-aria.adobe.com/Link', +}; + + + +} code={variantsSnippet} /> + +## Usage + + + +## API reference + + + + + +## Examples + +### Sizes + +} code={sizesSnippet} /> + +### With Icons + +} + code={withIconsSnippet} +/> + +### Disabled + +} + code={disabledSnippet} +/> + + + + diff --git a/docs-ui/src/app/components/button-link/props-definition.tsx b/docs-ui/src/app/components/button-link/props-definition.tsx new file mode 100644 index 0000000000..deae5364df --- /dev/null +++ b/docs-ui/src/app/components/button-link/props-definition.tsx @@ -0,0 +1,74 @@ +import { + classNamePropDefs, + stylePropDefs, + childrenPropDefs, + type PropDef, +} from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const buttonLinkPropDefs: Record = { + variant: { + type: 'enum', + values: ['primary', 'secondary', 'tertiary'], + default: 'primary', + responsive: true, + description: ( + <> + Visual style. Use primary for main actions,{' '} + secondary for alternatives, tertiary for + low-emphasis. + + ), + }, + size: { + type: 'enum', + values: ['small', 'medium'], + default: 'small', + responsive: true, + description: ( + <> + Link size. Use small for inline contexts,{' '} + medium for standalone. + + ), + }, + iconStart: { + type: 'enum', + values: ['ReactElement'], + description: 'Icon displayed before the link text.', + }, + iconEnd: { + type: 'enum', + values: ['ReactElement'], + description: 'Icon displayed after the link text.', + }, + isDisabled: { + type: 'boolean', + default: 'false', + description: 'Prevents interaction and applies disabled styling.', + }, + href: { + type: 'string', + required: true, + description: 'URL the link navigates to.', + }, + target: { + type: 'enum', + values: ['_self', '_blank', '_parent', '_top'], + description: ( + <> + Where to open the linked URL. Use _blank for external + links. + + ), + }, + onSurface: { + type: 'enum', + values: ['0', '1', '2', '3', 'danger', 'warning', 'success', 'auto'], + responsive: true, + description: 'Surface context for correct color contrast.', + }, + ...childrenPropDefs, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/app/components/button-link/snippets.ts b/docs-ui/src/app/components/button-link/snippets.ts new file mode 100644 index 0000000000..7f1a69027c --- /dev/null +++ b/docs-ui/src/app/components/button-link/snippets.ts @@ -0,0 +1,68 @@ +export const buttonLinkUsageSnippet = `import { ButtonLink } from '@backstage/ui'; + +Button`; + +export const variantsSnippet = ` + } + variant="primary" + href="https://ui.backstage.io" + target="_blank" + > + Button + + } + variant="secondary" + href="https://ui.backstage.io" + target="_blank" + > + Button + + } + variant="tertiary" + href="https://ui.backstage.io" + target="_blank" + > + Button + +`; + +export const sizesSnippet = ` + + Small + + + Medium + +`; + +export const withIconsSnippet = ` + } href="https://ui.backstage.io" target="_blank"> + Button + + } href="https://ui.backstage.io" target="_blank"> + Button + + } + iconEnd={} + href="https://ui.backstage.io" + target="_blank" + > + Button + +`; + +export const disabledSnippet = ` + + Primary + + + Secondary + + + Tertiary + +`; diff --git a/docs-ui/src/app/components/button/components.tsx b/docs-ui/src/app/components/button/components.tsx new file mode 100644 index 0000000000..1fe13f6630 --- /dev/null +++ b/docs-ui/src/app/components/button/components.tsx @@ -0,0 +1,94 @@ +'use client'; + +import { Button } from '../../../../../packages/ui/src/components/Button/Button'; +import { ButtonLink } from '../../../../../packages/ui/src/components/ButtonLink/ButtonLink'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; +import { RiArrowRightSLine, RiCloudLine } from '@remixicon/react'; +import { MemoryRouter } from 'react-router-dom'; + +export const Variants = () => { + return ( + + + + + + ); +}; + +export const Sizes = () => { + return ( + + + + + ); +}; + +export const WithIcons = () => { + return ( + + + + + + ); +}; + +export const Disabled = () => { + return ( + + + + + + ); +}; + +export const Destructive = () => { + return ( + + + + + + ); +}; + +export const Loading = () => { + return ( + + ); +}; + +export const AsLink = () => { + return ( + + + Button + + + ); +}; diff --git a/docs-ui/src/app/components/button/page.mdx b/docs-ui/src/app/components/button/page.mdx new file mode 100644 index 0000000000..6434a7f4a4 --- /dev/null +++ b/docs-ui/src/app/components/button/page.mdx @@ -0,0 +1,147 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { CodeBlock } from '@/components/CodeBlock'; +import { buttonPropDefs } from './props-definition'; +import { + variantsSnippet, + sizesSnippet, + withIconsSnippet, + disabledSnippet, + destructiveSnippet, + loadingSnippet, + asLinkSnippet, + buttonSnippetUsage, + buttonResponsiveSnippet, +} from './snippets'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { ButtonDefinition } from '../../../utils/definitions'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; +import { + Variants, + Sizes, + WithIcons, + Disabled, + Destructive, + Loading, + AsLink, +} from './components'; + +export const reactAriaUrls = { + button: 'https://react-spectrum.adobe.com/react-aria/Button.html', +}; + + + +} code={variantsSnippet} /> + +## Usage + + + +## API reference + + + + + +## Examples + +### Variants + +} + code={variantsSnippet} + layout="side-by-side" +/> + +### Sizes + +} + code={sizesSnippet} + layout="side-by-side" +/> + +### With Icons + +Icons can appear before or after the label. + +} + code={withIconsSnippet} + layout="side-by-side" +/> + +### Disabled + +} + code={disabledSnippet} + layout="side-by-side" +/> + +### Destructive + +Use the `destructive` prop for dangerous actions like delete or remove. + +} + code={destructiveSnippet} + layout="side-by-side" +/> + +### Loading + +Shows a spinner and disables interaction during async operations. + +} + code={loadingSnippet} + layout="side-by-side" +/> + +### Responsive + +Button props accept responsive breakpoint objects. + + + +### As Link + +If you want to use a button as a link, please use the `ButtonLink` component. + +} + code={asLinkSnippet} + 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 new file mode 100644 index 0000000000..0f94fcffaf --- /dev/null +++ b/docs-ui/src/app/components/button/props-definition.tsx @@ -0,0 +1,75 @@ +import { classNamePropDefs, stylePropDefs } from '@/utils/propDefs'; +import type { PropDef } from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const buttonPropDefs: Record = { + variant: { + type: 'enum', + values: ['primary', 'secondary', 'tertiary'], + default: 'primary', + responsive: true, + description: ( + <> + Visual style. Use primary for main actions,{' '} + secondary for alternatives, tertiary for + low-emphasis. + + ), + }, + destructive: { + type: 'boolean', + default: 'false', + description: + 'Applies destructive styling for dangerous actions like delete or remove.', + }, + size: { + type: 'enum', + values: ['small', 'medium'], + default: 'small', + responsive: true, + description: ( + <> + Button size. Use small for dense layouts. + + ), + }, + iconStart: { + type: 'enum', + values: ['ReactElement'], + description: 'Icon displayed before the button text.', + }, + iconEnd: { + type: 'enum', + values: ['ReactElement'], + description: 'Icon displayed after the button text.', + }, + isDisabled: { + type: 'boolean', + default: 'false', + description: 'Prevents interaction and applies disabled styling.', + }, + loading: { + type: 'boolean', + default: 'false', + description: 'Shows a spinner and disables the button.', + }, + children: { + type: 'enum', + values: ['ReactNode'], + description: 'Button label text or content.', + }, + type: { + type: 'enum', + values: ['button', 'submit', 'reset'], + default: 'button', + description: 'HTML button type attribute.', + }, + onSurface: { + type: 'enum', + values: ['0', '1', '2', '3', 'danger', 'warning', 'success', 'auto'], + responsive: true, + description: 'Surface context for correct color contrast.', + }, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/app/components/button/snippets.ts b/docs-ui/src/app/components/button/snippets.ts new file mode 100644 index 0000000000..6b8aba7e26 --- /dev/null +++ b/docs-ui/src/app/components/button/snippets.ts @@ -0,0 +1,66 @@ +export const buttonSnippetUsage = `import { Button } from '@backstage/ui'; + +`; + +export const buttonResponsiveSnippet = ``; + +export const variantsSnippet = ` + + + +`; + +export const sizesSnippet = ` + + +`; + +export const withIconsSnippet = ` + + + +`; + +export const disabledSnippet = ` + + + +`; + +export const destructiveSnippet = ` + + + +`; + +export const loadingSnippet = ``; + +export const asLinkSnippet = ` + + Button + +`; diff --git a/docs-ui/src/app/components/card/components.tsx b/docs-ui/src/app/components/card/components.tsx new file mode 100644 index 0000000000..d10e4d7bce --- /dev/null +++ b/docs-ui/src/app/components/card/components.tsx @@ -0,0 +1,65 @@ +'use client'; + +import { + Card, + CardHeader, + CardBody, + CardFooter, +} from '../../../../../packages/ui/src/components/Card/Card'; +import { Text } from '../../../../../packages/ui/src/components/Text/Text'; + +export const Default = () => { + return ( + + Header + Body + Footer + + ); +}; + +export const HeaderAndBody = () => { + return ( + + Header + Body content without a footer + + ); +}; + +export const WithLongBody = () => { + return ( + + + Header + + + + This is the first paragraph of a long body text that demonstrates how + the Card component handles extensive content. The card should adjust + accordingly to display all the text properly while maintaining its + structure. + + + Here's a second paragraph that adds more content to our card + body. Having multiple paragraphs helps to visualize how spacing works + within the card component. + + + This third paragraph continues to add more text to ensure we have a + proper demonstration of a card with significant content. This makes it + easier to test scrolling behavior and overall layout when content + exceeds the initial view. + + + + Footer + + + ); +}; diff --git a/docs-ui/src/app/components/card/page.mdx b/docs-ui/src/app/components/card/page.mdx new file mode 100644 index 0000000000..6f410fcd97 --- /dev/null +++ b/docs-ui/src/app/components/card/page.mdx @@ -0,0 +1,86 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { CodeBlock } from '@/components/CodeBlock'; +import { + cardPropDefs, + cardHeaderPropDefs, + cardBodyPropDefs, + cardFooterPropDefs, +} from './props-definition'; +import { + cardUsageSnippet, + defaultSnippet, + headerAndBodySnippet, + withLongBodySnippet, +} from './snippets'; +import { Default, HeaderAndBody, WithLongBody } from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { CardDefinition } from '../../../utils/definitions'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; + + + +} code={defaultSnippet} /> + +## Usage + + + +## API reference + +All Card components extend `HTMLDivElement` attributes. + +### Card + + + +### CardHeader + +Fixed at the top of the card. + + + +### CardBody + +Scrollable content area that fills available space. + + + +### CardFooter + +Fixed at the bottom of the card. + + + +## Examples + +### Header and body only + +Cards can omit the footer section. + +} + code={headerAndBodySnippet} +/> + +### Scrollable body + +When body content exceeds the available height, CardBody scrolls while header and footer remain fixed. + +} + code={withLongBodySnippet} +/> + + + + diff --git a/docs-ui/src/app/components/card/props-definition.ts b/docs-ui/src/app/components/card/props-definition.ts new file mode 100644 index 0000000000..b3e3776648 --- /dev/null +++ b/docs-ui/src/app/components/card/props-definition.ts @@ -0,0 +1,38 @@ +import { + classNamePropDefs, + stylePropDefs, + type PropDef, +} from '@/utils/propDefs'; + +const optionalChildrenPropDef: Record = { + children: { + type: 'enum', + values: ['ReactNode'], + responsive: false, + description: 'Content to display inside the component.', + }, +}; + +export const cardPropDefs: Record = { + ...optionalChildrenPropDef, + ...classNamePropDefs, + ...stylePropDefs, +}; + +export const cardHeaderPropDefs: Record = { + ...optionalChildrenPropDef, + ...classNamePropDefs, + ...stylePropDefs, +}; + +export const cardBodyPropDefs: Record = { + ...optionalChildrenPropDef, + ...classNamePropDefs, + ...stylePropDefs, +}; + +export const cardFooterPropDefs: Record = { + ...optionalChildrenPropDef, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/content/card.props.ts b/docs-ui/src/app/components/card/snippets.ts similarity index 50% rename from docs-ui/src/content/card.props.ts rename to docs-ui/src/app/components/card/snippets.ts index 70c71bdf56..6f956e5518 100644 --- a/docs-ui/src/content/card.props.ts +++ b/docs-ui/src/app/components/card/snippets.ts @@ -1,30 +1,4 @@ -import { - classNamePropDefs, - stylePropDefs, - type PropDef, -} from '@/utils/propDefs'; - -export const cardPropDefs: Record = { - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const cardHeaderPropDefs: Record = { - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const cardBodyPropDefs: Record = { - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const cardFooterPropDefs: Record = { - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const cardUsageSnippet = `import { card } from '@backstage/ui'; +export const cardUsageSnippet = `import { Card, CardHeader, CardBody, CardFooter } from '@backstage/ui'; Header @@ -32,13 +6,20 @@ export const cardUsageSnippet = `import { card } from '@backstage/ui'; Footer `; -export const cardDefaultSnippet = ` +export const defaultSnippet = ` Header Body Footer `; -export const cardLongBodySnippet = ` +export const headerAndBodySnippet = ` + Header + Body content without a footer +`; + +export const withLongBodySnippet = `import { Text } from '@backstage/ui'; + + Header @@ -65,19 +46,3 @@ export const cardLongBodySnippet = `Footer `; - -export const cardListRowSnippet = ` - - Header - - - Hello world - Hello world - Hello world - Hello world - ... - - - Footer - -`; diff --git a/docs-ui/src/app/components/checkbox/components.tsx b/docs-ui/src/app/components/checkbox/components.tsx new file mode 100644 index 0000000000..a826c9e02f --- /dev/null +++ b/docs-ui/src/app/components/checkbox/components.tsx @@ -0,0 +1,21 @@ +'use client'; + +import { Checkbox } from '../../../../../packages/ui/src/components/Checkbox/Checkbox'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; + +export const Default = () => { + return Accept terms and conditions; +}; + +export const AllVariants = () => { + return ( + + Unchecked + Checked + Disabled + + Checked & Disabled + + + ); +}; diff --git a/docs-ui/src/content/checkbox.mdx b/docs-ui/src/app/components/checkbox/page.mdx similarity index 50% rename from docs-ui/src/content/checkbox.mdx rename to docs-ui/src/app/components/checkbox/page.mdx index c574e8fed4..9657b471da 100644 --- a/docs-ui/src/content/checkbox.mdx +++ b/docs-ui/src/app/components/checkbox/page.mdx @@ -1,29 +1,29 @@ import { PropsTable } from '@/components/PropsTable'; -import { CheckboxSnippet } from '@/snippets/stories-snippets'; import { Snippet } from '@/components/Snippet'; import { CodeBlock } from '@/components/CodeBlock'; +import { checkboxPropDefs } from './props-definition'; import { - checkboxPropDefs, checkboxUsageSnippet, - checkboxDefaultSnippet, - checkboxVariantsSnippet, -} from './checkbox.props'; + defaultSnippet, + allVariantsSnippet, +} from './snippets'; +import { Default, AllVariants } from './components'; import { PageTitle } from '@/components/PageTitle'; import { Theming } from '@/components/Theming'; -import { CheckboxDefinition } from '../utils/definitions'; +import { CheckboxDefinition } from '../../../utils/definitions'; import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; + +export const reactAriaUrls = { + checkbox: 'https://react-aria.adobe.com/Checkbox', +}; -} - code={checkboxDefaultSnippet} -/> +} code={defaultSnippet} /> ## Usage @@ -33,18 +33,18 @@ import { ChangelogComponent } from '@/components/ChangelogComponent'; + + ## Examples ### All variants -Here's a view when checkboxes have different variants. - } - code={checkboxVariantsSnippet} + preview={} + code={allVariantsSnippet} /> diff --git a/docs-ui/src/app/components/checkbox/props-definition.ts b/docs-ui/src/app/components/checkbox/props-definition.ts new file mode 100644 index 0000000000..fd4b47ff8d --- /dev/null +++ b/docs-ui/src/app/components/checkbox/props-definition.ts @@ -0,0 +1,49 @@ +import { + classNamePropDefs, + stylePropDefs, + type PropDef, +} from '@/utils/propDefs'; + +export const checkboxPropDefs: Record = { + children: { + type: 'enum', + values: ['ReactNode'], + required: true, + description: 'Label displayed next to the checkbox.', + }, + isSelected: { + type: 'boolean', + description: 'Controls checked state (controlled mode).', + }, + defaultSelected: { + type: 'boolean', + description: 'Initial checked state (uncontrolled mode).', + }, + onChange: { + type: 'enum', + values: ['(isSelected: boolean) => void'], + description: 'Called when the checked state changes.', + }, + isDisabled: { + type: 'boolean', + description: 'Prevents interaction and applies disabled styling.', + }, + isRequired: { + type: 'boolean', + description: 'Marks the checkbox as required for form validation.', + }, + isIndeterminate: { + type: 'boolean', + description: 'Shows a mixed state, typically for "select all" checkboxes.', + }, + name: { + type: 'string', + description: 'Name attribute for form submission.', + }, + value: { + type: 'string', + description: 'Value attribute for form submission.', + }, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/app/components/checkbox/snippets.ts b/docs-ui/src/app/components/checkbox/snippets.ts new file mode 100644 index 0000000000..bef496195f --- /dev/null +++ b/docs-ui/src/app/components/checkbox/snippets.ts @@ -0,0 +1,12 @@ +export const checkboxUsageSnippet = `import { Checkbox } from '@backstage/ui'; + +Accept terms`; + +export const defaultSnippet = `Accept terms and conditions`; + +export const allVariantsSnippet = ` + Unchecked + Checked + Disabled + Checked & Disabled +`; diff --git a/docs-ui/src/app/components/container/components.tsx b/docs-ui/src/app/components/container/components.tsx new file mode 100644 index 0000000000..a11bbd9463 --- /dev/null +++ b/docs-ui/src/app/components/container/components.tsx @@ -0,0 +1,20 @@ +'use client'; + +import { Container } from '../../../../../packages/ui/src/components/Container/Container'; +import { DecorativeBox } from '@/components/DecorativeBox'; + +export const Default = () => { + return ( + + Page content goes here + + ); +}; + +export const ResponsiveSpacing = () => { + return ( + + Content with vertical spacing + + ); +}; diff --git a/docs-ui/src/app/components/container/page.mdx b/docs-ui/src/app/components/container/page.mdx new file mode 100644 index 0000000000..e0f4014a07 --- /dev/null +++ b/docs-ui/src/app/components/container/page.mdx @@ -0,0 +1,46 @@ +import { CodeBlock } from '@/components/CodeBlock'; +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { containerPropDefs } from './props-definition'; +import { + containerUsageSnippet, + defaultSnippet, + containerResponsiveSnippet, +} from './snippets'; +import { Default, ResponsiveSpacing } from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { ContainerDefinition } from '../../../utils/definitions'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; + + + +} code={defaultSnippet} /> + +## Usage + + + +## Core Concepts + +Container provides the standard page layout for plugin content. It constrains content to a maximum width, centers it horizontally, and adds consistent horizontal gutters. Use it once per page to wrap your main content area. + +## API Reference + + + +## Examples + +### Responsive spacing + +Vertical spacing props accept breakpoint objects. + +} code={containerResponsiveSnippet} /> + + + + diff --git a/docs-ui/src/app/components/container/props-definition.ts b/docs-ui/src/app/components/container/props-definition.ts new file mode 100644 index 0000000000..89a51eac5c --- /dev/null +++ b/docs-ui/src/app/components/container/props-definition.ts @@ -0,0 +1,20 @@ +import { + classNamePropDefs, + stylePropDefs, + createSpacingGroup, + type PropDef, +} from '@/utils/propDefs'; + +export const containerPropDefs: Record = { + children: { + type: 'enum', + values: ['ReactNode'], + description: 'Content to render inside the container.', + }, + ...classNamePropDefs, + ...stylePropDefs, + spacing: createSpacingGroup( + ['my', 'mt', 'mb', 'py', 'pt', 'pb'], + 'Vertical spacing properties for controlling margin and padding.', + ), +}; diff --git a/docs-ui/src/app/components/container/snippets.ts b/docs-ui/src/app/components/container/snippets.ts new file mode 100644 index 0000000000..a314b52387 --- /dev/null +++ b/docs-ui/src/app/components/container/snippets.ts @@ -0,0 +1,13 @@ +export const containerUsageSnippet = `import { Container } from "@backstage/ui"; + + + {/* Your plugin's main content */} +`; + +export const defaultSnippet = ` + Page content goes here +`; + +export const containerResponsiveSnippet = ` + Content with vertical spacing +`; diff --git a/docs-ui/src/app/components/dialog/components.tsx b/docs-ui/src/app/components/dialog/components.tsx new file mode 100644 index 0000000000..18ab1bf9c5 --- /dev/null +++ b/docs-ui/src/app/components/dialog/components.tsx @@ -0,0 +1,118 @@ +'use client'; + +import { + Dialog, + DialogTrigger, + DialogHeader, + DialogBody, + DialogFooter, +} from '../../../../../packages/ui/src/components/Dialog/Dialog'; +import { Button } from '../../../../../packages/ui/src/components/Button/Button'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; +import { Text } from '../../../../../packages/ui/src/components/Text/Text'; +import { TextField } from '../../../../../packages/ui/src/components/TextField/TextField'; +import { Select } from '../../../../../packages/ui/src/components/Select/Select'; + +export const Default = () => ( + + + + Example Dialog + + This is a basic dialog example. + + + + + + + +); + +export const PreviewFixedWidthAndHeight = () => ( + + + + Long Content Dialog + + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim + ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut + aliquip ex ea commodo consequat. + + + Duis aute irure dolor in reprehenderit in voluptate velit esse + cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat + cupidatat non proident, sunt in culpa qui officia deserunt mollit + anim id est laborum. + + + Sed ut perspiciatis unde omnis iste natus error sit voluptatem + accusantium doloremque laudantium, totam rem aperiam, eaque ipsa + quae ab illo inventore veritatis et quasi architecto beatae vitae + dicta sunt explicabo. + + + Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut + fugit, sed quia consequuntur magni dolores eos qui ratione + voluptatem sequi nesciunt. + + + Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, + consectetur, adipisci velit, sed quia non numquam eius modi tempora + incidunt ut labore et dolore magnam aliquam quaerat voluptatem. + + + Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis + suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur. + + + + + + + + + +); + +export const PreviewWithForm = () => ( + + + + Create New User + + + + + + + + + + + + +`; + +export const dialogWithNoTriggerSnippet = `const [isOpen, setIsOpen] = useState(false); + + + Create New User + + Your content + + + + + +`; + +export const dialogCloseSnippet = ``; diff --git a/docs-ui/src/app/components/flex/components.tsx b/docs-ui/src/app/components/flex/components.tsx new file mode 100644 index 0000000000..ce6cc8c05f --- /dev/null +++ b/docs-ui/src/app/components/flex/components.tsx @@ -0,0 +1,44 @@ +'use client'; + +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; +import { DecorativeBox } from '@/components/DecorativeBox'; + +export const Default = () => { + return ( + + + + + + ); +}; + +export const DirectionExample = () => { + return ( + + First + Second + Third + + ); +}; + +export const ResponsiveExample = () => { + return ( + + 1 + 2 + 3 + + ); +}; + +export const AlignExample = () => { + return ( + + Start + Middle + End + + ); +}; diff --git a/docs-ui/src/app/components/flex/page.mdx b/docs-ui/src/app/components/flex/page.mdx new file mode 100644 index 0000000000..f321b54583 --- /dev/null +++ b/docs-ui/src/app/components/flex/page.mdx @@ -0,0 +1,75 @@ +import { PropsTable } from '@/components/PropsTable'; +import { CodeBlock } from '@/components/CodeBlock'; +import { Snippet } from '@/components/Snippet'; +import { flexPropDefs } from './props-definition'; +import { + flexUsageSnippet, + defaultSnippet, + flexResponsiveSnippet, + flexAlignSnippet, + flexDirectionSnippet, +} from './snippets'; +import { + Default, + ResponsiveExample, + AlignExample, + DirectionExample, +} from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { FlexDefinition } from '../../../utils/definitions'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; + + + +} code={defaultSnippet} /> + +## Usage + + + +## API reference + + + +## Examples + +### Direction + +} + code={flexDirectionSnippet} + layout="side-by-side" +/> + +### Responsive gap + +Gap values can be responsive using breakpoint objects. + +} + code={flexResponsiveSnippet} + layout="side-by-side" +/> + +### Alignment + +} + code={flexAlignSnippet} + layout="side-by-side" +/> + + + + diff --git a/docs-ui/src/app/components/flex/props-definition.tsx b/docs-ui/src/app/components/flex/props-definition.tsx new file mode 100644 index 0000000000..2136dd0498 --- /dev/null +++ b/docs-ui/src/app/components/flex/props-definition.tsx @@ -0,0 +1,66 @@ +import { + classNamePropDefs, + stylePropDefs, + gapPropDefs, + spacingGroupAll, + type PropDef, +} from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const flexPropDefs: Record = { + direction: { + type: 'enum', + values: ['row', 'column', 'row-reverse', 'column-reverse'], + responsive: true, + description: ( + <> + Main axis direction. Use row for horizontal,{' '} + column for vertical layouts. + + ), + }, + align: { + type: 'enum', + values: ['start', 'center', 'end', 'baseline', 'stretch'], + responsive: true, + description: + 'Cross-axis alignment. Controls how children align perpendicular to the main axis.', + }, + justify: { + type: 'enum', + values: ['start', 'center', 'end', 'between'], + responsive: true, + description: ( + <> + Main-axis distribution. Use between to space children + evenly with no edge gaps. + + ), + }, + gap: { + ...gapPropDefs.gap, + default: '4', + description: + 'Space between children. Accepts spacing scale values or responsive objects.', + }, + surface: { + type: 'enum', + values: ['0', '1', '2', '3', 'danger', 'warning', 'success', 'auto'], + responsive: true, + description: ( + <> + Surface level for theming. Use auto to increment from + parent context. + + ), + }, + children: { + type: 'enum', + values: ['ReactNode'], + responsive: false, + description: 'Content to render inside the flex container.', + }, + ...classNamePropDefs, + ...stylePropDefs, + spacing: spacingGroupAll, +}; diff --git a/docs-ui/src/app/components/flex/snippets.ts b/docs-ui/src/app/components/flex/snippets.ts new file mode 100644 index 0000000000..8770880c79 --- /dev/null +++ b/docs-ui/src/app/components/flex/snippets.ts @@ -0,0 +1,31 @@ +export const flexUsageSnippet = `import { Flex } from '@backstage/ui'; + + +
Item 1
+
Item 2
+
Item 3
+
`; + +export const defaultSnippet = ` + + + +`; + +export const flexDirectionSnippet = ` + First + Second + Third +`; + +export const flexResponsiveSnippet = ` + 1 + 2 + 3 +`; + +export const flexAlignSnippet = ` + Start + Middle + End +`; diff --git a/docs-ui/src/app/components/grid/components.tsx b/docs-ui/src/app/components/grid/components.tsx new file mode 100644 index 0000000000..0c0e5a0546 --- /dev/null +++ b/docs-ui/src/app/components/grid/components.tsx @@ -0,0 +1,40 @@ +'use client'; + +import { Grid } from '../../../../../packages/ui/src/components/Grid/Grid'; +import { DecorativeBox } from '@/components/DecorativeBox'; + +export const Default = () => { + return ( + + + + + + + + + ); +}; + +export const ResponsiveExample = () => { + return ( + + 1 + 2 + 3 + 4 + + ); +}; + +export const GridItemExample = () => { + return ( + + + Spans 2 columns + + 1 column + 1 column + + ); +}; diff --git a/docs-ui/src/app/components/grid/page.mdx b/docs-ui/src/app/components/grid/page.mdx new file mode 100644 index 0000000000..8862586830 --- /dev/null +++ b/docs-ui/src/app/components/grid/page.mdx @@ -0,0 +1,64 @@ +import { CodeBlock } from '@/components/CodeBlock'; +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { gridPropDefs, gridItemPropDefs } from './props-definition'; +import { + gridUsageSnippet, + defaultSnippet, + gridResponsiveSnippet, + gridItemSnippet, +} from './snippets'; +import { Default, ResponsiveExample, GridItemExample } from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { GridDefinition } from '../../../utils/definitions'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; + + + +} code={defaultSnippet} /> + +## Usage + + + +## API reference + +### Grid.Root + +The grid container. Defines column count and gap between items. + + + +### Grid.Item + +A grid child with column and row spanning control. + + + +## Examples + +### Responsive columns + +Column count can change at different breakpoints. + +} + code={gridResponsiveSnippet} + open +/> + +### Column spanning + +Use Grid.Item to span multiple columns. + +} code={gridItemSnippet} open /> + + + + diff --git a/docs-ui/src/app/components/grid/props-definition.tsx b/docs-ui/src/app/components/grid/props-definition.tsx new file mode 100644 index 0000000000..4622f8f614 --- /dev/null +++ b/docs-ui/src/app/components/grid/props-definition.tsx @@ -0,0 +1,115 @@ +import { + childrenPropDefs, + classNamePropDefs, + gapPropDefs, + stylePropDefs, + spacingGroupAll, + type PropDef, +} from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +const columnValues = [ + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + '10', + '11', + '12', + 'auto', +]; + +const surfaceValues = [ + '0', + '1', + '2', + '3', + 'danger', + 'warning', + 'success', + 'auto', +]; + +export const gridPropDefs: Record = { + columns: { + type: 'enum', + values: columnValues, + default: 'auto', + responsive: true, + description: ( + <> + Number of columns. Use 1-12 for fixed layouts, auto to fit + content. + + ), + }, + gap: { + ...gapPropDefs.gap, + default: '4', + description: + 'Space between items. Use higher values for separated layouts, lower for compact.', + }, + surface: { + type: 'enum', + values: surfaceValues, + responsive: true, + description: ( + <> + Surface level for theming. Use auto to increment from + parent context. + + ), + }, + ...childrenPropDefs, + ...classNamePropDefs, + ...stylePropDefs, + spacing: spacingGroupAll, +}; + +export const gridItemPropDefs: Record = { + colSpan: { + type: 'enum', + values: columnValues, + responsive: true, + description: 'Number of columns the item spans across.', + }, + colStart: { + type: 'enum', + values: columnValues, + responsive: true, + description: + 'Starting column position. Use with colEnd for explicit placement.', + }, + colEnd: { + type: 'enum', + values: columnValues, + responsive: true, + description: + 'Ending column position. Use with colStart for explicit placement.', + }, + rowSpan: { + type: 'enum', + values: columnValues, + responsive: true, + description: 'Number of rows the item spans. Useful for tall content.', + }, + surface: { + type: 'enum', + values: surfaceValues, + responsive: true, + description: ( + <> + Surface level for theming. Use auto to increment from + parent context. + + ), + }, + ...childrenPropDefs, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/app/components/grid/snippets.ts b/docs-ui/src/app/components/grid/snippets.ts new file mode 100644 index 0000000000..2915a2ba4b --- /dev/null +++ b/docs-ui/src/app/components/grid/snippets.ts @@ -0,0 +1,31 @@ +export const gridUsageSnippet = `import { Grid } from '@backstage/ui'; + + +
Item 1
+
Item 2
+
Item 3
+
`; + +export const defaultSnippet = ` + + + + + + +`; + +export const gridResponsiveSnippet = ` + 1 + 2 + 3 + 4 +`; + +export const gridItemSnippet = ` + + Spans 2 columns + + 1 column + 1 column +`; diff --git a/docs-ui/src/app/components/header-page/components.tsx b/docs-ui/src/app/components/header-page/components.tsx new file mode 100644 index 0000000000..791afc5bbe --- /dev/null +++ b/docs-ui/src/app/components/header-page/components.tsx @@ -0,0 +1,84 @@ +'use client'; + +import { HeaderPage } from '../../../../../packages/ui/src/components/HeaderPage/HeaderPage'; +import { Button } from '../../../../../packages/ui/src/components/Button/Button'; +import { ButtonIcon } from '../../../../../packages/ui/src/components/ButtonIcon/ButtonIcon'; +import { + MenuTrigger, + Menu, + MenuItem, +} from '../../../../../packages/ui/src/components/Menu/Menu'; +import { MemoryRouter } from 'react-router-dom'; +import { RiMore2Line } from '@remixicon/react'; + +const tabs = [ + { id: 'overview', label: 'Overview', href: '/overview' }, + { id: 'checks', label: 'Checks', href: '/checks' }, + { id: 'tracks', label: 'Tracks', href: '/tracks' }, + { id: 'campaigns', label: 'Campaigns', href: '/campaigns' }, + { id: 'integrations', label: 'Integrations', href: '/integrations' }, +]; + +const breadcrumbs = [ + { label: 'Home', href: '/' }, + { label: 'Long Breadcrumb Name', href: '/long-breadcrumb' }, + { label: 'Another Long Breadcrumb', href: '/another-long-breadcrumb' }, + { + label: 'Yet Another Long Breadcrumb', + href: '/yet-another-long-breadcrumb', + }, +]; + +export const WithEverything = () => ( + + + + + + } + /> + +); + +export const WithLongBreadcrumbs = () => ( + + + +); + +export const WithTabs = () => ( + + + +); + +export const WithCustomActions = () => ( + + Custom action} + /> + +); + +export const WithMenu = () => ( + + + } /> + + Settings + alert('logout')}>Logout + + + } + /> + +); diff --git a/docs-ui/src/app/components/header-page/page.mdx b/docs-ui/src/app/components/header-page/page.mdx new file mode 100644 index 0000000000..ac99fb1af0 --- /dev/null +++ b/docs-ui/src/app/components/header-page/page.mdx @@ -0,0 +1,66 @@ +import { PropsTable } from '@/components/PropsTable'; +import { CodeBlock } from '@/components/CodeBlock'; +import { Snippet } from '@/components/Snippet'; +import { + WithEverything, + WithLongBreadcrumbs, + WithTabs, + WithCustomActions, + WithMenu, +} from './components'; +import { headerPagePropDefs } from './props-definition'; +import { + usage, + defaultSnippet, + withTabs, + withBreadcrumbs, + withCustomActions, + withMenu, +} from './snippets'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { HeaderPageDefinition } from '../../../utils/definitions'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; + + + +} code={defaultSnippet} /> + +## Usage + + + +## API reference + + + +## Examples + +### Breadcrumbs + +Labels are truncated at 240px. + +} code={withBreadcrumbs} /> + +### Tabs + +Tabs use React Router and highlight based on the current route. + +} code={withTabs} /> + +### Custom actions + +} code={withCustomActions} /> + +### With menu + +Use `customActions` to add a dropdown menu. + +} code={withMenu} /> + + + + diff --git a/docs-ui/src/app/components/header-page/props-definition.tsx b/docs-ui/src/app/components/header-page/props-definition.tsx new file mode 100644 index 0000000000..393141870f --- /dev/null +++ b/docs-ui/src/app/components/header-page/props-definition.tsx @@ -0,0 +1,69 @@ +import { classNamePropDefs, type PropDef } from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const headerPagePropDefs: Record = { + title: { + type: 'string', + description: 'Page heading displayed in the header.', + }, + customActions: { + type: 'enum', + values: ['ReactNode'], + description: 'Custom elements rendered in the actions area.', + }, + tabs: { + type: 'complex', + description: 'Navigation tabs displayed below the title.', + complexType: { + name: 'HeaderTab[]', + properties: { + id: { + type: 'string', + required: true, + description: 'Unique identifier for the tab.', + }, + label: { + type: 'string', + required: true, + description: 'Display text for the tab.', + }, + href: { + type: 'string', + required: true, + description: 'URL to navigate to when tab is clicked.', + }, + matchStrategy: { + type: "'exact' | 'prefix'", + required: false, + default: "'exact'", + description: ( + <> + Route matching strategy. Use exact for exact path + match, prefix if pathname starts with href. + + ), + }, + }, + }, + }, + breadcrumbs: { + type: 'complex', + description: 'Breadcrumb trail displayed above the title.', + complexType: { + name: 'HeaderPageBreadcrumb[]', + properties: { + label: { + type: 'string', + required: true, + description: 'Display text for the breadcrumb. Truncated at 240px.', + }, + href: { + type: 'string', + required: true, + description: 'URL for the breadcrumb link.', + }, + }, + }, + }, + ...classNamePropDefs, +}; diff --git a/docs-ui/src/app/components/header-page/snippets.ts b/docs-ui/src/app/components/header-page/snippets.ts new file mode 100644 index 0000000000..607675717c --- /dev/null +++ b/docs-ui/src/app/components/header-page/snippets.ts @@ -0,0 +1,56 @@ +export const usage = `import { HeaderPage } from '@backstage/ui'; + +`; + +export const defaultSnippet = ` + + + + } +/>`; + +export const withBreadcrumbs = ``; + +export const withTabs = ``; + +export const withCustomActions = `Custom action} +/>`; + +export const withMenu = ` + } /> + + Settings + {}}>Logout + + + } +/>`; diff --git a/docs-ui/src/app/components/header/components.tsx b/docs-ui/src/app/components/header/components.tsx new file mode 100644 index 0000000000..80a4d1dd6e --- /dev/null +++ b/docs-ui/src/app/components/header/components.tsx @@ -0,0 +1,72 @@ +'use client'; + +import { Header } from '../../../../../packages/ui/src/components/Header/Header'; +import { HeaderPage } from '../../../../../packages/ui/src/components/HeaderPage/HeaderPage'; +import { ButtonIcon } from '../../../../../packages/ui/src/components/ButtonIcon/ButtonIcon'; +import { Button } from '../../../../../packages/ui/src/components/Button/Button'; +import { MemoryRouter } from 'react-router-dom'; +import { + RiHeartLine, + RiEmotionHappyLine, + RiCloudy2Line, +} from '@remixicon/react'; + +const tabs = [ + { id: 'overview', label: 'Overview', href: '/overview' }, + { id: 'checks', label: 'Checks', href: '/checks' }, + { id: 'tracks', label: 'Tracks', href: '/tracks' }, + { id: 'campaigns', label: 'Campaigns', href: '/campaigns' }, + { id: 'integrations', label: 'Integrations', href: '/integrations' }, +]; + +const tabs2 = [ + { id: 'banana', label: 'Banana', href: '/banana' }, + { id: 'apple', label: 'Apple', href: '/apple' }, + { id: 'orange', label: 'Orange', href: '/orange' }, +]; + +export const WithAllOptionsAndTabs = () => ( + +
+ } /> + } /> + } /> + + } + /> + +); + +export const WithAllOptions = () => ( + +
+ } /> + } /> + } /> + + } + /> + +); + +export const WithHeaderPage = () => ( + + <> +
+ Custom action} + /> + + +); diff --git a/docs-ui/src/app/components/header/page.mdx b/docs-ui/src/app/components/header/page.mdx new file mode 100644 index 0000000000..71e9950933 --- /dev/null +++ b/docs-ui/src/app/components/header/page.mdx @@ -0,0 +1,57 @@ +import { PropsTable } from '@/components/PropsTable'; +import { CodeBlock } from '@/components/CodeBlock'; +import { Snippet } from '@/components/Snippet'; +import { + WithAllOptionsAndTabs, + WithAllOptions, + WithHeaderPage, +} from './components'; +import { headerPropDefs } from './props-definition'; +import { + usage, + simple, + defaultSnippet, + withTabs, + withHeaderPage, +} from './snippets'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { HeaderDefinition } from '../../../utils/definitions'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; + + + +} code={defaultSnippet} /> + +## Usage + + + +## API reference + + + +## Examples + +### Simple header + +} code={simple} open /> + +### Header with tabs + +Tabs use React Router and highlight automatically based on the current route. + +} code={withTabs} open /> + +### Header with HeaderPage + +Combine with [HeaderPage](/components/header-page) for multi-level navigation. + +} code={withHeaderPage} open /> + + + + diff --git a/docs-ui/src/app/components/header/props-definition.tsx b/docs-ui/src/app/components/header/props-definition.tsx new file mode 100644 index 0000000000..4a651cdb72 --- /dev/null +++ b/docs-ui/src/app/components/header/props-definition.tsx @@ -0,0 +1,63 @@ +import { classNamePropDefs, type PropDef } from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const headerPropDefs: Record = { + icon: { + type: 'enum', + values: ['ReactNode'], + description: 'Icon displayed before the title.', + }, + title: { + type: 'string', + description: 'Main heading text for the header.', + }, + titleLink: { + type: 'string', + description: 'URL the title links to when clicked.', + }, + customActions: { + type: 'enum', + values: ['ReactNode'], + description: 'Custom elements rendered in the toolbar area.', + }, + tabs: { + type: 'complex', + description: 'Navigation tabs displayed below the toolbar.', + complexType: { + name: 'HeaderTab[]', + properties: { + id: { + type: 'string', + required: true, + description: 'Unique identifier for the tab.', + }, + label: { + type: 'string', + required: true, + description: 'Display text for the tab.', + }, + href: { + type: 'string', + required: true, + description: 'URL to navigate to when tab is clicked.', + }, + matchStrategy: { + type: "'exact' | 'prefix'", + required: false, + description: ( + <> + Route matching strategy. Use exact for exact path + match, prefix if pathname starts with href. + + ), + }, + }, + }, + }, + onTabSelectionChange: { + type: 'enum', + values: ['(key: Key) => void'], + description: 'Handler called when the selected tab changes.', + }, + ...classNamePropDefs, +}; diff --git a/docs-ui/src/app/components/header/snippets.ts b/docs-ui/src/app/components/header/snippets.ts new file mode 100644 index 0000000000..b83f1b68b2 --- /dev/null +++ b/docs-ui/src/app/components/header/snippets.ts @@ -0,0 +1,61 @@ +export const usage = `import { Header } from '@backstage/ui'; + +
`; + +export const defaultSnippet = `
+ } /> + } /> + } /> + + } +/>`; + +export const simple = `
+ } /> + } /> + } /> + + } +/>`; + +export const withTabs = `
`; + +export const withHeaderPage = `
+Custom action} +/>`; diff --git a/docs-ui/src/app/components/link/components.tsx b/docs-ui/src/app/components/link/components.tsx new file mode 100644 index 0000000000..320dd52517 --- /dev/null +++ b/docs-ui/src/app/components/link/components.tsx @@ -0,0 +1,115 @@ +'use client'; + +import { Link } from '../../../../../packages/ui/src/components/Link/Link'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; +import { MemoryRouter } from 'react-router-dom'; + +export const Default = () => { + return ( + + + Sign up for Backstage + + + ); +}; + +export const ExternalLink = () => { + return ( + + + Sign up for Backstage + + + ); +}; + +export const AllVariants = () => { + return ( + + + + title-large + + + title-medium + + + title-small + + + title-x-small + + + body-large + + + body-medium + + + body-small + + + body-x-small + + + + ); +}; + +export const AllColors = () => { + return ( + + + + Primary + + + Secondary + + + Danger + + + Warning + + + Success + + + Info + + + + ); +}; + +export const Weight = () => { + return ( + + + + Regular + + + Bold + + + + ); +}; + +export const Standalone = () => { + return ( + + + + Default link + + + Standalone link + + + + ); +}; diff --git a/docs-ui/src/app/components/link/page.mdx b/docs-ui/src/app/components/link/page.mdx new file mode 100644 index 0000000000..8715bb270b --- /dev/null +++ b/docs-ui/src/app/components/link/page.mdx @@ -0,0 +1,107 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { CodeBlock } from '@/components/CodeBlock'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; +import { linkPropDefs } from './props-definition'; +import { + linkUsageSnippet, + defaultSnippet, + externalLinkSnippet, + allVariantsSnippet, + allColorsSnippet, + weightSnippet, + standaloneSnippet, +} from './snippets'; +import { + Default, + ExternalLink, + AllVariants, + AllColors, + Weight, + Standalone, +} from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { LinkDefinition } from '../../../utils/definitions'; + +export const reactAriaUrls = { + link: 'https://react-aria.adobe.com/Link', +}; + + + +} code={defaultSnippet} /> + +## Usage + + + +## API reference + + + + + +## Examples + +### External link + +Use `target="_blank"` to open links in a new tab. + +} + code={externalLinkSnippet} + layout="side-by-side" +/> + +### Variants + +} + code={allVariantsSnippet} +/> + +### Colors + +Status colors for contextual links. + +} + code={allColorsSnippet} +/> + +### Weight + +} + code={weightSnippet} + layout="side-by-side" +/> + +### Standalone + +Use `standalone` to remove the underline by default. The underline will appear on hover. + +} + code={standaloneSnippet} + layout="side-by-side" +/> + + + + diff --git a/docs-ui/src/app/components/link/props-definition.tsx b/docs-ui/src/app/components/link/props-definition.tsx new file mode 100644 index 0000000000..f0aa95114e --- /dev/null +++ b/docs-ui/src/app/components/link/props-definition.tsx @@ -0,0 +1,79 @@ +import { + childrenPropDefs, + classNamePropDefs, + stylePropDefs, + type PropDef, +} from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const linkPropDefs: Record = { + href: { + type: 'string', + description: + 'URL the link navigates to. Supports internal and external URLs.', + }, + target: { + type: 'enum', + values: ['_self', '_blank', '_parent', '_top'], + description: ( + <> + Where to open the link. Use _blank for external links that + open in new tabs. + + ), + }, + title: { + type: 'string', + description: 'Tooltip text shown on hover. Useful for accessibility.', + }, + variant: { + type: 'enum', + values: [ + 'title-large', + 'title-medium', + 'title-small', + 'title-x-small', + 'body-large', + 'body-medium', + 'body-small', + 'body-x-small', + ], + default: 'body', + responsive: true, + description: + 'Typography style. Title variants for headings, body for paragraph text.', + }, + weight: { + type: 'enum', + values: ['regular', 'bold'], + default: 'regular', + responsive: true, + description: ( + <> + Font weight. Use bold for emphasis. + + ), + }, + color: { + type: 'enum', + values: ['primary', 'secondary', 'danger', 'warning', 'success'], + default: 'primary', + responsive: true, + description: + 'Text color. Status colors (danger, warning, success) for contextual links.', + }, + truncate: { + type: 'boolean', + description: + 'Truncates text with ellipsis when it overflows its container.', + default: 'false', + }, + standalone: { + type: 'boolean', + description: 'Removes underline by default. Underline appears on hover.', + default: 'false', + }, + ...childrenPropDefs, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/app/components/link/snippets.ts b/docs-ui/src/app/components/link/snippets.ts new file mode 100644 index 0000000000..386ad9f1a0 --- /dev/null +++ b/docs-ui/src/app/components/link/snippets.ts @@ -0,0 +1,39 @@ +export const linkUsageSnippet = `import { Link } from '@backstage/ui'; + +Sign up for Backstage`; + +export const defaultSnippet = `Sign up for Backstage`; + +export const externalLinkSnippet = ` + Sign up for Backstage +`; + +export const allVariantsSnippet = ` + title-large + title-medium + title-small + title-x-small + body-large + body-medium + body-small + body-x-small +`; + +export const allColorsSnippet = ` + Primary + Secondary + Danger + Warning + Success + Info +`; + +export const weightSnippet = ` + Regular + Bold +`; + +export const standaloneSnippet = ` + Default link + Standalone link +`; diff --git a/docs-ui/src/app/components/menu/components.tsx b/docs-ui/src/app/components/menu/components.tsx new file mode 100644 index 0000000000..fbb481f5ef --- /dev/null +++ b/docs-ui/src/app/components/menu/components.tsx @@ -0,0 +1,169 @@ +'use client'; + +import { + MenuTrigger, + Menu, + MenuItem, + MenuSection, + MenuSeparator, + SubmenuTrigger, + MenuAutocomplete, + MenuAutocompleteListbox, + MenuListBoxItem, +} from '../../../../../packages/ui/src/components/Menu/Menu'; +import { Button } from '../../../../../packages/ui/src/components/Button/Button'; +import { MemoryRouter } from 'react-router-dom'; +import { + RiChat1Line, + RiFileLine, + RiFolderLine, + RiImageLine, + RiSettingsLine, + RiShareBoxLine, +} from '@remixicon/react'; + +export const Preview = () => ( + + + + + Edit + Duplicate + Rename + + }>Share + }>Feedback + + + }>Settings + + Edit + Duplicate + Rename + + + + + +); + +export const PreviewSubmenu = () => ( + + + + + New File + + Open Recent + + File 1.txt + File 2.txt + + + Save + + + +); + +export const PreviewIcons = () => ( + + + + + }>New File + }>New Folder + }>New Image + + + +); + +export const PreviewLinks = () => ( + + + + + Home + About + Contact + + + +); + +export const PreviewSections = () => ( + + + + + + New + Open + + + Cut + Copy + Paste + + + + +); + +export const PreviewSeparators = () => ( + + + + + New + Open + + Save + Save As... + + + +); + +export const PreviewAutocompleteMenu = () => ( + + + + + Option 1 + Option 2 + Option 3 + + + +); + +export const PreviewAutocompleteListbox = () => ( + + + + + Option 1 + Option 2 + Option 3 + + + +); + +export const PreviewAutocompleteListboxMultiple = () => ( + + + + + Option 1 + Option 2 + Option 3 + + + +); diff --git a/docs-ui/src/app/components/menu/page.mdx b/docs-ui/src/app/components/menu/page.mdx new file mode 100644 index 0000000000..f1de264d73 --- /dev/null +++ b/docs-ui/src/app/components/menu/page.mdx @@ -0,0 +1,229 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { CodeBlock } from '@/components/CodeBlock'; +import { + Preview, + PreviewSubmenu, + PreviewIcons, + PreviewLinks, + PreviewSections, + PreviewSeparators, + PreviewAutocompleteMenu, + PreviewAutocompleteListbox, + PreviewAutocompleteListboxMultiple, +} from './components'; +import { + menuTriggerPropDefs, + submenuTriggerPropDefs, + menuPropDefs, + menuListBoxPropDefs, + menuAutocompletePropDefs, + menuAutocompleteListboxPropDefs, + menuItemPropDefs, + menuListBoxItemPropDefs, + menuSectionPropDefs, + menuSeparatorPropDefs, +} from './props-definition'; +import { + usage, + preview, + submenu, + icons, + sections, + separators, + links, + autocomplete, + autocompleteListbox, + autocompleteListboxMultiple, +} from './snippets'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { MenuDefinition } from '../../../utils/definitions'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; + +export const reactAriaUrls = { + menuTrigger: 'https://react-aria.adobe.com/Menu#menutrigger', + submenuTrigger: 'https://react-aria.adobe.com/Menu#submenutrigger', + menu: 'https://react-aria.adobe.com/Menu', + menuItem: 'https://react-aria.adobe.com/Menu#menuitem', + menuSection: 'https://react-aria.adobe.com/Menu#menusection', + listBox: 'https://react-aria.adobe.com/ListBox', + listBoxItem: 'https://react-aria.adobe.com/ListBox#listboxitem', +}; + + + +} code={preview} /> + +## Usage + + + +### Triggers + +- `MenuTrigger` combines a trigger element with a menu popover. +- `SubmenuTrigger` combines a `MenuItem` with a nested submenu. + +### Containers + +- `Menu` contains menu items or sections. +- `MenuListBox` supports selection with checkmarks. +- `MenuAutocomplete` adds a search input to filter items. +- `MenuAutocompleteListbox` combines search with selection. + +### Items + +- `MenuItem` is an interactive action in the menu. +- `MenuListBoxItem` is a selectable item in a list box. + +### Grouping + +- `MenuSection` groups items with a title. +- `MenuSeparator` adds a horizontal divider. + +## API reference + +### MenuTrigger + +Accepts two children: the trigger element and a menu container. + + + + + +### SubmenuTrigger + +Accepts two children: a `MenuItem` and a menu container. + + + + + +### Menu + + + + + +### MenuListBox + + + + + +### MenuAutocomplete + + + + + +### MenuAutocompleteListbox + + + + + +### MenuItem + + + + + +### MenuListBoxItem + + + + + +### MenuSection + + + + + +### MenuSeparator + + + + + +## Examples + +### Nested navigation + +Submenus open to the right of their parent item. + +} + code={submenu} +/> + +### With icons + +} code={icons} /> + +### With links + +The `href` prop works with both internal and external links. + +} code={links} /> + +### With sections + +} + code={sections} +/> + +### With separators + +} + code={separators} +/> + +### With autocomplete + +} + code={autocomplete} +/> + +### With list box + +} + code={autocompleteListbox} +/> + +### Multiple selection + +Set `selectionMode="multiple"` to allow multiple selections. + +} + code={autocompleteListboxMultiple} +/> + + + + diff --git a/docs-ui/src/app/components/menu/props-definition.tsx b/docs-ui/src/app/components/menu/props-definition.tsx new file mode 100644 index 0000000000..5e11b22737 --- /dev/null +++ b/docs-ui/src/app/components/menu/props-definition.tsx @@ -0,0 +1,364 @@ +import { classNamePropDefs, type PropDef } from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const menuTriggerPropDefs: Record = { + isOpen: { + type: 'boolean', + description: 'Controlled open state of the menu.', + }, + defaultOpen: { + type: 'boolean', + description: 'Whether the menu is open by default.', + }, + onOpenChange: { + type: 'enum', + values: ['(isOpen: boolean) => void'], + description: 'Handler called when the open state changes.', + }, +}; + +export const submenuTriggerPropDefs: Record = { + delay: { + type: 'number', + default: '200', + description: 'Delay in milliseconds before the submenu opens on hover.', + }, +}; + +export const menuPropDefs: Record = { + placement: { + type: 'enum', + values: [ + 'top', + 'bottom', + 'left', + 'right', + 'top start', + 'top end', + 'bottom start', + 'bottom end', + 'left start', + 'left end', + 'right start', + 'right end', + ], + description: 'Position of the menu relative to the trigger.', + }, + onAction: { + type: 'enum', + values: ['(key: Key) => void'], + description: + 'Handler called when an item is activated. Receives the item key.', + }, + selectionMode: { + type: 'enum', + values: ['none', 'single', 'multiple'], + description: 'How items can be selected.', + }, + selectedKeys: { + type: 'enum', + values: ['Iterable'], + description: 'Controlled selected keys.', + }, + defaultSelectedKeys: { + type: 'enum', + values: ['Iterable'], + description: 'Default selected keys for uncontrolled usage.', + }, + disabledKeys: { + type: 'enum', + values: ['Iterable'], + description: 'Keys of items that are disabled.', + }, + virtualized: { + type: 'boolean', + default: false, + description: 'Enable virtualization for large lists.', + }, + maxWidth: { + type: 'string', + description: 'Maximum width of the menu popover.', + }, + maxHeight: { + type: 'string', + description: 'Maximum height of the menu popover.', + }, + ...classNamePropDefs, +}; + +export const menuListBoxPropDefs: Record = { + placement: { + type: 'enum', + values: [ + 'top', + 'bottom', + 'left', + 'right', + 'top start', + 'top end', + 'bottom start', + 'bottom end', + 'left start', + 'left end', + 'right start', + 'right end', + ], + description: 'Position of the list box relative to the trigger.', + }, + selectionMode: { + type: 'enum', + values: ['none', 'single', 'multiple'], + description: 'How items can be selected.', + }, + selectedKeys: { + type: 'enum', + values: ['Iterable'], + description: 'Controlled selected keys.', + }, + defaultSelectedKeys: { + type: 'enum', + values: ['Iterable'], + description: 'Default selected keys for uncontrolled usage.', + }, + onSelectionChange: { + type: 'enum', + values: ['(keys: Selection) => void'], + description: 'Handler called when selection changes.', + }, + disabledKeys: { + type: 'enum', + values: ['Iterable'], + description: 'Keys of items that are disabled.', + }, + virtualized: { + type: 'boolean', + default: false, + description: 'Enable virtualization for large lists.', + }, + maxWidth: { + type: 'string', + description: 'Maximum width of the list box popover.', + }, + maxHeight: { + type: 'string', + description: 'Maximum height of the list box popover.', + }, + ...classNamePropDefs, +}; + +export const menuAutocompletePropDefs: Record = { + placeholder: { + type: 'string', + description: 'Placeholder text for the search input.', + }, + placement: { + type: 'enum', + values: [ + 'top', + 'bottom', + 'left', + 'right', + 'top start', + 'top end', + 'bottom start', + 'bottom end', + 'left start', + 'left end', + 'right start', + 'right end', + ], + description: 'Position of the menu relative to the trigger.', + }, + onAction: { + type: 'enum', + values: ['(key: Key) => void'], + description: + 'Handler called when an item is activated. Receives the item key.', + }, + selectionMode: { + type: 'enum', + values: ['none', 'single', 'multiple'], + description: 'How items can be selected.', + }, + selectedKeys: { + type: 'enum', + values: ['Iterable'], + description: 'Controlled selected keys.', + }, + defaultSelectedKeys: { + type: 'enum', + values: ['Iterable'], + description: 'Default selected keys for uncontrolled usage.', + }, + disabledKeys: { + type: 'enum', + values: ['Iterable'], + description: 'Keys of items that are disabled.', + }, + onSelectionChange: { + type: 'enum', + values: ['(keys: Selection) => void'], + description: 'Handler called when selection changes.', + }, + virtualized: { + type: 'boolean', + default: false, + description: 'Enable virtualization for large lists.', + }, + maxWidth: { + type: 'string', + description: 'Maximum width of the menu popover.', + }, + maxHeight: { + type: 'string', + description: 'Maximum height of the menu popover.', + }, + ...classNamePropDefs, +}; + +export const menuAutocompleteListboxPropDefs: Record = { + placeholder: { + type: 'string', + description: 'Placeholder text for the search input.', + }, + placement: { + type: 'enum', + values: [ + 'top', + 'bottom', + 'left', + 'right', + 'top start', + 'top end', + 'bottom start', + 'bottom end', + 'left start', + 'left end', + 'right start', + 'right end', + ], + description: 'Position of the list box relative to the trigger.', + }, + selectionMode: { + type: 'enum', + values: ['none', 'single', 'multiple'], + description: 'How items can be selected.', + }, + selectedKeys: { + type: 'enum', + values: ['Iterable'], + description: 'Controlled selected keys.', + }, + defaultSelectedKeys: { + type: 'enum', + values: ['Iterable'], + description: 'Default selected keys for uncontrolled usage.', + }, + onSelectionChange: { + type: 'enum', + values: ['(keys: Selection) => void'], + description: 'Handler called when selection changes.', + }, + virtualized: { + type: 'boolean', + default: false, + description: 'Enable virtualization for large lists.', + }, + maxWidth: { + type: 'string', + description: 'Maximum width of the list box popover.', + }, + maxHeight: { + type: 'string', + description: 'Maximum height of the list box popover.', + }, + ...classNamePropDefs, +}; + +export const menuItemPropDefs: Record = { + children: { + type: 'enum', + values: ['ReactNode'], + required: true, + description: 'Content displayed in the menu item.', + }, + id: { + type: 'enum', + values: ['Key'], + description: 'Unique key for the item.', + }, + iconStart: { + type: 'enum', + values: ['ReactNode'], + description: 'Icon displayed before the item content.', + }, + color: { + type: 'enum', + values: ['primary', 'danger'], + description: ( + <> + Color variant. Use danger for destructive actions. + + ), + }, + href: { + type: 'string', + description: 'URL to navigate to when the item is clicked.', + }, + isDisabled: { + type: 'boolean', + description: 'Whether the item is disabled.', + }, + textValue: { + type: 'string', + description: 'Text used for typeahead and accessibility.', + }, + onAction: { + type: 'enum', + values: ['() => void'], + description: 'Handler called when the item is activated.', + }, + ...classNamePropDefs, +}; + +export const menuListBoxItemPropDefs: Record = { + children: { + type: 'enum', + values: ['ReactNode'], + required: true, + description: 'Content displayed in the list box item.', + }, + id: { + type: 'enum', + values: ['Key'], + description: 'Unique key for the item.', + }, + textValue: { + type: 'string', + description: 'Text used for typeahead and accessibility.', + }, + isDisabled: { + type: 'boolean', + description: 'Whether the item is disabled.', + }, + ...classNamePropDefs, +}; + +export const menuSectionPropDefs: Record = { + title: { + type: 'string', + required: true, + description: 'Heading displayed above the section.', + }, + children: { + type: 'enum', + values: ['ReactNode'], + required: true, + description: 'Menu items within the section.', + }, + ...classNamePropDefs, +}; + +export const menuSeparatorPropDefs: Record = { + ...classNamePropDefs, +}; diff --git a/docs-ui/src/app/components/menu/snippets.ts b/docs-ui/src/app/components/menu/snippets.ts new file mode 100644 index 0000000000..ee7e77e8c2 --- /dev/null +++ b/docs-ui/src/app/components/menu/snippets.ts @@ -0,0 +1,119 @@ +export const usage = `import { MenuTrigger, Menu, MenuItem } from '@backstage/ui'; + + + + + Item 1 + Item 2 + +`; + +export const preview = ` + + + Edit + Duplicate + Rename + + }>Share + }>Feedback + + + }>Settings + + Edit + Duplicate + Rename + + + +`; + +export const submenu = ` + + + New File + + Open Recent + + File 1.txt + File 2.txt + + + Save + +`; + +export const icons = ` + + + }>New File + }>New Folder + }>New Image + +`; + +export const sections = ` + + + + New + Open + + + Cut + Copy + Paste + + +`; + +export const separators = ` + + + New + Open + + Save + Save As... + +`; + +export const links = ` + + + Home + About + Contact + +`; + +export const autocomplete = ` + + + Option 1 + Option 2 + Option 3 + +`; + +export const autocompleteListbox = ` + + + Option 1 + Option 2 + Option 3 + +`; + +export const autocompleteListboxMultiple = ` + + + Option 1 + Option 2 + Option 3 + +`; diff --git a/docs-ui/src/app/components/page.mdx b/docs-ui/src/app/components/page.mdx index bd18005d19..399d9aafbf 100644 --- a/docs-ui/src/app/components/page.mdx +++ b/docs-ui/src/app/components/page.mdx @@ -1,173 +1,9 @@ -import { ComponentCards, ComponentCard } from '@/components/ComponentCards'; -import { LayoutComponents } from '@/components/LayoutComponents'; -import { CodeBlock } from '@/components/CodeBlock'; +import { ComponentGrid } from '@/components/ComponentGrid'; # Components -## Layout Components +Below is the full list of components available in the library. Each component is designed to be flexible, accessible, +and easy to integrate into your plugins. We are actively working on adding more components, so check back regularly +for updates. -We built a couple of layout components to help you build responsive elements -that will be consistent with the rest of your Backstage instance. These -components are opinionated and use TypeScript to ensure that the props you -provide are the ones coming from the theme. - - - Hello World - - Project 1 - Project 2 - - -`} -/> - - - -## Components - -### Actions - - - - - - - - -### Content display - - - - - - -### Selection and inputs - - - - - - - - - - - -### Navigation - - - - - - - - -### Images and icons - - - - - - -### Feedback indicators - - - - - - -### Typography - - - - + diff --git a/docs-ui/src/app/components/password-field/components.tsx b/docs-ui/src/app/components/password-field/components.tsx new file mode 100644 index 0000000000..a9f96b9267 --- /dev/null +++ b/docs-ui/src/app/components/password-field/components.tsx @@ -0,0 +1,63 @@ +'use client'; + +import { PasswordField } from '../../../../../packages/ui/src/components/PasswordField/PasswordField'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; +import { RiLockLine } from '@remixicon/react'; + +export const WithLabel = () => { + return ( + + ); +}; + +export const Sizes = () => { + return ( + + + + + ); +}; + +export const WithDescription = () => { + return ( + + ); +}; + +export const WithIcon = () => { + return ( + } + style={{ maxWidth: '300px' }} + /> + ); +}; + +export const Validation = () => { + return ( + + ); +}; diff --git a/docs-ui/src/app/components/password-field/page.mdx b/docs-ui/src/app/components/password-field/page.mdx new file mode 100644 index 0000000000..2b79425453 --- /dev/null +++ b/docs-ui/src/app/components/password-field/page.mdx @@ -0,0 +1,87 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { passwordFieldPropDefs } from './props-definition'; +import { + passwordFieldUsageSnippet, + withLabelSnippet, + sizesSnippet, + withDescriptionSnippet, + withIconSnippet, + validationSnippet, +} from './snippets'; +import { + WithLabel, + Sizes, + WithDescription, + WithIcon, + Validation, +} from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { CodeBlock } from '@/components/CodeBlock'; +import { PasswordFieldDefinition } from '../../../utils/definitions'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; + +export const reactAriaUrls = { + textField: 'https://react-aria.adobe.com/TextField', +}; + + + +} + code={withLabelSnippet} +/> + +## Usage + + + +## API reference + + + + + +## Examples + +### Sizes + +} code={sizesSnippet} /> + +### With description + +} + code={withDescriptionSnippet} +/> + +### With icon + +} + code={withIconSnippet} +/> + +### Validation + +} + code={validationSnippet} +/> + + + + diff --git a/docs-ui/src/app/components/password-field/props-definition.tsx b/docs-ui/src/app/components/password-field/props-definition.tsx new file mode 100644 index 0000000000..63f0f56d25 --- /dev/null +++ b/docs-ui/src/app/components/password-field/props-definition.tsx @@ -0,0 +1,77 @@ +import { classNamePropDefs, type PropDef } from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const passwordFieldPropDefs: Record = { + size: { + type: 'enum', + values: ['small', 'medium'], + default: 'small', + responsive: true, + description: ( + <> + Visual size of the input. Use small for dense layouts,{' '} + medium for prominent fields. + + ), + }, + label: { + type: 'string', + description: 'Visible label displayed above the input.', + }, + 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.', + }, + icon: { + type: 'enum', + values: ['ReactNode'], + description: 'Icon rendered before the input.', + }, + placeholder: { + type: 'string', + description: 'Text displayed when the input is empty.', + }, + name: { + type: 'string', + description: 'Form field name for submission.', + }, + isRequired: { + type: 'boolean', + description: 'Whether the field is required for form submission.', + }, + isDisabled: { + type: 'boolean', + description: 'Whether the input is disabled.', + }, + isReadOnly: { + type: 'boolean', + description: 'Whether the input is read-only.', + }, + value: { + type: 'string', + description: 'Controlled value of the input.', + }, + defaultValue: { + type: 'string', + description: 'Default value for uncontrolled usage.', + }, + onChange: { + type: 'enum', + values: ['(value: string) => void'], + description: 'Handler called when the input value changes.', + }, + isInvalid: { + type: 'boolean', + description: 'Whether the field is in an invalid state.', + }, + ...classNamePropDefs, +}; diff --git a/docs-ui/src/app/components/password-field/snippets.ts b/docs-ui/src/app/components/password-field/snippets.ts new file mode 100644 index 0000000000..6bc4b9760b --- /dev/null +++ b/docs-ui/src/app/components/password-field/snippets.ts @@ -0,0 +1,33 @@ +export const passwordFieldUsageSnippet = `import { PasswordField } from '@backstage/ui'; + +`; + +export const withLabelSnippet = ``; + +export const sizesSnippet = ` + + +`; + +export const withDescriptionSnippet = ``; + +export const withIconSnippet = `} +/>`; + +export const validationSnippet = ``; diff --git a/docs-ui/src/app/components/popover/components.tsx b/docs-ui/src/app/components/popover/components.tsx new file mode 100644 index 0000000000..4135d88059 --- /dev/null +++ b/docs-ui/src/app/components/popover/components.tsx @@ -0,0 +1,60 @@ +'use client'; + +import { Popover } from '../../../../../packages/ui/src/components/Popover/Popover'; +import { DialogTrigger } from '../../../../../packages/ui/src/components/Dialog/Dialog'; +import { Button } from '../../../../../packages/ui/src/components/Button/Button'; +import { Text } from '../../../../../packages/ui/src/components/Text/Text'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; + +export const Default = () => { + return ( + + + + Popover content + + + ); +}; + +export const Placement = () => { + return ( + + + + + Content above trigger + + + + + + Content to the right + + + + + + Content below trigger + + + + + + Content to the left + + + + ); +}; + +export const HideArrow = () => { + return ( + + + + Popover without arrow + + + ); +}; diff --git a/docs-ui/src/app/components/popover/page.mdx b/docs-ui/src/app/components/popover/page.mdx new file mode 100644 index 0000000000..0d546cdc05 --- /dev/null +++ b/docs-ui/src/app/components/popover/page.mdx @@ -0,0 +1,74 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { CodeBlock } from '@/components/CodeBlock'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; +import { dialogTriggerPropDefs, popoverPropDefs } from './props-definition'; +import { + popoverUsageSnippet, + defaultSnippet, + placementSnippet, + hideArrowSnippet, +} from './snippets'; +import { Default, Placement, HideArrow } from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { PopoverDefinition } from '../../../utils/definitions'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; + +export const reactAriaUrls = { + dialogTrigger: 'https://react-aria.adobe.com/Modal#dialogtrigger', + popover: 'https://react-aria.adobe.com/Popover', +}; + + + +} code={defaultSnippet} /> + +## Usage + + + +## API reference + +### DialogTrigger + +Wraps the trigger button and popover content. + + + + + +### Popover + +Displays floating content with automatic positioning. + + + + + +## Examples + +### Placement + +} + code={placementSnippet} +/> + +### Hidden arrow + +} + code={hideArrowSnippet} +/> + + + + diff --git a/docs-ui/src/app/components/popover/props-definition.ts b/docs-ui/src/app/components/popover/props-definition.ts new file mode 100644 index 0000000000..563bfa7d66 --- /dev/null +++ b/docs-ui/src/app/components/popover/props-definition.ts @@ -0,0 +1,47 @@ +import { childrenPropDefs, classNamePropDefs } from '@/utils/propDefs'; +import type { PropDef } from '@/utils/propDefs'; + +export const dialogTriggerPropDefs: Record = { + defaultOpen: { + type: 'boolean', + description: 'Whether the popover is open by default (uncontrolled).', + }, + isOpen: { + type: 'boolean', + description: 'Whether the popover is open (controlled).', + }, + onOpenChange: { + type: 'enum', + values: ['(isOpen: boolean) => void'], + description: 'Handler called when the popover open state changes.', + }, + ...childrenPropDefs, +}; + +export const popoverPropDefs: Record = { + placement: { + type: 'enum', + values: ['top', 'right', 'bottom', 'left'], + description: + 'The placement of the popover relative to the trigger element.', + }, + offset: { + type: 'number', + default: '8', + description: + 'The distance in pixels between the popover and the trigger element.', + }, + containerPadding: { + type: 'number', + default: '12', + description: + 'The minimum distance in pixels from the edge of the viewport.', + }, + hideArrow: { + type: 'boolean', + default: 'false', + description: 'Whether to hide the arrow pointing to the trigger element.', + }, + ...childrenPropDefs, + ...classNamePropDefs, +}; diff --git a/docs-ui/src/app/components/popover/snippets.ts b/docs-ui/src/app/components/popover/snippets.ts new file mode 100644 index 0000000000..986b33c770 --- /dev/null +++ b/docs-ui/src/app/components/popover/snippets.ts @@ -0,0 +1,49 @@ +export const popoverUsageSnippet = `import { DialogTrigger, Popover, Button, Text } from '@backstage/ui'; + + + + + Popover content + +`; + +export const defaultSnippet = ` + + + Popover content + +`; + +export const placementSnippet = ` + + + + Content above trigger + + + + + + Content to the right + + + + + + Content below trigger + + + + + + Content to the left + + +`; + +export const hideArrowSnippet = ` + + + Popover without arrow + +`; diff --git a/docs-ui/src/app/components/radio-group/components.tsx b/docs-ui/src/app/components/radio-group/components.tsx new file mode 100644 index 0000000000..56870c0166 --- /dev/null +++ b/docs-ui/src/app/components/radio-group/components.tsx @@ -0,0 +1,78 @@ +'use client'; + +import { + RadioGroup, + Radio, +} from '../../../../../packages/ui/src/components/RadioGroup/RadioGroup'; + +export const Default = () => { + return ( + + Bulbasaur + Charmander + Squirtle + + ); +}; + +export const Horizontal = () => { + return ( + + Bulbasaur + Charmander + Squirtle + + ); +}; + +export const Disabled = () => { + return ( + + Bulbasaur + Charmander + Squirtle + + ); +}; + +export const DisabledSingle = () => { + return ( + + Bulbasaur + + Charmander + + Squirtle + + ); +}; + +export const Validation = () => { + return ( + (value === 'charmander' ? 'Nice try!' : null)} + > + Bulbasaur + Charmander + Squirtle + + ); +}; + +export const ReadOnly = () => { + return ( + + Bulbasaur + Charmander + Squirtle + + ); +}; diff --git a/docs-ui/src/app/components/radio-group/page.mdx b/docs-ui/src/app/components/radio-group/page.mdx new file mode 100644 index 0000000000..5cc296b959 --- /dev/null +++ b/docs-ui/src/app/components/radio-group/page.mdx @@ -0,0 +1,118 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; +import { radioGroupPropDefs, radioPropDefs } from './props-definition'; +import { + radioGroupUsageSnippet, + defaultSnippet, + horizontalSnippet, + disabledSnippet, + disabledSingleSnippet, + validationSnippet, + readOnlySnippet, +} from './snippets'; +import { + Default, + Horizontal, + Disabled, + DisabledSingle, + Validation, + ReadOnly, +} from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { CodeBlock } from '@/components/CodeBlock'; +import { RadioGroupDefinition } from '../../../utils/definitions'; + +export const reactAriaUrls = { + radioGroup: 'https://react-aria.adobe.com/RadioGroup', +}; + + + +} code={defaultSnippet} /> + +## Usage + + + +## API reference + +### RadioGroup + + + + + +### Radio + +Individual radio button within a group. + + + + + +## Examples + +### Horizontal + +} + code={horizontalSnippet} +/> + +### Disabled + +} + code={disabledSnippet} +/> + +### Disabled single radio + +} + code={disabledSingleSnippet} +/> + +### Validation + +} + code={validationSnippet} +/> + +### Read only + +} + code={readOnlySnippet} +/> + + + + diff --git a/docs-ui/src/app/components/radio-group/props-definition.tsx b/docs-ui/src/app/components/radio-group/props-definition.tsx new file mode 100644 index 0000000000..54da42d93a --- /dev/null +++ b/docs-ui/src/app/components/radio-group/props-definition.tsx @@ -0,0 +1,91 @@ +import { + classNamePropDefs, + childrenPropDefs, + type PropDef, +} from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const radioGroupPropDefs: Record = { + label: { + type: 'string', + description: 'The visible label for the radio group.', + }, + 'aria-label': { + type: 'string', + description: + 'Accessible label when a visible label is not provided. Either label, aria-label, or aria-labelledby is required.', + }, + 'aria-labelledby': { + type: 'string', + description: + 'ID of an element that labels the radio group. Either label, aria-label, or aria-labelledby is required.', + }, + secondaryLabel: { + type: 'string', + description: ( + <> + Secondary label text. Defaults to Required when isRequired + is true. + + ), + }, + description: { + type: 'string', + description: 'Helper text displayed below the label.', + }, + orientation: { + type: 'enum', + values: ['horizontal', 'vertical'], + default: 'vertical', + description: 'The axis the radio buttons should align with.', + }, + value: { + type: 'string', + description: 'The current value (controlled).', + }, + defaultValue: { + type: 'string', + description: 'The default value (uncontrolled).', + }, + onChange: { + type: 'enum', + values: ['(value: string) => void'], + description: 'Handler called when the value changes.', + }, + name: { + type: 'string', + description: 'The name of the radio group for form submission.', + }, + isDisabled: { + type: 'boolean', + description: 'Whether all radio buttons in the group are disabled.', + }, + isReadOnly: { + type: 'boolean', + description: 'Whether the radio group is read-only.', + }, + isRequired: { + type: 'boolean', + description: 'Whether a selection is required before form submission.', + }, + isInvalid: { + type: 'boolean', + description: 'Whether the radio group is in an invalid state.', + }, + ...childrenPropDefs, + ...classNamePropDefs, +}; + +export const radioPropDefs: Record = { + value: { + type: 'string', + required: true, + description: 'The value of the radio button.', + }, + isDisabled: { + type: 'boolean', + description: 'Whether this radio button is disabled.', + }, + ...childrenPropDefs, + ...classNamePropDefs, +}; diff --git a/docs-ui/src/app/components/radio-group/snippets.ts b/docs-ui/src/app/components/radio-group/snippets.ts new file mode 100644 index 0000000000..d0b14ef5c4 --- /dev/null +++ b/docs-ui/src/app/components/radio-group/snippets.ts @@ -0,0 +1,57 @@ +export const radioGroupUsageSnippet = `import { RadioGroup, Radio } from '@backstage/ui'; + + + Option 1 + Option 2 +`; + +export const defaultSnippet = ` + Bulbasaur + Charmander + Squirtle +`; + +export const horizontalSnippet = ` + Bulbasaur + Charmander + Squirtle +`; + +export const disabledSnippet = ` + Bulbasaur + Charmander + Squirtle +`; + +export const disabledSingleSnippet = ` + Bulbasaur + + Charmander + + Squirtle +`; + +export const validationSnippet = ` (value === 'charmander' ? 'Nice try!' : null)} +> + Bulbasaur + Charmander + Squirtle +`; + +export const readOnlySnippet = ` + Bulbasaur + Charmander + Squirtle +`; diff --git a/docs-ui/src/app/components/search-field/components.tsx b/docs-ui/src/app/components/search-field/components.tsx new file mode 100644 index 0000000000..84a4c6018d --- /dev/null +++ b/docs-ui/src/app/components/search-field/components.tsx @@ -0,0 +1,38 @@ +'use client'; + +import { SearchField } from '../../../../../packages/ui/src/components/SearchField/SearchField'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; + +export const WithLabel = () => { + return ( + + ); +}; + +export const Sizes = () => { + return ( + + + + + ); +}; + +export const WithDescription = () => { + return ( + + ); +}; + +export const StartCollapsed = () => { + return ( + + + + + ); +}; diff --git a/docs-ui/src/app/components/search-field/page.mdx b/docs-ui/src/app/components/search-field/page.mdx new file mode 100644 index 0000000000..425dbc8f62 --- /dev/null +++ b/docs-ui/src/app/components/search-field/page.mdx @@ -0,0 +1,91 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; +import { searchFieldPropDefs } from './props-definition'; +import { + searchFieldUsageSnippet, + withLabelSnippet, + sizesSnippet, + withDescriptionSnippet, + startCollapsedSnippet, +} from './snippets'; +import { + WithLabel, + Sizes, + WithDescription, + StartCollapsed, +} from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { CodeBlock } from '@/components/CodeBlock'; +import { SearchFieldDefinition } from '../../../utils/definitions'; + +export const reactAriaUrls = { + searchField: 'https://react-aria.adobe.com/SearchField', +}; + + + +} + code={withLabelSnippet} +/> + +## Usage + + + +## API reference + + + + + +## Examples + +### Sizes + +} + code={sizesSnippet} + layout="side-by-side" +/> + +### With description + +Add context below the input with the `description` prop. + +} + code={withDescriptionSnippet} + layout="side-by-side" +/> + +### Collapsible + +Use `startCollapsed` for space-constrained layouts where the field expands on focus. + +} + code={startCollapsedSnippet} + layout="side-by-side" +/> + + + + diff --git a/docs-ui/src/app/components/search-field/props-definition.tsx b/docs-ui/src/app/components/search-field/props-definition.tsx new file mode 100644 index 0000000000..58d2cb0988 --- /dev/null +++ b/docs-ui/src/app/components/search-field/props-definition.tsx @@ -0,0 +1,85 @@ +import { classNamePropDefs, type PropDef } from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const searchFieldPropDefs: Record = { + size: { + type: 'enum', + values: ['small', 'medium'], + default: 'small', + responsive: true, + description: ( + <> + Visual size of the input. Use small for inline or dense + layouts, medium for standalone fields. + + ), + }, + label: { + type: 'string', + description: 'The visible label for the search field.', + }, + secondaryLabel: { + type: 'string', + description: ( + <> + Secondary label text. Defaults to Required when isRequired + is true. + + ), + }, + description: { + type: 'string', + description: 'Helper text displayed below the label.', + }, + placeholder: { + type: 'string', + default: 'Search', + description: 'Placeholder text shown when the field is empty.', + }, + icon: { + type: 'enum', + values: ['ReactNode', 'false'], + description: + 'Icon displayed before the input. Set to false to hide the icon.', + }, + startCollapsed: { + type: 'boolean', + default: 'false', + description: + 'Whether the search field starts in a collapsed state. Expands on focus.', + }, + name: { + type: 'string', + description: 'The name of the input for form submission.', + }, + value: { + type: 'string', + description: 'The current value (controlled).', + }, + defaultValue: { + type: 'string', + description: 'The default value (uncontrolled).', + }, + onChange: { + type: 'enum', + values: ['(value: string) => void'], + description: 'Handler called when the value changes.', + }, + isDisabled: { + type: 'boolean', + description: 'Whether the search field is disabled.', + }, + isReadOnly: { + type: 'boolean', + description: 'Whether the search field is read-only.', + }, + isRequired: { + type: 'boolean', + description: 'Whether a value is required before form submission.', + }, + isInvalid: { + type: 'boolean', + description: 'Whether the search field is in an invalid state.', + }, + ...classNamePropDefs, +}; diff --git a/docs-ui/src/app/components/search-field/snippets.ts b/docs-ui/src/app/components/search-field/snippets.ts new file mode 100644 index 0000000000..e54bca1bf4 --- /dev/null +++ b/docs-ui/src/app/components/search-field/snippets.ts @@ -0,0 +1,20 @@ +export const searchFieldUsageSnippet = `import { SearchField } from '@backstage/ui'; + +`; + +export const withLabelSnippet = ``; + +export const sizesSnippet = ` + + +`; + +export const withDescriptionSnippet = ``; + +export const startCollapsedSnippet = ` + + +`; diff --git a/docs-ui/src/app/components/select/components.tsx b/docs-ui/src/app/components/select/components.tsx new file mode 100644 index 0000000000..1cbc323b84 --- /dev/null +++ b/docs-ui/src/app/components/select/components.tsx @@ -0,0 +1,150 @@ +'use client'; + +import { Select } from '../../../../../packages/ui/src/components/Select/Select'; +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 skills = [ + { value: 'react', label: 'React' }, + { value: 'typescript', label: 'TypeScript' }, + { value: 'javascript', label: 'JavaScript' }, + { value: 'python', label: 'Python' }, + { value: 'java', label: 'Java' }, + { value: 'csharp', label: 'C#' }, + { value: 'go', label: 'Go' }, + { value: 'rust', label: 'Rust' }, + { value: 'kotlin', label: 'Kotlin' }, + { value: 'swift', label: 'Swift' }, +]; + +export const Preview = () => ( + +); + +export const Sizes = () => ( + + + +); + +export const WithIcon = () => ( + +); + +export const DisabledOption = () => ( + +); + +export const MultipleSelection = () => ( + +); diff --git a/docs-ui/src/app/components/select/page.mdx b/docs-ui/src/app/components/select/page.mdx new file mode 100644 index 0000000000..8e7df65ef9 --- /dev/null +++ b/docs-ui/src/app/components/select/page.mdx @@ -0,0 +1,147 @@ +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, + Searchable, + MultipleSelection, + SearchableMultiple, +} from './components'; +import { selectPropDefs } from './props-definition'; +import { + selectUsageSnippet, + selectDefaultSnippet, + selectDescriptionSnippet, + selectSizesSnippet, + selectDisabledSnippet, + selectResponsiveSnippet, + selectIconSnippet, + selectSearchableSnippet, + selectMultipleSnippet, + selectSearchableMultipleSnippet, + selectDisabledOptionsSnippet, +} from './snippets'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { SelectDefinition } from '../../../utils/definitions'; + +export const reactAriaUrls = { + select: 'https://react-aria.adobe.com/Select', +}; + + + +} + code={selectDefaultSnippet} +/> + +## Usage + + + +## API reference + + + + + +## Examples + +### Label and description + +} + code={selectDescriptionSnippet} +/> + +### Sizes + +} + code={selectSizesSnippet} +/> + +### With icon + +} + code={selectIconSnippet} +/> + +### Disabled + +} + code={selectDisabledSnippet} +/> + +### Disabled options + +} + code={selectDisabledOptionsSnippet} +/> + +### Searchable + +Enable filtering with the `searchable` prop. + +} + code={selectSearchableSnippet} +/> + +### Multiple selection + +} + code={selectMultipleSnippet} +/> + +### Searchable multiple + +Combine search and multiple selection. + +} + code={selectSearchableMultipleSnippet} +/> + +### Responsive + +Size can change at different breakpoints. + + + + + + diff --git a/docs-ui/src/app/components/select/props-definition.tsx b/docs-ui/src/app/components/select/props-definition.tsx new file mode 100644 index 0000000000..0d1ab22202 --- /dev/null +++ b/docs-ui/src/app/components/select/props-definition.tsx @@ -0,0 +1,137 @@ +import { + classNamePropDefs, + stylePropDefs, + type PropDef, +} from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const selectPropDefs: Record = { + options: { + type: 'complex', + description: 'Array of options to display in the dropdown.', + complexType: { + name: 'SelectOption[]', + properties: { + value: { + type: 'string', + required: true, + description: 'Unique value for the option.', + }, + label: { + type: 'string', + required: true, + description: 'Display text for the option.', + }, + disabled: { + type: 'boolean', + required: false, + description: 'Whether the option is disabled.', + }, + }, + }, + }, + selectionMode: { + type: 'enum', + values: ['single', 'multiple'], + default: 'single', + description: 'Single or multiple selection mode.', + }, + value: { + type: 'enum', + values: ['string', 'string[]'], + description: + 'Controlled selected value. String for single, array for multiple.', + }, + defaultValue: { + type: 'enum', + values: ['string', 'string[]'], + description: + 'Initial value for uncontrolled usage. String for single, array for multiple.', + }, + onSelectionChange: { + type: 'enum', + values: ['(key: Key | null) => void', '(keys: Selection) => void'], + description: 'Called when selection changes.', + }, + label: { + type: 'string', + description: 'Visible label above the select.', + }, + 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', + default: 'Select an option', + description: 'Text shown when no option is selected.', + }, + size: { + type: 'enum', + values: ['small', 'medium'], + default: 'small', + responsive: true, + description: 'Visual size of the select field.', + }, + icon: { + type: 'enum', + values: ['ReactNode'], + description: 'Icon displayed before the selected value.', + }, + searchable: { + type: 'boolean', + default: false, + description: 'Enables search/filter functionality in the dropdown.', + }, + searchPlaceholder: { + type: 'string', + default: 'Search...', + description: + 'Placeholder text for the search input when searchable is true.', + }, + isOpen: { + type: 'boolean', + description: 'Controlled open state. Use with onOpenChange.', + }, + defaultOpen: { + type: 'boolean', + description: 'Initial open state for uncontrolled usage.', + }, + 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 select in an error state.', + }, + name: { + type: 'string', + description: 'Form field name for form submission.', + }, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/content/select.props.ts b/docs-ui/src/app/components/select/snippets.ts similarity index 51% rename from docs-ui/src/content/select.props.ts rename to docs-ui/src/app/components/select/snippets.ts index 05f0d895c9..ca16481eaa 100644 --- a/docs-ui/src/content/select.props.ts +++ b/docs-ui/src/app/components/select/snippets.ts @@ -1,115 +1,3 @@ -import { - classNamePropDefs, - stylePropDefs, - type PropDef, -} from '@/utils/propDefs'; - -export const selectPropDefs: Record = { - label: { - type: 'string', - responsive: false, - }, - description: { - type: 'string', - responsive: false, - }, - name: { - type: 'string', - responsive: false, - required: true, - }, - options: { - type: 'enum', - values: ['Array<{ value: string, label: string }>'], - required: true, - }, - selectionMode: { - type: 'enum', - values: ['single', 'multiple'], - default: 'single', - responsive: false, - }, - placeholder: { - type: 'string', - default: 'Select an item', - responsive: false, - }, - icon: { - type: 'enum', - values: ['ReactNode'], - responsive: false, - }, - value: { - type: 'enum', - values: ['string', 'string[]'], - responsive: false, - description: - 'Selected value (controlled). String for single selection, array for multiple.', - }, - defaultValue: { - type: 'enum', - values: ['string', 'string[]'], - responsive: false, - description: - 'Initial value (uncontrolled). String for single selection, array for multiple.', - }, - size: { - type: 'enum', - values: ['small', 'medium'], - default: 'small', - responsive: true, - }, - isOpen: { - type: 'boolean', - responsive: false, - }, - defaultOpen: { - type: 'boolean', - responsive: false, - }, - disabledKeys: { - type: 'enum', - values: ['Iterable'], - responsive: false, - }, - isDisabled: { - type: 'boolean', - responsive: false, - }, - isRequired: { - type: 'boolean', - responsive: false, - }, - isInvalid: { - type: 'boolean', - responsive: false, - }, - onOpenChange: { - type: 'enum', - values: ['(isOpen: boolean) => void'], - responsive: false, - }, - onSelectionChange: { - type: 'enum', - values: ['(key: Key | null) => void', '(keys: Selection) => void'], - responsive: false, - description: - 'Handler called when selection changes. Single mode: receives Key | null. Multiple mode: receives Selection.', - }, - searchable: { - type: 'boolean', - default: 'false', - responsive: false, - }, - searchPlaceholder: { - type: 'string', - default: 'Search...', - responsive: false, - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - export const selectUsageSnippet = `import { Select } from '@backstage/ui'; `; @@ -209,3 +97,16 @@ export const selectSearchableMultipleSnippet = ``; diff --git a/docs-ui/src/app/components/skeleton/components.tsx b/docs-ui/src/app/components/skeleton/components.tsx new file mode 100644 index 0000000000..9f83a013db --- /dev/null +++ b/docs-ui/src/app/components/skeleton/components.tsx @@ -0,0 +1,44 @@ +'use client'; + +import { Skeleton } from '../../../../../packages/ui/src/components/Skeleton/Skeleton'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; +import { Box } from '../../../../../packages/ui/src/components/Box/Box'; + +export const CardPlaceholder = () => { + return ( + + + + + + + + ); +}; + +export const AvatarWithText = () => { + return ( + + + + + + + + + + + ); +}; + +export const Rounded = () => { + return ( + + + + + + + + ); +}; diff --git a/docs-ui/src/content/skeleton.mdx b/docs-ui/src/app/components/skeleton/page.mdx similarity index 52% rename from docs-ui/src/content/skeleton.mdx rename to docs-ui/src/app/components/skeleton/page.mdx index 07cd4b3332..b7d218af89 100644 --- a/docs-ui/src/content/skeleton.mdx +++ b/docs-ui/src/app/components/skeleton/page.mdx @@ -1,18 +1,18 @@ import { PropsTable } from '@/components/PropsTable'; import { Snippet } from '@/components/Snippet'; import { CodeBlock } from '@/components/CodeBlock'; -import { SkeletonSnippet } from '@/snippets/stories-snippets'; +import { skeletonPropDefs } from './props-definition'; import { - skeletonPropDefs, skeletonUsageSnippet, - skeletonDefaultSnippet, - skeletonDemo1Snippet, - skeletonDemo2Snippet, -} from './skeleton.props'; + cardPlaceholderSnippet, + avatarWithTextSnippet, + roundedSnippet, +} from './snippets'; +import { CardPlaceholder, AvatarWithText, Rounded } from './components'; import { PageTitle } from '@/components/PageTitle'; import { Theming } from '@/components/Theming'; import { ChangelogComponent } from '@/components/ChangelogComponent'; -import { SkeletonDefinition } from '../utils/definitions'; +import { SkeletonDefinition } from '../../../utils/definitions'; } - code={skeletonDefaultSnippet} + preview={} + code={cardPlaceholderSnippet} /> ## Usage @@ -32,32 +32,28 @@ import { SkeletonDefinition } from '../utils/definitions'; ## API reference +Skeleton extends standard HTML div attributes. + ## Examples -### Demo 1 - -You can use a mix of different sizes to create a more complex skeleton. +### Rounded } - code={skeletonDemo1Snippet} + layout="side-by-side" open + preview={} + code={roundedSnippet} /> -### Demo 2 - -You can use a mix of different sizes to create a more complex skeleton. +### Avatar with text } - code={skeletonDemo2Snippet} + layout="side-by-side" open + preview={} + code={avatarWithTextSnippet} /> diff --git a/docs-ui/src/app/components/skeleton/props-definition.ts b/docs-ui/src/app/components/skeleton/props-definition.ts new file mode 100644 index 0000000000..8c14c4c0ec --- /dev/null +++ b/docs-ui/src/app/components/skeleton/props-definition.ts @@ -0,0 +1,28 @@ +import { + classNamePropDefs, + stylePropDefs, + type PropDef, +} from '@/utils/propDefs'; + +export const skeletonPropDefs: Record = { + width: { + type: 'string', + default: '80', + description: + 'The width of the skeleton. Accepts a number (pixels) or CSS string value.', + }, + height: { + type: 'string', + default: '24', + description: + 'The height of the skeleton. Accepts a number (pixels) or CSS string value.', + }, + rounded: { + type: 'boolean', + default: 'false', + description: + 'Whether to apply fully rounded corners (for circular shapes).', + }, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/app/components/skeleton/snippets.ts b/docs-ui/src/app/components/skeleton/snippets.ts new file mode 100644 index 0000000000..84bbec1616 --- /dev/null +++ b/docs-ui/src/app/components/skeleton/snippets.ts @@ -0,0 +1,30 @@ +export const skeletonUsageSnippet = `import { Skeleton } from '@backstage/ui'; + +`; + +export const cardPlaceholderSnippet = ` + + + + + +`; + +export const avatarWithTextSnippet = ` + + + + + + + + +`; + +export const roundedSnippet = ` + + + + + +`; diff --git a/docs-ui/src/app/components/switch/components.tsx b/docs-ui/src/app/components/switch/components.tsx new file mode 100644 index 0000000000..604d9d68b1 --- /dev/null +++ b/docs-ui/src/app/components/switch/components.tsx @@ -0,0 +1,11 @@ +'use client'; + +import { Switch } from '../../../../../packages/ui/src/components/Switch/Switch'; + +export const Default = () => { + return ; +}; + +export const Disabled = () => { + return ; +}; diff --git a/docs-ui/src/app/components/switch/page.mdx b/docs-ui/src/app/components/switch/page.mdx new file mode 100644 index 0000000000..1f893aea36 --- /dev/null +++ b/docs-ui/src/app/components/switch/page.mdx @@ -0,0 +1,42 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { CodeBlock } from '@/components/CodeBlock'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; +import { switchPropDefs } from './props-definition'; +import { snippetUsage, defaultSnippet, disabledSnippet } from './snippets'; +import { Default, Disabled } from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { SwitchDefinition } from '../../../utils/definitions'; + +export const reactAriaUrls = { + switch: 'https://react-aria.adobe.com/Switch', +}; + + + +} code={defaultSnippet} /> + +## Usage + + + +## API reference + + + + + +## Examples + +### Disabled + +} code={disabledSnippet} /> + + + + diff --git a/docs-ui/src/app/components/switch/props-definition.ts b/docs-ui/src/app/components/switch/props-definition.ts new file mode 100644 index 0000000000..eeab3e64b8 --- /dev/null +++ b/docs-ui/src/app/components/switch/props-definition.ts @@ -0,0 +1,45 @@ +import { classNamePropDefs, stylePropDefs } from '@/utils/propDefs'; +import type { PropDef } from '@/utils/propDefs'; + +export const switchPropDefs: Record = { + label: { + type: 'string', + description: 'Text label displayed next to the switch.', + }, + isSelected: { + type: 'boolean', + description: + 'Controlled selected state. Use with onChange for controlled behavior.', + }, + defaultSelected: { + type: 'boolean', + description: 'Initial selected state for uncontrolled usage.', + }, + onChange: { + type: 'enum', + values: ['(isSelected: boolean) => void'], + description: 'Called when the switch state changes.', + }, + isDisabled: { + type: 'boolean', + description: 'Prevents user interaction when true.', + }, + isReadOnly: { + type: 'boolean', + description: 'Makes the switch non-interactive but still focusable.', + }, + name: { + type: 'string', + description: 'Form field name for form submission.', + }, + value: { + type: 'string', + description: 'Form field value submitted when selected.', + }, + autoFocus: { + type: 'boolean', + description: 'Focuses the switch on mount.', + }, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/app/components/switch/snippets.ts b/docs-ui/src/app/components/switch/snippets.ts new file mode 100644 index 0000000000..694f15106c --- /dev/null +++ b/docs-ui/src/app/components/switch/snippets.ts @@ -0,0 +1,7 @@ +export const snippetUsage = `import { Switch } from '@backstage/ui'; + +`; + +export const defaultSnippet = ``; + +export const disabledSnippet = ``; diff --git a/docs-ui/src/app/components/table/components.tsx b/docs-ui/src/app/components/table/components.tsx new file mode 100644 index 0000000000..d26deeb5d3 --- /dev/null +++ b/docs-ui/src/app/components/table/components.tsx @@ -0,0 +1,554 @@ +'use client'; + +import { useState } from 'react'; +import { + Table, + TableRoot, + TableHeader, + TableBody, + Column, + Row, + CellProfile, + CellText, + useTable, + type ColumnConfig, +} from '../../../../../packages/ui/src/components/Table'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; +import { Text } from '../../../../../packages/ui/src/components/Text/Text'; +import { SearchField } from '../../../../../packages/ui/src/components/SearchField/SearchField'; +import { + RadioGroup, + Radio, +} from '../../../../../packages/ui/src/components/RadioGroup'; +import { data as rockBandData } from '../../../../../packages/ui/src/components/Table/stories/mocked-data4'; +import { data as catalogData } from '../../../../../packages/ui/src/components/Table/stories/mocked-data1'; +import { MemoryRouter } from 'react-router-dom'; + +// ============================================================================= +// Types +// ============================================================================= + +type RockBandItem = (typeof rockBandData)[0]; +type CatalogItem = (typeof catalogData)[0]; + +// ============================================================================= +// Hero Example +// ============================================================================= + +const heroColumns: ColumnConfig[] = [ + { + id: 'name', + label: 'Band name', + isRowHeader: true, + defaultWidth: '3fr', + cell: item => ( + + ), + }, + { + id: 'genre', + label: 'Genre', + defaultWidth: '3fr', + cell: item => , + }, + { + id: 'yearFormed', + label: 'Year formed', + defaultWidth: '1fr', + cell: item => , + }, + { + id: 'albums', + label: 'Albums', + defaultWidth: '1fr', + cell: item => , + }, +]; + +export function HeroExample() { + const { tableProps } = useTable({ + mode: 'complete', + getData: () => rockBandData, + paginationOptions: { pageSize: 5 }, + }); + + return ( + + + + ); +} + +// ============================================================================= +// Sorting Example +// ============================================================================= + +const sortingColumns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + isSortable: true, + cell: item => , + }, + { + id: 'owner', + label: 'Owner', + isSortable: true, + cell: item => , + }, + { + id: 'type', + label: 'Type', + isSortable: true, + cell: item => , + }, + { + id: 'lifecycle', + label: 'Lifecycle', + isSortable: true, + cell: item => , + }, +]; + +export function SortingExample() { + const { tableProps } = useTable({ + mode: 'complete', + getData: () => catalogData, + paginationOptions: { pageSize: 5 }, + initialSort: { column: 'name', direction: 'ascending' }, + sortFn: (items, { column, direction }) => { + return [...items].sort((a, b) => { + let aVal: string; + let bVal: string; + if (column === 'owner') { + aVal = a.owner.name; + bVal = b.owner.name; + } else { + aVal = String(a[column as keyof CatalogItem]); + bVal = String(b[column as keyof CatalogItem]); + } + const cmp = aVal.localeCompare(bVal); + return direction === 'descending' ? -cmp : cmp; + }); + }, + }); + + return ( + +
+ + ); +} + +// ============================================================================= +// Search Example +// ============================================================================= + +const searchColumns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + cell: item => , + }, + { + id: 'owner', + label: 'Owner', + cell: item => , + }, + { id: 'type', label: 'Type', cell: item => }, +]; + +export function SearchExample() { + const { tableProps, search } = useTable({ + mode: 'complete', + getData: () => catalogData, + paginationOptions: { pageSize: 5 }, + searchFn: (items, query) => { + const lowerQuery = query.toLocaleLowerCase('en-US'); + return items.filter( + item => + item.name.toLocaleLowerCase('en-US').includes(lowerQuery) || + item.owner.name.toLocaleLowerCase('en-US').includes(lowerQuery) || + item.type.toLocaleLowerCase('en-US').includes(lowerQuery), + ); + }, + }); + + return ( + + + +
No results found for "{search.value}" + ) : ( + No data available + ) + } + {...tableProps} + /> + + + ); +} + +// ============================================================================= +// Selection Example +// ============================================================================= + +const selectionColumns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + cell: item => , + }, + { + id: 'owner', + label: 'Owner', + cell: item => , + }, + { id: 'type', label: 'Type', cell: item => }, +]; + +export function SelectionExample() { + const [selectionMode, setSelectionMode] = useState<'single' | 'multiple'>( + 'multiple', + ); + const [selectionBehavior, setSelectionBehavior] = useState< + 'toggle' | 'replace' + >('toggle'); + const [selected, setSelected] = useState | 'all'>( + new Set(), + ); + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => catalogData.slice(0, 5), + }); + + return ( + + +
+ +
+ + Selection mode: + + { + setSelectionMode(value as 'single' | 'multiple'); + setSelected(new Set()); + }} + > + single + multiple + +
+
+ + Selection behavior: + + { + setSelectionBehavior(value as 'toggle' | 'replace'); + setSelected(new Set()); + }} + > + toggle + replace + +
+
+ + + ); +} + +// ============================================================================= +// Row Actions Example +// ============================================================================= + +export function RowActionsExample() { + const [selected, setSelected] = useState | 'all'>( + new Set(), + ); + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => catalogData.slice(0, 5), + }); + + return ( + +
alert(`Clicked: ${item.name}`), + }} + selection={{ + mode: 'multiple', + behavior: 'toggle', + selected, + onSelectionChange: setSelected, + }} + {...tableProps} + /> + + ); +} + +// ============================================================================= +// Empty State Example +// ============================================================================= + +const emptyStateColumns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + cell: item => , + }, + { + id: 'owner', + label: 'Owner', + cell: item => , + }, + { id: 'type', label: 'Type', cell: item => }, +]; + +export function EmptyStateExample() { + const emptyData: CatalogItem[] = []; + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => emptyData, + }); + + return ( + +
No items yet. Create one to get started.} + {...tableProps} + /> + + ); +} + +// ============================================================================= +// Combined Example +// ============================================================================= + +const combinedColumns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + isSortable: true, + cell: item => , + }, + { + id: 'owner', + label: 'Owner', + isSortable: true, + cell: item => , + }, + { + id: 'type', + label: 'Type', + isSortable: true, + cell: item => , + }, +]; + +export function CombinedExample() { + const [selected, setSelected] = useState | 'all'>( + new Set(), + ); + + const { tableProps, search } = useTable({ + mode: 'offset', + getData: async ({ offset, pageSize, search: query, sort }) => { + // Simulate network delay + await new Promise(resolve => setTimeout(resolve, 1000)); + + // Filter data + let filtered = catalogData; + if (query) { + const lowerQuery = query.toLocaleLowerCase('en-US'); + filtered = filtered.filter( + item => + item.name.toLocaleLowerCase('en-US').includes(lowerQuery) || + item.owner.name.toLocaleLowerCase('en-US').includes(lowerQuery) || + item.type.toLocaleLowerCase('en-US').includes(lowerQuery), + ); + } + + // Sort data + if (sort?.column) { + filtered = [...filtered].sort((a, b) => { + let aVal: string; + let bVal: string; + if (sort.column === 'owner') { + aVal = a.owner.name; + bVal = b.owner.name; + } else { + aVal = String(a[sort.column as keyof CatalogItem]); + bVal = String(b[sort.column as keyof CatalogItem]); + } + const cmp = aVal.localeCompare(bVal); + return sort.direction === 'descending' ? -cmp : cmp; + }); + } + + // Paginate + const data = filtered.slice(offset, offset + pageSize); + + return { data, totalCount: filtered.length }; + }, + paginationOptions: { pageSize: 5, pageSizeOptions: [5, 10, 20] }, + initialSort: { column: 'name', direction: 'ascending' }, + }); + + return ( + + + +
alert(`Clicked: ${item.name}`), + }} + selection={{ + mode: 'multiple', + behavior: 'toggle', + selected, + onSelectionChange: setSelected, + }} + emptyState={ + search.value ? ( + No results match your search + ) : ( + No items available + ) + } + {...tableProps} + /> + + + ); +} + +// ============================================================================= +// Custom Row Example +// ============================================================================= + +const customRowColumns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + cell: item => , + }, + { + id: 'owner', + label: 'Owner', + cell: item => , + }, + { + id: 'lifecycle', + label: 'Lifecycle', + cell: item => , + }, +]; + +export function CustomRowExample() { + const { tableProps } = useTable({ + mode: 'complete', + getData: () => catalogData.slice(0, 5), + }); + + return ( + +
( + + {column => column.cell(item)} + + )} + {...tableProps} + /> + + ); +} + +// ============================================================================= +// Primitives Example +// ============================================================================= + +export function PrimitivesExample() { + const items = catalogData.slice(0, 5); + + return ( + + + + Name + Owner + Type + + + {items.map(item => ( + + + + + + ))} + + + + ); +} diff --git a/docs-ui/src/app/components/table/page.mdx b/docs-ui/src/app/components/table/page.mdx new file mode 100644 index 0000000000..6eb280cbe2 --- /dev/null +++ b/docs-ui/src/app/components/table/page.mdx @@ -0,0 +1,295 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { CodeBlock } from '@/components/CodeBlock'; +import { + HeroExample, + SortingExample, + SearchExample, + SelectionExample, + RowActionsExample, + EmptyStateExample, + CombinedExample, + CustomRowExample, + PrimitivesExample, +} from './components'; +import { + tableReturnColumns, + useTableOptionsPropDefs, + useTableReturnPropDefs, + tablePropDefs, + tablePaginationPropDefs, + columnConfigPropDefs, + cellTextPropDefs, + cellProfilePropDefs, + tableRootPropDefs, + columnPropDefs, + rowPropDefs, +} from './props-definition'; +import { + tableUsageSnippet, + tableHeroSnippet, + tableConceptsSnippet, + tableSortingSnippet, + tablePaginationSnippet, + tableSearchSnippet, + tableSelectionSnippet, + tableRowActionsHrefSnippet, + tableRowActionsClickSnippet, + tableRowActionsDisabledSnippet, + tableEmptyStateSnippet, + tableOffsetPaginationSnippet, + tableCursorPaginationSnippet, + tableCombinedSnippet, + tableCustomRowSnippet, + tablePrimitivesSnippet, +} from './snippets'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; +import { TableDefinition } from '../../../utils/definitions'; + +export const reactAriaUrls = { + table: 'https://react-aria.adobe.com/Table#table', + tableHeader: 'https://react-aria.adobe.com/Table#tableheader', + tableBody: 'https://react-aria.adobe.com/Table#tablebody', + column: 'https://react-aria.adobe.com/Table#column', + row: 'https://react-aria.adobe.com/Table#row', + cell: 'https://react-aria.adobe.com/Table#cell', +}; + + + +} code={tableHeroSnippet} /> + +## Usage + + + +## Core Concepts + +The Table component is designed around a hook + component pattern: + +- **`useTable`** manages data fetching, pagination state, sorting, and filtering. It returns `tableProps` that you spread onto the Table component. +- **`Table`** handles rendering - columns, rows, cells, and interactions. + +The hook supports three modes for different data scenarios: + +- **`complete`** - You have all data available upfront (client-side) +- **`offset`** - Your API uses offset/limit pagination +- **`cursor`** - Your API uses cursor-based pagination + + + +**Controlled vs uncontrolled state** + +By default, `useTable` manages sort, search, and filter state internally. Pass `initialSort`, `initialSearch`, or `initialFilter` to set starting values. + +For full control over state, use the controlled props instead: + +- `sort` / `onSortChange` +- `search` / `onSearchChange` +- `filter` / `onFilterChange` + +## Common Patterns + +### Sorting + +Columns can be made sortable by adding `isSortable: true` to the column configuration. When sortable, clicking a column header cycles through ascending, descending, and unsorted states. A visual indicator shows the current sort direction. + +With `mode: 'complete'`, sorting happens client-side. Provide a `sortFn` that receives the full dataset and the current sort descriptor, and returns the sorted array. You can also set an `initialSort` to define the default sort when the table first renders. For server-side sorting with `offset` or `cursor` modes, see [Server-Side Data](#server-side-data). + +} code={tableSortingSnippet} /> + +### Pagination + +Configure page size and available options through `paginationOptions`. The table displays navigation controls automatically. + + + +### Search + +The `useTable` hook returns a `search` object with `value` and `onChange` properties, ready to connect to a search input. With `mode: 'complete'`, provide a `searchFn` that filters the dataset based on the search query. + +The search state is debounced internally, so rapid typing doesn't trigger excessive re-filtering. When the search query changes, pagination resets to the first page automatically. + +For server-side search with `offset` or `cursor` modes, the search query is passed to your `getData` function. See [Server-Side Data](#server-side-data). + +} code={tableSearchSnippet} /> + +### Row Selection + +Tables support row selection with two configuration options: `mode` and `behavior`. + +Selection mode controls how many rows can be selected: + +- `single` - Only one row can be selected at a time +- `multiple` - Any number of rows can be selected, with a header checkbox for select-all + +Selection behavior controls the interaction style: + +- `toggle` - Checkboxes appear for selection. Click a checkbox to select/deselect. +- `replace` - No checkboxes. Click a row to select it (replacing previous selection). Use Cmd/Ctrl+click to select multiple rows. + +Selection state can be managed in two ways: + +- **Controlled** - Pass both `selected` and `onSelectionChange` to fully manage state externally +- **Uncontrolled** - Pass only `onSelectionChange` to let the Table manage state while receiving change notifications + +} code={tableSelectionSnippet} /> + +### Row Actions + +Rows can respond to user interaction in two ways: navigating to a URL or triggering a callback. + +Use `getHref` when rows should link to detail pages. The entire row becomes clickable and navigates on click. Links within cells remain independently clickable. + + + +Use `onClick` for custom actions like opening a panel or triggering a dialog. + + + +When combining row actions with selection, the interaction depends on selection behavior: + +- **`toggle`**: Clicking a row triggers its action when nothing is selected. Once any row is selected, clicking anywhere on the row toggles selection instead. +- **`replace`**: Single click selects the row. Double-click triggers the row action. + +You can also disable specific rows from being clicked using `getIsDisabled`: + + + +} code={tableRowActionsHrefSnippet} /> + +### Empty State + +When the table has no data to display, provide an `emptyState` to show a helpful message instead of an empty table body. Consider providing different messages depending on context - an empty search result is different from a table with no data at all. + +} code={tableEmptyStateSnippet} /> + +## Server-Side Data + +When your data comes from an API with server-side pagination, use `offset` or `cursor` mode instead of `complete`. The key difference: instead of providing all data upfront, you provide a `getData` function that fetches data for the current page. + +### Offset Pagination + +Use `mode: 'offset'` when your API accepts `offset` and `limit` (or `skip` and `take`) parameters. + + + +The `signal` parameter is an `AbortSignal` - pass it to `fetch` so in-flight requests are cancelled when the user navigates away or triggers a new query. + +### Cursor Pagination + +Use `mode: 'cursor'` when your API uses cursor-based pagination (common with GraphQL or APIs that return `nextCursor`/`prevCursor` tokens). + + + +### Loading 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. + +You can access these states via `tableProps.loading` and `tableProps.isStale` if you need to render additional loading indicators. + +## Combining Features + +Real-world tables often combine multiple features. Here's an example with search, sorting, pagination, and row selection working together. + +} code={tableCombinedSnippet} /> + +## Custom Tables + +For most use cases, `useTable` + `Table` provides everything you need. When you need more control, there are several ways you can customize your table. + +### Custom Row and Header Rendering + +Use a render function for `rowConfig` when you need to customize individual rows based on their data - for example, highlighting rows that require attention. Use `header` in column config to customize header cell content. + +} code={tableCustomRowSnippet} /> + +### Using Primitives Directly + +When the `Table` component doesn't support your use case, you can compose with the lower-level primitives: `TableRoot`, `TableHeader`, `TableBody`, `Column`, and `Row`. + +} code={tablePrimitivesSnippet} /> + +## API Reference + +### useTable + +The `useTable` hook manages data fetching, pagination, sorting, and filtering. + +**Options** + + + +**Return Value** + + + +### Table + +The main table component. + + + +### ColumnConfig + + + +### CellText + + + + + +### CellProfile + + + + + +### TablePagination + + + +### Primitives + +Low-level components for building custom table layouts. + +#### TableRoot + + + + + +#### TableHeader + + + +#### TableBody + + + +#### Column + + + + + +#### Row + + + + + +#### Cell + + + + + + diff --git a/docs-ui/src/app/components/table/props-definition.tsx b/docs-ui/src/app/components/table/props-definition.tsx new file mode 100644 index 0000000000..be24e86bf0 --- /dev/null +++ b/docs-ui/src/app/components/table/props-definition.tsx @@ -0,0 +1,461 @@ +import { + classNamePropDefs, + stylePropDefs, + type PropDef, +} from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +// ============================================================================= +// PropsTable Column Configuration (Table docs use description instead of responsive) +// ============================================================================= + +// For return values (no default column) +export const tableReturnColumns = [ + { key: 'prop' as const, width: '15%' }, + { key: 'type' as const, width: '25%' }, + { key: 'description' as const, width: '60%' }, +]; + +// ============================================================================= +// useTable Hook +// ============================================================================= + +export const useTableOptionsPropDefs: Record = { + mode: { + type: 'enum', + values: ['complete', 'offset', 'cursor'], + description: ( + <> + Data fetching strategy (required). Use complete for + client-side data, offset for offset/limit APIs,{' '} + cursor for cursor-based pagination. + + ), + }, + getData: { + type: 'enum', + values: ['function'], + description: + 'Function that returns or fetches data (required for "offset" and "cursor" modes). For the "complete" mode, either this or `data` must be provided. Signature varies by mode.', + }, + data: { + type: 'enum', + values: ['T[]'], + description: + 'The data for the table. Only applicable for "complete" mode, and either this or `getData` must be provided.', + }, + paginationOptions: { + type: 'enum', + values: ['object'], + description: ( + <> + Pagination configuration including pageSize,{' '} + pageSizeOptions, and initialOffset. + + ), + }, + // Uncontrolled state + initialSort: { + type: 'enum', + values: ['SortDescriptor'], + description: 'Default sort configuration on first render (uncontrolled).', + }, + initialSearch: { + type: 'string', + description: 'Default search value on first render (uncontrolled).', + }, + initialFilter: { + type: 'enum', + values: ['TFilter'], + description: 'Default filter value on first render (uncontrolled).', + }, + // Controlled state + sort: { + type: 'enum', + values: ['SortDescriptor'], + description: 'Current sort state (controlled).', + }, + onSortChange: { + type: 'enum', + values: ['(sort: SortDescriptor) => void'], + description: 'Sort change handler (controlled).', + }, + search: { + type: 'string', + description: 'Current search value (controlled).', + }, + onSearchChange: { + type: 'enum', + values: ['(search: string) => void'], + description: 'Search change handler (controlled).', + }, + filter: { + type: 'enum', + values: ['TFilter'], + description: 'Current filter value (controlled).', + }, + onFilterChange: { + type: 'enum', + values: ['(filter: TFilter) => void'], + description: 'Filter change handler (controlled).', + }, + // Client-side functions + sortFn: { + type: 'enum', + values: ['(data, sort) => data'], + description: ( + <> + Client-side sort function. Only used with complete mode. + + ), + }, + searchFn: { + type: 'enum', + values: ['(data, query) => data'], + description: ( + <> + Client-side search function. Only used with complete mode. + + ), + }, + filterFn: { + type: 'enum', + values: ['(data, filter) => data'], + description: ( + <> + Client-side filter function. Only used with complete mode. + + ), + }, +}; + +export const useTableReturnPropDefs: Record = { + tableProps: { + type: 'enum', + values: ['object'], + description: ( + <> + Props to spread onto the Table component. Includes data, + loading, error, pagination, and sort state. + + ), + }, + reload: { + type: 'enum', + values: ['() => void'], + description: 'Function to trigger a data refetch.', + }, + search: { + type: 'enum', + values: ['{ value, onChange }'], + description: ( + <> + Search state object for binding to a SearchField component. + + ), + }, + filter: { + type: 'enum', + values: ['{ value, onChange }'], + description: 'Filter state object for binding to filter controls.', + }, +}; + +// ============================================================================= +// Table Component +// ============================================================================= + +export const tablePropDefs: Record = { + columnConfig: { + type: 'enum', + values: ['ColumnConfig[]'], + description: + 'Array of column configurations defining how each column renders.', + }, + data: { + type: 'enum', + values: ['T[]'], + description: 'Array of data items to display in the table.', + }, + loading: { + type: 'boolean', + default: 'false', + description: 'Whether the table is in a loading state.', + }, + isStale: { + type: 'boolean', + default: 'false', + description: + 'Whether the displayed data is stale while new data is loading.', + }, + error: { + type: 'enum', + values: ['Error'], + description: 'Error object if data fetching failed.', + }, + pagination: { + type: 'enum', + values: ['TablePaginationType'], + description: ( + <> + Pagination configuration (required). Use{' '} + {'{ type: "none" }'} to disable or{' '} + {'{ type: "page", ...props }'} for pagination. + + ), + }, + sort: { + type: 'enum', + values: ['SortState'], + description: 'Sort state including current descriptor and change handler.', + }, + rowConfig: { + type: 'enum', + values: ['RowConfig | RowRenderFn'], + description: ( + <> + Row configuration object with getHref, onClick + , getIsDisabled, or a render function for custom rows. + + ), + }, + selection: { + type: 'enum', + values: ['TableSelection'], + description: + 'Selection configuration including mode, behavior, selected keys, and change handler.', + }, + emptyState: { + type: 'enum', + values: ['ReactNode'], + description: 'Content to display when the table has no data.', + }, + ...classNamePropDefs, + ...stylePropDefs, +}; + +// ============================================================================= +// ColumnConfig +// ============================================================================= + +export const columnConfigPropDefs: Record = { + id: { + type: 'string', + description: 'Unique identifier for the column.', + }, + label: { + type: 'string', + description: 'Display label for the column header.', + }, + cell: { + type: 'enum', + values: ['(item) => ReactNode'], + description: 'Render function for cell content.', + }, + header: { + type: 'enum', + values: ['() => ReactNode'], + description: 'Optional custom render function for the header cell.', + }, + isSortable: { + type: 'boolean', + default: 'false', + description: 'Whether the column supports sorting.', + }, + isHidden: { + type: 'boolean', + default: 'false', + description: 'Whether the column is hidden.', + }, + isRowHeader: { + type: 'boolean', + default: 'false', + description: 'Whether this column is the row header for accessibility.', + }, + width: { + type: 'enum', + values: ['ColumnSize'], + description: 'Current width of the column.', + }, + defaultWidth: { + type: 'enum', + values: ['ColumnSize'], + description: ( + <> + Default width of the column (e.g., 1fr, 200px + ). + + ), + }, + minWidth: { + type: 'enum', + values: ['ColumnStaticSize'], + description: 'Minimum width of the column.', + }, + maxWidth: { + type: 'enum', + values: ['ColumnStaticSize'], + description: 'Maximum width of the column.', + }, +}; + +// ============================================================================= +// CellText +// Note: Extends React Aria Cell props +// ============================================================================= + +export const cellTextPropDefs: Record = { + title: { + type: 'string', + description: 'Primary text content of the cell.', + }, + description: { + type: 'string', + description: 'Secondary description text displayed below the title.', + }, + color: { + type: 'enum', + values: ['TextColors'], + description: 'Text color variant.', + }, + leadingIcon: { + type: 'enum', + values: ['ReactNode'], + description: 'Icon displayed before the text content.', + }, + href: { + type: 'string', + description: 'URL to navigate to when the cell is clicked.', + }, +}; + +// ============================================================================= +// CellProfile +// Note: Extends React Aria Cell props +// ============================================================================= + +export const cellProfilePropDefs: Record = { + name: { + type: 'string', + description: 'Name to display.', + }, + src: { + type: 'string', + description: 'URL of the avatar image.', + }, + description: { + type: 'string', + description: 'Secondary text displayed below the name.', + }, + href: { + type: 'string', + description: 'URL to navigate to when clicked.', + }, + color: { + type: 'enum', + values: ['TextColors'], + description: 'Text color variant.', + }, +}; + +// ============================================================================= +// TablePagination +// ============================================================================= + +export const tablePaginationPropDefs: Record = { + pageSize: { + type: 'number', + description: 'Number of items per page.', + }, + pageSizeOptions: { + type: 'enum', + values: ['number[]'], + description: 'Available page size options for the dropdown.', + }, + offset: { + type: 'number', + description: 'Current offset (starting index) in the data.', + }, + totalCount: { + type: 'number', + description: 'Total number of items across all pages.', + }, + hasNextPage: { + type: 'boolean', + description: 'Whether there is a next page available.', + }, + hasPreviousPage: { + type: 'boolean', + description: 'Whether there is a previous page available.', + }, + onNextPage: { + type: 'enum', + values: ['() => void'], + description: 'Handler called when navigating to the next page.', + }, + onPreviousPage: { + type: 'enum', + values: ['() => void'], + description: 'Handler called when navigating to the previous page.', + }, + onPageSizeChange: { + type: 'enum', + values: ['(size: number) => void'], + description: 'Handler called when the page size changes.', + }, + showPageSizeOptions: { + type: 'boolean', + default: 'true', + description: 'Whether to show the page size dropdown.', + }, + getLabel: { + type: 'enum', + values: ['(props) => string'], + description: 'Custom function to generate the pagination label text.', + }, +}; + +// ============================================================================= +// Primitives +// ============================================================================= + +export const tableRootPropDefs: Record = { + stale: { + type: 'boolean', + default: 'false', + description: ( + <> + Whether the table data is stale (e.g., while fetching new data). Adds{' '} + aria-busy attribute. + + ), + }, +}; + +export const columnPropDefs: Record = { + isRowHeader: { + type: 'boolean', + description: 'Whether this column is a row header for accessibility.', + }, + children: { + type: 'enum', + values: ['ReactNode'], + description: 'Column header content.', + }, +}; + +export const rowPropDefs: Record = { + id: { + type: 'enum', + values: ['string | number'], + description: 'Unique identifier for the row.', + }, + children: { + type: 'enum', + values: ['ReactNode | ((column) => ReactNode)'], + description: + 'Row content. Can be a render function receiving column config.', + }, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/app/components/table/snippets.ts b/docs-ui/src/app/components/table/snippets.ts new file mode 100644 index 0000000000..ab4bf53a58 --- /dev/null +++ b/docs-ui/src/app/components/table/snippets.ts @@ -0,0 +1,359 @@ +// ============================================================================= +// Usage +// ============================================================================= + +export const tableUsageSnippet = `import { Table, useTable, CellText, type ColumnConfig } from '@backstage/ui'; + +const columns: ColumnConfig[] = [ + { id: 'name', label: 'Name', isRowHeader: true, cell: item => }, + { id: 'owner', label: 'Owner', cell: item => }, +]; + +function MyTable() { + const { tableProps } = useTable({ + mode: 'complete', + data, + }); + + return
; +}`; + +// ============================================================================= +// Hero / Quick Start +// ============================================================================= + +export const tableHeroSnippet = `import { Table, CellText, useTable, type ColumnConfig } from '@backstage/ui'; + +const data = [ + { id: 1, name: 'Service A', owner: 'Team Alpha', type: 'service' }, + { id: 2, name: 'Service B', owner: 'Team Beta', type: 'website' }, + { id: 3, name: 'Library C', owner: 'Team Gamma', type: 'library' }, +]; + +const columns: ColumnConfig[] = [ + { id: 'name', label: 'Name', isRowHeader: true, cell: item => }, + { id: 'owner', label: 'Owner', cell: item => }, + { id: 'type', label: 'Type', cell: item => }, +]; + +function MyTable() { + const { tableProps } = useTable({ + mode: 'complete', + data, + }); + + return
; +}`; + +// ============================================================================= +// Core Concepts +// ============================================================================= + +export const tableConceptsSnippet = `// What useTable returns +const { + tableProps, // Spread onto
+ reload, // Trigger data refetch + search, // { value, onChange } for search input + filter, // { value, onChange } for filters +} = useTable({ ... });`; + +// ============================================================================= +// Common Patterns +// ============================================================================= + +export const tableSortingSnippet = `const columns: ColumnConfig[] = [ + { id: 'name', label: 'Name', isSortable: true, cell: item => }, + { id: 'owner', label: 'Owner', isSortable: true, cell: item => }, + { id: 'type', label: 'Type', cell: item => }, +]; + +const { tableProps } = useTable({ + mode: 'complete', + data, + initialSort: { column: 'name', direction: 'ascending' }, + sortFn: (items, { column, direction }) => { + return [...items].sort((a, b) => { + const aVal = String(a[column]); + const bVal = String(b[column]); + const cmp = aVal.localeCompare(bVal); + return direction === 'descending' ? -cmp : cmp; + }); + }, +}); + +return
;`; + +export const tablePaginationSnippet = `const { tableProps } = useTable({ + mode: 'complete', + data, + paginationOptions: { + pageSize: 10, + pageSizeOptions: [10, 25, 50], + }, +});`; + +export const tableSearchSnippet = `const { tableProps, search } = useTable({ + mode: 'complete', + data, + searchFn: (items, query) => { + const lowerQuery = query.toLowerCase(); + return items.filter(item => + item.name.toLowerCase().includes(lowerQuery) || + item.owner.toLowerCase().includes(lowerQuery) + ); + }, +}); + +return ( + <> + +
+ +);`; + +export const tableSelectionSnippet = `const [selected, setSelected] = useState | 'all'>(new Set()); + +const { tableProps } = useTable({ + mode: 'complete', + data, +}); + +return ( +
+);`; + +export const tableRowActionsHrefSnippet = `
\`/catalog/\${item.namespace}/\${item.name}\` + }} + {...tableProps} +/>`; + +export const tableRowActionsClickSnippet = `
openDetailPanel(item) + }} + {...tableProps} +/>`; + +export const tableRowActionsDisabledSnippet = `
openDetailPanel(item), + getIsDisabled: item => item.status === 'archived', + }} + {...tableProps} +/>`; + +export const tableEmptyStateSnippet = `const { tableProps, search } = useTable({ + mode: 'complete', + data, + searchFn: (items, query) => { /* ... */ }, +}); + +return ( +
No results match "{search.value}" + : No items yet. Create one to get started. + } + {...tableProps} + /> +);`; + +// ============================================================================= +// Server-Side Data +// ============================================================================= + +export const tableOffsetPaginationSnippet = `const { tableProps } = useTable({ + mode: 'offset', + getData: async ({ offset, pageSize, sort, search, filter, signal }) => { + const response = await fetch( + \`/api/items?offset=\${offset}&limit=\${pageSize}&q=\${search}\`, + { signal } + ); + const { items, totalCount } = await response.json(); + + return { + data: items, + totalCount, + }; + }, + paginationOptions: { + pageSize: 20, + pageSizeOptions: [20, 50, 100], + }, +});`; + +export const tableCursorPaginationSnippet = `const { tableProps } = useTable({ + mode: 'cursor', + getData: async ({ cursor, pageSize, sort, search, signal }) => { + const response = await fetch( + \`/api/items?cursor=\${cursor ?? ''}&limit=\${pageSize}&q=\${search}\`, + { signal } + ); + const { items, nextCursor, prevCursor, totalCount } = await response.json(); + + return { + data: items, + nextCursor, + prevCursor, + totalCount, // optional - enables "X of Y" display + }; + }, + paginationOptions: { + pageSize: 20, + pageSizeOptions: [20, 50, 100], + }, +});`; + +// ============================================================================= +// Combining Features +// ============================================================================= + +export const tableCombinedSnippet = `interface TypeFilter { + type: string | null; +} + +const columns: ColumnConfig[] = [ + { id: 'name', label: 'Name', isRowHeader: true, isSortable: true, + cell: item => }, + { id: 'owner', label: 'Owner', isSortable: true, + cell: item => }, + { id: 'type', label: 'Type', isSortable: true, + cell: item => }, +]; + +function ItemsTable() { + const [selected, setSelected] = useState | 'all'>(new Set()); + + const { tableProps, search, filter } = useTable({ + mode: 'offset', + initialSort: { column: 'name', direction: 'ascending' }, + getData: async ({ offset, pageSize, sort, search, filter, signal }) => { + const params = new URLSearchParams({ + offset: String(offset), + limit: String(pageSize), + q: search, + ...(sort && { sortBy: sort.column, sortDir: sort.direction }), + ...(filter?.type && { type: filter.type }), + }); + + const response = await fetch(\`/api/items?\${params}\`, { signal }); + const { items, totalCount } = await response.json(); + + return { data: items, totalCount }; + }, + }); + + return ( + + + +
openDetailPanel(item), + }} + selection={{ + mode: 'multiple', + behavior: 'toggle', + selected, + onSelectionChange: setSelected, + }} + emptyState={ + search.value || filter.value?.type + ? No results match your filters + : No items available + } + {...tableProps} + /> + + ); +}`; + +// ============================================================================= +// Custom Tables +// ============================================================================= + +export const tableCustomRowSnippet = `import { Fragment } from 'react'; + +const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + header: () => Name (required), + cell: item => , + }, + { id: 'owner', label: 'Owner', cell: item => }, + { id: 'lifecycle', label: 'Lifecycle', cell: item => }, +]; + +const { tableProps } = useTable({ + mode: 'complete', + getData: () => data, +}); + +
( + + {column => ( + {column.cell(item)} + )} + + )} + {...tableProps} +/>`; + +export const tablePrimitivesSnippet = ` + + Name + Owner + Type + + + {items.map(item => ( + + + + + + ))} + +`; diff --git a/docs-ui/src/app/components/tabs/components.tsx b/docs-ui/src/app/components/tabs/components.tsx new file mode 100644 index 0000000000..8fbf3d4924 --- /dev/null +++ b/docs-ui/src/app/components/tabs/components.tsx @@ -0,0 +1,104 @@ +'use client'; + +import { + Tabs, + TabList, + Tab, + TabPanel, +} from '../../../../../packages/ui/src/components/Tabs'; +import { Text } from '../../../../../packages/ui/src/components/Text/Text'; +import { MemoryRouter } from 'react-router-dom'; + +export const Default = () => { + return ( + + + + Tab 1 + Tab 2 + Tab 3 + + + Content for Tab 1 + + + Content for Tab 2 + + + Content for Tab 3 + + + + ); +}; + +export const DefaultSelectedKey = () => { + return ( + + + + Tab 1 + Tab 2 + Tab 3 + + + Content for Tab 1 + + + Content for Tab 2 + + + Content for Tab 3 + + + + ); +}; + +export const DisabledTabs = () => { + return ( + + + + Tab 1 + + Tab 2 (Disabled) + + Tab 3 + + + Content for Tab 1 + + + Content for Tab 2 + + + Content for Tab 3 + + + + ); +}; + +export const Orientation = () => { + return ( + + + + Tab 1 + Tab 2 + Tab 3 + + + Content for Tab 1 + + + Content for Tab 2 + + + Content for Tab 3 + + + + ); +}; diff --git a/docs-ui/src/app/components/tabs/page.mdx b/docs-ui/src/app/components/tabs/page.mdx new file mode 100644 index 0000000000..6925127943 --- /dev/null +++ b/docs-ui/src/app/components/tabs/page.mdx @@ -0,0 +1,116 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { CodeBlock } from '@/components/CodeBlock'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; +import { + tabsPropDefs, + tabListPropDefs, + tabPropDefs, + tabPanelPropDefs, +} from './props-definition'; +import { + tabsUsageSnippet, + defaultSnippet, + defaultSelectedKeySnippet, + disabledTabsSnippet, + orientationSnippet, + urlNavigationSnippet, +} from './snippets'; +import { + Default, + DefaultSelectedKey, + DisabledTabs, + Orientation, +} from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { TabsDefinition } from '../../../utils/definitions'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; + +export const reactAriaUrls = { + tabs: 'https://react-aria.adobe.com/Tabs', +}; + + + +} code={defaultSnippet} /> + +## Usage + + + +## API reference + +### Tabs + +Container that groups the tab list and panels. + + + + + +### TabList + +Container for the tab buttons. + + + + + +### Tab + +Individual tab button. Add `href` to enable URL-based tab selection. + + + + + +### TabPanel + +Content panel associated with a tab. + + + + + +## Examples + +### Default selected + +} + code={defaultSelectedKeySnippet} +/> + +### Disabled tabs + +} + code={disabledTabsSnippet} +/> + +### Vertical orientation + +} + code={orientationSnippet} +/> + +### URL-based navigation + +Add `href` to Tab components to enable URL-based tab selection. The active tab is determined by the current route. + + + + + + diff --git a/docs-ui/src/app/components/tabs/props-definition.ts b/docs-ui/src/app/components/tabs/props-definition.ts new file mode 100644 index 0000000000..e1c1f056cb --- /dev/null +++ b/docs-ui/src/app/components/tabs/props-definition.ts @@ -0,0 +1,83 @@ +import { + childrenPropDefs, + classNamePropDefs, + type PropDef, +} from '@/utils/propDefs'; + +export const tabsPropDefs: Record = { + orientation: { + type: 'enum', + values: ['horizontal', 'vertical'], + default: 'horizontal', + description: + 'Layout direction. Use horizontal for top navigation, vertical for sidebar-style.', + }, + selectedKey: { + type: 'string', + description: 'The currently selected tab key (controlled).', + }, + defaultSelectedKey: { + type: 'string', + description: 'The default selected tab key (uncontrolled).', + }, + onSelectionChange: { + type: 'enum', + values: ['(key: Key) => void'], + description: 'Handler called when the selected tab changes.', + }, + isDisabled: { + type: 'boolean', + default: 'false', + description: + 'Disables all tabs. Use when an entire section is unavailable.', + }, + disabledKeys: { + type: 'enum', + values: ['Iterable'], + description: 'Keys of tabs that should be disabled.', + }, + ...childrenPropDefs, + ...classNamePropDefs, +}; + +export const tabListPropDefs: Record = { + ...childrenPropDefs, + ...classNamePropDefs, +}; + +export const tabPropDefs: Record = { + id: { + type: 'string', + required: true, + description: 'Unique identifier matching the corresponding TabPanel.', + }, + href: { + type: 'string', + description: + 'URL to navigate to. When set, tab selection is controlled by the current route.', + }, + matchStrategy: { + type: 'enum', + values: ['exact', 'prefix'], + default: 'exact', + description: + 'URL matching strategy. Use exact for leaf routes, prefix for parent routes.', + }, + isDisabled: { + type: 'boolean', + default: 'false', + description: 'Disables this tab. Use for temporarily unavailable options.', + }, + ...childrenPropDefs, + ...classNamePropDefs, +}; + +export const tabPanelPropDefs: Record = { + id: { + type: 'string', + required: true, + description: 'Unique identifier matching the corresponding Tab.', + }, + ...childrenPropDefs, + ...classNamePropDefs, +}; diff --git a/docs-ui/src/app/components/tabs/snippets.ts b/docs-ui/src/app/components/tabs/snippets.ts new file mode 100644 index 0000000000..651a0a89af --- /dev/null +++ b/docs-ui/src/app/components/tabs/snippets.ts @@ -0,0 +1,71 @@ +export const tabsUsageSnippet = `import { Tabs, TabList, Tab, TabPanel } from '@backstage/ui'; + + + + Tab 1 + Tab 2 + + Content 1 + Content 2 +`; + +export const defaultSnippet = ` + + Tab 1 + Tab 2 + Tab 3 + + + Content for Tab 1 + + + Content for Tab 2 + + + Content for Tab 3 + +`; + +export const defaultSelectedKeySnippet = ` + + Tab 1 + Tab 2 + Tab 3 + + Content 1 + Content 2 + Content 3 +`; + +export const disabledTabsSnippet = ` + + Tab 1 + Tab 2 (Disabled) + Tab 3 + + Content 1 + Content 2 + Content 3 +`; + +export const orientationSnippet = ` + + Tab 1 + Tab 2 + Tab 3 + + Content 1 + Content 2 + Content 3 +`; + +export const urlNavigationSnippet = ` + + Overview + Profile + Security + + Overview content + Profile content + Security content +`; diff --git a/docs-ui/src/app/components/tag-group/components.tsx b/docs-ui/src/app/components/tag-group/components.tsx new file mode 100644 index 0000000000..a8455c1d1f --- /dev/null +++ b/docs-ui/src/app/components/tag-group/components.tsx @@ -0,0 +1,127 @@ +'use client'; + +import { + TagGroup, + Tag, +} from '../../../../../packages/ui/src/components/TagGroup/TagGroup'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; +import { MemoryRouter } from 'react-router-dom'; +import { useState } from 'react'; +import { useListData } from 'react-stately'; +import type { Selection } from 'react-aria-components'; +import { + RiAccountCircleLine, + RiBugLine, + RiEyeLine, + RiHeartLine, +} from '@remixicon/react'; + +interface ListItem { + id: string; + name: string; + icon: React.ReactNode; + isDisabled?: boolean; +} + +const initialList: ListItem[] = [ + { id: 'banana', name: 'Banana', icon: }, + { + id: 'apple', + name: 'Apple', + icon: , + isDisabled: true, + }, + { id: 'orange', name: 'Orange', icon: , isDisabled: true }, + { id: 'pear', name: 'Pear', icon: }, + { id: 'grape', name: 'Grape', icon: }, + { id: 'pineapple', name: 'Pineapple', icon: }, + { id: 'strawberry', name: 'Strawberry', icon: }, +]; + +export const Default = () => ( + + + {initialList.map(item => ( + {item.name} + ))} + + +); + +export const WithLink = () => ( + + + {initialList.map(item => ( + + {item.name} + + ))} + + +); + +export const WithIcon = () => ( + + + {initialList.map(item => ( + + {item.name} + + ))} + + +); + +export const Sizes = () => ( + + + + {initialList.map(item => ( + + {item.name} + + ))} + + + {initialList.map(item => ( + + {item.name} + + ))} + + + +); + +export const RemovingTags = () => { + const [selected, setSelected] = useState(new Set(['travel'])); + const list = useListData({ + initialItems: initialList, + }); + + return ( + + + aria-label="Tag Group" + items={list.items} + onRemove={keys => list.remove(...keys)} + selectedKeys={selected} + onSelectionChange={setSelected} + > + {item => {item.name}} + + + ); +}; + +export const Disabled = () => ( + + + {initialList.map(item => ( + + {item.name} + + ))} + + +); diff --git a/docs-ui/src/app/components/tag-group/page.mdx b/docs-ui/src/app/components/tag-group/page.mdx new file mode 100644 index 0000000000..1b283a8170 --- /dev/null +++ b/docs-ui/src/app/components/tag-group/page.mdx @@ -0,0 +1,91 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { CodeBlock } from '@/components/CodeBlock'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; +import { + Default, + WithLink, + WithIcon, + Sizes, + RemovingTags, + Disabled, +} from './components'; +import { tagGroupPropDefs, tagPropDefs } from './props-definition'; +import { + usage, + preview, + withLink, + disabled, + withIcons, + sizes, + removingTags, +} from './snippets'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { TagGroupDefinition } from '../../../utils/definitions'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; + +export const reactAriaUrls = { + tagGroup: 'https://react-aria.adobe.com/TagGroup', +}; + + + +} code={preview} /> + +## Usage + + + +## API reference + +### TagGroup + +Container for a collection of tags. + + + + + +### Tag + +Individual tag item within a group. + + + + + +## Examples + +### With links + +} code={withLink} /> + +### With icons + +} code={withIcons} /> + +### Sizes + +} code={sizes} /> + +### Removable + +} + code={removingTags} +/> + +### Disabled + +} code={disabled} /> + + + + diff --git a/docs-ui/src/app/components/tag-group/props-definition.tsx b/docs-ui/src/app/components/tag-group/props-definition.tsx new file mode 100644 index 0000000000..3f64b03e8c --- /dev/null +++ b/docs-ui/src/app/components/tag-group/props-definition.tsx @@ -0,0 +1,89 @@ +import { + classNamePropDefs, + childrenPropDefs, + type PropDef, +} from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const tagGroupPropDefs: Record = { + items: { + type: 'enum', + values: ['Iterable'], + description: 'Item objects in the collection.', + }, + renderEmptyState: { + type: 'enum', + values: ['() => ReactNode'], + description: 'Content to display when the collection is empty.', + }, + selectionMode: { + type: 'enum', + values: ['none', 'single', 'multiple'], + description: 'The type of selection allowed.', + }, + selectedKeys: { + type: 'enum', + values: ['all', 'Iterable'], + description: 'The currently selected keys (controlled).', + }, + defaultSelectedKeys: { + type: 'enum', + values: ['all', 'Iterable'], + description: 'The initial selected keys (uncontrolled).', + }, + disabledKeys: { + type: 'enum', + values: ['Iterable'], + description: 'Keys of tags that should be disabled.', + }, + onRemove: { + type: 'enum', + values: ['(keys: Set) => void'], + description: 'Handler called when a tag is removed.', + }, + onSelectionChange: { + type: 'enum', + values: ['(keys: Selection) => void'], + description: 'Handler called when the selection changes.', + }, + ...childrenPropDefs, + ...classNamePropDefs, +}; + +export const tagPropDefs: Record = { + id: { + type: 'string', + description: 'Unique identifier for the tag.', + }, + textValue: { + type: 'string', + description: + 'Text value for accessibility. Derived from children if string.', + }, + href: { + type: 'string', + description: 'URL to navigate to when the tag is clicked.', + }, + icon: { + type: 'enum', + values: ['ReactNode'], + description: 'Icon displayed before the tag text.', + }, + size: { + type: 'enum', + values: ['small', 'medium'], + default: 'small', + description: ( + <> + Visual size of the tag. Use small for inline or dense + layouts, medium for standalone tags. + + ), + }, + isDisabled: { + type: 'boolean', + description: 'Whether the tag is disabled.', + }, + ...childrenPropDefs, + ...classNamePropDefs, +}; diff --git a/docs-ui/src/app/components/tag-group/snippets.ts b/docs-ui/src/app/components/tag-group/snippets.ts new file mode 100644 index 0000000000..c939c69d14 --- /dev/null +++ b/docs-ui/src/app/components/tag-group/snippets.ts @@ -0,0 +1,62 @@ +export const usage = `import { TagGroup, Tag } from '@backstage/ui'; + + + Tag 1 + Tag 2 +`; + +export const preview = ` + Banana + Apple + Orange + Pear + Grape + Pineapple + Strawberry +`; + +export const withLink = ` + Banana + Apple + Orange +`; + +export const disabled = ` + Banana + Apple + Orange + Pear +`; + +export const withIcons = ` + }>Banana + }>Apple + }>Orange + }>Pear +`; + +export const sizes = ` + + }>Banana + }>Apple + + + }>Banana + }>Apple + +`; + +export const removingTags = `const list = useListData({ + initialItems: [ + { id: 'banana', name: 'Banana' }, + { id: 'apple', name: 'Apple' }, + { id: 'orange', name: 'Orange' }, + ], +}); + + list.remove(...keys)} +> + {item => {item.name}} +`; diff --git a/docs-ui/src/app/components/text-field/components.tsx b/docs-ui/src/app/components/text-field/components.tsx new file mode 100644 index 0000000000..6f6c8019ea --- /dev/null +++ b/docs-ui/src/app/components/text-field/components.tsx @@ -0,0 +1,51 @@ +'use client'; + +import { TextField } from '../../../../../packages/ui/src/components/TextField/TextField'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; +import { RiSparklingLine } from '@remixicon/react'; + +export const WithLabel = () => { + return ( + + ); +}; + +export const Sizes = () => { + return ( + + } + /> + } + /> + + ); +}; + +export const WithDescription = () => { + return ( + + ); +}; diff --git a/docs-ui/src/app/components/text-field/page.mdx b/docs-ui/src/app/components/text-field/page.mdx new file mode 100644 index 0000000000..87d1087814 --- /dev/null +++ b/docs-ui/src/app/components/text-field/page.mdx @@ -0,0 +1,70 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { textFieldPropDefs } from './props-definition'; +import { + textFieldUsageSnippet, + withLabelSnippet, + sizesSnippet, + withDescriptionSnippet, +} from './snippets'; +import { WithLabel, Sizes, WithDescription } from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { TextFieldDefinition } from '../../../utils/definitions'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { CodeBlock } from '@/components/CodeBlock'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; + +export const reactAriaUrls = { + textField: 'https://react-aria.adobe.com/TextField', +}; + + + +} + code={withLabelSnippet} +/> + +## Usage + + + +## API reference + + + + + +## Examples + +### Sizes + +} + code={sizesSnippet} + layout="side-by-side" +/> + +### With description + +} + code={withDescriptionSnippet} + layout="side-by-side" +/> + + + + diff --git a/docs-ui/src/app/components/text-field/props-definition.tsx b/docs-ui/src/app/components/text-field/props-definition.tsx new file mode 100644 index 0000000000..54589e1dab --- /dev/null +++ b/docs-ui/src/app/components/text-field/props-definition.tsx @@ -0,0 +1,85 @@ +import { + classNamePropDefs, + stylePropDefs, + type PropDef, +} from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const textFieldPropDefs: Record = { + size: { + type: 'enum', + values: ['small', 'medium'], + default: 'small', + responsive: true, + description: ( + <> + Visual size of the input. Use small for dense layouts,{' '} + medium for prominent fields. + + ), + }, + label: { + type: 'string', + description: 'Visible label displayed above the input.', + }, + 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.', + }, + icon: { + type: 'enum', + values: ['ReactNode'], + description: 'Icon rendered before the input.', + }, + type: { + type: 'enum', + values: ['text', 'email', 'tel', 'url'], + default: 'text', + description: + 'HTML input type. Use SearchField for search inputs and PasswordField for passwords.', + }, + placeholder: { + type: 'string', + description: 'Text displayed when the input is empty.', + }, + name: { + type: 'string', + description: 'Form field name for submission.', + }, + isRequired: { + type: 'boolean', + description: 'Whether the field is required for form submission.', + }, + isDisabled: { + type: 'boolean', + description: 'Whether the input is disabled.', + }, + isReadOnly: { + type: 'boolean', + description: 'Whether the input is read-only.', + }, + value: { + type: 'string', + description: 'Controlled value of the input.', + }, + defaultValue: { + type: 'string', + description: 'Default value for uncontrolled usage.', + }, + onChange: { + type: 'enum', + values: ['(value: string) => void'], + description: 'Handler called when the input value changes.', + }, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/app/components/text-field/snippets.ts b/docs-ui/src/app/components/text-field/snippets.ts new file mode 100644 index 0000000000..617884dcfe --- /dev/null +++ b/docs-ui/src/app/components/text-field/snippets.ts @@ -0,0 +1,31 @@ +export const textFieldUsageSnippet = `import { TextField } from '@backstage/ui'; + +`; + +export const withLabelSnippet = ``; + +export const sizesSnippet = ` + } + /> + } + /> +`; + +export const withDescriptionSnippet = ``; diff --git a/docs-ui/src/app/components/text/components.tsx b/docs-ui/src/app/components/text/components.tsx new file mode 100644 index 0000000000..8021a1dde6 --- /dev/null +++ b/docs-ui/src/app/components/text/components.tsx @@ -0,0 +1,66 @@ +'use client'; + +import { Text } from '../../../../../packages/ui/src/components/Text/Text'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; + +export const Default = () => { + return This is a text component; +}; + +export const Variants = () => { + return ( + + Title Large + Title Medium + Title Small + Title X-Small + Body Large + Body Medium + Body Small + Body X-Small + + ); +}; + +export const Colors = () => { + return ( + + Primary + Secondary + Danger + Warning + Success + Info + + ); +}; + +export const Weights = () => { + return ( + + Regular weight + Bold weight + + ); +}; + +export const AsElement = () => { + return ( + + Paragraph element + Span element + Div element + + ); +}; + +export const Truncate = () => { + return ( +
+ + This is a very long text that will be truncated when it exceeds the + container width + +
+ ); +}; diff --git a/docs-ui/src/app/components/text/page.mdx b/docs-ui/src/app/components/text/page.mdx new file mode 100644 index 0000000000..9a93f38160 --- /dev/null +++ b/docs-ui/src/app/components/text/page.mdx @@ -0,0 +1,56 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { CodeBlock } from '@/components/CodeBlock'; +import { textPropDefs } from './props-definition'; +import { + textUsageSnippet, + defaultSnippet, + variantsSnippet, + weightsSnippet, + colorsSnippet, + truncateSnippet, +} from './snippets'; +import { Default, Variants, Weights, Colors, Truncate } from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { TextDefinition } from '../../../utils/definitions'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; + + + +} code={defaultSnippet} /> + +## Usage + + + +## API reference + + + +## Examples + +### Variants + +} code={variantsSnippet} /> + +### Weights + +} code={weightsSnippet} /> + +### Colors + +Status colors for contextual messaging. + +} code={colorsSnippet} /> + +### Truncate + +} code={truncateSnippet} /> + + + + diff --git a/docs-ui/src/app/components/text/props-definition.tsx b/docs-ui/src/app/components/text/props-definition.tsx new file mode 100644 index 0000000000..8a25af2de7 --- /dev/null +++ b/docs-ui/src/app/components/text/props-definition.tsx @@ -0,0 +1,81 @@ +import { + childrenPropDefs, + classNamePropDefs, + stylePropDefs, + type PropDef, +} from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const textPropDefs: Record = { + variant: { + type: 'enum', + values: [ + 'title-large', + 'title-medium', + 'title-small', + 'title-x-small', + 'body-large', + 'body-medium', + 'body-small', + 'body-x-small', + ], + default: 'body-medium', + responsive: true, + description: + 'Typography style. Title variants for headings, body for paragraph text.', + }, + weight: { + type: 'enum', + values: ['regular', 'bold'], + default: 'regular', + responsive: true, + description: ( + <> + Font weight. Use bold for emphasis. + + ), + }, + color: { + type: 'enum', + values: ['primary', 'secondary', 'danger', 'warning', 'success'], + default: 'primary', + responsive: true, + description: + 'Text color. Status colors (danger, warning, success) for contextual messaging.', + }, + as: { + type: 'enum', + values: [ + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'p', + 'span', + 'label', + 'div', + 'strong', + 'em', + 'small', + 'legend', + ], + default: 'span', + description: + 'HTML element to render. Use heading tags for semantic structure.', + }, + truncate: { + type: 'boolean', + default: 'false', + description: ( + <> + Truncates text with ellipsis when it overflows its container. Requires{' '} + display: block to work. + + ), + }, + ...childrenPropDefs, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/app/components/text/snippets.ts b/docs-ui/src/app/components/text/snippets.ts new file mode 100644 index 0000000000..b8cc26bd6b --- /dev/null +++ b/docs-ui/src/app/components/text/snippets.ts @@ -0,0 +1,43 @@ +export const textUsageSnippet = `import { Text } from '@backstage/ui'; + +This is a text component`; + +export const defaultSnippet = `This is a text component`; + +export const variantsSnippet = ` + Title Large + Title Medium + Title Small + Title X-Small + Body Large + Body Medium + Body Small + Body X-Small +`; + +export const colorsSnippet = ` + Primary + Secondary + Danger + Warning + Success + Info +`; + +export const weightsSnippet = ` + Regular weight + Bold weight +`; + +export const asElementSnippet = ` + Paragraph element + Span element + Div element +`; + +export const truncateSnippet = `
+ + This is a very long text that will be truncated when it exceeds the + container width + +
`; diff --git a/docs-ui/src/app/components/toggle-button-group/components.tsx b/docs-ui/src/app/components/toggle-button-group/components.tsx new file mode 100644 index 0000000000..a6da51f862 --- /dev/null +++ b/docs-ui/src/app/components/toggle-button-group/components.tsx @@ -0,0 +1,154 @@ +'use client'; + +import { ToggleButtonGroup } from '../../../../../packages/ui/src/components/ToggleButtonGroup/ToggleButtonGroup'; +import { ToggleButton } from '../../../../../packages/ui/src/components/ToggleButton/ToggleButton'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; +import { Text } from '../../../../../packages/ui/src/components/Text/Text'; +import { + RiCloudLine, + RiStarFill, + RiStarLine, + RiArrowRightSLine, +} from '@remixicon/react'; + +export const ToggleButtonGroupSurfaces = () => ( + + + Default + + + Option 1 + Option 2 + Option 3 + + + + + On Surface 0 + + + Option 1 + Option 2 + Option 3 + + + + + On Surface 1 + + + Option 1 + Option 2 + Option 3 + + + + + On Surface 2 + + + Option 1 + Option 2 + Option 3 + + + + + On Surface 3 + + + Option 1 + Option 2 + Option 3 + + + + +); + +export const ToggleButtonGroupSingle = () => ( + + Dogs + Cats + Birds + +); + +export const ToggleButtonGroupMultiple = () => ( + + Frontend + Backend + Platform + +); + +export const ToggleButtonGroupVertical = () => ( + + Morning + Afternoon + Evening + +); + +export const ToggleButtonGroupDisabled = () => ( + + Cat + Dog + Bird + +); + +export const ToggleButtonGroupDisallowEmpty = () => ( + + One + Two + Three + +); + +export const ToggleButtonGroupIcons = () => ( + + } /> + } + /> + }> + Star + + }> + Next + + +); + +export const ToggleButtonGroupIconsOnly = () => ( + + } /> + } /> + } /> + +); diff --git a/docs-ui/src/app/components/toggle-button-group/page.mdx b/docs-ui/src/app/components/toggle-button-group/page.mdx new file mode 100644 index 0000000000..462ee8680b --- /dev/null +++ b/docs-ui/src/app/components/toggle-button-group/page.mdx @@ -0,0 +1,152 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { CodeBlock } from '@/components/CodeBlock'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; +import { toggleButtonGroupPropDefs } from './props-definition'; +import { + toggleButtonGroupHeroSnippet, + toggleButtonGroupUsageSnippet, + toggleButtonGroupSurfacesSnippet, + toggleButtonGroupSingleSnippet, + toggleButtonGroupMultipleSnippet, + toggleButtonGroupIconsSnippet, + toggleButtonGroupIconsOnlySnippet, + toggleButtonGroupDisallowEmptySnippet, + toggleButtonGroupVerticalSnippet, + toggleButtonGroupDisabledSnippet, +} from './snippets'; +import { + ToggleButtonGroupSingle, + ToggleButtonGroupMultiple, + ToggleButtonGroupVertical, + ToggleButtonGroupDisabled, + ToggleButtonGroupDisallowEmpty, + ToggleButtonGroupIcons, + ToggleButtonGroupIconsOnly, + ToggleButtonGroupSurfaces, +} from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { ToggleButtonGroupDefinition } from '../../../utils/definitions'; + +export const reactAriaUrls = { + toggleButtonGroup: 'https://react-aria.adobe.com/ToggleButtonGroup', +}; + + + +} + code={toggleButtonGroupHeroSnippet} +/> + +## Usage + + + +## API reference + + + + + +## Examples + +### Surfaces + +} + code={toggleButtonGroupSurfacesSnippet} +/> + +### Single selection + +} + code={toggleButtonGroupSingleSnippet} + layout="side-by-side" +/> + +### Multiple selection + +} + code={toggleButtonGroupMultipleSnippet} + layout="side-by-side" +/> + +### Icons and text + +} + code={toggleButtonGroupIconsSnippet} + layout="side-by-side" +/> + +### Icons only + +} + code={toggleButtonGroupIconsOnlySnippet} + layout="side-by-side" +/> + +### Disallow empty selection + +} + code={toggleButtonGroupDisallowEmptySnippet} + layout="side-by-side" +/> + +### Vertical orientation + +} + code={toggleButtonGroupVerticalSnippet} + layout="side-by-side" +/> + +### Disabled + +} + code={toggleButtonGroupDisabledSnippet} + layout="side-by-side" +/> + + + + diff --git a/docs-ui/src/app/components/toggle-button-group/props-definition.ts b/docs-ui/src/app/components/toggle-button-group/props-definition.ts new file mode 100644 index 0000000000..8c8632709e --- /dev/null +++ b/docs-ui/src/app/components/toggle-button-group/props-definition.ts @@ -0,0 +1,51 @@ +import { + childrenPropDefs, + classNamePropDefs, + type PropDef, +} from '@/utils/propDefs'; + +export const toggleButtonGroupPropDefs: Record = { + selectionMode: { + type: 'enum', + values: ['single', 'multiple'], + description: 'Whether to allow single or multiple selection.', + }, + selectedKeys: { + type: 'enum', + values: ['Iterable'], + description: 'The currently selected keys (controlled).', + }, + defaultSelectedKeys: { + type: 'enum', + values: ['Iterable'], + description: 'The initial selected keys (uncontrolled).', + }, + onSelectionChange: { + type: 'enum', + values: ['(keys: Selection) => void'], + description: 'Handler called when the selection changes.', + }, + orientation: { + type: 'enum', + values: ['horizontal', 'vertical'], + default: 'horizontal', + description: 'The layout orientation of the button group.', + }, + disallowEmptySelection: { + type: 'boolean', + description: + 'Whether to prevent deselecting when at least one button is selected.', + }, + isDisabled: { + type: 'boolean', + default: 'false', + description: 'Disables all buttons in the group.', + }, + disabledKeys: { + type: 'enum', + values: ['Iterable'], + description: 'Keys of buttons that should be disabled.', + }, + ...childrenPropDefs, + ...classNamePropDefs, +}; diff --git a/docs-ui/src/app/components/toggle-button-group/snippets.ts b/docs-ui/src/app/components/toggle-button-group/snippets.ts new file mode 100644 index 0000000000..ce5d70784a --- /dev/null +++ b/docs-ui/src/app/components/toggle-button-group/snippets.ts @@ -0,0 +1,121 @@ +export const toggleButtonGroupHeroSnippet = ` + Dogs + Cats + Birds +`; + +export const toggleButtonGroupUsageSnippet = `import { ToggleButtonGroup, ToggleButton } from '@backstage/ui'; + + + Dogs + Cats + Birds +`; + +export const toggleButtonGroupSingleSnippet = ` + Dogs + Cats + Birds +`; + +export const toggleButtonGroupMultipleSnippet = ` + Frontend + Backend + Platform +`; + +export const toggleButtonGroupVerticalSnippet = ` + Morning + Afternoon + Evening +`; + +export const toggleButtonGroupDisabledSnippet = ` + Cat + Dog + Bird +`; + +export const toggleButtonGroupDisallowEmptySnippet = ` + One + Two + Three +`; + +export const toggleButtonGroupIconsSnippet = `import { RiCloudLine, RiStarFill, RiStarLine, RiArrowRightSLine } from '@remixicon/react'; + + + } /> + } + /> + }> + Star + + }> + Next + +`; + +export const toggleButtonGroupIconsOnlySnippet = `import { RiCloudLine, RiStarLine, RiArrowRightSLine } from '@remixicon/react'; + + + } /> + } /> + } /> +`; + +export const toggleButtonGroupSurfacesSnippet = ` + + Default + + + Option 1 + Option 2 + Option 3 + + + + + On Surface 0 + + + Option 1 + Option 2 + Option 3 + + + + + On Surface 1 + + + Option 1 + Option 2 + Option 3 + + + + + On Surface 2 + + + Option 1 + Option 2 + Option 3 + + + + + On Surface 3 + + + Option 1 + Option 2 + Option 3 + + + +`; diff --git a/docs-ui/src/app/components/toggle-button/components.tsx b/docs-ui/src/app/components/toggle-button/components.tsx new file mode 100644 index 0000000000..6fa5aada98 --- /dev/null +++ b/docs-ui/src/app/components/toggle-button/components.tsx @@ -0,0 +1,57 @@ +'use client'; + +import { ToggleButton } from '../../../../../packages/ui/src/components/ToggleButton/ToggleButton'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; +import { RiCheckLine } from '@remixicon/react'; +import { useState } from 'react'; + +export const Default = () => { + const [isSelected, setIsSelected] = useState(false); + return ( + + Toggle + + ); +}; + +export const WithIcon = () => { + const [isSelected, setIsSelected] = useState(false); + return ( + } + > + With Icon + + ); +}; + +export const Sizes = () => { + const [small, setSmall] = useState(false); + const [medium, setMedium] = useState(false); + + return ( + + + Small + + + Medium + + + ); +}; + +export const Disabled = () => { + return ( + + {}}> + Disabled Off + + {}}> + Disabled On + + + ); +}; diff --git a/docs-ui/src/app/components/toggle-button/page.mdx b/docs-ui/src/app/components/toggle-button/page.mdx new file mode 100644 index 0000000000..4b6aad90d1 --- /dev/null +++ b/docs-ui/src/app/components/toggle-button/page.mdx @@ -0,0 +1,68 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { CodeBlock } from '@/components/CodeBlock'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; +import { toggleButtonPropDefs } from './props-definition'; +import { + toggleButtonUsageSnippet, + defaultSnippet, + withIconSnippet, + sizesSnippet, + disabledSnippet, +} from './snippets'; +import { Default, WithIcon, Sizes, Disabled } from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; +import { ToggleButtonDefinition } from '../../../utils/definitions'; + +export const reactAriaUrls = { + toggleButton: 'https://react-aria.adobe.com/ToggleButton', +}; + + + +} code={defaultSnippet} /> + +## Usage + + + +## API reference + + + + + +## Examples + +### With icon + +} + code={withIconSnippet} +/> + +### Sizes + +} code={sizesSnippet} /> + +### Disabled + +} + code={disabledSnippet} +/> + + + + diff --git a/docs-ui/src/app/components/toggle-button/props-definition.ts b/docs-ui/src/app/components/toggle-button/props-definition.ts new file mode 100644 index 0000000000..7af4521bcb --- /dev/null +++ b/docs-ui/src/app/components/toggle-button/props-definition.ts @@ -0,0 +1,55 @@ +import { classNamePropDefs, type PropDef } from '@/utils/propDefs'; + +export const toggleButtonPropDefs: Record = { + isSelected: { + type: 'boolean', + description: + 'Whether the button is selected. Controls the visual pressed state.', + }, + defaultSelected: { + type: 'boolean', + description: 'The default selected state (uncontrolled).', + }, + onChange: { + type: 'enum', + values: ['(isSelected: boolean) => void'], + description: 'Handler called when the button is pressed.', + }, + size: { + type: 'enum', + values: ['small', 'medium'], + default: 'small', + responsive: true, + description: + 'Visual weight. Use small for compact layouts, medium for emphasis.', + }, + iconStart: { + type: 'enum', + values: ['ReactElement'], + description: + 'Icon displayed before the button text. Sized to match button.', + }, + iconEnd: { + type: 'enum', + values: ['ReactElement'], + description: 'Icon displayed after the button text. Sized to match button.', + }, + isDisabled: { + type: 'boolean', + default: 'false', + description: 'Prevents interaction and dims the button.', + }, + onSurface: { + type: 'enum', + values: ['Surface'], + responsive: true, + description: + 'Surface the button is placed on. Defaults to context surface.', + }, + children: { + type: 'enum', + values: ['ReactNode', '(renderProps) => ReactNode'], + description: 'Button label. Can be a function for dynamic content.', + }, + ...classNamePropDefs, +}; diff --git a/docs-ui/src/app/components/toggle-button/snippets.ts b/docs-ui/src/app/components/toggle-button/snippets.ts new file mode 100644 index 0000000000..d913e0702e --- /dev/null +++ b/docs-ui/src/app/components/toggle-button/snippets.ts @@ -0,0 +1,42 @@ +export const toggleButtonUsageSnippet = `import { ToggleButton } from '@backstage/ui'; +import { useState } from 'react'; + +const [isSelected, setIsSelected] = useState(false); + + + Toggle +`; + +export const defaultSnippet = `const [isSelected, setIsSelected] = useState(false); + + + Toggle +`; + +export const withIconSnippet = `const [isSelected, setIsSelected] = useState(false); + +} +> + With Icon +`; + +export const sizesSnippet = ` + + Small + + + Medium + +`; + +export const disabledSnippet = ` + {}}> + Disabled Off + + {}}> + Disabled On + +`; diff --git a/docs-ui/src/app/components/tooltip/components.tsx b/docs-ui/src/app/components/tooltip/components.tsx new file mode 100644 index 0000000000..67fc8c8d30 --- /dev/null +++ b/docs-ui/src/app/components/tooltip/components.tsx @@ -0,0 +1,40 @@ +'use client'; + +import { + TooltipTrigger, + Tooltip, +} from '../../../../../packages/ui/src/components/Tooltip/Tooltip'; +import { Button } from '../../../../../packages/ui/src/components/Button/Button'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; + +export const Default = () => { + return ( + + + Helpful information + + ); +}; + +export const Placement = () => { + return ( + + + + Top tooltip + + + + Right tooltip + + + + Bottom tooltip + + + + Left tooltip + + + ); +}; diff --git a/docs-ui/src/app/components/tooltip/page.mdx b/docs-ui/src/app/components/tooltip/page.mdx new file mode 100644 index 0000000000..8a9711d56c --- /dev/null +++ b/docs-ui/src/app/components/tooltip/page.mdx @@ -0,0 +1,65 @@ +import { PropsTable } from '@/components/PropsTable'; +import { Snippet } from '@/components/Snippet'; +import { CodeBlock } from '@/components/CodeBlock'; +import { ReactAriaLink } from '@/components/ReactAriaLink'; +import { tooltipTriggerPropDefs, tooltipPropDefs } from './props-definition'; +import { + tooltipUsageSnippet, + defaultSnippet, + placementSnippet, +} from './snippets'; +import { Default, Placement } from './components'; +import { PageTitle } from '@/components/PageTitle'; +import { Theming } from '@/components/Theming'; +import { TooltipDefinition } from '../../../utils/definitions'; +import { ChangelogComponent } from '@/components/ChangelogComponent'; + +export const reactAriaUrls = { + tooltip: 'https://react-aria.adobe.com/Tooltip', +}; + + + +} code={defaultSnippet} align="center" /> + +## Usage + + + +## API reference + +### TooltipTrigger + +Wraps the trigger element and tooltip content. + + + + + +### Tooltip + +The tooltip content that appears on hover or focus. + + + + + +## Examples + +### Placement + +The tooltip appears in the specified direction relative to the trigger. + +} + code={placementSnippet} + align="center" +/> + + + + diff --git a/docs-ui/src/app/components/tooltip/props-definition.tsx b/docs-ui/src/app/components/tooltip/props-definition.tsx new file mode 100644 index 0000000000..16dc9133dd --- /dev/null +++ b/docs-ui/src/app/components/tooltip/props-definition.tsx @@ -0,0 +1,79 @@ +import { + childrenPropDefs, + classNamePropDefs, + stylePropDefs, +} from '@/utils/propDefs'; +import type { PropDef } from '@/utils/propDefs'; +import { Chip } from '@/components/Chip'; + +export const tooltipTriggerPropDefs: Record = { + delay: { + type: 'number', + default: 600, + description: 'Milliseconds before tooltip appears on hover.', + }, + closeDelay: { + type: 'number', + default: 0, + description: 'Milliseconds before tooltip hides after leaving trigger.', + }, + trigger: { + type: 'enum', + values: ['focus'], + description: ( + <> + Set to focus for focus-only tooltips that do not appear on + hover. + + ), + }, + isOpen: { + type: 'boolean', + description: 'Controlled open state. Use with onOpenChange.', + }, + defaultOpen: { + type: 'boolean', + description: 'Initial open state for uncontrolled usage.', + }, + isDisabled: { + type: 'boolean', + description: 'Prevents the tooltip from appearing.', + }, + ...childrenPropDefs, +}; + +export const tooltipPropDefs: Record = { + placement: { + type: 'enum', + values: [ + 'top', + 'top start', + 'top end', + 'bottom', + 'bottom start', + 'bottom end', + 'left', + 'left top', + 'left bottom', + 'right', + 'right top', + 'right bottom', + ], + default: 'top', + description: + 'Position relative to the trigger element. Compound placements include alignment.', + }, + offset: { + type: 'number', + default: 4, + description: 'Distance in pixels from the trigger element.', + }, + containerPadding: { + type: 'number', + default: 12, + description: 'Padding from viewport edge when repositioning.', + }, + ...childrenPropDefs, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/app/components/tooltip/snippets.ts b/docs-ui/src/app/components/tooltip/snippets.ts new file mode 100644 index 0000000000..68b7d1b0c7 --- /dev/null +++ b/docs-ui/src/app/components/tooltip/snippets.ts @@ -0,0 +1,30 @@ +export const tooltipUsageSnippet = `import { TooltipTrigger, Tooltip, Button } from '@backstage/ui'; + + + + Helpful information +`; + +export const defaultSnippet = ` + + Helpful information +`; + +export const placementSnippet = ` + + + Top tooltip + + + + Right tooltip + + + + Bottom tooltip + + + + Left tooltip + +`; diff --git a/docs-ui/src/app/components/visually-hidden/components.tsx b/docs-ui/src/app/components/visually-hidden/components.tsx new file mode 100644 index 0000000000..8298465240 --- /dev/null +++ b/docs-ui/src/app/components/visually-hidden/components.tsx @@ -0,0 +1,39 @@ +'use client'; + +import { VisuallyHidden } from '../../../../../packages/ui/src/components/VisuallyHidden/VisuallyHidden'; +import { Text } from '../../../../../packages/ui/src/components/Text/Text'; +import { Flex } from '../../../../../packages/ui/src/components/Flex/Flex'; + +export const Default = () => { + return ( + + + This text is followed by a paragraph that is visually hidden but + accessible to screen readers. Try using a screen reader to hear it, or + inspect the DOM to see it's there. + + + This content is visually hidden but accessible to screen readers + + + ); +}; + +export const ExampleUsage = () => { + return ( + + + Footer links + + + About us + + + Jobs + + + Terms and Conditions + + + ); +}; diff --git a/docs-ui/src/content/visually-hidden.mdx b/docs-ui/src/app/components/visually-hidden/page.mdx similarity index 56% rename from docs-ui/src/content/visually-hidden.mdx rename to docs-ui/src/app/components/visually-hidden/page.mdx index 72ffc7a1d4..c72250231f 100644 --- a/docs-ui/src/content/visually-hidden.mdx +++ b/docs-ui/src/app/components/visually-hidden/page.mdx @@ -1,16 +1,16 @@ import { PropsTable } from '@/components/PropsTable'; import { Snippet } from '@/components/Snippet'; import { CodeBlock } from '@/components/CodeBlock'; -import { VisuallyHiddenSnippet } from '@/snippets/stories-snippets'; +import { visuallyHiddenPropDefs } from './props-definition'; import { - visuallyHiddenPropDefs, visuallyHiddenUsageSnippet, - visuallyHiddenDefaultSnippet, - visuallyHiddenExampleUsageSnippet, -} from './visually-hidden.props'; + defaultSnippet, + exampleUsageSnippet, +} from './snippets'; +import { Default, ExampleUsage } from './components'; import { PageTitle } from '@/components/PageTitle'; import { Theming } from '@/components/Theming'; -import { VisuallyHiddenDefinition } from '../utils/definitions'; +import { VisuallyHiddenDefinition } from '../../../utils/definitions'; import { ChangelogComponent } from '@/components/ChangelogComponent'; -} - code={visuallyHiddenDefaultSnippet} -/> +} code={defaultSnippet} /> ## Usage @@ -33,17 +28,17 @@ import { ChangelogComponent } from '@/components/ChangelogComponent'; +This component also accepts all standard HTML `div` attributes. + ## Examples -### Example Usage - -Here's an example of providing screen reader context for a list of links in a footer. +### Hidden headings } - code={visuallyHiddenExampleUsageSnippet} + preview={} + code={exampleUsageSnippet} open /> diff --git a/docs-ui/src/app/components/visually-hidden/props-definition.ts b/docs-ui/src/app/components/visually-hidden/props-definition.ts new file mode 100644 index 0000000000..140ed45fa4 --- /dev/null +++ b/docs-ui/src/app/components/visually-hidden/props-definition.ts @@ -0,0 +1,17 @@ +import { + classNamePropDefs, + stylePropDefs, + type PropDef, +} from '@/utils/propDefs'; + +export const visuallyHiddenPropDefs: Record = { + children: { + type: 'enum', + values: ['ReactNode'], + responsive: false, + description: + 'Content to hide visually while remaining accessible to screen readers.', + }, + ...classNamePropDefs, + ...stylePropDefs, +}; diff --git a/docs-ui/src/content/visually-hidden.props.ts b/docs-ui/src/app/components/visually-hidden/snippets.ts similarity index 63% rename from docs-ui/src/content/visually-hidden.props.ts rename to docs-ui/src/app/components/visually-hidden/snippets.ts index 18a1c503d1..21ce6a04de 100644 --- a/docs-ui/src/content/visually-hidden.props.ts +++ b/docs-ui/src/app/components/visually-hidden/snippets.ts @@ -1,26 +1,10 @@ -import { - classNamePropDefs, - stylePropDefs, - type PropDef, -} from '@/utils/propDefs'; - -export const visuallyHiddenPropDefs: Record = { - children: { - type: 'enum', - values: ['ReactNode'], - responsive: false, - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - export const visuallyHiddenUsageSnippet = `import { VisuallyHidden } from '@backstage/ui'; This content is visually hidden but accessible to screen readers `; -export const visuallyHiddenDefaultSnippet = ` +export const defaultSnippet = ` This text is followed by a paragraph that is visually hidden but accessible to screen readers. Try using a screen reader to hear it, or @@ -31,7 +15,7 @@ export const visuallyHiddenDefaultSnippet = ` `; -export const visuallyHiddenExampleUsageSnippet = ` +export const exampleUsageSnippet = ` Footer links diff --git a/docs-ui/src/app/get-started/installation/page.mdx b/docs-ui/src/app/get-started/installation/page.mdx new file mode 100644 index 0000000000..cdb14d5924 --- /dev/null +++ b/docs-ui/src/app/get-started/installation/page.mdx @@ -0,0 +1,46 @@ +import { CodeBlock } from '@/components/CodeBlock'; +import { Banner } from '@/components/Banner'; +import { snippet } from './snippets'; + +# Installation + +## Import BUI's global styles + +Backstage UI works by importing a global CSS file at the root of your application. This file includes all the default styles for the components. +First, you'll need to install the package using a package manager. For example, if you're using Yarn: + + + +);`} +/> + + + +## Use BUI components + +As a plugin maintainer, you can use BUI components in your plugin. As mentioned above, you should not import the styles +again in your plugin as this will be handled at the root of your application. To get started, just add the library to +your plugin and import the components you need. + + + + diff --git a/docs-ui/src/app/get-started/installation/snippets.ts b/docs-ui/src/app/get-started/installation/snippets.ts new file mode 100644 index 0000000000..7e63005172 --- /dev/null +++ b/docs-ui/src/app/get-started/installation/snippets.ts @@ -0,0 +1,6 @@ +export const snippet = `import { Flex, Button, Text } from '@backstage/ui'; + + + Hello World + +;`; diff --git a/docs-ui/src/app/icon.svg b/docs-ui/src/app/icon.svg index b50d29e902..18824daaa7 100644 --- a/docs-ui/src/app/icon.svg +++ b/docs-ui/src/app/icon.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/docs-ui/src/app/layout.tsx b/docs-ui/src/app/layout.tsx index ad056626d8..a0f8ae5816 100644 --- a/docs-ui/src/app/layout.tsx +++ b/docs-ui/src/app/layout.tsx @@ -8,8 +8,8 @@ import { MobileBottomNav } from '@/components/MobileBottomNav'; import styles from './layout.module.css'; import '../css/globals.css'; -import '/public/theme-backstage.css'; -import '/public/theme-spotify.css'; +import '../css/theme-backstage.css'; +import '../css/theme-spotify.css'; export const metadata: Metadata = { title: 'Backstage UI', @@ -49,6 +49,10 @@ export default async function RootLayout({ data-theme-name="backstage" suppressHydrationWarning > + + + + diff --git a/docs-ui/src/app/page.mdx b/docs-ui/src/app/page.mdx index 9a796b401b..712a5ac5c6 100644 --- a/docs-ui/src/app/page.mdx +++ b/docs-ui/src/app/page.mdx @@ -1,59 +1,78 @@ +import { ComponentGrid } from '@/components/ComponentGrid'; import { CodeBlock } from '@/components/CodeBlock'; -import { Banner } from '@/components/Banner'; -import { snippet } from './snippets'; +import { ColorFamily } from '@/components/ColorFamily'; +import { + surfacesSnippet, + adaptiveSnippet, + customCardSnippet, + customTokensSnippet, + colorPickerSnippet, +} from './snippets'; -# Welcome to Backstage UI +# Get Started with BUI Backstage UI is a design system created specifically for Backstage, built with React, TypeScript, and vanilla CSS. This open-source library is hosted in the Backstage monorepo. While it can be used in other projects, Backstage UI is designed to deliver a consistent, accessible, and extensible experience tailored to Backstage users. -## Import BUI's global styles +Backstage UI is installed by default on every instance of Backstage, so you can start using it right away. +If your setup doesn't include it yet, follow the [installation guide](/get-started/installation) to get started. -Backstage UI works by importing a global CSS file at the root of your application. This file includes all the default styles for the components. -First, you'll need to install the package using a package manager. For example, if you're using Yarn: +## Layout containers - +[`Box`](/components/box), [`Flex`](/components/flex), [`Grid`](/components/grid), and [`Card`](/components/card) are the foundation of every layout in Backstage UI. +Each one offers a set of utility props that map directly to our design tokens, so you can build consistent +layouts without writing any CSS. When nested, they also act as surfaces and automatically increment the +background depth so visual hierarchy is handled for you. );`} + title="Nested surfaces with automatic styling" + code={surfacesSnippet} /> - +## Adaptive components -## Use BUI components - -As a plugin maintainer, you can use BUI components in your plugin. As mentioned above, you should not import the styles -again in your plugin as this will be handled at the root of your application. To get started, just add the library to -your plugin and import the components you need. +Components like [`Card`](/components/card), [`Button`](/components/button), [`Text`](/components/text), and others are **adaptive components**. They +automatically adjust their colors, borders, and backgrounds to match the surface they live on. Drop a +[`Button`](/components/button) inside a [`Card`](/components/card) inside a [`Box`](/components/box) and each component styles itself appropriately +without any extra configuration. - +## The neutral scale background colors -## Support + -Now that you have the basics down, you can start building your plugin using the new design system. -Please familiarise yourself first with our theming principles. This will help you understand the core concepts of the design system. -If you have any questions, please reach out to us on [Discord](https://discord.gg/MUpMjP2). +## Creating custom components + +As much as possible we would like you to use components directly without creating custom components. If you need to create a custom component, you should use the components provided by Backstage UI. + + + +If you need to build custom components outside of BUI, you can use our [design tokens](/tokens) as CSS variables to ensure your styles stay consistent with the rest of the system. + + + +When building custom interactive components, we strongly recommend using [React Aria](https://react-spectrum.adobe.com/react-aria/) as your foundation. React Aria provides all the necessary accessibility features out of the box — keyboard navigation, focus management, ARIA attributes, and screen reader support — so you can focus on styling and logic without worrying about compliance. + + ## Philosophy diff --git a/docs-ui/src/app/snippets.ts b/docs-ui/src/app/snippets.ts index 7e63005172..e16463a085 100644 --- a/docs-ui/src/app/snippets.ts +++ b/docs-ui/src/app/snippets.ts @@ -1,6 +1,39 @@ -export const snippet = `import { Flex, Button, Text } from '@backstage/ui'; +export const surfacesSnippet = ` + + + + + + +`; - +export const adaptiveSnippet = ` + {/* automatically set background to neutral-2 */} + + +`; + +export const customCardSnippet = ` Hello World - -;`; +`; + +export const customTokensSnippet = `
+
Hello World
+
`; + +export const colorPickerSnippet = `import { ColorPicker, ColorArea, ColorSlider, ColorField } from 'react-aria-components'; + +function MyColorPicker() { + return ( + + + + + + ); +}`; diff --git a/docs-ui/src/app/tokens/page.mdx b/docs-ui/src/app/tokens/page.mdx index 8e9031c81c..f359c10525 100644 --- a/docs-ui/src/app/tokens/page.mdx +++ b/docs-ui/src/app/tokens/page.mdx @@ -107,8 +107,6 @@ the value, you add an object with the value and the breakpoint prefix. ## Base colors -These colors are used for special purposes like ring, scrollbar, ... - @@ -133,62 +131,15 @@ These colors are used for special purposes like ring, scrollbar, ... Pure white color. This one should be the same in light and dark themes. - - - --bui-gray-1 - - You can use these mostly for backgrounds colors. - - - - --bui-gray-2 - - You can use these mostly for backgrounds colors. - - - - --bui-gray-3 - - You can use these mostly for backgrounds colors. - - - - --bui-gray-4 - - You can use these mostly for backgrounds colors. - - - - --bui-gray-5 - - You can use these mostly for backgrounds colors. - - - - --bui-gray-6 - - You can use these mostly for backgrounds colors. - - - - --bui-gray-7 - - You can use these mostly for backgrounds colors. - - - - --bui-gray-8 - - You can use these mostly for backgrounds colors. - -## Core background colors +## Neutral background colors -These colors are used for the background of your application. We are mostly using for now a -single elevated background for panels. `--bui-bg` should mostly use as the main background -color of your app. +These colors form a layered neutral scale for your application backgrounds. +`--bui-bg-app` is the base background color of your app. Each subsequent level +(1 through 4) represents an elevated layer on top of the previous one, with hover, +pressed, and disabled variants for interactive states. @@ -200,22 +151,129 @@ color of your app. - --bui-bg + --bui-bg-app + + + The base background color of your Backstage instance. - The background color of your Backstage instance. - --bui-bg-surface-1 + --bui-bg-neutral-1 + + + First elevated layer. Use for cards, dialogs, and panels. - Use for any panels or elevated surfaces. - --bui-bg-surface-2 + --bui-bg-neutral-1-hover - Use for any panels or elevated surfaces. + Hover state for elements on neutral-1. + + + --bui-bg-neutral-1-pressed + + Pressed state for elements on neutral-1. + + + + --bui-bg-neutral-1-disabled + + Disabled state for elements on neutral-1. + + + + --bui-bg-neutral-2 + + + Second elevated layer. Use for elements on top of neutral-1. + + + + + --bui-bg-neutral-2-hover + + Hover state for elements on neutral-2. + + + + --bui-bg-neutral-2-pressed + + Pressed state for elements on neutral-2. + + + + --bui-bg-neutral-2-disabled + + Disabled state for elements on neutral-2. + + + + --bui-bg-neutral-3 + + + Third elevated layer. Use for elements on top of neutral-2. + + + + + --bui-bg-neutral-3-hover + + Hover state for elements on neutral-3. + + + + --bui-bg-neutral-3-pressed + + Pressed state for elements on neutral-3. + + + + --bui-bg-neutral-3-disabled + + Disabled state for elements on neutral-3. + + + + --bui-bg-neutral-4 + + + Fourth elevated layer. Use for elements on top of neutral-3. + + + + + --bui-bg-neutral-4-hover + + Hover state for elements on neutral-4. + + + + --bui-bg-neutral-4-pressed + + Pressed state for elements on neutral-4. + + + + --bui-bg-neutral-4-disabled + + Disabled state for elements on neutral-4. + + + + +## Solid background colors + + + + + Prop + Description + + + --bui-bg-solid @@ -240,30 +298,19 @@ color of your app. Used for solid background colors when disabled. - - - --bui-bg-tint - - Used for tint background colors. - - - - --bui-bg-tint-hover - - Used for tint background colors when hovered. - - - - --bui-bg-tint-focus - - Used for tint background colors when active. - - - - --bui-bg-tint-disabled - - Used for tint background colors when disabled. - + + + +## Status background colors + + + + + Prop + Description + + + --bui-bg-danger @@ -282,6 +329,12 @@ color of your app. Used to show success information. + + + --bui-bg-info + + Used to show informational content. + @@ -315,22 +368,6 @@ are prefixed with `fg` to make it easier to identify. It should be used on top of main background surfaces. - - - --bui-fg-link - - - It should be used on top of main background surfaces. - - - - - --bui-fg-link-hover - - - It should be used on top of main background surfaces. - - --bui-fg-disabled @@ -347,33 +384,45 @@ are prefixed with `fg` to make it easier to identify. It should be used on top of solid background colors. - - - --bui-fg-tint - - - It should be used on top of tint background colors. - - - - - --bui-fg-tint-disabled - - - It should be used on top of tint background colors when disabled. - - --bui-fg-danger + Used for error states and destructive actions. + + + + --bui-fg-warning + + + Used for warning states and cautionary information. + + + + + --bui-fg-success + + Used for success states and positive feedback. + + + + --bui-fg-info + + + Used for informational content and neutral status. + + + + + --bui-fg-danger-on-bg + It should be used on top of danger background colors. - --bui-fg-warning + --bui-fg-warning-on-bg It should be used on top of warning background colors. @@ -381,12 +430,20 @@ are prefixed with `fg` to make it easier to identify. - --bui-fg-success + --bui-fg-success-on-bg It should be used on top of success background colors. + + + --bui-fg-info-on-bg + + + It should be used on top of info background colors. + + @@ -405,31 +462,15 @@ low contrast to help as a separator with the different background colors. - --bui-border + --bui-border-1 - It should be used on top of `--bui-bg-surface-1`. + Subtle border for low-contrast separators. - --bui-border-hover + --bui-border-2 - - Used when the component is interactive and hovered. - - - - - --bui-border-pressed - - - Used when the component is interactive and focused. - - - - - --bui-border-disabled - - Used when the component is disabled. + It should be used on top of `--bui-bg-neutral-1`. @@ -449,6 +490,12 @@ low contrast to help as a separator with the different background colors. It should be used on top of `--bui-bg-success`. + + + --bui-border-info + + It should be used on top of `--bui-bg-info`. + diff --git a/docs-ui/src/components/Changelog/index.tsx b/docs-ui/src/components/Changelog/index.tsx index d7a547b901..c1f3a5660b 100644 --- a/docs-ui/src/components/Changelog/index.tsx +++ b/docs-ui/src/components/Changelog/index.tsx @@ -1,76 +1,21 @@ import { changelog } from '@/utils/changelog'; import { MDXRemote } from 'next-mdx-remote-client/rsc'; import { formattedMDXComponents } from '@/mdx-components'; +import { Badge, BreakingBadge, generateChangelogMarkdown } from './utils'; export function Changelog() { - // Group changelog entries by version - const groupedChangelog = changelog.reduce((acc, entry) => { - if (!acc[entry.version]) { - acc[entry.version] = []; - } - acc[entry.version].push(entry); - return acc; - }, {} as Record); + const content = generateChangelogMarkdown(changelog, { + showComponentBadges: true, + }); - // Sort versions in descending order - const sortedVersions = Object.keys(groupedChangelog).sort((a, b) => - b.localeCompare(a), + return ( + ); - - const content = sortedVersions - .map(version => { - const entries = groupedChangelog[version]; - - // Group entries by bump type - const groupedByBump = entries.reduce((acc, entry) => { - const bumpType = entry.type || 'other'; - if (!acc[bumpType]) { - acc[bumpType] = []; - } - acc[bumpType].push(entry); - return acc; - }, {} as Record); - - // Define the order of bump types - const bumpOrder = ['breaking', 'new', 'fix', 'other']; - - const bumpSections = bumpOrder - .filter(bumpType => groupedByBump[bumpType]?.length > 0) - .map(bumpType => { - const bumpEntries = groupedByBump[bumpType]; - let sectionTitle = 'Other Changes'; - if (bumpType === 'breaking') { - sectionTitle = 'Breaking Changes'; - } else if (bumpType === 'new') { - sectionTitle = 'New Features'; - } else if (bumpType === 'fix') { - sectionTitle = 'Bug Fixes'; - } - - return `### ${sectionTitle} - - ${bumpEntries - .map(e => { - const prs = - e.prs.length > 0 - ? e.prs - .map( - pr => - `[#${pr}](https://github.com/backstage/backstage/pull/${pr})`, - ) - .join(', ') - : ''; - return `- ${e.description}${prs ? ` ${prs}` : ''}`; - }) - .join('\n')}`; - }) - .join('\n\n'); - - return `## Version ${version} - - ${bumpSections}`; - }) - .join('\n'); - - return ; } diff --git a/docs-ui/src/components/Changelog/utils.tsx b/docs-ui/src/components/Changelog/utils.tsx new file mode 100644 index 0000000000..d2daed1176 --- /dev/null +++ b/docs-ui/src/components/Changelog/utils.tsx @@ -0,0 +1,185 @@ +import type { ChangelogProps } from '@/utils/types'; + +// Badge Components +export const Badge = ({ + children, + variant = 'gray', +}: { + children: React.ReactNode; + variant?: 'red' | 'gray'; +}) => { + const colors = { + red: { + backgroundColor: 'var(--badge-red-bg)', + color: 'var(--badge-red-color)', + }, + gray: { + backgroundColor: 'var(--badge-gray-bg)', + color: 'var(--badge-gray-color)', + }, + }; + + return ( + + {children} + + ); +}; + +export const BreakingBadge = () => Breaking; + +// Utility Functions +export const toTitleCase = (kebabCase: string): string => { + return kebabCase + .split('-') + .map(word => word.charAt(0).toLocaleUpperCase('en-US') + word.slice(1)) + .join(' '); +}; + +export const groupByVersion = ( + entries: ChangelogProps[], +): Record => { + return entries.reduce((acc, entry) => { + if (!acc[entry.version]) { + acc[entry.version] = []; + } + acc[entry.version].push(entry); + return acc; + }, {} as Record); +}; + +export const sortVersions = (versions: string[]): string[] => { + return versions.sort((a, b) => { + const aParts = a.split('.').map(Number); + const bParts = b.split('.').map(Number); + + for (let i = 0; i < 3; i++) { + if (bParts[i] !== aParts[i]) { + return bParts[i] - aParts[i]; // Descending order + } + } + return 0; + }); +}; + +export const formatPRLinks = (prs: string[]): string => { + if (prs.length === 0) return ''; + + return prs + .map(pr => `[#${pr}](https://github.com/backstage/backstage/pull/${pr})`) + .join(', '); +}; + +export const generateEntryMarkdown = ( + entry: ChangelogProps, + options: { showComponentBadges?: boolean } = {}, +): string => { + const { showComponentBadges = true } = options; + const prs = formatPRLinks(entry.prs); + + // Prepend component names as badges if available and requested + const componentBadges = + showComponentBadges && entry.components.length > 0 + ? entry.components + .map(c => `${toTitleCase(c)}`) + .join(' ') + ' ' + : ''; + + // Add breaking badge if this is a breaking change + const breakingBadge = entry.breaking ? ' ' : ''; + + // Remove **BREAKING**: text from description since we show it as a badge + const description = entry.description.replace(/\*\*BREAKING\*\*:?\s*/, ''); + + // Build the entry + let entryMarkdown = `- ${componentBadges}${breakingBadge}${description}`; + if (prs) { + entryMarkdown += ` ${prs}`; + } + + // Add migration if present (should already be in description, but check) + if (entry.migration && !entry.description.includes('**Migration:**')) { + entryMarkdown += `\n\n Migration Guide:\n\n ${entry.migration + .split('\n') + .join('\n ')}`; + } + + return entryMarkdown; +}; + +export interface GenerateChangelogOptions { + showComponentBadges?: boolean; + headingLevel?: number; +} + +export const generateChangelogMarkdown = ( + entries: ChangelogProps[], + options: GenerateChangelogOptions = {}, +): string => { + const { showComponentBadges = true, headingLevel = 2 } = options; + + // Group changelog entries by version + const groupedChangelog = groupByVersion(entries); + + // Sort versions in descending order (semantic versioning) + const sortedVersions = sortVersions(Object.keys(groupedChangelog)); + + // Generate heading prefix based on level (e.g., "##" for level 2, "###" for level 3) + const versionHeading = '#'.repeat(headingLevel); + const sectionHeading = '#'.repeat(headingLevel + 1); + + const content = sortedVersions + .map(version => { + const versionEntries = groupedChangelog[version]; + + // Group entries: Breaking vs Everything Else + const breakingChanges = versionEntries.filter(e => e.breaking); + const otherChanges = versionEntries.filter(e => !e.breaking); + + const sections = []; + + // Breaking changes section + if (breakingChanges.length > 0) { + sections.push({ + title: 'Breaking Changes', + entries: breakingChanges, + }); + } + + // All other changes section + if (otherChanges.length > 0) { + sections.push({ + title: 'Changes', + entries: otherChanges, + }); + } + + const bumpSections = sections + .map(({ title, entries: sectionEntries }) => { + const entriesMarkdown = sectionEntries + .map(e => generateEntryMarkdown(e, { showComponentBadges })) + .join('\n\n'); + + return `${sectionHeading} ${title}\n\n${entriesMarkdown}`; + }) + .join('\n\n'); + + return `${versionHeading} Version ${version} + + ${bumpSections}`; + }) + .join('\n'); + + return content; +}; diff --git a/docs-ui/src/components/ChangelogComponent/index.tsx b/docs-ui/src/components/ChangelogComponent/index.tsx index ff86433268..92068d04f8 100644 --- a/docs-ui/src/components/ChangelogComponent/index.tsx +++ b/docs-ui/src/components/ChangelogComponent/index.tsx @@ -2,34 +2,32 @@ import { changelog } from '@/utils/changelog'; import { MDXRemote } from 'next-mdx-remote-client/rsc'; import { formattedMDXComponents } from '@/mdx-components'; import type { Component } from '@/utils/changelog'; +import { + Badge, + BreakingBadge, + generateChangelogMarkdown, +} from '../Changelog/utils'; export const ChangelogComponent = ({ component }: { component: Component }) => { const componentChangelog = changelog.filter(c => c.components.includes(component), ); + const content = `## Changelog + +${generateChangelogMarkdown(componentChangelog, { + showComponentBadges: false, + headingLevel: 3, +})}`; + return ( { - const prs = - change.prs.length > 0 - ? change.prs - .map( - pr => - `[#${pr}](https://github.com/backstage/backstage/pull/${pr})`, - ) - .join(', ') - : ''; - return `- \`${change.version}\` - ${change.description}${ - prs ? ` ${prs}` : '' - }`; - }) - .join('\n')}`} + components={{ + ...formattedMDXComponents, + Badge, + BreakingBadge, + }} + source={content} /> ); }; diff --git a/docs-ui/src/components/Chip/styles.module.css b/docs-ui/src/components/Chip/styles.module.css index 01ee29311d..d752ae2602 100644 --- a/docs-ui/src/components/Chip/styles.module.css +++ b/docs-ui/src/components/Chip/styles.module.css @@ -1,11 +1,9 @@ .chip { - display: inline-flex; - align-items: center; + display: inline-block; font-family: monospace; font-size: 13px; border-radius: 6px; - padding: 0px 8px; - height: 24px; + padding: 4px 8px; margin-right: 4px; background-color: #f0f0f0; color: #5d5d5d; diff --git a/docs-ui/src/components/ColorFamily/ColorFamily.module.css b/docs-ui/src/components/ColorFamily/ColorFamily.module.css new file mode 100644 index 0000000000..f38e481383 --- /dev/null +++ b/docs-ui/src/components/ColorFamily/ColorFamily.module.css @@ -0,0 +1,94 @@ +.wrapper { + display: flex; + flex-direction: column; + gap: 2rem; + margin-top: 1rem; + margin-bottom: 2rem; +} + +@media (min-width: 768px) { + .wrapper { + flex-direction: row; + align-items: flex-start; + } +} + +.visual { + flex: 1; + min-width: 0; +} + +.text { + flex: 1; + min-width: 0; +} + +.base { + border-radius: 12px; + padding: 16px; +} + +.baseLabel { + display: block; + font-size: 13px; + color: var(--bui-fg-primary); + margin-bottom: 12px; +} + +.level { + border-radius: 10px; + padding: 12px; +} + +.levelHeader { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 12px; +} + +.level > .level > .levelHeader:last-child, +.level:not(:has(> .level)) > .levelHeader { + margin-bottom: 0; +} + +.levelLabel { + font-size: 13px; + color: var(--bui-fg-primary); + white-space: nowrap; +} + +.chips { + display: flex; + gap: 6px; +} + +.chip { + padding: 6px 10px; + border-radius: 6px; + font-size: 11px; + font-weight: 500; + color: var(--bui-fg-primary); + white-space: nowrap; +} + +.description { + color: var(--primary); + margin-top: 0; + margin-bottom: 1rem; + font-size: 1rem; + line-height: 1.5; +} + +.description:last-child { + margin-bottom: 0; +} + +.link { + color: var(--link); + text-decoration: none; + + &:hover { + text-decoration: underline; + } +} diff --git a/docs-ui/src/components/ColorFamily/ColorFamily.tsx b/docs-ui/src/components/ColorFamily/ColorFamily.tsx new file mode 100644 index 0000000000..07b8779503 --- /dev/null +++ b/docs-ui/src/components/ColorFamily/ColorFamily.tsx @@ -0,0 +1,97 @@ +'use client'; + +import styles from './ColorFamily.module.css'; + +const StateChip = ({ + level, + state, + label, +}: { + level: number; + state: string; + label: string; +}) => ( +
+ {label} +
+); + +const NeutralLevel = ({ + level, + children, + height, +}: { + level: number; + children?: React.ReactNode; + height?: number; +}) => ( +
+
+ Neutral {level} +
+ + + +
+
+ {children} +
+); + +export const ColorFamily = () => { + return ( +
+
+
+ Neutral 0 + + + + + + + +
+
+
+

+ BUI uses a layered neutral scale from 0 to 4. Each level nests inside + the previous one, automatically incrementing the background depth. + This creates clear visual hierarchy without manually picking colors. +

+

+ Neutral 0 is the application background and should only be used once, + at the root of your app. All other surfaces build on top of it. +

+

+ Each level can be interactive or{' '} + non-interactive. A Card, for example, can be flat + (just a surface) or fully clickable with hover and pressed states. The + three interaction states (hover, pressed, disabled) are built into + every neutral level. +

+

+ Explore the full list of color tokens on the{' '} + + tokens page + + . +

+
+
+ ); +}; diff --git a/docs-ui/src/components/ColorFamily/index.ts b/docs-ui/src/components/ColorFamily/index.ts new file mode 100644 index 0000000000..12f7fb4008 --- /dev/null +++ b/docs-ui/src/components/ColorFamily/index.ts @@ -0,0 +1 @@ +export { ColorFamily } from './ColorFamily'; diff --git a/docs-ui/src/components/CommandPalette/CommandPalette.module.css b/docs-ui/src/components/CommandPalette/CommandPalette.module.css new file mode 100644 index 0000000000..dbbdb72ceb --- /dev/null +++ b/docs-ui/src/components/CommandPalette/CommandPalette.module.css @@ -0,0 +1,154 @@ +.overlay { + position: fixed; + inset: 0; + z-index: 200; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + align-items: flex-start; + justify-content: center; + padding-top: 15vh; + + &[data-entering] { + animation: overlayFadeIn 200ms ease-out; + } + + &[data-exiting] { + animation: overlayFadeOut 150ms ease-in; + } +} + +@keyframes overlayFadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes overlayFadeOut { + from { + opacity: 1; + } + to { + opacity: 0; + } +} + +.modal { + width: min(90vw, 500px); + max-height: min(70vh, 400px); + background-color: var(--bg); + border: 1px solid var(--border); + border-radius: 12px; + box-shadow: 0 16px 48px rgba(0, 0, 0, 0.2); + display: flex; + flex-direction: column; + outline: none; + overflow: hidden; + + &[data-entering] { + animation: modalScaleIn 200ms ease-out; + } + + &[data-exiting] { + animation: modalScaleOut 150ms ease-in; + } +} + +@keyframes modalScaleIn { + from { + opacity: 0; + transform: scale(0.95) translateY(-8px); + } + to { + opacity: 1; + transform: scale(1) translateY(0); + } +} + +@keyframes modalScaleOut { + from { + opacity: 1; + transform: scale(1) translateY(0); + } + to { + opacity: 0; + transform: scale(0.95) translateY(-8px); + } +} + +.dialog { + display: flex; + flex-direction: column; + height: 100%; + max-height: min(70vh, 400px); + outline: none; + overflow: hidden; +} + +.searchField { + display: flex; + align-items: center; + padding: 12px 16px; + border-bottom: 1px solid var(--border); + flex-shrink: 0; +} + +.srOnly { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +.input { + width: 100%; + background: transparent; + border: none; + outline: none; + font-size: 1rem; + color: var(--primary); + font-family: inherit; + + &::placeholder { + color: var(--secondary); + } +} + +.menu { + flex: 1; + overflow-y: auto; + padding: 8px; + outline: none; + border: none; +} + +.menuItem { + padding: 8px 12px; + border-radius: 8px; + color: var(--primary); + cursor: pointer; + font-size: 0.875rem; + outline: none; + + &[data-focused] { + background-color: var(--action); + } + + &[data-pressed] { + background-color: var(--action); + } +} + +.empty { + padding: 24px 12px; + text-align: center; + color: var(--secondary); + font-size: 0.875rem; +} diff --git a/docs-ui/src/components/CommandPalette/CommandPalette.tsx b/docs-ui/src/components/CommandPalette/CommandPalette.tsx new file mode 100644 index 0000000000..bcc534372a --- /dev/null +++ b/docs-ui/src/components/CommandPalette/CommandPalette.tsx @@ -0,0 +1,76 @@ +'use client'; + +import { + Autocomplete, + Dialog, + Input, + Label, + Menu, + MenuItem, + Modal, + ModalOverlay, + SearchField, + useFilter, +} from 'react-aria-components'; +import { useRouter } from 'next/navigation'; +import { components } from '@/utils/data'; +import styles from './CommandPalette.module.css'; + +interface CommandPaletteProps { + isOpen: boolean; + onOpenChange: (isOpen: boolean) => void; +} + +const items = components.map(c => ({ id: c.slug, ...c })); + +export const CommandPalette = ({ + isOpen, + onOpenChange, +}: CommandPaletteProps) => { + const router = useRouter(); + const { contains } = useFilter({ sensitivity: 'base' }); + + return ( + + + + + + + + + { + router.push(`/components/${key}`); + onOpenChange(false); + }} + renderEmptyState={() => ( +
No components found.
+ )} + > + {item => ( + + {item.title} + + )} +
+
+
+
+
+ ); +}; diff --git a/docs-ui/src/components/CommandPalette/index.ts b/docs-ui/src/components/CommandPalette/index.ts new file mode 100644 index 0000000000..95c1305982 --- /dev/null +++ b/docs-ui/src/components/CommandPalette/index.ts @@ -0,0 +1 @@ +export { CommandPalette } from './CommandPalette'; diff --git a/docs-ui/src/components/ComponentCards/ComponentCards.module.css b/docs-ui/src/components/ComponentCards/ComponentCards.module.css deleted file mode 100644 index 8eb9dbd3d0..0000000000 --- a/docs-ui/src/components/ComponentCards/ComponentCards.module.css +++ /dev/null @@ -1,54 +0,0 @@ -.grid { - display: grid; - grid-template-columns: repeat(1, 1fr); - gap: 1rem; - margin-top: 1rem; - margin-bottom: 3rem; -} - -@media (min-width: 768px) { - .grid { - grid-template-columns: repeat(2, 1fr); - } -} - -@media (min-width: 1024px) { - .grid { - grid-template-columns: repeat(3, 1fr); - } -} - -@media (min-width: 1280px) { - .grid { - grid-template-columns: repeat(4, 1fr); - } -} - -.card { - display: flex; - flex-direction: column; - justify-content: flex-end; - background-color: var(--bg); - border-radius: 8px; - border: 1px solid var(--border); - padding: 16px; - gap: 4px; - min-height: 120px; - - &:hover { - background-color: var(--bg-hover); - } -} - -.title { - margin: 0; - font-size: 16px; - font-weight: 600; - color: var(--primary); -} - -.description { - margin: 0; - font-size: 14px; - color: var(--secondary); -} diff --git a/docs-ui/src/components/ComponentCards/ComponentCards.tsx b/docs-ui/src/components/ComponentCards/ComponentCards.tsx deleted file mode 100644 index 0e4d22c02a..0000000000 --- a/docs-ui/src/components/ComponentCards/ComponentCards.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import Link from 'next/link'; -import styles from './ComponentCards.module.css'; - -export const ComponentCards = ({ children }: { children: React.ReactNode }) => { - return
{children}
; -}; - -export const ComponentCard = ({ - title, - description, - href, -}: { - title: string; - description: string; - href: string; -}) => { - return ( - -

{title}

-

{description}

- - ); -}; diff --git a/docs-ui/src/components/ComponentCards/index.ts b/docs-ui/src/components/ComponentCards/index.ts deleted file mode 100644 index 4bc4beaae3..0000000000 --- a/docs-ui/src/components/ComponentCards/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './ComponentCards'; diff --git a/docs-ui/src/components/ComponentGrid/ComponentGrid.module.css b/docs-ui/src/components/ComponentGrid/ComponentGrid.module.css new file mode 100644 index 0000000000..a6dd54a864 --- /dev/null +++ b/docs-ui/src/components/ComponentGrid/ComponentGrid.module.css @@ -0,0 +1,29 @@ +.grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + margin-top: 1rem; + margin-bottom: 2rem; +} + +@media (min-width: 768px) { + .grid { + grid-template-columns: repeat(4, 1fr); + } +} + +.item { + display: flex; + align-items: center; + gap: 6px; + padding: 10px 0; + font-size: 14px; + font-weight: 400; + color: var(--primary); + text-decoration: none; + + &:hover { + color: var(--link); + text-decoration: underline; + text-underline-offset: 2px; + } +} diff --git a/docs-ui/src/components/ComponentGrid/ComponentGrid.tsx b/docs-ui/src/components/ComponentGrid/ComponentGrid.tsx new file mode 100644 index 0000000000..eb0f043420 --- /dev/null +++ b/docs-ui/src/components/ComponentGrid/ComponentGrid.tsx @@ -0,0 +1,21 @@ +'use client'; + +import Link from 'next/link'; +import { components } from '@/utils/data'; +import styles from './ComponentGrid.module.css'; + +export const ComponentGrid = () => { + return ( +
+ {components.map(item => ( + + {item.title} + + ))} +
+ ); +}; diff --git a/docs-ui/src/components/ComponentGrid/index.ts b/docs-ui/src/components/ComponentGrid/index.ts new file mode 100644 index 0000000000..f0fe06477a --- /dev/null +++ b/docs-ui/src/components/ComponentGrid/index.ts @@ -0,0 +1 @@ +export * from './ComponentGrid'; diff --git a/docs-ui/src/components/CustomTheme/customTheme.tsx b/docs-ui/src/components/CustomTheme/customTheme.tsx index ae765d7d88..539113140a 100644 --- a/docs-ui/src/components/CustomTheme/customTheme.tsx +++ b/docs-ui/src/components/CustomTheme/customTheme.tsx @@ -1,6 +1,6 @@ 'use client'; -import { useEffect, useState, useCallback } from 'react'; +import { useEffect, useState, useCallback, useSyncExternalStore } from 'react'; import CodeMirror from '@uiw/react-codemirror'; import { sass } from '@codemirror/lang-sass'; import styles from './styles.module.css'; @@ -14,6 +14,10 @@ const defaultTheme = `:root { --bui-bg-solid: #000; }`; +// Stable server snapshots for useSyncExternalStore +const serverIsClient = false; +const serverDefaultTheme = defaultTheme; + const myTheme = createTheme({ theme: 'light', settings: { @@ -46,12 +50,41 @@ const myTheme = createTheme({ }); export const CustomTheme = () => { - const [isClient, setIsClient] = useState(false); const [open, setOpen] = useState(true); - const [customTheme, setCustomTheme] = useState(undefined); const { selectedThemeName } = usePlayground(); const [savedMessage, setSavedMessage] = useState('Save'); + // SSR-safe client detection + const isClient = useSyncExternalStore( + () => () => {}, + () => true, + () => serverIsClient, + ); + + // SSR-safe localStorage access for custom theme + const customThemeFromStorage = useSyncExternalStore( + callback => { + window.addEventListener('storage', callback); + return () => window.removeEventListener('storage', callback); + }, + () => { + const stored = localStorage.getItem('customThemeCss'); + if (!stored) { + localStorage.setItem('customThemeCss', defaultTheme); + return defaultTheme; + } + return stored; + }, + () => serverDefaultTheme, + ); + + const [customTheme, setCustomTheme] = useState(customThemeFromStorage); + + // Sync from storage when it changes + useEffect(() => { + setCustomTheme(customThemeFromStorage); + }, [customThemeFromStorage]); + const updateStyleElement = (theme: string) => { let styleElement = document.getElementById( 'custom-theme-style', @@ -66,16 +99,11 @@ export const CustomTheme = () => { styleElement.textContent = theme; }; + // Apply custom theme to DOM useEffect(() => { - if (selectedThemeName === 'custom') { - let storedTheme = localStorage.getItem('customThemeCss'); - if (!storedTheme) { - storedTheme = defaultTheme; - localStorage.setItem('customThemeCss', storedTheme); - } - setCustomTheme(storedTheme); - updateStyleElement(storedTheme); - } else { + if (selectedThemeName === 'custom' && customTheme && isClient) { + updateStyleElement(customTheme); + } else if (isClient) { const styleElement = document.getElementById( 'custom-theme-style', ) as HTMLStyleElement; @@ -83,11 +111,7 @@ export const CustomTheme = () => { styleElement.remove(); } } - }, [selectedThemeName]); - - useEffect(() => { - setIsClient(true); - }, []); + }, [selectedThemeName, customTheme, isClient]); const handleSave = () => { if (customTheme) { diff --git a/docs-ui/src/components/DecorativeBox/index.tsx b/docs-ui/src/components/DecorativeBox/index.tsx index a5c20725bc..8af067459e 100644 --- a/docs-ui/src/components/DecorativeBox/index.tsx +++ b/docs-ui/src/components/DecorativeBox/index.tsx @@ -1,5 +1,17 @@ +'use client'; + +import { CSSProperties, ReactNode } from 'react'; import styles from './styles.module.css'; -export const DecorativeBox = () => { - return
; +interface DecorativeBoxProps { + children?: ReactNode; + style?: CSSProperties; +} + +export const DecorativeBox = ({ children, style }: DecorativeBoxProps) => { + return ( +
+ {children} +
+ ); }; diff --git a/docs-ui/src/components/DecorativeBox/styles.module.css b/docs-ui/src/components/DecorativeBox/styles.module.css index 84a6b579a0..a2a5c9407a 100644 --- a/docs-ui/src/components/DecorativeBox/styles.module.css +++ b/docs-ui/src/components/DecorativeBox/styles.module.css @@ -1,8 +1,14 @@ .box { min-width: 64px; min-height: 64px; + padding: 8px 12px; background-color: #eaf2fd; border-radius: 4px; box-shadow: 0 0 0 1px #2563eb; background-image: url("data:image/svg+xml,%3Csvg width='6' height='6' viewBox='0 0 6 6' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%232563eb' fill-opacity='0.3' fill-rule='evenodd'%3E%3Cpath d='M5 0h1L0 6V5zM6 5v1H5z'/%3E%3C/g%3E%3C/svg%3E"); + color: #2563eb; + font-weight: 500; + display: flex; + align-items: center; + justify-content: center; } diff --git a/docs-ui/src/components/LayoutComponents/LayoutComponents.module.css b/docs-ui/src/components/LayoutComponents/LayoutComponents.module.css deleted file mode 100644 index 9009cdb6a4..0000000000 --- a/docs-ui/src/components/LayoutComponents/LayoutComponents.module.css +++ /dev/null @@ -1,48 +0,0 @@ -.layoutComponents { - display: flex; - justify-content: flex-start; - gap: 1rem; - flex-wrap: wrap; - margin-top: 2rem; - - & svg rect { - transition: fill 0.2s ease-in-out; - } - - & .box { - display: flex; - flex-direction: column; - width: calc(50% - 0.5rem); - margin-bottom: 1rem; - align-items: flex-start; - } - - & .content { - flex: none; - background-color: var(--bg); - border: 1px solid var(--border); - border-radius: 4px; - width: 100%; - height: 180px; - transition: all 0.2s ease-in-out; - margin-bottom: 0.75rem; - display: flex; - align-items: center; - justify-content: center; - - &:hover { - transform: translateY(-4px); - } - } - - & .title { - font-size: 16px; - transition: color 0.2s ease-in-out; - margin-bottom: 0.25rem; - } - - & .description { - font-size: 16px; - color: var(--secondary); - } -} diff --git a/docs-ui/src/components/LayoutComponents/LayoutComponents.tsx b/docs-ui/src/components/LayoutComponents/LayoutComponents.tsx deleted file mode 100644 index 0bf822526e..0000000000 --- a/docs-ui/src/components/LayoutComponents/LayoutComponents.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { BoxSvg } from './svgs/box'; -import { FlexSvg } from './svgs/flex'; -import { GridSvg } from './svgs/grid'; -import { ContainerSvg } from './svgs/container'; -import styles from './LayoutComponents.module.css'; -import Link from 'next/link'; - -export const LayoutComponents = () => { - return ( -
-
- - - -
Box
-
- The most basic layout component -
-
-
- - - -
Flex
-
- Arrange your components vertically -
-
-
- - - -
Grid
-
- Arrange your components in a grid -
-
-
- - - -
Container
-
- A container for your components -
-
-
- ); -}; diff --git a/docs-ui/src/components/LayoutComponents/index.ts b/docs-ui/src/components/LayoutComponents/index.ts deleted file mode 100644 index 8efb793bbd..0000000000 --- a/docs-ui/src/components/LayoutComponents/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { LayoutComponents } from './LayoutComponents'; diff --git a/docs-ui/src/components/Navigation/Navigation.module.css b/docs-ui/src/components/Navigation/Navigation.module.css index f5e1312ab1..efba109f97 100644 --- a/docs-ui/src/components/Navigation/Navigation.module.css +++ b/docs-ui/src/components/Navigation/Navigation.module.css @@ -49,16 +49,13 @@ } .sectionTitle { - font-size: 0.6875rem; - font-weight: 500; - padding: 0 12px 4px; - color: var(--secondary); + display: flex; + align-items: center; + gap: 8px; + color: var(--primary); margin-top: 40px; - text-transform: uppercase; - - &:first-child { - margin-top: 12px; - } + padding: 8px 12px; + margin-bottom: 8px; } .line { diff --git a/docs-ui/src/components/Navigation/Navigation.tsx b/docs-ui/src/components/Navigation/Navigation.tsx index 13fa87661f..bad77e942e 100644 --- a/docs-ui/src/components/Navigation/Navigation.tsx +++ b/docs-ui/src/components/Navigation/Navigation.tsx @@ -2,7 +2,6 @@ import Link from 'next/link'; import { usePathname } from 'next/navigation'; -import { Fragment } from 'react'; import clsx from 'clsx'; import { RiCollageLine, @@ -12,26 +11,13 @@ import { RiServiceLine, RiStackLine, } from '@remixicon/react'; -import { components, layoutComponents } from '@/utils/data'; +import { components } from '@/utils/data'; import styles from './Navigation.module.css'; interface NavigationProps { onLinkClick?: () => void; } -const data = [ - { - title: 'Layout Components', - content: layoutComponents, - url: '/components', - }, - { - title: 'Components', - content: components, - url: '/components', - }, -]; - export const Navigation = ({ onLinkClick }: NavigationProps) => { const pathname = usePathname(); @@ -55,16 +41,6 @@ export const Navigation = ({ onLinkClick }: NavigationProps) => { Tokens -
  • - - - Components - -
  • @@ -89,35 +65,31 @@ export const Navigation = ({ onLinkClick }: NavigationProps) => {
  • - {data.map(section => { +
    + + Components +
    + {components.map(item => { + const isActive = pathname === `/components/${item.slug}`; + return ( - -
    {section.title}
    - - {section.content.map(item => { - const isActive = pathname === `${section.url}/${item.slug}`; - - return ( - -
    {item.title}
    -
    - {item.status === 'alpha' && 'Alpha'} - {item.status === 'beta' && 'Beta'} - {item.status === 'inProgress' && 'In Progress'} - {item.status === 'stable' && 'Stable'} - {item.status === 'deprecated' && 'Deprecated'} -
    - - ); + + onClick={onLinkClick} + > +
    {item.title}
    +
    + {item.status === 'alpha' && 'Alpha'} + {item.status === 'beta' && 'Beta'} + {item.status === 'inProgress' && 'In Progress'} + {item.status === 'stable' && 'Stable'} + {item.status === 'deprecated' && 'Deprecated'} +
    + ); })} diff --git a/docs-ui/src/components/PropsTable/PropsTable.tsx b/docs-ui/src/components/PropsTable/PropsTable.tsx index 86b7b274ef..a8af2ad116 100644 --- a/docs-ui/src/components/PropsTable/PropsTable.tsx +++ b/docs-ui/src/components/PropsTable/PropsTable.tsx @@ -3,77 +3,133 @@ import * as Table from '../Table'; import { Chip } from '../Chip'; import { TypePopup } from './TypePopup'; +import { SpacingPopup } from './SpacingPopup'; +import { SpacingGroupRow } from './SpacingGroupRow'; import { PropDef } from '@/utils/propDefs'; -// Use the proper PropDef type type PropData = PropDef; -// Modify the PropsTable component to use the new type +type ColumnType = 'prop' | 'type' | 'default' | 'description' | 'responsive'; + +interface ColumnConfig { + key: ColumnType; + width: string; +} + +const defaultColumns: ColumnConfig[] = [ + { key: 'prop' as const, width: '15%' }, + { key: 'type' as const, width: '25%' }, + { key: 'default' as const, width: '15%' }, + { key: 'description' as const, width: '45%' }, +]; + +const columnLabels: Record = { + prop: 'Prop', + type: 'Type', + default: 'Default', + description: 'Description', + responsive: 'Responsive', +}; + export const PropsTable = >({ data, + columns = defaultColumns, }: { data: T; + columns?: ColumnConfig[]; }) => { if (!data) return null; + const renderCell = ( + propName: string, + propData: PropData, + column: ColumnType, + ) => { + const enumValues = + Array.isArray(propData.values) && + propData.values.map(t => {t}); + + switch (column) { + case 'prop': + return {propName}; + + case 'type': + return ( +
    + {propData.type === 'string' && string} + {propData.type === 'number' && number} + {propData.type === 'boolean' && boolean} + {propData.type === 'enum' && enumValues} + {propData.type === 'spacing' && Array.isArray(propData.values) && ( + + )} + {propData.type === 'complex' && propData.complexType && ( + + )} + {propData.type === 'enum | string' && ( + <> + {enumValues} + string + + )} +
    + ); + + case 'default': + return propData.default ? {propData.default} : '-'; + + case 'description': + return propData.description ? ( + {propData.description} + ) : null; + + case 'responsive': + return {propData.responsive ? 'Yes' : 'No'}; + + default: + return null; + } + }; + return ( - Prop - Type - Default - - Responsive - + {columns.map(col => ( + + {columnLabels[col.key]} + + ))} {Object.keys(data).map(n => { - const enumValues = - Array.isArray(data[n].values) && - data[n].values.map(t => {t}); + const propData = data[n]; + // Handle spacing-group type + if (propData.type === 'spacing-group' && propData.spacingGroup) { + return ( + + ); + } + + // Handle regular props return ( - - {n} - - -
    - {data[n].type === 'string' && string} - {data[n].type === 'number' && number} - {data[n].type === 'boolean' && boolean} - {data[n].type === 'enum' && enumValues} - {data[n].type === 'spacing' && ( - <> - 0.5, 1, 1.5, 2, 3, ..., 14 - string - - )} - {data[n].type === 'complex' && data[n].complexType && ( - - )} - {data[n].type === 'enum | string' && ( - <> - {enumValues} - string - - )} -
    -
    - - {data[n].default ? data[n].default : '-'} - - - {data[n].responsive ? 'Yes' : 'No'} - + {columns.map(col => ( + + {renderCell(n, propData, col.key)} + + ))}
    ); })} diff --git a/docs-ui/src/components/PropsTable/SpacingGroupRow.module.css b/docs-ui/src/components/PropsTable/SpacingGroupRow.module.css new file mode 100644 index 0000000000..71ade80b47 --- /dev/null +++ b/docs-ui/src/components/PropsTable/SpacingGroupRow.module.css @@ -0,0 +1,96 @@ +.expandButton { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + background: none; + border: none; + padding: 0; + cursor: pointer; + font-family: inherit; + color: inherit; + text-align: left; + gap: 0.5rem; +} + +.expandButton:hover { + opacity: 0.8; +} + +.propName { + font-family: monospace; + font-size: 13px; + font-weight: 500; + white-space: nowrap; + flex: 1; +} + +.count { + font-size: 12px; + color: var(--text-secondary); + font-weight: normal; +} + +.icon { + color: var(--text-secondary); + flex-shrink: 0; + display: flex; + align-items: center; +} + +.expandedContent { + padding: 0.5rem 0; +} + +.twoColumnLayout { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 2rem; +} + +.column { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.columnTitle { + font-size: 13px; + font-weight: 600; + color: var(--text-primary); + margin-bottom: 0.25rem; + padding-bottom: 0.5rem; + border-bottom: 1px solid var(--border); +} + +.propsGrid { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.propRow { + display: grid; + grid-template-columns: auto 1fr auto; + gap: 1rem; + align-items: start; +} + +.propRowName { + min-width: 80px; +} + +.propRowDescription { + font-size: 14px; + color: var(--text-secondary); + line-height: 1.5; +} + +.propRowDefault { + font-size: 12px; + color: var(--text-secondary); + white-space: nowrap; + display: flex; + align-items: center; + gap: 0.25rem; +} diff --git a/docs-ui/src/components/PropsTable/SpacingGroupRow.tsx b/docs-ui/src/components/PropsTable/SpacingGroupRow.tsx new file mode 100644 index 0000000000..b3cc8de26d --- /dev/null +++ b/docs-ui/src/components/PropsTable/SpacingGroupRow.tsx @@ -0,0 +1,142 @@ +'use client'; + +import { useState } from 'react'; +import * as Table from '../Table'; +import { Chip } from '../Chip'; +import { SpacingPopup } from './SpacingPopup'; +import type { SpacingGroupDef } from '@/utils/propDefs'; +import { RiArrowDownSLine, RiArrowRightSLine } from '@remixicon/react'; +import styles from './SpacingGroupRow.module.css'; + +interface SpacingGroupRowProps { + spacingGroup: SpacingGroupDef; + description?: React.ReactNode; + columns: Array<{ key: string; width: string }>; +} + +export const SpacingGroupRow = ({ + spacingGroup, + description, + columns, +}: SpacingGroupRowProps) => { + const [isExpanded, setIsExpanded] = useState(false); + + // Separate padding and margin props + const paddingProps = spacingGroup.props.filter(prop => + prop.name.startsWith('p'), + ); + const marginProps = spacingGroup.props.filter(prop => + prop.name.startsWith('m'), + ); + + const renderCell = (columnKey: string) => { + switch (columnKey) { + case 'prop': + return ( + + ); + + case 'type': + return ; + + case 'default': + return '-'; + + case 'description': + return description ? ( + {description} + ) : null; + + case 'responsive': + return {spacingGroup.responsive ? 'Yes' : 'No'}; + + default: + return null; + } + }; + + return ( + <> + + {columns.map(col => ( + + {renderCell(col.key)} + + ))} + + {isExpanded && ( + + +
    +
    + {/* Padding Column */} + {paddingProps.length > 0 && ( +
    +
    Padding
    +
    + {paddingProps.map(prop => ( +
    +
    + {prop.name} +
    +
    + {prop.description} +
    + {prop.default && ( +
    + Default: {prop.default} +
    + )} +
    + ))} +
    +
    + )} + + {/* Margin Column */} + {marginProps.length > 0 && ( +
    +
    Margin
    +
    + {marginProps.map(prop => ( +
    +
    + {prop.name} +
    +
    + {prop.description} +
    + {prop.default && ( +
    + Default: {prop.default} +
    + )} +
    + ))} +
    +
    + )} +
    +
    +
    +
    + )} + + ); +}; diff --git a/docs-ui/src/components/PropsTable/SpacingPopup.module.css b/docs-ui/src/components/PropsTable/SpacingPopup.module.css new file mode 100644 index 0000000000..892bc14bc6 --- /dev/null +++ b/docs-ui/src/components/PropsTable/SpacingPopup.module.css @@ -0,0 +1,77 @@ +.button { + display: inline-flex; + align-items: center; + font-family: monospace; + font-size: 13px; + border-radius: 6px; + padding: 0px 8px; + height: 24px; + margin-right: 4px; + background-color: #f0f0f0; + color: #5d5d5d; + cursor: pointer; + border: none; + outline: none; + box-shadow: none; + transition: background-color 150ms ease; +} + +.button:hover { + background-color: #e0e0e0; +} + +[data-theme-mode='dark'] .button { + background-color: #2c2c2c; + color: #fff; +} + +[data-theme-mode='dark'] .button:hover { + background-color: #3c3c3c; +} + +.popover { + border: 1px solid var(--border); + box-shadow: 0 8px 20px rgba(0 0 0 / 0.1); + border-radius: 6px; + background: var(--bg); + color: var(--primary); + outline: none; + transition: transform 200ms, opacity 200ms; + padding: 1rem; + margin-top: 6px; + max-width: 400px; + --origin: translateY(-8px); + + &[data-entering], + &[data-exiting] { + transform: var(--origin); + opacity: 0; + } +} + +.arrow svg { + display: block; + fill: var(--bg); + stroke: var(--border); + stroke-width: 1px; + transform: rotate(180deg); +} + +.title { + font-size: 14px; + font-weight: 500; + margin-bottom: 0.75rem; +} + +.grid { + display: flex; + flex-wrap: wrap; + gap: 0.375rem; + margin-bottom: 0.75rem; +} + +.note { + font-size: 12px; + color: var(--text-secondary); + font-style: italic; +} diff --git a/docs-ui/src/components/PropsTable/SpacingPopup.tsx b/docs-ui/src/components/PropsTable/SpacingPopup.tsx new file mode 100644 index 0000000000..9515ec4e5a --- /dev/null +++ b/docs-ui/src/components/PropsTable/SpacingPopup.tsx @@ -0,0 +1,47 @@ +import { Chip } from '../Chip'; +import { + Button, + Dialog, + DialogTrigger, + OverlayArrow, + Popover, +} from 'react-aria-components'; +import styles from './SpacingPopup.module.css'; + +interface SpacingPopupProps { + values: string[]; +} + +export const SpacingPopup = ({ values }: SpacingPopupProps) => { + // Display abbreviated list: first, second, ..., last + const firstValue = values[0]; + const secondValue = values[1]; + const lastValue = values[values.length - 1]; + + return ( +
    + {firstValue} + {secondValue} + + + + + + + + + +
    All spacing values
    +
    + {values.map(value => ( + {value} + ))} +
    +
    Also accepts custom string values
    +
    +
    +
    + {lastValue} +
    + ); +}; diff --git a/docs-ui/src/components/ReactAriaLink/ReactAriaLink.tsx b/docs-ui/src/components/ReactAriaLink/ReactAriaLink.tsx new file mode 100644 index 0000000000..37656c482d --- /dev/null +++ b/docs-ui/src/components/ReactAriaLink/ReactAriaLink.tsx @@ -0,0 +1,26 @@ +import styles from './styles.module.css'; + +interface ReactAriaLinkProps { + /** The React Aria component name (e.g., "Cell", "Table") */ + component: string; + /** The documentation URL */ + href: string; +} + +/** + * Displays a standardized note linking to React Aria documentation. + * + * Usage: + * + */ +export function ReactAriaLink({ component, href }: ReactAriaLinkProps) { + return ( +

    + Inherits all{' '} + + React Aria {component} + {' '} + props. +

    + ); +} diff --git a/docs-ui/src/components/ReactAriaLink/index.ts b/docs-ui/src/components/ReactAriaLink/index.ts new file mode 100644 index 0000000000..8fa7b70e73 --- /dev/null +++ b/docs-ui/src/components/ReactAriaLink/index.ts @@ -0,0 +1 @@ +export { ReactAriaLink } from './ReactAriaLink'; diff --git a/docs-ui/src/components/ReactAriaLink/styles.module.css b/docs-ui/src/components/ReactAriaLink/styles.module.css new file mode 100644 index 0000000000..b74436fee3 --- /dev/null +++ b/docs-ui/src/components/ReactAriaLink/styles.module.css @@ -0,0 +1,15 @@ +.note { + font-size: 1rem; + color: var(--secondary); + margin-top: 0.5rem; + margin-bottom: 1rem; +} + +.note a { + color: var(--link); + text-decoration: none; +} + +.note a:hover { + text-decoration: underline; +} diff --git a/docs-ui/src/components/Roadmap/Roadmap.tsx b/docs-ui/src/components/Roadmap/Roadmap.tsx deleted file mode 100644 index 52f96e0f76..0000000000 --- a/docs-ui/src/components/Roadmap/Roadmap.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { RoadmapItem } from './list'; - -export const Roadmap = ({ list }: { list: RoadmapItem[] }) => { - const orderList = ['inProgress', 'notStarted', 'completed']; - return ( -
    - {list - .sort( - (a, b) => orderList.indexOf(a.status) - orderList.indexOf(b.status), - ) - .map(Item)} -
    - ); -}; - -const Item = ({ - title, - status = 'notStarted', -}: { - title: string; - status: 'notStarted' | 'inProgress' | 'inReview' | 'completed'; -}) => { - return ( -
    -
    -
    -
    {title}
    -
    - - {status === 'notStarted' && 'Not Started'} - {status === 'inProgress' && 'In Progress'} - {status === 'inReview' && 'Ready for Review'} - {status === 'completed' && 'Completed'} - -
    - ); -}; diff --git a/docs-ui/src/components/Roadmap/index.ts b/docs-ui/src/components/Roadmap/index.ts deleted file mode 100644 index c7006073d6..0000000000 --- a/docs-ui/src/components/Roadmap/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { Roadmap } from './Roadmap'; diff --git a/docs-ui/src/components/Roadmap/list.ts b/docs-ui/src/components/Roadmap/list.ts deleted file mode 100644 index 24b9197cf5..0000000000 --- a/docs-ui/src/components/Roadmap/list.ts +++ /dev/null @@ -1,47 +0,0 @@ -export type RoadmapItem = { - title: string; - status: 'notStarted' | 'inProgress' | 'inReview' | 'completed'; -}; - -export const list: RoadmapItem[] = [ - { - title: 'Remove Vanilla Extract and use pure CSS instead', - status: 'inProgress', - }, - { - title: 'Add collapsing across breakpoints for the Inline component', - status: 'notStarted', - }, - { - title: 'Add reversing the order for the Inline component', - status: 'notStarted', - }, - { - title: 'Set up Storybook', - status: 'completed', - }, - { - title: 'Set up iconography', - status: 'completed', - }, - { - title: 'Set up global tokens', - status: 'inProgress', - }, - { - title: 'Set up theming system', - status: 'inProgress', - }, - { - title: 'Create first pass at box component', - status: 'completed', - }, - { - title: 'Create first pass at stack component', - status: 'completed', - }, - { - title: 'Create first pass at inline component', - status: 'completed', - }, -]; diff --git a/docs-ui/src/components/Roadmap/styles.css b/docs-ui/src/components/Roadmap/styles.css deleted file mode 100644 index 63f32312e7..0000000000 --- a/docs-ui/src/components/Roadmap/styles.css +++ /dev/null @@ -1,100 +0,0 @@ -.roadmap { - display: flex; - flex-direction: column; -} - -.roadmap .roadmap-item { - display: flex; - align-items: center; - justify-content: space-between; - border-bottom: 1px solid #e0e0e0; - padding: 8px 0px; -} - -.roadmap .roadmap-item .left { - display: flex; - align-items: center; - padding-left: 12px; - gap: 12px; -} - -.roadmap .roadmap-item .dot { - width: 8px; - height: 8px; - border-radius: 50%; - background-color: #e0e0e0; -} - -.roadmap .roadmap-item.notStarted { - color: #000; -} - -.roadmap .roadmap-item.inProgress { - color: #000; -} - -.roadmap .roadmap-item.inReview { - color: #000; -} - -.roadmap .roadmap-item.completed .title { - color: #a2a2a2; - text-decoration: line-through; -} - -.roadmap .roadmap-item.notStarted .dot { - background-color: #d1d1d1; -} - -.roadmap .roadmap-item.inProgress .dot { - background-color: #ffd000; -} - -.roadmap .roadmap-item.inReview .dot { - background-color: #4ed14a; -} - -.roadmap .roadmap-item.completed .dot { - background-color: #4ed14a; -} - -.roadmap .roadmap-item .title { - font-size: 16px; -} - -.roadmap .roadmap-item .pill { - display: inline-flex; - align-items: center; - height: 24px; - padding: 0px 8px; - border-radius: 40px; - font-size: 12px; - font-weight: 600; - margin-left: 8px; - border-style: solid; - border-width: 1px; -} - -.roadmap .roadmap-item.notStarted .pill { - background-color: #f2f2f2; - border-color: #cdcdcd; - color: #888888; -} - -.roadmap .roadmap-item.inProgress .pill { - background-color: #fff2b9; - border-color: #ffd000; - color: #d79927; -} - -.roadmap .roadmap-item.inReview .pill { - background-color: #d7f9d7; - border-color: #4ed14a; - color: #3a9837; -} - -.roadmap .roadmap-item.completed .pill { - background-color: #d7f9d7; - border-color: #4ed14a; - color: #3a9837; -} diff --git a/docs-ui/src/components/Snippet/client.tsx b/docs-ui/src/components/Snippet/client.tsx index 04284c3249..2041218a12 100644 --- a/docs-ui/src/components/Snippet/client.tsx +++ b/docs-ui/src/components/Snippet/client.tsx @@ -12,6 +12,7 @@ interface SnippetProps { py?: number; open?: boolean; height?: string | number; + layout?: 'stacked' | 'side-by-side'; } export const SnippetClient = ({ @@ -22,9 +23,28 @@ export const SnippetClient = ({ py = 2, open = false, height = 'auto', + layout = 'stacked', }: SnippetProps) => { const [isOpen, setIsOpen] = useState(open); + if (layout === 'side-by-side') { + return ( +
    +
    +
    {codeContent}
    +
    +
    +
    + {preview} +
    +
    +
    + ); + } + return ( { return ( ); }; diff --git a/docs-ui/src/components/Snippet/styles.module.css b/docs-ui/src/components/Snippet/styles.module.css index 3141564293..c6270670a7 100644 --- a/docs-ui/src/components/Snippet/styles.module.css +++ b/docs-ui/src/components/Snippet/styles.module.css @@ -7,7 +7,7 @@ .preview { border-radius: 8px; box-shadow: inset 0 0 0 1px var(--border); - background-color: var(--bui-bg); + background-color: var(--bui-bg-app); padding: 1px; position: relative; } @@ -60,3 +60,43 @@ opacity: 1; } } + +/* Side-by-side layout */ +.sideBySide { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 16px; + align-items: stretch; +} + +.sideBySideCode { + min-width: 0; + overflow: auto; + display: flex; + flex-direction: column; +} + +.codeWrapper { + flex: 1; + display: flex; + flex-direction: column; +} + +.codeWrapper > div { + flex: 1; + margin-bottom: 0; +} + +.sideBySidePreview { + border-radius: 8px; + box-shadow: inset 0 0 0 1px var(--border); + background-color: var(--bui-bg-app); + padding: 1px; + min-width: 0; + display: flex; + flex-direction: column; +} + +.sideBySidePreview > .previewContent { + flex: 1; +} diff --git a/docs-ui/src/components/Table/Table.tsx b/docs-ui/src/components/Table/Table.tsx index 4d0e48dbce..a43bcd766a 100644 --- a/docs-ui/src/components/Table/Table.tsx +++ b/docs-ui/src/components/Table/Table.tsx @@ -45,12 +45,14 @@ export const Row = ({ children }: { children: ReactNode }) => { export const Cell = ({ children, style, + colSpan, }: { children: ReactNode; style?: CSSProperties; + colSpan?: number; }) => { return ( -
    ); diff --git a/docs-ui/src/components/TableOfContents/TableOfContents.tsx b/docs-ui/src/components/TableOfContents/TableOfContents.tsx index d18265415b..429d677b80 100644 --- a/docs-ui/src/components/TableOfContents/TableOfContents.tsx +++ b/docs-ui/src/components/TableOfContents/TableOfContents.tsx @@ -1,6 +1,6 @@ 'use client'; -import { useEffect, useState } from 'react'; +import { useEffect, useState, useLayoutEffect } from 'react'; import { usePathname } from 'next/navigation'; import styles from './TableOfContents.module.css'; @@ -17,6 +17,29 @@ export function TableOfContents() { const [indicatorHeight, setIndicatorHeight] = useState(0); const pathname = usePathname(); + // Update indicator position when activeId changes + useLayoutEffect(() => { + if (!activeId) return; + + // Use requestAnimationFrame to defer setState call + const rafId = requestAnimationFrame(() => { + const activeElement = document.querySelector( + `[data-toc-id="${activeId}"]`, + ) as HTMLElement; + if (activeElement) { + const list = activeElement.closest('ul'); + if (list) { + const listRect = list.getBoundingClientRect(); + const elementRect = activeElement.getBoundingClientRect(); + setIndicatorTop(elementRect.top - listRect.top); + setIndicatorHeight(elementRect.height); + } + } + }); + + return () => cancelAnimationFrame(rafId); + }, [activeId, headings]); + useEffect(() => { // Extract all H2 and H3 headings from the document const elements = Array.from( @@ -29,18 +52,6 @@ export function TableOfContents() { level: parseInt(element.tagName.substring(1)), })); - setHeadings(headingData); - - // Set initial active heading (first visible heading or first heading) - if (headingData.length > 0) { - const viewportTop = window.scrollY + 100; // offset for header - const visibleHeading = elements.find(element => { - const rect = element.getBoundingClientRect(); - return rect.top + window.scrollY >= viewportTop - 200; - }); - setActiveId(visibleHeading?.id || headingData[0].id); - } - // Set up IntersectionObserver to track visible headings const observerOptions = { rootMargin: '-80px 0px -80% 0px', @@ -62,29 +73,26 @@ export function TableOfContents() { elements.forEach(element => observer.observe(element)); + // Initialize headings and active ID after observer is set up + requestAnimationFrame(() => { + setHeadings(headingData); + + // Set initial active heading (first visible heading or first heading) + if (headingData.length > 0) { + const viewportTop = window.scrollY + 100; // offset for header + const visibleHeading = elements.find(element => { + const rect = element.getBoundingClientRect(); + return rect.top + window.scrollY >= viewportTop - 200; + }); + setActiveId(visibleHeading?.id || headingData[0].id); + } + }); + return () => { elements.forEach(element => observer.unobserve(element)); }; }, [pathname]); - // Update indicator position when activeId changes - useEffect(() => { - if (activeId) { - const activeElement = document.querySelector( - `[data-toc-id="${activeId}"]`, - ) as HTMLElement; - if (activeElement) { - const list = activeElement.closest('ul'); - if (list) { - const listRect = list.getBoundingClientRect(); - const elementRect = activeElement.getBoundingClientRect(); - setIndicatorTop(elementRect.top - listRect.top); - setIndicatorHeight(elementRect.height); - } - } - } - }, [activeId, headings]); - const handleClick = (id: string) => { const element = document.getElementById(id); if (element) { diff --git a/docs-ui/src/components/Theming/index.tsx b/docs-ui/src/components/Theming/index.tsx index d06f51348b..9f67c3a111 100644 --- a/docs-ui/src/components/Theming/index.tsx +++ b/docs-ui/src/components/Theming/index.tsx @@ -1,11 +1,16 @@ -import { MDXRemote } from 'next-mdx-remote-client/rsc'; -import { formattedMDXComponents } from '@/mdx-components'; -import type { - ComponentDefinition, - DataAttributeValues, -} from '../../../../packages/ui/src/types'; +'use client'; -export function Theming({ definition }: { definition: ComponentDefinition }) { +import { formattedMDXComponents } from '@/mdx-components'; +import type { DataAttributeValues } from '../../../../packages/ui/src/types'; + +interface ThemingProps { + definition: { + classNames: Record; + dataAttributes?: Record; + }; +} + +export function Theming({ definition }: ThemingProps) { const classNames = definition.classNames; const dataAttributes = definition.dataAttributes; @@ -33,15 +38,28 @@ export function Theming({ definition }: { definition: ComponentDefinition }) { ...Object.values(classNames).slice(1), ]; + // Use the same styled components from MDX, with fallbacks to HTML elements + const H2 = formattedMDXComponents.h2 || 'h2'; + const P = formattedMDXComponents.p || 'p'; + const Ul = formattedMDXComponents.ul || 'ul'; + const Li = formattedMDXComponents.li || 'li'; + const Code = formattedMDXComponents.code || 'code'; + return ( - `- \`${selector}\``).join('\n')} - `} - /> +
    +

    Theming

    +

    + Our theming system is based on a mix between CSS classes, CSS variables + and data attributes. If you want to customise this component, you can + use one of these class names below. +

    +
      + {classNamesArray.map((selector, index) => ( +
    • + {selector} +
    • + ))} +
    +
    ); } diff --git a/docs-ui/src/components/Toolbar/Toolbar.module.css b/docs-ui/src/components/Toolbar/Toolbar.module.css index 581fc599b3..4f067bd7bd 100644 --- a/docs-ui/src/components/Toolbar/Toolbar.module.css +++ b/docs-ui/src/components/Toolbar/Toolbar.module.css @@ -10,12 +10,10 @@ } } -.breadcrumb { +.left { display: flex; align-items: center; gap: 0.5rem; - font-size: 0.875rem; - font-weight: 500; } .logoMobile { @@ -26,39 +24,6 @@ } } -.breadcrumbDesktop { - display: none; - - @media (min-width: 768px) { - display: flex; - align-items: center; - gap: 0.5rem; - } -} - -.breadcrumbLink { - color: var(--secondary); - text-decoration: none; - cursor: pointer; - - &:hover { - color: var(--primary); - text-decoration: underline; - transition: color 0.2s ease-in-out; - text-decoration-thickness: 1px; - text-underline-offset: 4px; - } -} - -.breadcrumbSeparator { - color: var(--secondary); - flex-shrink: 0; -} - -.breadcrumbCurrent { - color: var(--primary); -} - .actions { display: none; @@ -119,6 +84,51 @@ } } +.searchButton { + display: none; + align-items: center; + gap: 6px; + background-color: var(--bg); + border: 1px solid var(--border); + border-radius: 32px; + padding-inline: 16px 12px; + min-width: 180px; + color: var(--secondary); + font-size: 0.8125rem; + font-weight: 500; + height: 32px; + cursor: pointer; + font-family: inherit; + white-space: nowrap; + + &:hover { + background-color: var(--action); + color: var(--primary); + transition: background-color 0.2s ease-in-out, color 0.2s ease-in-out; + } + + @media (min-width: 768px) { + display: flex; + } +} + +.searchLabel { + display: inline; + flex: 1; + text-align: left; +} + +.searchKbd { + display: inline; + font-family: inherit; + font-size: 0.6875rem; + font-weight: 500; + background-color: var(--action); + border-radius: 4px; + padding: 2px 5px; + color: var(--secondary); +} + .buttonGroup { display: flex; align-items: center; diff --git a/docs-ui/src/components/Toolbar/Toolbar.tsx b/docs-ui/src/components/Toolbar/Toolbar.tsx index e7defd5e8a..4a071bf45e 100644 --- a/docs-ui/src/components/Toolbar/Toolbar.tsx +++ b/docs-ui/src/components/Toolbar/Toolbar.tsx @@ -1,10 +1,11 @@ 'use client'; +import { useState, useEffect } from 'react'; import { RiArrowDownSLine, - RiArrowRightSLine, RiGithubLine, RiMoonLine, + RiSearchLine, RiSunLine, } from '@remixicon/react'; import { @@ -19,10 +20,8 @@ import { } from 'react-aria-components'; import styles from './Toolbar.module.css'; import { usePlayground } from '@/utils/playground-context'; -import { usePathname } from 'next/navigation'; -import Link from 'next/link'; -import { components, layoutComponents } from '@/utils/data'; import { Logo } from '@/components/Sidebar/Logo'; +import { CommandPalette } from '@/components/CommandPalette'; interface ToolbarProps { version: string; @@ -42,75 +41,36 @@ export const Toolbar = ({ version }: ToolbarProps) => { setSelectedThemeName, } = usePlayground(); - const pathname = usePathname(); + const [isCommandPaletteOpen, setIsCommandPaletteOpen] = useState(false); - // Determine breadcrumb content based on current path - const getBreadcrumb = () => { - const allComponents = [...components, ...layoutComponents]; + useEffect(() => { + const isMac = /mac(os|intosh)/i.test(navigator.userAgent); + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === 'k' && (isMac ? e.metaKey : e.ctrlKey)) { + e.preventDefault(); + setIsCommandPaletteOpen(prev => !prev); + } + }; - // Root page - if (pathname === '/') { - return { section: null, title: 'Getting Started' }; - } - - // Components index page - if (pathname === '/components') { - return { section: null, title: 'Components' }; - } - - // Component detail pages - if (pathname?.startsWith('/components/')) { - const slug = pathname.split('/components/')[1]; - const component = allComponents.find(c => c.slug === slug); - return { - section: 'Components', - sectionLink: '/components', - title: component?.title || slug, - }; - } - - // Tokens page - if (pathname === '/tokens') { - return { section: null, title: 'Tokens' }; - } - - // Changelog page - if (pathname === '/changelog') { - return { section: null, title: 'Changelog' }; - } - - return { section: null, title: '' }; - }; - - const breadcrumb = getBreadcrumb(); + document.addEventListener('keydown', handleKeyDown); + return () => document.removeEventListener('keydown', handleKeyDown); + }, []); return (
    -
    +
    -
    - {breadcrumb.section && breadcrumb.sectionLink ? ( - <> - - {breadcrumb.section} - - - - {breadcrumb.title} - - - ) : ( - {breadcrumb.title} - )} -
    +
    - Admin - User - Viewer - - - - - - - - -`; - -export const dialogWithNoTriggerSnippet = `const [isOpen, setIsOpen] = useState(false); - - - Create New User - - Your content - - - - - -`; - -export const dialogCloseSnippet = ``; diff --git a/docs-ui/src/content/flex.mdx b/docs-ui/src/content/flex.mdx deleted file mode 100644 index 36284f1f0b..0000000000 --- a/docs-ui/src/content/flex.mdx +++ /dev/null @@ -1,69 +0,0 @@ -import { PropsTable } from '@/components/PropsTable'; -import { CodeBlock } from '@/components/CodeBlock'; -import { Snippet } from '@/components/Snippet'; -import { FlexSnippet } from '@/snippets/stories-snippets'; -import { - flexPropDefs, - flexUsageSnippet, - flexDefaultSnippet, - flexFAQ1Snippet, - flexSimpleSnippet, - flexResponsiveSnippet, - flexAlignSnippet, -} from './flex.props'; -import { spacingPropDefs } from '@/utils/propDefs'; -import { PageTitle } from '@/components/PageTitle'; -import { Theming } from '@/components/Theming'; -import { FlexDefinition } from '../utils/definitions'; -import { ChangelogComponent } from '@/components/ChangelogComponent'; - - - -} - code={flexDefaultSnippet} -/> - -## Usage - - - -## API reference - - - -The grid component also accepts all the spacing props from the Box component. - - - -## Examples - -### Simple - -A simple example of how to use the Flex component. - - - -### Responsive - -The Flex component also supports responsive values, making it easy to create -responsive designs. - - - -### Align - -The Flex component also supports responsive alignment, making it easy to -create responsive designs. - - - - - - diff --git a/docs-ui/src/content/flex.props.ts b/docs-ui/src/content/flex.props.ts deleted file mode 100644 index cc4c2d5a75..0000000000 --- a/docs-ui/src/content/flex.props.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { - childrenPropDefs, - classNamePropDefs, - stylePropDefs, - type PropDef, -} from '@/utils/propDefs'; - -export const flexPropDefs: Record = { - align: { - type: 'enum', - values: ['start', 'center', 'end', 'baseline', 'stretch'], - responsive: true, - }, - direction: { - type: 'enum', - values: ['row', 'column', 'row-reverse', 'column-reverse'], - responsive: true, - }, - justify: { - type: 'enum', - values: ['start', 'center', 'end', 'between'], - responsive: true, - }, - ...childrenPropDefs, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const flexUsageSnippet = `import { Flex } from '@backstage/ui'; - -`; - -export const flexDefaultSnippet = ` - - - -`; - -export const flexSimpleSnippet = ` - Hello World - Hello World - Hello World -`; - -export const flexResponsiveSnippet = ` - Hello World - Hello World - Hello World -`; - -export const flexAlignSnippet = ` - Hello World - Hello World - Hello World -`; diff --git a/docs-ui/src/content/grid.mdx b/docs-ui/src/content/grid.mdx deleted file mode 100644 index 5f179b9e14..0000000000 --- a/docs-ui/src/content/grid.mdx +++ /dev/null @@ -1,99 +0,0 @@ -import { CodeBlock } from '@/components/CodeBlock'; -import { PropsTable } from '@/components/PropsTable'; -import { Snippet } from '@/components/Snippet'; -import { GridSnippet } from '@/snippets/stories-snippets'; -import { spacingPropDefs } from '@/utils/propDefs'; -import { - gridPropDefs, - gridItemPropDefs, - gridUsageSnippet, - gridDefaultSnippet, - gridSimpleSnippet, - gridComplexSnippet, - gridMixingRowsSnippet, - gridResponsiveSnippet, - gridStartEndSnippet, -} from './grid.props'; -import { PageTitle } from '@/components/PageTitle'; -import { Theming } from '@/components/Theming'; -import { GridDefinition } from '../utils/definitions'; -import { ChangelogComponent } from '@/components/ChangelogComponent'; - - - -} - code={gridDefaultSnippet} -/> - -## Usage - - - -## API reference - -### Grid.Root - -This is the grid container component. It will help to define the number of -columns that will be used in the grid. You can also define the gap between the -columns. All values are responsive. - - - -The grid component also accepts all the spacing props from the Box component. - - - -### Grid.Item - -If you need more control over the columns, you can use the grid item -component. This will give you access to `rowSpan`, `colSpan`, `start` and -`end`. All values are responsive. This component is optional, you can use any -elements directly if you prefer. - - - -## Examples - -### Simple grid - -A simple grid with 3 columns and a gap of md. - - - -### Complex grid - -You can also use the grid item to create more complex layouts. In this example -the first column will span 1 column and the second column will span 2 columns. - - - -### Mixing rows and columns - -The grid item component also supports the `rowSpan` prop, which allows you to -span multiple rows within the grid layout. In this example, the first item -will span 2 rows to achieve a dynamic and flexible grid structure. - - - -### Responsive grid - -The grid component also supports responsive values, making it easy to create -responsive designs. - - - -### Start and End - -The start and end props can be used to position the item in the grid. - - - - - - diff --git a/docs-ui/src/content/grid.props.ts b/docs-ui/src/content/grid.props.ts deleted file mode 100644 index 6f037cd64f..0000000000 --- a/docs-ui/src/content/grid.props.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { - childrenPropDefs, - classNamePropDefs, - stylePropDefs, - type PropDef, -} from '@/utils/propDefs'; - -const columnsValues = [ - '1', - '2', - '3', - '4', - '5', - '6', - '7', - '8', - '9', - '10', - '11', - '12', -]; - -export const gridPropDefs: Record = { - columns: { - type: 'enum | string', - values: [...columnsValues, 'auto'], - responsive: true, - default: 'auto', - }, - ...childrenPropDefs, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const gridItemPropDefs: Record = { - colSpan: { - type: 'enum | string', - values: [...columnsValues, 'full'], - responsive: true, - }, - rowSpan: { - type: 'enum | string', - values: [...columnsValues, 'full'], - responsive: true, - }, - colStart: { - type: 'enum | string', - values: [...columnsValues, 'auto'], - responsive: true, - }, - colEnd: { - type: 'enum | string', - values: [...columnsValues, 'auto'], - responsive: true, - }, - ...childrenPropDefs, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const gridUsageSnippet = `import { Grid } from '@backstage/ui'; - -`; - -export const gridDefaultSnippet = ` - - - -`; - -export const gridSimpleSnippet = ` - Hello World - Hello World - Hello World -`; - -export const gridComplexSnippet = ` - - Hello World - - - Hello World - -`; - -export const gridMixingRowsSnippet = ` - - Hello World - - - Hello World - - - Hello World - -`; - -export const gridResponsiveSnippet = ` - - - - Hello World - -`; - -export const gridStartEndSnippet = ` - - Hello World - -`; diff --git a/docs-ui/src/content/header-page.mdx b/docs-ui/src/content/header-page.mdx deleted file mode 100644 index 12ef2c32ee..0000000000 --- a/docs-ui/src/content/header-page.mdx +++ /dev/null @@ -1,88 +0,0 @@ -import { PropsTable } from '@/components/PropsTable'; -import { CodeBlock } from '@/components/CodeBlock'; -import { Snippet } from '@/components/Snippet'; -import { HeaderPageSnippet } from '@/snippets/stories-snippets'; -import { - propDefs, - usage, - simple, - defaultSnippet, - withTabs, - withBreadcrumbs, - withCustomActions, - withMenuItems, -} from './header-page.props'; -import { PageTitle } from '@/components/PageTitle'; -import { Theming } from '@/components/Theming'; -import { HeaderPageDefinition } from '../utils/definitions'; -import { ChangelogComponent } from '@/components/ChangelogComponent'; - - - -} - code={defaultSnippet} -/> - -## Usage - - - -## API reference - - - -## Examples - -### With Breadcrumbs - -You can add breadcrumbs to the header page to help users navigate to the previous page. The `breadcrumbs` -prop is an array of objects with a `label` and `href` property. By default we truncate the breadcrumb label to 240px. - -} - code={withBreadcrumbs} -/> - -### With Tabs - -You can add tabs to the header page to help users navigate to the different sections of the page. The `tabs` -prop is an array of objects with a `label` and `href` property. - -} - code={withTabs} -/> - -### With Custom Actions - -You can add custom actions to the header page to help users navigate to the different sections of the page. The `customActions` -prop is a React node. - -} - code={withCustomActions} -/> - -### With Menu Items - -You can add menu items to the header page to help users navigate to the different sections of the page. The `menuItems` -prop is an array of objects with a `label`, `value` and `onClick` property. - -} - code={withMenuItems} -/> - - - - diff --git a/docs-ui/src/content/header-page.props.ts b/docs-ui/src/content/header-page.props.ts deleted file mode 100644 index fca9497b58..0000000000 --- a/docs-ui/src/content/header-page.props.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { - childrenPropDefs, - classNamePropDefs, - stylePropDefs, - type PropDef, -} from '@/utils/propDefs'; - -export const propDefs: Record = { - title: { - type: 'string', - default: 'Your plugin', - }, - customActions: { - type: 'enum', - values: ['ReactNode'], - }, - menuItems: { - type: 'complex', - complexType: { - name: 'MenuItem[]', - properties: { - label: { - type: 'string', - required: true, - description: 'Display text for the menu item', - }, - value: { - type: 'string', - required: true, - description: 'Unique value for the menu item', - }, - onClick: { - type: '() => void', - required: false, - description: 'Callback function when menu item is clicked', - }, - }, - }, - }, - tabs: { - type: 'complex', - complexType: { - name: 'HeaderTab[]', - properties: { - id: { - type: 'string', - required: true, - description: 'Unique identifier for the tab', - }, - label: { - type: 'string', - required: true, - description: 'Display text for the tab', - }, - href: { - type: 'string', - required: false, - description: 'URL to navigate to when tab is clicked', - }, - matchStrategy: { - type: "'exact' | 'prefix'", - required: false, - description: 'How to match the current route to highlight the tab', - }, - }, - }, - }, - breadcrumbs: { - type: 'complex', - complexType: { - name: 'Breadcrumb[]', - properties: { - label: { - type: 'string', - required: true, - description: 'Display text for the breadcrumb', - }, - href: { - type: 'string', - required: true, - description: 'URL for the breadcrumb link', - }, - }, - }, - }, - ...childrenPropDefs, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const usage = `import { HeaderPage } from '@backstage/ui'; - -`; - -export const defaultSnippet = `Custom action} -/>`; - -export const withBreadcrumbs = ``; - -export const withTabs = ``; - -export const withCustomActions = `Custom action} -/>`; - -export const withMenuItems = ` {} }, - { label: 'Invite new members', value: 'invite-new-members', onClick: () => {} }, - ]} -/>`; diff --git a/docs-ui/src/content/header.mdx b/docs-ui/src/content/header.mdx deleted file mode 100644 index eb505d7a62..0000000000 --- a/docs-ui/src/content/header.mdx +++ /dev/null @@ -1,86 +0,0 @@ -import { PropsTable } from '@/components/PropsTable'; -import { CodeBlock } from '@/components/CodeBlock'; -import { Snippet } from '@/components/Snippet'; -import { HeaderSnippet } from '@/snippets/stories-snippets'; -import { - propDefs, - usage, - simple, - defaultSnippet, - withTabs, - withBreadcrumbs, - withHeaderPage, -} from './header.props'; -import { PageTitle } from '@/components/PageTitle'; -import { Theming } from '@/components/Theming'; -import { HeaderDefinition } from '../utils/definitions'; -import { ChangelogComponent } from '@/components/ChangelogComponent'; - - - -} - code={defaultSnippet} -/> - -## Usage - - - -## API reference - - - -## Examples - -### Simple header - -A simple example of how to use the Header component. - -} - code={simple} - open -/> - -### Header with tabs - -A simple example of how to use the Header component with tabs. All links are using React Router -under the hood and will be active when you are on the corresponding page. - -} -code={withTabs} -open -/> - -### Header with breadcrumbs - -Breacrumbs should appear when you scroll down (and not directly visible as it is in the demo below). - -} - code={withBreadcrumbs} - open -/> - -### Header with HeaderPage - -You can use the `Header` component inside the [HeaderPage](/components/header-page) component to compose your multi-level navigation. - -} - code={withHeaderPage} - open -/> - - - - diff --git a/docs-ui/src/content/header.props.ts b/docs-ui/src/content/header.props.ts deleted file mode 100644 index af9a745fc5..0000000000 --- a/docs-ui/src/content/header.props.ts +++ /dev/null @@ -1,200 +0,0 @@ -import { - childrenPropDefs, - classNamePropDefs, - stylePropDefs, - type PropDef, -} from '@/utils/propDefs'; - -export const propDefs: Record = { - icon: { - type: 'enum', - values: ['ReactNode'], - }, - title: { - type: 'string', - default: 'Your plugin', - }, - titleLink: { - type: 'string', - default: '/', - }, - customActions: { - type: 'enum', - values: ['ReactNode'], - }, - menuItems: { - type: 'complex', - complexType: { - name: 'MenuItem[]', - properties: { - label: { - type: 'string', - required: true, - description: 'Display text for the menu item', - }, - value: { - type: 'string', - required: true, - description: 'Unique value for the menu item', - }, - onClick: { - type: '() => void', - required: false, - description: 'Callback function when menu item is clicked', - }, - }, - }, - }, - tabs: { - type: 'complex', - complexType: { - name: 'HeaderTab[]', - properties: { - id: { - type: 'string', - required: true, - description: 'Unique identifier for the tab', - }, - label: { - type: 'string', - required: true, - description: 'Display text for the tab', - }, - href: { - type: 'string', - required: false, - description: 'URL to navigate to when tab is clicked', - }, - matchStrategy: { - type: "'exact' | 'prefix'", - required: false, - description: 'How to match the current route to highlight the tab', - }, - }, - }, - }, - onTabSelectionChange: { - type: 'enum', - values: ['(key: string) => void'], - }, - ...childrenPropDefs, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const usage = `import { Header } from '@backstage/ui'; - -
    `; - -export const defaultSnippet = `
    - } /> - } /> - } /> - - } -/>`; - -export const simple = `
    - } /> - } /> - } /> - - } -/>`; - -export const withTabs = ` -
    - } /> - } /> - } /> - - } - tabs={[ - { id: 'overview', label: 'Overview' }, - { id: 'checks', label: 'Checks' }, - { id: 'tracks', label: 'Tracks' }, - { id: 'campaigns', label: 'Campaigns' }, - { id: 'integrations', label: 'Integrations' }, - ]} -/> -`; - -export const withBreadcrumbs = `
    `; - -export const withHeaderPage = `
    -Custom action} -/>`; diff --git a/docs-ui/src/content/link.mdx b/docs-ui/src/content/link.mdx deleted file mode 100644 index 486c06b298..0000000000 --- a/docs-ui/src/content/link.mdx +++ /dev/null @@ -1,103 +0,0 @@ -import { PropsTable } from '@/components/PropsTable'; -import { Snippet } from '@/components/Snippet'; -import { CodeBlock } from '@/components/CodeBlock'; -import { - MenuSnippet, - ButtonSnippet, - LinkSnippet, -} from '@/snippets/stories-snippets'; -import { - linkPropDefs, - linkUsageSnippet, - linkDefaultSnippet, - linkVariantsSnippet, - linkWeightsSnippet, - linkColorsSnippet, - linkRouterSnippet, - linkTruncateSnippet, -} from './link.props'; -import { PageTitle } from '@/components/PageTitle'; -import { Theming } from '@/components/Theming'; -import { ChangelogComponent } from '@/components/ChangelogComponent'; -import { LinkDefinition } from '../utils/definitions'; - - - -} - code={linkDefaultSnippet} -/> - -## Usage - - - -## API reference - - - -## Router Integration - -The `Link` component handles both internal and external navigation. It automatically detects whether the provided URL is internal (relative path) or external (absolute URL with protocol) and renders the appropriate element: - -- **Internal routes**: Uses `react-router-dom`'s `Link` component for client-side navigation -- **External URLs**: Renders a standard `` element for traditional navigation - - - -## Examples - -### Variants - -Here's a view when links have different variants. - -} - code={linkVariantsSnippet} -/> - -### Weights - -Here's a view when links have different weights. - -} - code={linkWeightsSnippet} -/> - -### Colors - -Here's a view when links have different colors. - -} - code={linkColorsSnippet} -/> - -### Truncate - -The `Link` component has a `truncate` prop that can be used to truncate the text. - -} - code={linkTruncateSnippet} -/> - - - - diff --git a/docs-ui/src/content/link.props.ts b/docs-ui/src/content/link.props.ts deleted file mode 100644 index 748e64cc15..0000000000 --- a/docs-ui/src/content/link.props.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { - classNamePropDefs, - stylePropDefs, - type PropDef, -} from '@/utils/propDefs'; - -export const linkPropDefs: Record = { - href: { - type: 'string', - }, - variant: { - type: 'enum', - values: [ - 'title-large', - 'title-medium', - 'title-small', - 'title-x-small', - 'body-large', - 'body-medium', - 'body-small', - 'body-x-small', - ], - default: 'body-medium', - responsive: true, - }, - weight: { - type: 'enum', - values: ['regular', 'bold'], - default: 'regular', - responsive: true, - }, - color: { - type: 'enum', - values: ['primary', 'secondary', 'danger', 'warning', 'success'], - default: 'primary', - responsive: true, - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const linkUsageSnippet = `import { Link } from '@backstage/ui'; - -Sign up for Backstage`; - -export const linkDefaultSnippet = `Sign up for Backstage`; - -export const linkVariantsSnippet = ` - ... - ... - ... - ... - ... - ... - ... - ... -`; - -export const linkWeightsSnippet = ` - - -`; - -export const linkColorsSnippet = ` - I am primary - I am secondary - I am danger - I am warning - I am success -`; - -export const linkRouterSnippet = `import { Link } from '@backstage/ui'; - -// Internal route -Home - -// External URL -Backstage -`; - -export const linkTruncateSnippet = `...`; diff --git a/docs-ui/src/content/menu.mdx b/docs-ui/src/content/menu.mdx deleted file mode 100644 index 9ede0885e2..0000000000 --- a/docs-ui/src/content/menu.mdx +++ /dev/null @@ -1,237 +0,0 @@ -import { PropsTable } from '@/components/PropsTable'; -import { Snippet } from '@/components/Snippet'; -import { CodeBlock } from '@/components/CodeBlock'; -import { MenuSnippet } from '@/snippets/stories-snippets'; -import { - usage, - preview, - submenu, - icons, - sections, - separators, - links, - autocomplete, - autocompleteListbox, - autocompleteListboxMultiple, - menuTriggerPropDefs, - submenuTriggerPropDefs, - menuPropDefs, - menuListBoxPropDefs, - menuAutocompletePropDefs, - menuAutocompleteListboxPropDefs, - menuItemPropDefs, - menuListBoxItemPropDefs, - menuSectionPropDefs, - menuSeparatorPropDefs, -} from './menu.props'; -import { PageTitle } from '@/components/PageTitle'; -import { Theming } from '@/components/Theming'; -import { ChangelogComponent } from '@/components/ChangelogComponent'; -import { MenuDefinition } from '../utils/definitions'; - - - -} - code={preview} -/> - -## Usage - - - -### Triggers - -- `MenuTrigger` is a wrapper component that combines a button or other trigger element with a menu displayed in a popover. -- `SubmenuTrigger` is a wrapper component that combines a `MenuItem` with a menu displayed in a popover. - -### Containers - -- `Menu` is a container component that contains a list of menu items or sections. -- `MenuListBox` is a container component that contains a list of menu items or sections. -- `MenuAutocomplete` is a container component that contains a list of menu items or sections. -- `MenuAutocompleteListbox` is a container component that contains a list of menu items or sections. - -### Items - -- `MenuItem` is an individual interactive item in the menu. -- `MenuListBoxItem` is an individual interactive item in the menu list box. - -### Separators - -- `MenuSeparator` is a component that renders a horizontal line to separate menu items. -- `MenuSection` is a component that renders a section in the menu. - -## API reference - -### MenuTrigger - -`MenuTrigger` accepts exactly two children: the first child should be the trigger element, and second child should be -one of the menu containers containing the menu. - - - -### SubmenuTrigger - -The `SubmenuTrigger` accepts exactly two children: the first child should be the `MenuItem` which triggers opening -of the submenu, and second child should be one of the menu containers containing the submenu. - - - -### Menu - -`Menu` is a container component that contains a list of menu items or sections. - - - -### MenuListBox - -`MenuListBox` is a container component that contains a list of menu items or sections. - - - -### MenuAutocomplete - -`MenuAutocomplete` is a container component that contains a list of menu items or sections. - - - -### MenuAutocompleteListbox - -`MenuAutocompleteListbox` is a container component that contains a list of menu items or sections. - - - -### MenuItem - -`MenuItem` is an individual interactive item in the menu. - - - -### MenuListBoxItem - -`MenuListBoxItem` is an individual interactive item in the menu list box. - - - -### MenuSection - -`MenuSection` is a component that renders a section in the menu. - - - -### MenuSeparator - -`MenuSeparator` is a component that renders a horizontal line to separate menu items. - - - -## Examples - -### Nested navigation - -You can nest menus to create a more complex navigation structure. It is important to use the `placement` prop to ensure -the submenu is displayed in the correct position. The best practice is to use the `right top` placement for the submenu. - -} - code={submenu} -/> - -### With icons - -You can use the `iconStart` prop to add an icon to the menu item. - -} - code={icons} -/> - -### With links - -You can use the `href` prop to add a link to the menu item. This is using our router provider under the hood -to work for both internal and external links. - -} - code={links} -/> - -### With sections - -You can use the `MenuSection` component to add a section to the menu. - -} - code={sections} -/> - -### With separators - -You can use the `MenuSeparator` component to add a separator to the menu. - -} - code={separators} -/> - -### With autocomplete - -You can use the `MenuAutocomplete` component to add a autocomplete to the menu. - -} - code={autocomplete} -/> - -### With list box - -You can use the `MenuListBox` component to add a list box to the menu. - -} - code={autocompleteListbox} -/> - -### With list box with multiple selection - -You can use the `MenuListBox` component to add a list box to the menu. You can also use the `selectionMode` prop to -allow multiple selection. - -} - code={autocompleteListboxMultiple} -/> - - - - diff --git a/docs-ui/src/content/menu.props.ts b/docs-ui/src/content/menu.props.ts deleted file mode 100644 index 2c7d76dd5d..0000000000 --- a/docs-ui/src/content/menu.props.ts +++ /dev/null @@ -1,372 +0,0 @@ -import { - classNamePropDefs, - stylePropDefs, - type PropDef, -} from '@/utils/propDefs'; - -const placementValues = [ - 'bottom', - 'bottom left', - 'bottom right', - 'bottom start', - 'bottom end', - 'top', - 'top left', - 'top right', - 'top start', - 'top end', - 'left', - 'left top', - 'left bottom', - 'start', - 'start top', - 'start bottom', - 'right', - 'right top', - 'right bottom', - 'end', - 'end top', - 'end bottom', -]; - -export const menuTriggerPropDefs: Record = { - isOpen: { - type: 'boolean', - }, - defaultOpen: { - type: 'boolean', - }, - onOpenChange: { - type: 'enum', - values: ['(isOpen: boolean) => void'], - }, -}; - -export const submenuTriggerPropDefs: Record = { - delay: { - type: 'number', - default: '200', - }, -}; - -export const menuPropDefs: Record = { - disabledKeys: { - type: 'enum', - values: ['Iterable'], - }, - selectionMode: { - type: 'enum', - values: ['none', 'single', 'multiple'], - }, - selectedKeys: { - type: 'enum', - values: ['all', 'Iterable'], - }, - defaultSelectedKeys: { - type: 'enum', - values: ['all', 'Iterable'], - }, - placement: { - type: 'enum', - values: placementValues, - }, - virtualized: { - type: 'boolean', - default: 'false', - }, - maxWidth: { - type: 'number', - }, - maxHeight: { - type: 'number', - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const menuListBoxPropDefs: Record = { - disabledKeys: { - type: 'enum', - values: ['Iterable'], - }, - selectionMode: { - type: 'enum', - values: ['none', 'single', 'multiple'], - }, - selectedKeys: { - type: 'enum', - values: ['all', 'Iterable'], - }, - defaultSelectedKeys: { - type: 'enum', - values: ['all', 'Iterable'], - }, - placement: { - type: 'enum', - values: placementValues, - }, - virtualized: { - type: 'boolean', - default: 'false', - }, - maxWidth: { - type: 'number', - }, - maxHeight: { - type: 'number', - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const menuAutocompletePropDefs: Record = { - placement: { - type: 'enum', - values: placementValues, - }, - virtualized: { - type: 'boolean', - default: 'false', - }, - maxWidth: { - type: 'number', - }, - maxHeight: { - type: 'number', - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const menuAutocompleteListboxPropDefs: Record = { - placement: { - type: 'enum', - values: placementValues, - }, - virtualized: { - type: 'boolean', - default: 'false', - }, - maxWidth: { - type: 'number', - }, - maxHeight: { - type: 'number', - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const menuItemPropDefs: Record = { - id: { - type: 'enum', - values: ['Key'], - }, - value: { - type: 'string', - }, - textValue: { - type: 'string', - }, - isDisabled: { - type: 'boolean', - }, - href: { - type: 'string', - }, - onAction: { - type: 'enum', - values: ['(event) => void'], - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const menuListBoxItemPropDefs: Record = { - id: { - type: 'enum', - values: ['Key'], - }, - value: { - type: 'string', - }, - textValue: { - type: 'string', - }, - isDisabled: { - type: 'boolean', - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const menuSectionPropDefs: Record = { - title: { - type: 'string', - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const menuSeparatorPropDefs: Record = { - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const usage = `import { MenuTrigger, Menu, MenuItem } from '@backstage/ui'; - - - - - Apple - Banana - Blueberry - - - Vegetables - - Carrot - Tomato - Potato - - - -`; - -export const preview = ` - - - {options.map(option => ( - {option.label} - ))} - -`; - -export const submenu = ` - - - Edit - Duplicate - - Submenu - - Edit - Duplicate - Rename - - Share - Move - - }>Feedback - - - -`; - -export const icons = ` - - - }>Copy - }>Rename - }>Send feedback - -`; - -export const sections = ` - - - - }>Profile - }>Settings - - - }>Help Center - }> - Contact Support - - }>Feedback - - -`; - -export const separators = ` - - - Edit - Duplicate - Rename - - Share - Move - - }>Feedback - -`; - -export const links = ` - - - Internal link - - External link - - Email link - -`; - -export const autocomplete = ` - - - Create new file... - Create new folder... - Assign to... - Assign to me - Change status... - Change priority... - Add label... - Remove label... - -`; - -export const autocompleteListbox = `const [selected, setSelected] = useState( - new Set(['blueberry']), -); - - - Selected: {Array.from(selected).join(', ')} - - - - {options.map(option => ( - - {option.label} - - ))} - - -`; - -export const autocompleteListboxMultiple = `const [selected, setSelected] = useState( - new Set(['blueberry', 'cherry']), -); - - - Selected: {Array.from(selected).join(', ')} - - - - {options.map(option => ( - - {option.label} - - ))} - - -`; diff --git a/docs-ui/src/content/password-field.mdx b/docs-ui/src/content/password-field.mdx deleted file mode 100644 index 8dda2b4f2a..0000000000 --- a/docs-ui/src/content/password-field.mdx +++ /dev/null @@ -1,65 +0,0 @@ -import { PropsTable } from '@/components/PropsTable'; -import { Snippet } from '@/components/Snippet'; -import { PasswordFieldSnippet } from '@/snippets/stories-snippets'; -import { - inputPropDefs, - passwordFieldUsageSnippet, - passwordFieldDefaultSnippet, - passwordFieldSizesSnippet, - passwordFieldDescriptionSnippet, -} from './password-field.props'; -import { PageTitle } from '@/components/PageTitle'; -import { Theming } from '@/components/Theming'; -import { ChangelogComponent } from '@/components/ChangelogComponent'; -import { CodeBlock } from '@/components/CodeBlock'; -import { PasswordFieldDefinition } from '../utils/definitions'; - - - -} - code={passwordFieldDefaultSnippet} -/> - -## Usage - - - -## API reference - - - -## Examples - -### Sizes - -We support two different sizes: `small`, `medium`. - -} - code={passwordFieldSizesSnippet} -/> - -### With description - -Here's a simple PasswordField with a description. - -} - code={passwordFieldDescriptionSnippet} -/> - - - - diff --git a/docs-ui/src/content/password-field.props.ts b/docs-ui/src/content/password-field.props.ts deleted file mode 100644 index 493405b5fd..0000000000 --- a/docs-ui/src/content/password-field.props.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { - classNamePropDefs, - stylePropDefs, - type PropDef, -} from '@/utils/propDefs'; - -export const inputPropDefs: Record = { - size: { - type: 'enum', - values: ['small', 'medium'], - default: 'small', - responsive: true, - }, - label: { - type: 'string', - }, - icon: { - type: 'enum', - values: ['ReactNode'], - }, - description: { - type: 'string', - }, - name: { - type: 'string', - required: true, - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const passwordFieldUsageSnippet = `import { PasswordField } from '@backstage/ui'; - -`; - -export const passwordFieldDefaultSnippet = ``; - -export const passwordFieldSizesSnippet = ` - } /> - } /> -`; - -export const passwordFieldDescriptionSnippet = ``; diff --git a/docs-ui/src/content/radio-group.mdx b/docs-ui/src/content/radio-group.mdx deleted file mode 100644 index ba9352c026..0000000000 --- a/docs-ui/src/content/radio-group.mdx +++ /dev/null @@ -1,105 +0,0 @@ -import { PropsTable } from '@/components/PropsTable'; -import { Snippet } from '@/components/Snippet'; -import { RadioGroupSnippet } from '@/snippets/stories-snippets'; -import { - radioGroupPropDefs, - radioGroupUsageSnippet, - radioGroupDefaultSnippet, - radioGroupDescriptionSnippet, - radioGroupHorizontalSnippet, - radioGroupDisabledSnippet, - radioGroupDisabledSingleSnippet, - radioGroupValidationSnippet, - radioGroupReadOnlySnippet, -} from './radio-group.props'; -import { PageTitle } from '@/components/PageTitle'; -import { Theming } from '@/components/Theming'; -import { ChangelogComponent } from '@/components/ChangelogComponent'; -import { CodeBlock } from '@/components/CodeBlock'; -import { RadioGroupDefinition } from '../utils/definitions'; - - - -} - code={radioGroupDefaultSnippet} -/> - -## Usage - - - -## API reference - - - -## Examples - -### Horizontal - -Here's a simple TextField with a description. - -} - code={radioGroupHorizontalSnippet} -/> - -### Disabled - -You can disable the entire radio group by adding the `isDisabled` prop to the `RadioGroup` component. - -} - code={radioGroupDisabledSnippet} -/> - -### Disabled Single radio - -You can disable a single radio by adding the `isDisabled` prop to the `Radio` component. - -} - code={radioGroupDisabledSingleSnippet} -/> - -### Validation - -Here's an example of a radio group with errors. - -} - code={radioGroupValidationSnippet} -/> - -### Read only - -You can make the radio group read only by adding the `isReadOnly` prop to the `RadioGroup` component. - -} - code={radioGroupReadOnlySnippet} -/> - - - - diff --git a/docs-ui/src/content/radio-group.props.ts b/docs-ui/src/content/radio-group.props.ts deleted file mode 100644 index 3ed08f1053..0000000000 --- a/docs-ui/src/content/radio-group.props.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { - classNamePropDefs, - stylePropDefs, - type PropDef, -} from '@/utils/propDefs'; - -export const radioGroupPropDefs: Record = { - size: { - type: 'enum', - values: ['small', 'medium'], - default: 'small', - responsive: true, - }, - label: { - type: 'string', - }, - icon: { - type: 'enum', - values: ['ReactNode'], - }, - description: { - type: 'string', - }, - name: { - type: 'string', - required: true, - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const radioGroupUsageSnippet = `import { RadioGroup } from '@backstage/ui'; - -`; - -export const radioGroupDefaultSnippet = ``; - -export const radioGroupDescriptionSnippet = ``; - -export const radioGroupHorizontalSnippet = ``; - -export const radioGroupDisabledSnippet = ` - Bulbasaur - Charmander - Squirtle -`; - -export const radioGroupDisabledSingleSnippet = ` - Bulbasaur - Charmander - Squirtle -`; - -export const radioGroupValidationSnippet = ` (value === \'charmander\' ? \'Nice try!\' : null)> - Bulbasaur - Charmander - Squirtle -`; - -export const radioGroupReadOnlySnippet = ` - Bulbasaur - Charmander - Squirtle -`; diff --git a/docs-ui/src/content/search-field.mdx b/docs-ui/src/content/search-field.mdx deleted file mode 100644 index 6b33feea42..0000000000 --- a/docs-ui/src/content/search-field.mdx +++ /dev/null @@ -1,78 +0,0 @@ -import { PropsTable } from '@/components/PropsTable'; -import { Snippet } from '@/components/Snippet'; -import { SearchFieldSnippet } from '@/snippets/stories-snippets'; -import { - searchFieldPropDefs, - searchFieldUsageSnippet, - searchFieldDefaultSnippet, - searchFieldSizesSnippet, - searchFieldDescriptionSnippet, - searchFieldCollapsibleSnippet, -} from './search-field.props'; -import { PageTitle } from '@/components/PageTitle'; -import { Theming } from '@/components/Theming'; -import { ChangelogComponent } from '@/components/ChangelogComponent'; -import { CodeBlock } from '@/components/CodeBlock'; -import { SearchFieldDefinition } from '../utils/definitions'; - - - -} - code={searchFieldDefaultSnippet} -/> - -## Usage - - - -## API reference - - - -## Examples - -### Sizes - -We support two different sizes: `small`, `medium`. - -} - code={searchFieldSizesSnippet} -/> - -### With description - -Here's a simple SearchField with a description. - -} - code={searchFieldDescriptionSnippet} -/> - -### Collapsible - -You can make the SearchField collapsible by setting the `startCollapsed` prop to `true`. - -} - code={searchFieldCollapsibleSnippet} -/> - - - - diff --git a/docs-ui/src/content/search-field.props.ts b/docs-ui/src/content/search-field.props.ts deleted file mode 100644 index b11ae3931c..0000000000 --- a/docs-ui/src/content/search-field.props.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { - classNamePropDefs, - stylePropDefs, - type PropDef, -} from '@/utils/propDefs'; - -export const searchFieldPropDefs: Record = { - size: { - type: 'enum', - values: ['small', 'medium'], - default: 'small', - responsive: true, - }, - label: { - type: 'string', - }, - icon: { - type: 'enum', - values: ['ReactNode'], - }, - description: { - type: 'string', - }, - name: { - type: 'string', - required: true, - }, - startCollapsed: { - type: 'boolean', - default: 'false', - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const searchFieldUsageSnippet = `import { SearchField } from '@backstage/ui'; - -`; - -export const searchFieldDefaultSnippet = ``; - -export const searchFieldSizesSnippet = ` - } /> - } /> -`; - -export const searchFieldDescriptionSnippet = ``; - -export const searchFieldCollapsibleSnippet = ``; diff --git a/docs-ui/src/content/select.mdx b/docs-ui/src/content/select.mdx deleted file mode 100644 index 436129d749..0000000000 --- a/docs-ui/src/content/select.mdx +++ /dev/null @@ -1,138 +0,0 @@ -import { PropsTable } from '@/components/PropsTable'; -import { Snippet } from '@/components/Snippet'; -import { CodeBlock } from '@/components/CodeBlock'; -import { SelectSnippet } from '@/snippets/stories-snippets'; -import { - selectPropDefs, - selectUsageSnippet, - selectDefaultSnippet, - selectDescriptionSnippet, - selectSizesSnippet, - selectDisabledSnippet, - selectResponsiveSnippet, - selectIconSnippet, - selectSearchableSnippet, - selectMultipleSnippet, - selectSearchableMultipleSnippet, -} from './select.props'; -import { PageTitle } from '@/components/PageTitle'; -import { Theming } from '@/components/Theming'; -import { ChangelogComponent } from '@/components/ChangelogComponent'; -import { SelectDefinition } from '../utils/definitions'; - - - -} - code={selectDefaultSnippet} -/> - -## Usage - - - -## API reference - - - -## Examples - -### With Label and description - -Select component with label and description. - -} - code={selectDescriptionSnippet} -/> - -### Sizes - -Here's a view when the selects have different sizes. - -} - code={selectSizesSnippet} -/> - -### With Icon - -Here's a view when the select has an icon. - -} -code={selectIconSnippet} -/> - -### Disabled - -Here's a view when the select is disabled. - -} - code={selectDisabledSnippet} -/> - -### Searchable - -Here's a view when the select has searchable filtering. - -} - code={selectSearchableSnippet} -/> - -### Multiple Selection - -Here's a view when the select allows multiple selections. - -} - code={selectMultipleSnippet} -/> - -### Searchable with Multiple Selection - -Here's a view when the select combines search and multiple selection. - -} - code={selectSearchableMultipleSnippet} -/> - -### Responsive - -Here's a view when the select is responsive. - - - - - - diff --git a/docs-ui/src/content/skeleton.props.ts b/docs-ui/src/content/skeleton.props.ts deleted file mode 100644 index ab79268d15..0000000000 --- a/docs-ui/src/content/skeleton.props.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { - classNamePropDefs, - stylePropDefs, - type PropDef, -} from '@/utils/propDefs'; - -export const skeletonPropDefs: Record = { - width: { - type: 'number', - default: '80', - responsive: false, - }, - height: { - type: 'number', - default: '24', - responsive: false, - }, - rounded: { - type: 'boolean', - default: 'false', - responsive: false, - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const skeletonUsageSnippet = `import { Flex, Skeleton } from '@backstage/ui'; - - - - - -`; - -export const skeletonDefaultSnippet = ` - - - -`; - -export const skeletonDemo1Snippet = ` - - - - - - - - - - -`; - -export const skeletonDemo2Snippet = ` - - - -`; diff --git a/docs-ui/src/content/switch.mdx b/docs-ui/src/content/switch.mdx deleted file mode 100644 index 965cc7832b..0000000000 --- a/docs-ui/src/content/switch.mdx +++ /dev/null @@ -1,47 +0,0 @@ -import { PropsTable } from '@/components/PropsTable'; -import { Snippet } from '@/components/Snippet'; -import { CodeBlock } from '@/components/CodeBlock'; -import { SwitchSnippet } from '@/snippets/stories-snippets'; -import { switchPropDefs, snippetUsage } from './switch.props'; -import { PageTitle } from '@/components/PageTitle'; -import { Theming } from '@/components/Theming'; -import { ChangelogComponent } from '@/components/ChangelogComponent'; -import { SwitchDefinition } from '../utils/definitions'; - - - -} - code={``} -/> - -## Usage - - - -## API reference - - - -## Examples - -### Disabled - -A switch can be disabled using the `isDisabled` prop. - -} - code={``} -/> - - - - diff --git a/docs-ui/src/content/switch.props.ts b/docs-ui/src/content/switch.props.ts deleted file mode 100644 index 5576436102..0000000000 --- a/docs-ui/src/content/switch.props.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { classNamePropDefs, stylePropDefs } from '@/utils/propDefs'; -import type { PropDef } from '@/utils/propDefs'; - -export const switchPropDefs: Record = { - autoFocus: { - type: 'boolean', - }, - defaultSelected: { - type: 'boolean', - }, - ...classNamePropDefs, - isDisabled: { - type: 'boolean', - }, - isReadOnly: { - type: 'boolean', - }, - isSelected: { - type: 'boolean', - }, - label: { - type: 'string', - }, - name: { - type: 'string', - }, - onChange: { - type: 'enum', - values: ['(isSelected: boolean) => void'], - }, - onFocus: { - type: 'enum', - values: ['(e: FocusEvent) => void'], - }, - onBlur: { - type: 'enum', - values: ['(e: FocusEvent) => void'], - }, - onFocusChange: { - type: 'enum', - values: ['(isFocused: boolean) => void'], - }, - onKeyDown: { - type: 'enum', - values: ['(e: KeyboardEvent) => void'], - }, - onKeyUp: { - type: 'enum', - values: ['(e: KeyboardEvent) => void'], - }, - onHoverStart: { - type: 'enum', - values: ['(e: HoverEvent) => void'], - }, - onHoverEnd: { - type: 'enum', - values: ['(e: HoverEvent) => void'], - }, - onHoverChange: { - type: 'enum', - values: ['(isHovered: boolean) => void'], - }, - ...stylePropDefs, - value: { - type: 'string', - }, -}; - -export const snippetUsage = `import { Switch } from '@backstage/ui'; - -`; diff --git a/docs-ui/src/content/table.mdx b/docs-ui/src/content/table.mdx deleted file mode 100644 index 00b7290532..0000000000 --- a/docs-ui/src/content/table.mdx +++ /dev/null @@ -1,165 +0,0 @@ -import { PropsTable } from '@/components/PropsTable'; -import { Snippet } from '@/components/Snippet'; -import { CodeBlock } from '@/components/CodeBlock'; -import { TableSnippet } from '@/snippets/stories-snippets'; -import { - tablePropDefs, - tableHeaderPropDefs, - tableBodyPropDefs, - tablePaginationPropDefs, - tableUsageSnippet, - tableBasicSnippet, - tableRowClickSnippet, - tableHybridSnippet, - tableCellInteractionsSnippet, - tablePaginationSnippet, - tableSelectionActionsSnippet, - tableSelectionModeSnippet, - tableSelectionBehaviorSnippet, - tableSortingSnippet, - columnPropDefs, - rowPropDefs, - cellPropDefs, -} from './table.props'; -import { ChangelogComponent } from '@/components/ChangelogComponent'; -import { PageTitle } from '@/components/PageTitle'; -import { Theming } from '@/components/Theming'; -import { TableDefinition } from '../utils/definitions'; - - - -} - code={tableBasicSnippet} -/> - -## Usage - - - -## API reference - -### Table - -The main table component that renders data in a structured grid format. - - - -### TableHeader - -The header section of the table that contains the column definitions. - - - -### Column - -A column definition that describes how a column should be rendered. - - - -### TableBody - -The body section of the table that contains the rows. - - - -### Row - -A row definition that describes how a row should be rendered. - - - -### Cell - -A cell definition that describes how a cell should be rendered. - - - -### TablePagination - -A pagination component designed to work with the Table component. - - - -## Examples - -### Basic Table - -Coming soon. - -### Row selection - -Tables support row selection with two configuration options: selection mode and selection behavior. - -#### Selection mode - -Use `selectionMode` to control how many rows can be selected. With `single`, only one row can be selected at a time. With `multiple`, any number of rows can be selected, and a header checkbox provides select-all functionality. - -} - code={tableSelectionModeSnippet} -/> - -#### Selection behavior - -Use `selectionBehavior` to control how selection is indicated and interacted with. With `toggle`, checkboxes appear for selection. With `replace`, selection is indicated by row background color—click to select, Cmd/Ctrl+click for multiple. - -} - code={tableSelectionBehaviorSnippet} -/> - -#### With row actions - -With toggle behavior, clicking a row triggers its action when nothing is selected. Once any row is selected, clicking toggles selection instead. - -With replace behavior, clicking selects the row and double-clicking triggers the action. - -} - code={tableSelectionActionsSnippet} -/> - -### Row Clicks - -Coming soon. - -### Pagination - -Coming soon. - -### Sorting - -Coming soon. - -### Asynchronous loading - -Coming soon. - -### Empty state - -Coming soon. - -### Column resizing - -This feature is not available yet — let us know if you'd like us to explore it! - -### Column reordering - -This feature is not available yet — let us know if you'd like us to explore it! - -### Column pinning - -This feature is not available yet — let us know if you'd like us to explore it! - -### Column visibility - -This feature is not available yet — let us know if you'd like us to explore it! - - - - diff --git a/docs-ui/src/content/table.props.ts b/docs-ui/src/content/table.props.ts deleted file mode 100644 index 21bd5597c6..0000000000 --- a/docs-ui/src/content/table.props.ts +++ /dev/null @@ -1,377 +0,0 @@ -import { - classNamePropDefs, - stylePropDefs, - type PropDef, -} from '@/utils/propDefs'; - -export const tablePropDefs: Record = { - selectionBehavior: { - type: 'enum', - values: ['toggle', 'replace'], - default: 'toggle', - description: 'How multiple selection should behave in the collection.', - }, - disabledBehavior: { - type: 'enum', - values: ['selection', 'all'], - default: 'selection', - description: - 'Whether disabledKeys applies to all interactions, or only selection.', - }, - disabledKeys: { - type: 'enum', - values: ['Iterable'], - description: 'A list of row keys to disable.', - }, - selectionMode: { - type: 'enum', - values: ['single', 'multiple'], - description: 'The type of selection that is allowed in the collection.', - }, - selectedKeys: { - type: 'enum', - values: ['all', 'Iterable'], - description: 'The currently selected keys in the collection (controlled).', - }, - defaultSelectedKeys: { - type: 'enum', - values: ['all', 'Iterable'], - description: 'The initial selected keys in the collection (uncontrolled).', - }, - onRowAction: { - type: 'enum', - values: ['(key: Key) => void'], - description: - 'Handler that is called when a user performs an action on the row.', - }, - onSelectionChange: { - type: 'enum', - values: ['(keys: Selection) => void'], - description: 'Handler that is called when the selection changes.', - }, - onSortChange: { - type: 'enum', - values: ['(descriptor: SortDescriptor) => any'], - description: - 'Handler that is called when the sorted column or direction changes.', - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const tableHeaderPropDefs: Record = { - onHoverStart: { - type: 'enum', - values: ['(e: HoverEvent) => void'], - description: 'Handler that is called when a hover interaction starts.', - }, - onHoverEnd: { - type: 'enum', - values: ['(e: HoverEvent) => void'], - description: 'Handler that is called when a hover interaction ends.', - }, - onHoverChange: { - type: 'enum', - values: ['(isHovering: boolean) => void'], - description: 'Handler that is called when the hover state changes.', - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const columnPropDefs: Record = { - id: { - type: 'enum', - values: ['Key'], - description: 'The unique id of the column.', - }, - allowsSorting: { - type: 'boolean', - description: 'Whether the column allows sorting.', - }, - isRowHeader: { - type: 'boolean', - description: - 'Whether a column is a row header and should be announced by assistive technology during row navigation.', - }, - textValue: { - type: 'string', - description: - "A string representation of the column's contents, used for accessibility announcements.", - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const tableBodyPropDefs: Record = { - renderEmptyState: { - type: 'enum', - values: ['(props) => ReactNode'], - description: - 'Provides content to display when there are no rows in the table.', - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const rowPropDefs: Record = { - textValue: { - type: 'string', - description: - "A string representation of the row's contents, used for accessibility announcements.", - }, - isDisabled: { - type: 'boolean', - description: 'Whether the row is disabled.', - }, - id: { - type: 'enum', - values: ['Key'], - description: 'The unique id of the row.', - }, - href: { - type: 'string', - description: 'The URL to navigate to when the row is clicked.', - }, - hrefLang: { - type: 'string', - description: - 'The language of the URL to navigate to when the row is clicked.', - }, - target: { - type: 'string', - description: - 'The target of the URL to navigate to when the row is clicked.', - }, - rel: { - type: 'string', - description: - 'The relationship of the URL to navigate to when the row is clicked.', - }, - onAction: { - type: 'enum', - values: ['() => void'], - description: - "Handler that is called when a user performs an action on the row. The exact user event depends on the collection's selectionBehavior prop and the interaction modality.", - }, - onHoverStart: { - type: 'enum', - values: ['(e: HoverEvent) => void'], - description: 'Handler that is called when a hover interaction starts.', - }, - onHoverEnd: { - type: 'enum', - values: ['(e: HoverEvent) => void'], - description: 'Handler that is called when a hover interaction ends.', - }, - onHoverChange: { - type: 'enum', - values: ['(isHovering: boolean) => void'], - description: 'Handler that is called when the hover state changes.', - }, - onPress: { - type: 'enum', - values: ['(e: PressEvent) => void'], - description: - 'Handler that is called when the press is released over the target.', - }, - onPressStart: { - type: 'enum', - values: ['(e: PressEvent) => void'], - description: 'Handler that is called when a press interaction starts.', - }, - onPressEnd: { - type: 'enum', - values: ['(e: PressEvent) => void'], - description: - 'Handler that is called when a press interaction ends, either over the target or when the pointer leaves the target.', - }, - onPressChange: { - type: 'enum', - values: ['(isPressed: boolean) => void'], - description: 'Handler that is called when the press state changes.', - }, - onPressUp: { - type: 'enum', - values: ['(e: PressEvent) => void'], - description: - 'Handler that is called when a press is released over the target, regardless of whether it started on the target or not.', - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const cellPropDefs: Record = { - id: { - type: 'enum', - values: ['Key'], - description: 'The unique id of the cell.', - }, - textValue: { - type: 'string', - description: - "A string representation of the cell's contents, used for features like typeahead.", - }, - leadingIcon: { - type: 'enum', - values: ['ReactNode'], - description: 'Optional icon to display before the cell content.', - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const tablePaginationPropDefs: Record = { - offset: { - type: 'number', - description: 'The current offset (starting index) for pagination.', - }, - pageSize: { - type: 'number', - description: 'The number of items per page.', - }, - setOffset: { - type: 'enum', - values: ['(offset: number) => void'], - description: 'Handler that is called when the offset changes.', - }, - setPageSize: { - type: 'enum', - values: ['(pageSize: number) => void'], - description: 'Handler that is called when the page size changes.', - }, - rowCount: { - type: 'number', - description: 'The total number of rows in the table.', - }, - onNextPage: { - type: 'enum', - values: ['() => void'], - description: 'Handler that is called when the next page is requested.', - }, - onPreviousPage: { - type: 'enum', - values: ['() => void'], - description: 'Handler that is called when the previous page is requested.', - }, - onPageSizeChange: { - type: 'enum', - values: ['(pageSize: number) => void'], - description: 'Handler that is called when the page size changes.', - }, - showPageSizeOptions: { - type: 'boolean', - description: 'Whether to show the page size options.', - }, - ...classNamePropDefs, - ...stylePropDefs, -}; - -export const tableUsageSnippet = `import { Cell, CellText, ..., TableHeader, TablePagination } from '@backstage/ui'; - -
    + {children}
    - - - - - - - - - -
    -`; - -export const tableBasicSnippet = `import { Table, TableHeader, Column, TableBody, Row, CellText, CellProfile, TablePagination, useTable } from '@backstage/ui'; - -const data = [ - { - name: 'The Beatles', - image: 'https://upload.wikimedia.org/wikipedia/en/thumb/4/42/Beatles_-...jpg', - genre: 'Rock, Pop, Psychedelic Rock', - yearFormed: 1960, - albums: 13 - }, - // ... more data -]; - -// Uncontrolled pagination (easiest) -const { data: paginatedData, paginationProps } = useTable({ - data, - pagination: { - defaultPageSize: 5, - }, -}); - - - - Band name - Genre - Year formed - Albums - - - {paginatedData?.map(item => ( - - - - - - - ))} - -
    -`; - -export const tableSelectionActionsSnippet = `import { Table, TableHeader, TableBody, Column, Row, CellText } from '@backstage/ui'; - -function MyTable() { - const [selectedKeys, setSelectedKeys] = React.useState(new Set([])); - - return ( - console.log('Opening', key)} - > - - Name - Status - - - - - - - - - - - -
    - ); -}`; - -export const tableSelectionModeSnippet = ` - {/* ... */} -
    `; - -export const tableSelectionBehaviorSnippet = ` - {/* ... */} -
    `; diff --git a/docs-ui/src/content/tabs.mdx b/docs-ui/src/content/tabs.mdx deleted file mode 100644 index 1fc7448eba..0000000000 --- a/docs-ui/src/content/tabs.mdx +++ /dev/null @@ -1,85 +0,0 @@ -import { PropsTable } from '@/components/PropsTable'; -import { TabsSnippet } from '@/snippets/stories-snippets'; -import { Snippet } from '@/components/Snippet'; -import { CodeBlock } from '@/components/CodeBlock'; -import { - tabsPropDefs, - tabPropDefs, - tabsUsageSnippet, - tabsDefaultSnippet, - tabsWithTabPanelsSnippet, - tabsWithLinksSnippet, - tabsWithDeeplyNestedRoutesSnippet, -} from './tabs.props'; -import { PageTitle } from '@/components/PageTitle'; -import { Theming } from '@/components/Theming'; -import { TabsDefinition } from '../utils/definitions'; -import { ChangelogComponent } from '@/components/ChangelogComponent'; - - - -} - code={tabsDefaultSnippet} -/> - -## Usage - - - -## API reference - -### Tabs - -Groups the tabs and the corresponding panels. Renders a `
    ` element. - - - -### Tab - -An individual interactive tab button that toggles the corresponding panel. Renders a ` - I am a tooltip -`; - -export const tooltipDefaultSnippet = ` - - I am a tooltip -`; diff --git a/docs-ui/src/css/globals.css b/docs-ui/src/css/globals.css index dcc348a9ee..407138fd61 100644 --- a/docs-ui/src/css/globals.css +++ b/docs-ui/src/css/globals.css @@ -17,6 +17,10 @@ --surface-1: #f4f4f4; --code-bg: #3e444f; --code-title: #505865; + --badge-red-bg: color(display-p3 0.831 0.184 0.012/0.091); + --badge-red-color: color(display-p3 0.755 0.259 0.152); + --badge-gray-bg: #dee3ec; + --badge-gray-color: #35363d; } [data-theme-mode='dark'] { diff --git a/docs-ui/src/css/mdx.module.css b/docs-ui/src/css/mdx.module.css index 7cc2422ecd..ea6e3c6549 100644 --- a/docs-ui/src/css/mdx.module.css +++ b/docs-ui/src/css/mdx.module.css @@ -27,18 +27,24 @@ line-height: 1.5; margin-top: 0; margin-bottom: 1rem; - color: var(--secondary); + color: var(--primary); } .ul { - margin: 0; + margin-top: 0; + margin-bottom: 1rem; padding-left: 2rem; } .li { - color: var(--secondary); + color: var(--primary); margin-bottom: 0.5rem; line-height: 1.5; + padding-left: 0.4rem; +} + +.li::marker { + color: var(--text-secondary); } .a { @@ -73,3 +79,34 @@ .anchorLink:hover .anchorHash { opacity: 1; } + +.table { + width: 100%; + border-collapse: collapse; + margin-bottom: 1rem; + font-size: 0.875rem; +} + +.th { + text-align: left; + padding: 0.75rem 1rem; + border-bottom: 1px solid var(--border); + color: var(--primary); + font-weight: 500; +} + +.td { + padding: 0.75rem 1rem; + border-bottom: 1px solid var(--border); + color: var(--secondary); +} + +.td code { + font-family: var(--font-mono); + background-color: var(--bg); + padding: 0.2rem 0.375rem; + border-radius: 0.25rem; + color: var(--secondary); + border: 1px solid var(--border); + font-size: 0.8125rem; +} diff --git a/packages/ui/css/styles.css b/docs-ui/src/css/theme-backstage.css similarity index 94% rename from packages/ui/css/styles.css rename to docs-ui/src/css/theme-backstage.css index c96eda05c9..7316fe0549 100644 --- a/packages/ui/css/styles.css +++ b/docs-ui/src/css/theme-backstage.css @@ -1,15 +1,13 @@ -@layer tokens, base, components, utilities; - -/*! modern-normalize v3.0.1 | MIT License | https://github.com/sindresorhus/modern-normalize */ @layer tokens { :root { --bui-font-regular: system-ui; - --bui-font-monospace: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace; + --bui-font-monospace: ui-monospace, 'Menlo', 'Monaco', 'Consolas', + 'Liberation Mono', 'Courier New', monospace; --bui-font-weight-regular: 400; --bui-font-weight-bold: 600; - --bui-font-size-1: .625rem; - --bui-font-size-2: .75rem; - --bui-font-size-3: .875rem; + --bui-font-size-1: 0.625rem; + --bui-font-size-2: 0.75rem; + --bui-font-size-3: 0.875rem; --bui-font-size-4: 1rem; --bui-font-size-5: 1.25rem; --bui-font-size-6: 1.5rem; @@ -17,8 +15,8 @@ --bui-font-size-8: 3rem; --bui-font-size-9: 4rem; --bui-font-size-10: 5.75rem; - --bui-space: .25rem; - --bui-space-0_5: calc(var(--bui-space) * .5); + --bui-space: 0.25rem; + --bui-space-0_5: calc(var(--bui-space) * 0.5); --bui-space-1: var(--bui-space); --bui-space-1_5: calc(var(--bui-space) * 1.5); --bui-space-2: calc(var(--bui-space) * 2); @@ -34,212 +32,212 @@ --bui-space-12: calc(var(--bui-space) * 12); --bui-space-13: calc(var(--bui-space) * 13); --bui-space-14: calc(var(--bui-space) * 14); - --bui-radius-1: calc(.125rem); - --bui-radius-2: calc(.25rem); - --bui-radius-3: calc(.5rem); - --bui-radius-4: calc(.75rem); + --bui-radius-1: calc(0.125rem); + --bui-radius-2: calc(0.25rem); + --bui-radius-3: calc(0.5rem); + --bui-radius-4: calc(0.75rem); --bui-radius-5: calc(1rem); --bui-radius-6: calc(1.25rem); --bui-radius-full: 9999px; --bui-black: #000; --bui-white: #fff; - --bui-gray-1: #f8f8f8; - --bui-gray-2: #ececec; - --bui-gray-3: #d9d9d9; - --bui-gray-4: #c1c1c1; - --bui-gray-5: #9e9e9e; - --bui-gray-6: #8c8c8c; - --bui-gray-7: #757575; - --bui-gray-8: #595959; - --bui-bg: var(--bui-gray-1); - --bui-bg-surface-1: var(--bui-white); - --bui-bg-surface-2: var(--bui-gray-2); --bui-bg-solid: #1f5493; --bui-bg-solid-hover: #163a66; --bui-bg-solid-pressed: #0f2b4e; - --bui-bg-solid-disabled: #ebebeb; - --bui-bg-tint: transparent; - --bui-bg-tint-hover: #1f549366; - --bui-bg-tint-pressed: #1f549399; - --bui-bg-tint-disabled: #ebebeb; - --bui-bg-danger: #feebe7; - --bui-bg-warning: #fff2b2; - --bui-bg-success: #e6f6eb; + --bui-bg-solid-disabled: #163a66; + --bui-bg-app: #f8f8f8; + --bui-bg-neutral-1: #fff; + --bui-bg-neutral-1-hover: oklch(0% 0 0/0.12); + --bui-bg-neutral-1-pressed: oklch(0% 0 0/0.16); + --bui-bg-neutral-1-disabled: oklch(0% 0 0/0.06); + --bui-bg-neutral-2: oklch(0% 0 0/0.06); + --bui-bg-neutral-2-hover: oklch(0% 0 0/0.12); + --bui-bg-neutral-2-pressed: oklch(0% 0 0/0.16); + --bui-bg-neutral-2-disabled: oklch(0% 0 0/0.06); + --bui-bg-neutral-3: oklch(0% 0 0/0.06); + --bui-bg-neutral-3-hover: oklch(0% 0 0/0.12); + --bui-bg-neutral-3-pressed: oklch(0% 0 0/0.16); + --bui-bg-neutral-3-disabled: oklch(0% 0 0/0.06); + --bui-bg-neutral-4: oklch(0% 0 0/0.06); + --bui-bg-neutral-4-hover: oklch(0% 0 0/0.12); + --bui-bg-neutral-4-pressed: oklch(0% 0 0/0.16); + --bui-bg-neutral-4-disabled: oklch(0% 0 0/0.06); + --bui-bg-danger: #ffe2e2; + --bui-bg-warning: #ffedd5; + --bui-bg-success: #dcfce7; + --bui-bg-info: #dbeafe; --bui-fg-primary: var(--bui-black); - --bui-fg-secondary: var(--bui-gray-7); - --bui-fg-link: #1f5493; - --bui-fg-link-hover: #1f2d5c; - --bui-fg-disabled: #9e9e9e; + --bui-fg-secondary: oklch(0% 0 0/0.5); + --bui-fg-disabled: oklch(0% 0 0/0.28); --bui-fg-solid: var(--bui-white); - --bui-fg-solid-disabled: #9c9c9c; - --bui-fg-tint: #1f5493; - --bui-fg-tint-disabled: var(--bui-gray-5); - --bui-fg-danger: #e22b2b; - --bui-fg-warning: #e36d05; - --bui-fg-success: #1db954; - --bui-border: #0000001a; - --bui-border-hover: #0003; - --bui-border-pressed: #0006; - --bui-border-disabled: #0000001a; + --bui-fg-solid-disabled: #98a8bc; + --bui-fg-danger-on-bg: #991919; + --bui-fg-warning-on-bg: #92310a; + --bui-fg-success-on-bg: #116932; + --bui-fg-info-on-bg: #173da6; + --bui-fg-danger: #ec3b18; + --bui-fg-warning: #ef7a32; + --bui-fg-success: #1ed760; + --bui-fg-info: #0d74ce; + --bui-border-2: #0000001a; + --bui-border-info: #7ea9d6; --bui-border-danger: #f87a7a; --bui-border-warning: #e36d05; --bui-border-success: #53db83; --bui-ring: #1f5493; --bui-scrollbar: #a0a0a03b; --bui-scrollbar-thumb: #a0a0a0; - --bui-animate-pulse: pulse 2s cubic-bezier(.4, 0, .6, 1) infinite; + --bui-shadow: 0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a; + --bui-animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; } - - [data-theme-mode="dark"] { - --bui-gray-1: #191919; - --bui-gray-2: #242424; - --bui-gray-3: #373737; - --bui-gray-4: #464646; - --bui-gray-5: #575757; - --bui-gray-6: #7b7b7b; - --bui-gray-7: #9e9e9e; - --bui-gray-8: #b4b4b4; - --bui-bg: #333; - --bui-bg-surface-1: #424242; - --bui-bg-surface-2: var(--bui-gray-2); + [data-theme-mode='dark'] { --bui-bg-solid: #9cc9ff; --bui-bg-solid-hover: #83b9fd; --bui-bg-solid-pressed: #83b9fd; - --bui-bg-solid-disabled: #222; - --bui-bg-tint: transparent; - --bui-bg-tint-hover: #9cc9ff1f; - --bui-bg-tint-pressed: #9cc9ff29; - --bui-bg-tint-disabled: transparent; - --bui-bg-danger: #3b1219; + --bui-bg-solid-disabled: #1b3d68; + --bui-bg-app: #333; + --bui-bg-neutral-1: oklch(100% 0 0/0.1); + --bui-bg-neutral-1-hover: oklch(100% 0 0/0.14); + --bui-bg-neutral-1-pressed: oklch(100% 0 0/0.2); + --bui-bg-neutral-1-disabled: oklch(100% 0 0/0.1); + --bui-bg-neutral-2: oklch(100% 0 0/0.06); + --bui-bg-neutral-2-hover: oklch(100% 0 0/0.1); + --bui-bg-neutral-2-pressed: oklch(100% 0 0/0.16); + --bui-bg-neutral-2-disabled: oklch(100% 0 0/0.06); + --bui-bg-neutral-3: oklch(100% 0 0/0.08); + --bui-bg-neutral-3-hover: oklch(100% 0 0/0.12); + --bui-bg-neutral-3-pressed: oklch(100% 0 0/0.2); + --bui-bg-neutral-3-disabled: oklch(100% 0 0/0.08); + --bui-bg-neutral-4: oklch(100% 0 0/0.08); + --bui-bg-neutral-4-hover: oklch(100% 0 0/0.12); + --bui-bg-neutral-4-pressed: oklch(100% 0 0/0.2); + --bui-bg-neutral-4-disabled: oklch(100% 0 0/0.08); + --bui-bg-danger: #300c0c; --bui-bg-warning: #302008; - --bui-bg-success: #132d21; + --bui-bg-success: #042713; + --bui-bg-info: #132049; --bui-fg-primary: var(--bui-white); - --bui-fg-secondary: var(--bui-gray-7); - --bui-fg-link: #9cc9ff; - --bui-fg-link-hover: #7eb5f7; - --bui-fg-disabled: var(--bui-gray-7); + --bui-fg-secondary: oklch(0% 0 0/0.5); + --bui-fg-disabled: oklch(0% 0 0/0.28); --bui-fg-solid: #101821; - --bui-fg-solid-disabled: var(--bui-gray-5); - --bui-fg-tint: #9cc9ff; - --bui-fg-tint-disabled: var(--bui-gray-5); - --bui-fg-danger: #e22b2b; - --bui-fg-warning: #e36d05; - --bui-fg-success: #1db954; - --bui-border: #ffffff1f; - --bui-border-hover: #fff6; - --bui-border-pressed: #ffffff80; - --bui-border-disabled: #fff3; + --bui-fg-solid-disabled: #6191cc; + --bui-fg-danger-on-bg: #fca5a5; + --bui-fg-warning-on-bg: #fdba74; + --bui-fg-success-on-bg: #86efac; + --bui-fg-info-on-bg: #a3cfff; + --bui-fg-danger: #ff5a30; + --bui-fg-warning: #ffa057; + --bui-fg-success: #1ed760; + --bui-fg-info: #70b8ff; + --bui-border-2: #ffffff1f; + --bui-border-info: #7ea9d6; --bui-border-danger: #f87a7a; --bui-border-warning: #e36d05; --bui-border-success: #53db83; --bui-ring: #1f5493; --bui-scrollbar: #3636363a; --bui-scrollbar-thumb: #575757; + --bui-shadow: none; } } - @layer base { - *, :before, :after { + *, + :before, + :after { box-sizing: border-box; } - html { -webkit-text-size-adjust: 100%; tab-size: 4; - font-family: system-ui, Segoe UI, Roboto, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji; + font-family: system-ui, Segoe UI, Roboto, Helvetica, Arial, sans-serif, + Apple Color Emoji, Segoe UI Emoji; line-height: 1.15; } - body { margin: 0; } - - b, strong { + b, + strong { font-weight: bolder; } - - code, kbd, samp, pre { - font-family: ui-monospace, SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace; + code, + kbd, + samp, + pre { + font-family: ui-monospace, SFMono-Regular, Consolas, Liberation Mono, Menlo, + monospace; font-size: 1em; } - small { font-size: 80%; } - - sub, sup { + sub, + sup { vertical-align: baseline; font-size: 75%; line-height: 0; position: relative; } - sub { - bottom: -.25em; + bottom: -0.25em; } - sup { - top: -.5em; + top: -0.5em; } - table { border-color: currentColor; } - - button, input, optgroup, select, textarea { + button, + input, + optgroup, + select, + textarea { margin: 0; font-family: inherit; font-size: 100%; line-height: 1.15; } - - button, [type="button"], [type="reset"], [type="submit"] { + button, + [type='button'], + [type='reset'], + [type='submit'] { -webkit-appearance: button; } - legend { padding: 0; } - progress { vertical-align: baseline; } - - ::-webkit-inner-spin-button, ::-webkit-outer-spin-button { + ::-webkit-inner-spin-button, + ::-webkit-outer-spin-button { height: auto; } - - [type="search"] { + [type='search'] { -webkit-appearance: textfield; outline-offset: -2px; } - ::-webkit-search-decoration { -webkit-appearance: none; } - ::-webkit-file-upload-button { -webkit-appearance: button; font: inherit; } - summary { display: list-item; } - :where(a) { color: inherit; text-decoration: none; } - @keyframes pulse { 50% { - opacity: .5; + opacity: 0.5; } } - body { - background-color: var(--bui-bg); + background-color: var(--bui-bg-app); color: var(--bui-fg-primary); font-family: var(--bui-font-regular); font-weight: var(--bui-font-weight-regular); @@ -247,9012 +245,6914 @@ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } - - [data-theme-mode="dark"] { + [data-theme-mode='dark'] { color-scheme: dark; } - - [data-theme-mode="light"] { + [data-theme-mode='light'] { color-scheme: light; } } - @layer components; - @layer utilities { .bui-p { padding: var(--p); } - .bui-p-0\.5 { padding: var(--bui-space-0_5); } - .bui-p-1 { padding: var(--bui-space-1); } - .bui-p-1\.5 { padding: var(--bui-space-1_5); } - .bui-p-2 { padding: var(--bui-space-2); } - .bui-p-3 { padding: var(--bui-space-3); } - .bui-p-4 { padding: var(--bui-space-4); } - .bui-p-5 { padding: var(--bui-space-5); } - .bui-p-6 { padding: var(--bui-space-6); } - .bui-p-7 { padding: var(--bui-space-7); } - .bui-p-8 { padding: var(--bui-space-8); } - .bui-p-9 { padding: var(--bui-space-9); } - .bui-p-10 { padding: var(--bui-space-10); } - .bui-p-11 { padding: var(--bui-space-11); } - .bui-p-12 { padding: var(--bui-space-12); } - .bui-p-13 { padding: var(--bui-space-13); } - .bui-p-14 { padding: var(--bui-space-14); } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-p { padding: var(--p-xs); } - .xs\:bui-p-0\.5 { padding: var(--bui-space-0_5); } - .xs\:bui-p-1 { padding: var(--bui-space-1); } - .xs\:bui-p-1\.5 { padding: var(--bui-space-1_5); } - .xs\:bui-p-2 { padding: var(--bui-space-2); } - .xs\:bui-p-3 { padding: var(--bui-space-3); } - .xs\:bui-p-4 { padding: var(--bui-space-4); } - .xs\:bui-p-5 { padding: var(--bui-space-5); } - .xs\:bui-p-6 { padding: var(--bui-space-6); } - .xs\:bui-p-7 { padding: var(--bui-space-7); } - .xs\:bui-p-8 { padding: var(--bui-space-8); } - .xs\:bui-p-9 { padding: var(--bui-space-9); } - .xs\:bui-p-10 { padding: var(--bui-space-10); } - .xs\:bui-p-11 { padding: var(--bui-space-11); } - .xs\:bui-p-12 { padding: var(--bui-space-12); } - .xs\:bui-p-13 { padding: var(--bui-space-13); } - .xs\:bui-p-14 { padding: var(--bui-space-14); } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-p { padding: var(--p-sm); } - .sm\:bui-p-0\.5 { padding: var(--bui-space-0_5); } - .sm\:bui-p-1 { padding: var(--bui-space-1); } - .sm\:bui-p-1\.5 { padding: var(--bui-space-1_5); } - .sm\:bui-p-2 { padding: var(--bui-space-2); } - .sm\:bui-p-3 { padding: var(--bui-space-3); } - .sm\:bui-p-4 { padding: var(--bui-space-4); } - .sm\:bui-p-5 { padding: var(--bui-space-5); } - .sm\:bui-p-6 { padding: var(--bui-space-6); } - .sm\:bui-p-7 { padding: var(--bui-space-7); } - .sm\:bui-p-8 { padding: var(--bui-space-8); } - .sm\:bui-p-9 { padding: var(--bui-space-9); } - .sm\:bui-p-10 { padding: var(--bui-space-10); } - .sm\:bui-p-11 { padding: var(--bui-space-11); } - .sm\:bui-p-12 { padding: var(--bui-space-12); } - .sm\:bui-p-13 { padding: var(--bui-space-13); } - .sm\:bui-p-14 { padding: var(--bui-space-14); } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-p { padding: var(--p-md); } - .md\:bui-p-0\.5 { padding: var(--bui-space-0_5); } - .md\:bui-p-1 { padding: var(--bui-space-1); } - .md\:bui-p-1\.5 { padding: var(--bui-space-1_5); } - .md\:bui-p-2 { padding: var(--bui-space-2); } - .md\:bui-p-3 { padding: var(--bui-space-3); } - .md\:bui-p-4 { padding: var(--bui-space-4); } - .md\:bui-p-5 { padding: var(--bui-space-5); } - .md\:bui-p-6 { padding: var(--bui-space-6); } - .md\:bui-p-7 { padding: var(--bui-space-7); } - .md\:bui-p-8 { padding: var(--bui-space-8); } - .md\:bui-p-9 { padding: var(--bui-space-9); } - .md\:bui-p-10 { padding: var(--bui-space-10); } - .md\:bui-p-11 { padding: var(--bui-space-11); } - .md\:bui-p-12 { padding: var(--bui-space-12); } - .md\:bui-p-13 { padding: var(--bui-space-13); } - .md\:bui-p-14 { padding: var(--bui-space-14); } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-p { padding: var(--p-lg); } - .lg\:bui-p-0\.5 { padding: var(--bui-space-0_5); } - .lg\:bui-p-1 { padding: var(--bui-space-1); } - .lg\:bui-p-1\.5 { padding: var(--bui-space-1_5); } - .lg\:bui-p-2 { padding: var(--bui-space-2); } - .lg\:bui-p-3 { padding: var(--bui-space-3); } - .lg\:bui-p-4 { padding: var(--bui-space-4); } - .lg\:bui-p-5 { padding: var(--bui-space-5); } - .lg\:bui-p-6 { padding: var(--bui-space-6); } - .lg\:bui-p-7 { padding: var(--bui-space-7); } - .lg\:bui-p-8 { padding: var(--bui-space-8); } - .lg\:bui-p-9 { padding: var(--bui-space-9); } - .lg\:bui-p-10 { padding: var(--bui-space-10); } - .lg\:bui-p-11 { padding: var(--bui-space-11); } - .lg\:bui-p-12 { padding: var(--bui-space-12); } - .lg\:bui-p-13 { padding: var(--bui-space-13); } - .lg\:bui-p-14 { padding: var(--bui-space-14); } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-p { padding: var(--p-xl); } - .xl\:bui-p-0\.5 { padding: var(--bui-space-0_5); } - .xl\:bui-p-1 { padding: var(--bui-space-1); } - .xl\:bui-p-1\.5 { padding: var(--bui-space-1_5); } - .xl\:bui-p-2 { padding: var(--bui-space-2); } - .xl\:bui-p-3 { padding: var(--bui-space-3); } - .xl\:bui-p-4 { padding: var(--bui-space-4); } - .xl\:bui-p-5 { padding: var(--bui-space-5); } - .xl\:bui-p-6 { padding: var(--bui-space-6); } - .xl\:bui-p-7 { padding: var(--bui-space-7); } - .xl\:bui-p-8 { padding: var(--bui-space-8); } - .xl\:bui-p-9 { padding: var(--bui-space-9); } - .xl\:bui-p-10 { padding: var(--bui-space-10); } - .xl\:bui-p-11 { padding: var(--bui-space-11); } - .xl\:bui-p-12 { padding: var(--bui-space-12); } - .xl\:bui-p-13 { padding: var(--bui-space-13); } - .xl\:bui-p-14 { padding: var(--bui-space-14); } } - .bui-pl { padding-left: var(--pl); } - .bui-pl-0\.5 { padding-left: var(--bui-space-0_5); } - .bui-pl-1 { padding-left: var(--bui-space-1); } - .bui-pl-1\.5 { padding-left: var(--bui-space-1_5); } - .bui-pl-2 { padding-left: var(--bui-space-2); } - .bui-pl-3 { padding-left: var(--bui-space-3); } - .bui-pl-4 { padding-left: var(--bui-space-4); } - .bui-pl-5 { padding-left: var(--bui-space-5); } - .bui-pl-6 { padding-left: var(--bui-space-6); } - .bui-pl-7 { padding-left: var(--bui-space-7); } - .bui-pl-8 { padding-left: var(--bui-space-8); } - .bui-pl-9 { padding-left: var(--bui-space-9); } - .bui-pl-10 { padding-left: var(--bui-space-10); } - .bui-pl-11 { padding-left: var(--bui-space-11); } - .bui-pl-12 { padding-left: var(--bui-space-12); } - .bui-pl-13 { padding-left: var(--bui-space-13); } - .bui-pl-14 { padding-left: var(--bui-space-14); } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-pl { padding-left: var(--pl-xs); } - .xs\:bui-pl-0\.5 { padding-left: var(--bui-space-0_5); } - .xs\:bui-pl-1 { padding-left: var(--bui-space-1); } - .xs\:bui-pl-1\.5 { padding-left: var(--bui-space-1_5); } - .xs\:bui-pl-2 { padding-left: var(--bui-space-2); } - .xs\:bui-pl-3 { padding-left: var(--bui-space-3); } - .xs\:bui-pl-4 { padding-left: var(--bui-space-4); } - .xs\:bui-pl-5 { padding-left: var(--bui-space-5); } - .xs\:bui-pl-6 { padding-left: var(--bui-space-6); } - .xs\:bui-pl-7 { padding-left: var(--bui-space-7); } - .xs\:bui-pl-8 { padding-left: var(--bui-space-8); } - .xs\:bui-pl-9 { padding-left: var(--bui-space-9); } - .xs\:bui-pl-10 { padding-left: var(--bui-space-10); } - .xs\:bui-pl-11 { padding-left: var(--bui-space-11); } - .xs\:bui-pl-12 { padding-left: var(--bui-space-12); } - .xs\:bui-pl-13 { padding-left: var(--bui-space-13); } - .xs\:bui-pl-14 { padding-left: var(--bui-space-14); } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-pl { padding-left: var(--pl-sm); } - .sm\:bui-pl-0\.5 { padding-left: var(--bui-space-0_5); } - .sm\:bui-pl-1 { padding-left: var(--bui-space-1); } - .sm\:bui-pl-1\.5 { padding-left: var(--bui-space-1_5); } - .sm\:bui-pl-2 { padding-left: var(--bui-space-2); } - .sm\:bui-pl-3 { padding-left: var(--bui-space-3); } - .sm\:bui-pl-4 { padding-left: var(--bui-space-4); } - .sm\:bui-pl-5 { padding-left: var(--bui-space-5); } - .sm\:bui-pl-6 { padding-left: var(--bui-space-6); } - .sm\:bui-pl-7 { padding-left: var(--bui-space-7); } - .sm\:bui-pl-8 { padding-left: var(--bui-space-8); } - .sm\:bui-pl-9 { padding-left: var(--bui-space-9); } - .sm\:bui-pl-10 { padding-left: var(--bui-space-10); } - .sm\:bui-pl-11 { padding-left: var(--bui-space-11); } - .sm\:bui-pl-12 { padding-left: var(--bui-space-12); } - .sm\:bui-pl-13 { padding-left: var(--bui-space-13); } - .sm\:bui-pl-14 { padding-left: var(--bui-space-14); } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-pl { padding-left: var(--pl-md); } - .md\:bui-pl-0\.5 { padding-left: var(--bui-space-0_5); } - .md\:bui-pl-1 { padding-left: var(--bui-space-1); } - .md\:bui-pl-1\.5 { padding-left: var(--bui-space-1_5); } - .md\:bui-pl-2 { padding-left: var(--bui-space-2); } - .md\:bui-pl-3 { padding-left: var(--bui-space-3); } - .md\:bui-pl-4 { padding-left: var(--bui-space-4); } - .md\:bui-pl-5 { padding-left: var(--bui-space-5); } - .md\:bui-pl-6 { padding-left: var(--bui-space-6); } - .md\:bui-pl-7 { padding-left: var(--bui-space-7); } - .md\:bui-pl-8 { padding-left: var(--bui-space-8); } - .md\:bui-pl-9 { padding-left: var(--bui-space-9); } - .md\:bui-pl-10 { padding-left: var(--bui-space-10); } - .md\:bui-pl-11 { padding-left: var(--bui-space-11); } - .md\:bui-pl-12 { padding-left: var(--bui-space-12); } - .md\:bui-pl-13 { padding-left: var(--bui-space-13); } - .md\:bui-pl-14 { padding-left: var(--bui-space-14); } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-pl { padding-left: var(--pl-lg); } - .lg\:bui-pl-0\.5 { padding-left: var(--bui-space-0_5); } - .lg\:bui-pl-1 { padding-left: var(--bui-space-1); } - .lg\:bui-pl-1\.5 { padding-left: var(--bui-space-1_5); } - .lg\:bui-pl-2 { padding-left: var(--bui-space-2); } - .lg\:bui-pl-3 { padding-left: var(--bui-space-3); } - .lg\:bui-pl-4 { padding-left: var(--bui-space-4); } - .lg\:bui-pl-5 { padding-left: var(--bui-space-5); } - .lg\:bui-pl-6 { padding-left: var(--bui-space-6); } - .lg\:bui-pl-7 { padding-left: var(--bui-space-7); } - .lg\:bui-pl-8 { padding-left: var(--bui-space-8); } - .lg\:bui-pl-9 { padding-left: var(--bui-space-9); } - .lg\:bui-pl-10 { padding-left: var(--bui-space-10); } - .lg\:bui-pl-11 { padding-left: var(--bui-space-11); } - .lg\:bui-pl-12 { padding-left: var(--bui-space-12); } - .lg\:bui-pl-13 { padding-left: var(--bui-space-13); } - .lg\:bui-pl-14 { padding-left: var(--bui-space-14); } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-pl { padding-left: var(--pl-xl); } - .xl\:bui-pl-0\.5 { padding-left: var(--bui-space-0_5); } - .xl\:bui-pl-1 { padding-left: var(--bui-space-1); } - .xl\:bui-pl-1\.5 { padding-left: var(--bui-space-1_5); } - .xl\:bui-pl-2 { padding-left: var(--bui-space-2); } - .xl\:bui-pl-3 { padding-left: var(--bui-space-3); } - .xl\:bui-pl-4 { padding-left: var(--bui-space-4); } - .xl\:bui-pl-5 { padding-left: var(--bui-space-5); } - .xl\:bui-pl-6 { padding-left: var(--bui-space-6); } - .xl\:bui-pl-7 { padding-left: var(--bui-space-7); } - .xl\:bui-pl-8 { padding-left: var(--bui-space-8); } - .xl\:bui-pl-9 { padding-left: var(--bui-space-9); } - .xl\:bui-pl-10 { padding-left: var(--bui-space-10); } - .xl\:bui-pl-11 { padding-left: var(--bui-space-11); } - .xl\:bui-pl-12 { padding-left: var(--bui-space-12); } - .xl\:bui-pl-13 { padding-left: var(--bui-space-13); } - .xl\:bui-pl-14 { padding-left: var(--bui-space-14); } } - .bui-pr { padding-right: var(--pr); } - .bui-pr-0\.5 { padding-right: var(--bui-space-0_5); } - .bui-pr-1 { padding-right: var(--bui-space-1); } - .bui-pr-1\.5 { padding-right: var(--bui-space-1_5); } - .bui-pr-2 { padding-right: var(--bui-space-2); } - .bui-pr-3 { padding-right: var(--bui-space-3); } - .bui-pr-4 { padding-right: var(--bui-space-4); } - .bui-pr-5 { padding-right: var(--bui-space-5); } - .bui-pr-6 { padding-right: var(--bui-space-6); } - .bui-pr-7 { padding-right: var(--bui-space-7); } - .bui-pr-8 { padding-right: var(--bui-space-8); } - .bui-pr-9 { padding-right: var(--bui-space-9); } - .bui-pr-10 { padding-right: var(--bui-space-10); } - .bui-pr-11 { padding-right: var(--bui-space-11); } - .bui-pr-12 { padding-right: var(--bui-space-12); } - .bui-pr-13 { padding-right: var(--bui-space-13); } - .bui-pr-14 { padding-right: var(--bui-space-14); } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-pr { padding-right: var(--pr-xs); } - .xs\:bui-pr-0\.5 { padding-right: var(--bui-space-0_5); } - .xs\:bui-pr-1 { padding-right: var(--bui-space-1); } - .xs\:bui-pr-1\.5 { padding-right: var(--bui-space-1_5); } - .xs\:bui-pr-2 { padding-right: var(--bui-space-2); } - .xs\:bui-pr-3 { padding-right: var(--bui-space-3); } - .xs\:bui-pr-4 { padding-right: var(--bui-space-4); } - .xs\:bui-pr-5 { padding-right: var(--bui-space-5); } - .xs\:bui-pr-6 { padding-right: var(--bui-space-6); } - .xs\:bui-pr-7 { padding-right: var(--bui-space-7); } - .xs\:bui-pr-8 { padding-right: var(--bui-space-8); } - .xs\:bui-pr-9 { padding-right: var(--bui-space-9); } - .xs\:bui-pr-10 { padding-right: var(--bui-space-10); } - .xs\:bui-pr-11 { padding-right: var(--bui-space-11); } - .xs\:bui-pr-12 { padding-right: var(--bui-space-12); } - .xs\:bui-pr-13 { padding-right: var(--bui-space-13); } - .xs\:bui-pr-14 { padding-right: var(--bui-space-14); } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-pr { padding-right: var(--pr-sm); } - .sm\:bui-pr-0\.5 { padding-right: var(--bui-space-0_5); } - .sm\:bui-pr-1 { padding-right: var(--bui-space-1); } - .sm\:bui-pr-1\.5 { padding-right: var(--bui-space-1_5); } - .sm\:bui-pr-2 { padding-right: var(--bui-space-2); } - .sm\:bui-pr-3 { padding-right: var(--bui-space-3); } - .sm\:bui-pr-4 { padding-right: var(--bui-space-4); } - .sm\:bui-pr-5 { padding-right: var(--bui-space-5); } - .sm\:bui-pr-6 { padding-right: var(--bui-space-6); } - .sm\:bui-pr-7 { padding-right: var(--bui-space-7); } - .sm\:bui-pr-8 { padding-right: var(--bui-space-8); } - .sm\:bui-pr-9 { padding-right: var(--bui-space-9); } - .sm\:bui-pr-10 { padding-right: var(--bui-space-10); } - .sm\:bui-pr-11 { padding-right: var(--bui-space-11); } - .sm\:bui-pr-12 { padding-right: var(--bui-space-12); } - .sm\:bui-pr-13 { padding-right: var(--bui-space-13); } - .sm\:bui-pr-14 { padding-right: var(--bui-space-14); } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-pr { padding-right: var(--pr-md); } - .md\:bui-pr-0\.5 { padding-right: var(--bui-space-0_5); } - .md\:bui-pr-1 { padding-right: var(--bui-space-1); } - .md\:bui-pr-1\.5 { padding-right: var(--bui-space-1_5); } - .md\:bui-pr-2 { padding-right: var(--bui-space-2); } - .md\:bui-pr-3 { padding-right: var(--bui-space-3); } - .md\:bui-pr-4 { padding-right: var(--bui-space-4); } - .md\:bui-pr-5 { padding-right: var(--bui-space-5); } - .md\:bui-pr-6 { padding-right: var(--bui-space-6); } - .md\:bui-pr-7 { padding-right: var(--bui-space-7); } - .md\:bui-pr-8 { padding-right: var(--bui-space-8); } - .md\:bui-pr-9 { padding-right: var(--bui-space-9); } - .md\:bui-pr-10 { padding-right: var(--bui-space-10); } - .md\:bui-pr-11 { padding-right: var(--bui-space-11); } - .md\:bui-pr-12 { padding-right: var(--bui-space-12); } - .md\:bui-pr-13 { padding-right: var(--bui-space-13); } - .md\:bui-pr-14 { padding-right: var(--bui-space-14); } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-pr { padding-right: var(--pr-lg); } - .lg\:bui-pr-0\.5 { padding-right: var(--bui-space-0_5); } - .lg\:bui-pr-1 { padding-right: var(--bui-space-1); } - .lg\:bui-pr-1\.5 { padding-right: var(--bui-space-1_5); } - .lg\:bui-pr-2 { padding-right: var(--bui-space-2); } - .lg\:bui-pr-3 { padding-right: var(--bui-space-3); } - .lg\:bui-pr-4 { padding-right: var(--bui-space-4); } - .lg\:bui-pr-5 { padding-right: var(--bui-space-5); } - .lg\:bui-pr-6 { padding-right: var(--bui-space-6); } - .lg\:bui-pr-7 { padding-right: var(--bui-space-7); } - .lg\:bui-pr-8 { padding-right: var(--bui-space-8); } - .lg\:bui-pr-9 { padding-right: var(--bui-space-9); } - .lg\:bui-pr-10 { padding-right: var(--bui-space-10); } - .lg\:bui-pr-11 { padding-right: var(--bui-space-11); } - .lg\:bui-pr-12 { padding-right: var(--bui-space-12); } - .lg\:bui-pr-13 { padding-right: var(--bui-space-13); } - .lg\:bui-pr-14 { padding-right: var(--bui-space-14); } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-pr { padding-right: var(--pr-xl); } - .xl\:bui-pr-0\.5 { padding-right: var(--bui-space-0_5); } - .xl\:bui-pr-1 { padding-right: var(--bui-space-1); } - .xl\:bui-pr-1\.5 { padding-right: var(--bui-space-1_5); } - .xl\:bui-pr-2 { padding-right: var(--bui-space-2); } - .xl\:bui-pr-3 { padding-right: var(--bui-space-3); } - .xl\:bui-pr-4 { padding-right: var(--bui-space-4); } - .xl\:bui-pr-5 { padding-right: var(--bui-space-5); } - .xl\:bui-pr-6 { padding-right: var(--bui-space-6); } - .xl\:bui-pr-7 { padding-right: var(--bui-space-7); } - .xl\:bui-pr-8 { padding-right: var(--bui-space-8); } - .xl\:bui-pr-9 { padding-right: var(--bui-space-9); } - .xl\:bui-pr-10 { padding-right: var(--bui-space-10); } - .xl\:bui-pr-11 { padding-right: var(--bui-space-11); } - .xl\:bui-pr-12 { padding-right: var(--bui-space-12); } - .xl\:bui-pr-13 { padding-right: var(--bui-space-13); } - .xl\:bui-pr-14 { padding-right: var(--bui-space-14); } } - .bui-pt { padding-top: var(--pt); } - .bui-pt-0\.5 { padding-top: var(--bui-space-0_5); } - .bui-pt-1 { padding-top: var(--bui-space-1); } - .bui-pt-1\.5 { padding-top: var(--bui-space-1_5); } - .bui-pt-2 { padding-top: var(--bui-space-2); } - .bui-pt-3 { padding-top: var(--bui-space-3); } - .bui-pt-4 { padding-top: var(--bui-space-4); } - .bui-pt-5 { padding-top: var(--bui-space-5); } - .bui-pt-6 { padding-top: var(--bui-space-6); } - .bui-pt-7 { padding-top: var(--bui-space-7); } - .bui-pt-8 { padding-top: var(--bui-space-8); } - .bui-pt-9 { padding-top: var(--bui-space-9); } - .bui-pt-10 { padding-top: var(--bui-space-10); } - .bui-pt-11 { padding-top: var(--bui-space-11); } - .bui-pt-12 { padding-top: var(--bui-space-12); } - .bui-pt-13 { padding-top: var(--bui-space-13); } - .bui-pt-14 { padding-top: var(--bui-space-14); } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-pt { padding-top: var(--pt-xs); } - .xs\:bui-pt-0\.5 { padding-top: var(--bui-space-0_5); } - .xs\:bui-pt-1 { padding-top: var(--bui-space-1); } - .xs\:bui-pt-1\.5 { padding-top: var(--bui-space-1_5); } - .xs\:bui-pt-2 { padding-top: var(--bui-space-2); } - .xs\:bui-pt-3 { padding-top: var(--bui-space-3); } - .xs\:bui-pt-4 { padding-top: var(--bui-space-4); } - .xs\:bui-pt-5 { padding-top: var(--bui-space-5); } - .xs\:bui-pt-6 { padding-top: var(--bui-space-6); } - .xs\:bui-pt-7 { padding-top: var(--bui-space-7); } - .xs\:bui-pt-8 { padding-top: var(--bui-space-8); } - .xs\:bui-pt-9 { padding-top: var(--bui-space-9); } - .xs\:bui-pt-10 { padding-top: var(--bui-space-10); } - .xs\:bui-pt-11 { padding-top: var(--bui-space-11); } - .xs\:bui-pt-12 { padding-top: var(--bui-space-12); } - .xs\:bui-pt-13 { padding-top: var(--bui-space-13); } - .xs\:bui-pt-14 { padding-top: var(--bui-space-14); } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-pt { padding-top: var(--pt-sm); } - .sm\:bui-pt-0\.5 { padding-top: var(--bui-space-0_5); } - .sm\:bui-pt-1 { padding-top: var(--bui-space-1); } - .sm\:bui-pt-1\.5 { padding-top: var(--bui-space-1_5); } - .sm\:bui-pt-2 { padding-top: var(--bui-space-2); } - .sm\:bui-pt-3 { padding-top: var(--bui-space-3); } - .sm\:bui-pt-4 { padding-top: var(--bui-space-4); } - .sm\:bui-pt-5 { padding-top: var(--bui-space-5); } - .sm\:bui-pt-6 { padding-top: var(--bui-space-6); } - .sm\:bui-pt-7 { padding-top: var(--bui-space-7); } - .sm\:bui-pt-8 { padding-top: var(--bui-space-8); } - .sm\:bui-pt-9 { padding-top: var(--bui-space-9); } - .sm\:bui-pt-10 { padding-top: var(--bui-space-10); } - .sm\:bui-pt-11 { padding-top: var(--bui-space-11); } - .sm\:bui-pt-12 { padding-top: var(--bui-space-12); } - .sm\:bui-pt-13 { padding-top: var(--bui-space-13); } - .sm\:bui-pt-14 { padding-top: var(--bui-space-14); } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-pt { padding-top: var(--pt-md); } - .md\:bui-pt-0\.5 { padding-top: var(--bui-space-0_5); } - .md\:bui-pt-1 { padding-top: var(--bui-space-1); } - .md\:bui-pt-1\.5 { padding-top: var(--bui-space-1_5); } - .md\:bui-pt-2 { padding-top: var(--bui-space-2); } - .md\:bui-pt-3 { padding-top: var(--bui-space-3); } - .md\:bui-pt-4 { padding-top: var(--bui-space-4); } - .md\:bui-pt-5 { padding-top: var(--bui-space-5); } - .md\:bui-pt-6 { padding-top: var(--bui-space-6); } - .md\:bui-pt-7 { padding-top: var(--bui-space-7); } - .md\:bui-pt-8 { padding-top: var(--bui-space-8); } - .md\:bui-pt-9 { padding-top: var(--bui-space-9); } - .md\:bui-pt-10 { padding-top: var(--bui-space-10); } - .md\:bui-pt-11 { padding-top: var(--bui-space-11); } - .md\:bui-pt-12 { padding-top: var(--bui-space-12); } - .md\:bui-pt-13 { padding-top: var(--bui-space-13); } - .md\:bui-pt-14 { padding-top: var(--bui-space-14); } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-pt { padding-top: var(--pt-lg); } - .lg\:bui-pt-0\.5 { padding-top: var(--bui-space-0_5); } - .lg\:bui-pt-1 { padding-top: var(--bui-space-1); } - .lg\:bui-pt-1\.5 { padding-top: var(--bui-space-1_5); } - .lg\:bui-pt-2 { padding-top: var(--bui-space-2); } - .lg\:bui-pt-3 { padding-top: var(--bui-space-3); } - .lg\:bui-pt-4 { padding-top: var(--bui-space-4); } - .lg\:bui-pt-5 { padding-top: var(--bui-space-5); } - .lg\:bui-pt-6 { padding-top: var(--bui-space-6); } - .lg\:bui-pt-7 { padding-top: var(--bui-space-7); } - .lg\:bui-pt-8 { padding-top: var(--bui-space-8); } - .lg\:bui-pt-9 { padding-top: var(--bui-space-9); } - .lg\:bui-pt-10 { padding-top: var(--bui-space-10); } - .lg\:bui-pt-11 { padding-top: var(--bui-space-11); } - .lg\:bui-pt-12 { padding-top: var(--bui-space-12); } - .lg\:bui-pt-13 { padding-top: var(--bui-space-13); } - .lg\:bui-pt-14 { padding-top: var(--bui-space-14); } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-pt { padding-top: var(--pt-xl); } - .xl\:bui-pt-0\.5 { padding-top: var(--bui-space-0_5); } - .xl\:bui-pt-1 { padding-top: var(--bui-space-1); } - .xl\:bui-pt-1\.5 { padding-top: var(--bui-space-1_5); } - .xl\:bui-pt-2 { padding-top: var(--bui-space-2); } - .xl\:bui-pt-3 { padding-top: var(--bui-space-3); } - .xl\:bui-pt-4 { padding-top: var(--bui-space-4); } - .xl\:bui-pt-5 { padding-top: var(--bui-space-5); } - .xl\:bui-pt-6 { padding-top: var(--bui-space-6); } - .xl\:bui-pt-7 { padding-top: var(--bui-space-7); } - .xl\:bui-pt-8 { padding-top: var(--bui-space-8); } - .xl\:bui-pt-9 { padding-top: var(--bui-space-9); } - .xl\:bui-pt-10 { padding-top: var(--bui-space-10); } - .xl\:bui-pt-11 { padding-top: var(--bui-space-11); } - .xl\:bui-pt-12 { padding-top: var(--bui-space-12); } - .xl\:bui-pt-13 { padding-top: var(--bui-space-13); } - .xl\:bui-pt-14 { padding-top: var(--bui-space-14); } } - .bui-pb { padding-bottom: var(--pb); } - .bui-pb-0\.5 { padding-bottom: var(--bui-space-0_5); } - .bui-pb-1 { padding-bottom: var(--bui-space-1); } - .bui-pb-1\.5 { padding-bottom: var(--bui-space-1_5); } - .bui-pb-2 { padding-bottom: var(--bui-space-2); } - .bui-pb-3 { padding-bottom: var(--bui-space-3); } - .bui-pb-4 { padding-bottom: var(--bui-space-4); } - .bui-pb-5 { padding-bottom: var(--bui-space-5); } - .bui-pb-6 { padding-bottom: var(--bui-space-6); } - .bui-pb-7 { padding-bottom: var(--bui-space-7); } - .bui-pb-8 { padding-bottom: var(--bui-space-8); } - .bui-pb-9 { padding-bottom: var(--bui-space-9); } - .bui-pb-10 { padding-bottom: var(--bui-space-10); } - .bui-pb-11 { padding-bottom: var(--bui-space-11); } - .bui-pb-12 { padding-bottom: var(--bui-space-12); } - .bui-pb-13 { padding-bottom: var(--bui-space-13); } - .bui-pb-14 { padding-bottom: var(--bui-space-14); } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-pb { padding-bottom: var(--pb-xs); } - .xs\:bui-pb-0\.5 { padding-bottom: var(--bui-space-0_5); } - .xs\:bui-pb-1 { padding-bottom: var(--bui-space-1); } - .xs\:bui-pb-1\.5 { padding-bottom: var(--bui-space-1_5); } - .xs\:bui-pb-2 { padding-bottom: var(--bui-space-2); } - .xs\:bui-pb-3 { padding-bottom: var(--bui-space-3); } - .xs\:bui-pb-4 { padding-bottom: var(--bui-space-4); } - .xs\:bui-pb-5 { padding-bottom: var(--bui-space-5); } - .xs\:bui-pb-6 { padding-bottom: var(--bui-space-6); } - .xs\:bui-pb-7 { padding-bottom: var(--bui-space-7); } - .xs\:bui-pb-8 { padding-bottom: var(--bui-space-8); } - .xs\:bui-pb-9 { padding-bottom: var(--bui-space-9); } - .xs\:bui-pb-10 { padding-bottom: var(--bui-space-10); } - .xs\:bui-pb-11 { padding-bottom: var(--bui-space-11); } - .xs\:bui-pb-12 { padding-bottom: var(--bui-space-12); } - .xs\:bui-pb-13 { padding-bottom: var(--bui-space-13); } - .xs\:bui-pb-14 { padding-bottom: var(--bui-space-14); } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-pb { padding-bottom: var(--pb-sm); } - .sm\:bui-pb-0\.5 { padding-bottom: var(--bui-space-0_5); } - .sm\:bui-pb-1 { padding-bottom: var(--bui-space-1); } - .sm\:bui-pb-1\.5 { padding-bottom: var(--bui-space-1_5); } - .sm\:bui-pb-2 { padding-bottom: var(--bui-space-2); } - .sm\:bui-pb-3 { padding-bottom: var(--bui-space-3); } - .sm\:bui-pb-4 { padding-bottom: var(--bui-space-4); } - .sm\:bui-pb-5 { padding-bottom: var(--bui-space-5); } - .sm\:bui-pb-6 { padding-bottom: var(--bui-space-6); } - .sm\:bui-pb-7 { padding-bottom: var(--bui-space-7); } - .sm\:bui-pb-8 { padding-bottom: var(--bui-space-8); } - .sm\:bui-pb-9 { padding-bottom: var(--bui-space-9); } - .sm\:bui-pb-10 { padding-bottom: var(--bui-space-10); } - .sm\:bui-pb-11 { padding-bottom: var(--bui-space-11); } - .sm\:bui-pb-12 { padding-bottom: var(--bui-space-12); } - .sm\:bui-pb-13 { padding-bottom: var(--bui-space-13); } - .sm\:bui-pb-14 { padding-bottom: var(--bui-space-14); } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-pb { padding-bottom: var(--pb-md); } - .md\:bui-pb-0\.5 { padding-bottom: var(--bui-space-0_5); } - .md\:bui-pb-1 { padding-bottom: var(--bui-space-1); } - .md\:bui-pb-1\.5 { padding-bottom: var(--bui-space-1_5); } - .md\:bui-pb-2 { padding-bottom: var(--bui-space-2); } - .md\:bui-pb-3 { padding-bottom: var(--bui-space-3); } - .md\:bui-pb-4 { padding-bottom: var(--bui-space-4); } - .md\:bui-pb-5 { padding-bottom: var(--bui-space-5); } - .md\:bui-pb-6 { padding-bottom: var(--bui-space-6); } - .md\:bui-pb-7 { padding-bottom: var(--bui-space-7); } - .md\:bui-pb-8 { padding-bottom: var(--bui-space-8); } - .md\:bui-pb-9 { padding-bottom: var(--bui-space-9); } - .md\:bui-pb-10 { padding-bottom: var(--bui-space-10); } - .md\:bui-pb-11 { padding-bottom: var(--bui-space-11); } - .md\:bui-pb-12 { padding-bottom: var(--bui-space-12); } - .md\:bui-pb-13 { padding-bottom: var(--bui-space-13); } - .md\:bui-pb-14 { padding-bottom: var(--bui-space-14); } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-pb { padding-bottom: var(--pb-lg); } - .lg\:bui-pb-0\.5 { padding-bottom: var(--bui-space-0_5); } - .lg\:bui-pb-1 { padding-bottom: var(--bui-space-1); } - .lg\:bui-pb-1\.5 { padding-bottom: var(--bui-space-1_5); } - .lg\:bui-pb-2 { padding-bottom: var(--bui-space-2); } - .lg\:bui-pb-3 { padding-bottom: var(--bui-space-3); } - .lg\:bui-pb-4 { padding-bottom: var(--bui-space-4); } - .lg\:bui-pb-5 { padding-bottom: var(--bui-space-5); } - .lg\:bui-pb-6 { padding-bottom: var(--bui-space-6); } - .lg\:bui-pb-7 { padding-bottom: var(--bui-space-7); } - .lg\:bui-pb-8 { padding-bottom: var(--bui-space-8); } - .lg\:bui-pb-9 { padding-bottom: var(--bui-space-9); } - .lg\:bui-pb-10 { padding-bottom: var(--bui-space-10); } - .lg\:bui-pb-11 { padding-bottom: var(--bui-space-11); } - .lg\:bui-pb-12 { padding-bottom: var(--bui-space-12); } - .lg\:bui-pb-13 { padding-bottom: var(--bui-space-13); } - .lg\:bui-pb-14 { padding-bottom: var(--bui-space-14); } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-pb { padding-bottom: var(--pb-xl); } - .xl\:bui-pb-0\.5 { padding-bottom: var(--bui-space-0_5); } - .xl\:bui-pb-1 { padding-bottom: var(--bui-space-1); } - .xl\:bui-pb-1\.5 { padding-bottom: var(--bui-space-1_5); } - .xl\:bui-pb-2 { padding-bottom: var(--bui-space-2); } - .xl\:bui-pb-3 { padding-bottom: var(--bui-space-3); } - .xl\:bui-pb-4 { padding-bottom: var(--bui-space-4); } - .xl\:bui-pb-5 { padding-bottom: var(--bui-space-5); } - .xl\:bui-pb-6 { padding-bottom: var(--bui-space-6); } - .xl\:bui-pb-7 { padding-bottom: var(--bui-space-7); } - .xl\:bui-pb-8 { padding-bottom: var(--bui-space-8); } - .xl\:bui-pb-9 { padding-bottom: var(--bui-space-9); } - .xl\:bui-pb-10 { padding-bottom: var(--bui-space-10); } - .xl\:bui-pb-11 { padding-bottom: var(--bui-space-11); } - .xl\:bui-pb-12 { padding-bottom: var(--bui-space-12); } - .xl\:bui-pb-13 { padding-bottom: var(--bui-space-13); } - .xl\:bui-pb-14 { padding-bottom: var(--bui-space-14); } } - .bui-py { padding-top: var(--py); padding-bottom: var(--py); } - .bui-py-0\.5 { padding-top: var(--bui-space-0_5); padding-bottom: var(--bui-space-0_5); } - .bui-py-1 { padding-top: var(--bui-space-1); padding-bottom: var(--bui-space-1); } - .bui-py-1\.5 { padding-top: var(--bui-space-1_5); padding-bottom: var(--bui-space-1_5); } - .bui-py-2 { padding-top: var(--bui-space-2); padding-bottom: var(--bui-space-2); } - .bui-py-3 { padding-top: var(--bui-space-3); padding-bottom: var(--bui-space-3); } - .bui-py-4 { padding-top: var(--bui-space-4); padding-bottom: var(--bui-space-4); } - .bui-py-5 { padding-top: var(--bui-space-5); padding-bottom: var(--bui-space-5); } - .bui-py-6 { padding-top: var(--bui-space-6); padding-bottom: var(--bui-space-6); } - .bui-py-7 { padding-top: var(--bui-space-7); padding-bottom: var(--bui-space-7); } - .bui-py-8 { padding-top: var(--bui-space-8); padding-bottom: var(--bui-space-8); } - .bui-py-9 { padding-top: var(--bui-space-9); padding-bottom: var(--bui-space-9); } - .bui-py-10 { padding-top: var(--bui-space-10); padding-bottom: var(--bui-space-10); } - .bui-py-11 { padding-top: var(--bui-space-11); padding-bottom: var(--bui-space-11); } - .bui-py-12 { padding-top: var(--bui-space-12); padding-bottom: var(--bui-space-12); } - .bui-py-13 { padding-top: var(--bui-space-13); padding-bottom: var(--bui-space-13); } - .bui-py-14 { padding-top: var(--bui-space-14); padding-bottom: var(--bui-space-14); } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-py { padding-top: var(--py-xs); padding-bottom: var(--py-xs); } - .xs\:bui-py-0\.5 { padding-top: var(--bui-space-0_5); padding-bottom: var(--bui-space-0_5); } - .xs\:bui-py-1 { padding-top: var(--bui-space-1); padding-bottom: var(--bui-space-1); } - .xs\:bui-py-1\.5 { padding-top: var(--bui-space-1_5); padding-bottom: var(--bui-space-1_5); } - .xs\:bui-py-2 { padding-top: var(--bui-space-2); padding-bottom: var(--bui-space-2); } - .xs\:bui-py-3 { padding-top: var(--bui-space-3); padding-bottom: var(--bui-space-3); } - .xs\:bui-py-4 { padding-top: var(--bui-space-4); padding-bottom: var(--bui-space-4); } - .xs\:bui-py-5 { padding-top: var(--bui-space-5); padding-bottom: var(--bui-space-5); } - .xs\:bui-py-6 { padding-top: var(--bui-space-6); padding-bottom: var(--bui-space-6); } - .xs\:bui-py-7 { padding-top: var(--bui-space-7); padding-bottom: var(--bui-space-7); } - .xs\:bui-py-8 { padding-top: var(--bui-space-8); padding-bottom: var(--bui-space-8); } - .xs\:bui-py-9 { padding-top: var(--bui-space-9); padding-bottom: var(--bui-space-9); } - .xs\:bui-py-10 { padding-top: var(--bui-space-10); padding-bottom: var(--bui-space-10); } - .xs\:bui-py-11 { padding-top: var(--bui-space-11); padding-bottom: var(--bui-space-11); } - .xs\:bui-py-12 { padding-top: var(--bui-space-12); padding-bottom: var(--bui-space-12); } - .xs\:bui-py-13 { padding-top: var(--bui-space-13); padding-bottom: var(--bui-space-13); } - .xs\:bui-py-14 { padding-top: var(--bui-space-14); padding-bottom: var(--bui-space-14); } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-py { padding-top: var(--py-sm); padding-bottom: var(--py-sm); } - .sm\:bui-py-0\.5 { padding-top: var(--bui-space-0_5); padding-bottom: var(--bui-space-0_5); } - .sm\:bui-py-1 { padding-top: var(--bui-space-1); padding-bottom: var(--bui-space-1); } - .sm\:bui-py-1\.5 { padding-top: var(--bui-space-1_5); padding-bottom: var(--bui-space-1_5); } - .sm\:bui-py-2 { padding-top: var(--bui-space-2); padding-bottom: var(--bui-space-2); } - .sm\:bui-py-3 { padding-top: var(--bui-space-3); padding-bottom: var(--bui-space-3); } - .sm\:bui-py-4 { padding-top: var(--bui-space-4); padding-bottom: var(--bui-space-4); } - .sm\:bui-py-5 { padding-top: var(--bui-space-5); padding-bottom: var(--bui-space-5); } - .sm\:bui-py-6 { padding-top: var(--bui-space-6); padding-bottom: var(--bui-space-6); } - .sm\:bui-py-7 { padding-top: var(--bui-space-7); padding-bottom: var(--bui-space-7); } - .sm\:bui-py-8 { padding-top: var(--bui-space-8); padding-bottom: var(--bui-space-8); } - .sm\:bui-py-9 { padding-top: var(--bui-space-9); padding-bottom: var(--bui-space-9); } - .sm\:bui-py-10 { padding-top: var(--bui-space-10); padding-bottom: var(--bui-space-10); } - .sm\:bui-py-11 { padding-top: var(--bui-space-11); padding-bottom: var(--bui-space-11); } - .sm\:bui-py-12 { padding-top: var(--bui-space-12); padding-bottom: var(--bui-space-12); } - .sm\:bui-py-13 { padding-top: var(--bui-space-13); padding-bottom: var(--bui-space-13); } - .sm\:bui-py-14 { padding-top: var(--bui-space-14); padding-bottom: var(--bui-space-14); } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-py { padding-top: var(--py-md); padding-bottom: var(--py-md); } - .md\:bui-py-0\.5 { padding-top: var(--bui-space-0_5); padding-bottom: var(--bui-space-0_5); } - .md\:bui-py-1 { padding-top: var(--bui-space-1); padding-bottom: var(--bui-space-1); } - .md\:bui-py-1\.5 { padding-top: var(--bui-space-1_5); padding-bottom: var(--bui-space-1_5); } - .md\:bui-py-2 { padding-top: var(--bui-space-2); padding-bottom: var(--bui-space-2); } - .md\:bui-py-3 { padding-top: var(--bui-space-3); padding-bottom: var(--bui-space-3); } - .md\:bui-py-4 { padding-top: var(--bui-space-4); padding-bottom: var(--bui-space-4); } - .md\:bui-py-5 { padding-top: var(--bui-space-5); padding-bottom: var(--bui-space-5); } - .md\:bui-py-6 { padding-top: var(--bui-space-6); padding-bottom: var(--bui-space-6); } - .md\:bui-py-7 { padding-top: var(--bui-space-7); padding-bottom: var(--bui-space-7); } - .md\:bui-py-8 { padding-top: var(--bui-space-8); padding-bottom: var(--bui-space-8); } - .md\:bui-py-9 { padding-top: var(--bui-space-9); padding-bottom: var(--bui-space-9); } - .md\:bui-py-10 { padding-top: var(--bui-space-10); padding-bottom: var(--bui-space-10); } - .md\:bui-py-11 { padding-top: var(--bui-space-11); padding-bottom: var(--bui-space-11); } - .md\:bui-py-12 { padding-top: var(--bui-space-12); padding-bottom: var(--bui-space-12); } - .md\:bui-py-13 { padding-top: var(--bui-space-13); padding-bottom: var(--bui-space-13); } - .md\:bui-py-14 { padding-top: var(--bui-space-14); padding-bottom: var(--bui-space-14); } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-py { padding-top: var(--py-lg); padding-bottom: var(--py-lg); } - .lg\:bui-py-0\.5 { padding-top: var(--bui-space-0_5); padding-bottom: var(--bui-space-0_5); } - .lg\:bui-py-1 { padding-top: var(--bui-space-1); padding-bottom: var(--bui-space-1); } - .lg\:bui-py-1\.5 { padding-top: var(--bui-space-1_5); padding-bottom: var(--bui-space-1_5); } - .lg\:bui-py-2 { padding-top: var(--bui-space-2); padding-bottom: var(--bui-space-2); } - .lg\:bui-py-3 { padding-top: var(--bui-space-3); padding-bottom: var(--bui-space-3); } - .lg\:bui-py-4 { padding-top: var(--bui-space-4); padding-bottom: var(--bui-space-4); } - .lg\:bui-py-5 { padding-top: var(--bui-space-5); padding-bottom: var(--bui-space-5); } - .lg\:bui-py-6 { padding-top: var(--bui-space-6); padding-bottom: var(--bui-space-6); } - .lg\:bui-py-7 { padding-top: var(--bui-space-7); padding-bottom: var(--bui-space-7); } - .lg\:bui-py-8 { padding-top: var(--bui-space-8); padding-bottom: var(--bui-space-8); } - .lg\:bui-py-9 { padding-top: var(--bui-space-9); padding-bottom: var(--bui-space-9); } - .lg\:bui-py-10 { padding-top: var(--bui-space-10); padding-bottom: var(--bui-space-10); } - .lg\:bui-py-11 { padding-top: var(--bui-space-11); padding-bottom: var(--bui-space-11); } - .lg\:bui-py-12 { padding-top: var(--bui-space-12); padding-bottom: var(--bui-space-12); } - .lg\:bui-py-13 { padding-top: var(--bui-space-13); padding-bottom: var(--bui-space-13); } - .lg\:bui-py-14 { padding-top: var(--bui-space-14); padding-bottom: var(--bui-space-14); } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-py { padding-top: var(--py-xl); padding-bottom: var(--py-xl); } - .xl\:bui-py-0\.5 { padding-top: var(--bui-space-0_5); padding-bottom: var(--bui-space-0_5); } - .xl\:bui-py-1 { padding-top: var(--bui-space-1); padding-bottom: var(--bui-space-1); } - .xl\:bui-py-1\.5 { padding-top: var(--bui-space-1_5); padding-bottom: var(--bui-space-1_5); } - .xl\:bui-py-2 { padding-top: var(--bui-space-2); padding-bottom: var(--bui-space-2); } - .xl\:bui-py-3 { padding-top: var(--bui-space-3); padding-bottom: var(--bui-space-3); } - .xl\:bui-py-4 { padding-top: var(--bui-space-4); padding-bottom: var(--bui-space-4); } - .xl\:bui-py-5 { padding-top: var(--bui-space-5); padding-bottom: var(--bui-space-5); } - .xl\:bui-py-6 { padding-top: var(--bui-space-6); padding-bottom: var(--bui-space-6); } - .xl\:bui-py-7 { padding-top: var(--bui-space-7); padding-bottom: var(--bui-space-7); } - .xl\:bui-py-8 { padding-top: var(--bui-space-8); padding-bottom: var(--bui-space-8); } - .xl\:bui-py-9 { padding-top: var(--bui-space-9); padding-bottom: var(--bui-space-9); } - .xl\:bui-py-10 { padding-top: var(--bui-space-10); padding-bottom: var(--bui-space-10); } - .xl\:bui-py-11 { padding-top: var(--bui-space-11); padding-bottom: var(--bui-space-11); } - .xl\:bui-py-12 { padding-top: var(--bui-space-12); padding-bottom: var(--bui-space-12); } - .xl\:bui-py-13 { padding-top: var(--bui-space-13); padding-bottom: var(--bui-space-13); } - .xl\:bui-py-14 { padding-top: var(--bui-space-14); padding-bottom: var(--bui-space-14); } } - .bui-px { padding-left: var(--px); padding-right: var(--px); } - .bui-px-0\.5 { padding-left: var(--bui-space-0_5); padding-right: var(--bui-space-0_5); } - .bui-px-1 { padding-left: var(--bui-space-1); padding-right: var(--bui-space-1); } - .bui-px-1\.5 { padding-left: var(--bui-space-1_5); padding-right: var(--bui-space-1_5); } - .bui-px-2 { padding-left: var(--bui-space-2); padding-right: var(--bui-space-2); } - .bui-px-3 { padding-left: var(--bui-space-3); padding-right: var(--bui-space-3); } - .bui-px-4 { padding-left: var(--bui-space-4); padding-right: var(--bui-space-4); } - .bui-px-5 { padding-left: var(--bui-space-5); padding-right: var(--bui-space-5); } - .bui-px-6 { padding-left: var(--bui-space-6); padding-right: var(--bui-space-6); } - .bui-px-7 { padding-left: var(--bui-space-7); padding-right: var(--bui-space-7); } - .bui-px-8 { padding-left: var(--bui-space-8); padding-right: var(--bui-space-8); } - .bui-px-9 { padding-left: var(--bui-space-9); padding-right: var(--bui-space-9); } - .bui-px-10 { padding-left: var(--bui-space-10); padding-right: var(--bui-space-10); } - .bui-px-11 { padding-left: var(--bui-space-11); padding-right: var(--bui-space-11); } - .bui-px-12 { padding-left: var(--bui-space-12); padding-right: var(--bui-space-12); } - .bui-px-13 { padding-left: var(--bui-space-13); padding-right: var(--bui-space-13); } - .bui-px-14 { padding-left: var(--bui-space-14); padding-right: var(--bui-space-14); } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-px { padding-left: var(--px-xs); padding-right: var(--px-xs); } - .xs\:bui-px-0\.5 { padding-left: var(--bui-space-0_5); padding-right: var(--bui-space-0_5); } - .xs\:bui-px-1 { padding-left: var(--bui-space-1); padding-right: var(--bui-space-1); } - .xs\:bui-px-1\.5 { padding-left: var(--bui-space-1_5); padding-right: var(--bui-space-1_5); } - .xs\:bui-px-2 { padding-left: var(--bui-space-2); padding-right: var(--bui-space-2); } - .xs\:bui-px-3 { padding-left: var(--bui-space-3); padding-right: var(--bui-space-3); } - .xs\:bui-px-4 { padding-left: var(--bui-space-4); padding-right: var(--bui-space-4); } - .xs\:bui-px-5 { padding-left: var(--bui-space-5); padding-right: var(--bui-space-5); } - .xs\:bui-px-6 { padding-left: var(--bui-space-6); padding-right: var(--bui-space-6); } - .xs\:bui-px-7 { padding-left: var(--bui-space-7); padding-right: var(--bui-space-7); } - .xs\:bui-px-8 { padding-left: var(--bui-space-8); padding-right: var(--bui-space-8); } - .xs\:bui-px-9 { padding-left: var(--bui-space-9); padding-right: var(--bui-space-9); } - .xs\:bui-px-10 { padding-left: var(--bui-space-10); padding-right: var(--bui-space-10); } - .xs\:bui-px-11 { padding-left: var(--bui-space-11); padding-right: var(--bui-space-11); } - .xs\:bui-px-12 { padding-left: var(--bui-space-12); padding-right: var(--bui-space-12); } - .xs\:bui-px-13 { padding-left: var(--bui-space-13); padding-right: var(--bui-space-13); } - .xs\:bui-px-14 { padding-left: var(--bui-space-14); padding-right: var(--bui-space-14); } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-px { padding-left: var(--px-sm); padding-right: var(--px-sm); } - .sm\:bui-px-0\.5 { padding-left: var(--bui-space-0_5); padding-right: var(--bui-space-0_5); } - .sm\:bui-px-1 { padding-left: var(--bui-space-1); padding-right: var(--bui-space-1); } - .sm\:bui-px-1\.5 { padding-left: var(--bui-space-1_5); padding-right: var(--bui-space-1_5); } - .sm\:bui-px-2 { padding-left: var(--bui-space-2); padding-right: var(--bui-space-2); } - .sm\:bui-px-3 { padding-left: var(--bui-space-3); padding-right: var(--bui-space-3); } - .sm\:bui-px-4 { padding-left: var(--bui-space-4); padding-right: var(--bui-space-4); } - .sm\:bui-px-5 { padding-left: var(--bui-space-5); padding-right: var(--bui-space-5); } - .sm\:bui-px-6 { padding-left: var(--bui-space-6); padding-right: var(--bui-space-6); } - .sm\:bui-px-7 { padding-left: var(--bui-space-7); padding-right: var(--bui-space-7); } - .sm\:bui-px-8 { padding-left: var(--bui-space-8); padding-right: var(--bui-space-8); } - .sm\:bui-px-9 { padding-left: var(--bui-space-9); padding-right: var(--bui-space-9); } - .sm\:bui-px-10 { padding-left: var(--bui-space-10); padding-right: var(--bui-space-10); } - .sm\:bui-px-11 { padding-left: var(--bui-space-11); padding-right: var(--bui-space-11); } - .sm\:bui-px-12 { padding-left: var(--bui-space-12); padding-right: var(--bui-space-12); } - .sm\:bui-px-13 { padding-left: var(--bui-space-13); padding-right: var(--bui-space-13); } - .sm\:bui-px-14 { padding-left: var(--bui-space-14); padding-right: var(--bui-space-14); } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-px { padding-left: var(--px-md); padding-right: var(--px-md); } - .md\:bui-px-0\.5 { padding-left: var(--bui-space-0_5); padding-right: var(--bui-space-0_5); } - .md\:bui-px-1 { padding-left: var(--bui-space-1); padding-right: var(--bui-space-1); } - .md\:bui-px-1\.5 { padding-left: var(--bui-space-1_5); padding-right: var(--bui-space-1_5); } - .md\:bui-px-2 { padding-left: var(--bui-space-2); padding-right: var(--bui-space-2); } - .md\:bui-px-3 { padding-left: var(--bui-space-3); padding-right: var(--bui-space-3); } - .md\:bui-px-4 { padding-left: var(--bui-space-4); padding-right: var(--bui-space-4); } - .md\:bui-px-5 { padding-left: var(--bui-space-5); padding-right: var(--bui-space-5); } - .md\:bui-px-6 { padding-left: var(--bui-space-6); padding-right: var(--bui-space-6); } - .md\:bui-px-7 { padding-left: var(--bui-space-7); padding-right: var(--bui-space-7); } - .md\:bui-px-8 { padding-left: var(--bui-space-8); padding-right: var(--bui-space-8); } - .md\:bui-px-9 { padding-left: var(--bui-space-9); padding-right: var(--bui-space-9); } - .md\:bui-px-10 { padding-left: var(--bui-space-10); padding-right: var(--bui-space-10); } - .md\:bui-px-11 { padding-left: var(--bui-space-11); padding-right: var(--bui-space-11); } - .md\:bui-px-12 { padding-left: var(--bui-space-12); padding-right: var(--bui-space-12); } - .md\:bui-px-13 { padding-left: var(--bui-space-13); padding-right: var(--bui-space-13); } - .md\:bui-px-14 { padding-left: var(--bui-space-14); padding-right: var(--bui-space-14); } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-px { padding-left: var(--px-lg); padding-right: var(--px-lg); } - .lg\:bui-px-0\.5 { padding-left: var(--bui-space-0_5); padding-right: var(--bui-space-0_5); } - .lg\:bui-px-1 { padding-left: var(--bui-space-1); padding-right: var(--bui-space-1); } - .lg\:bui-px-1\.5 { padding-left: var(--bui-space-1_5); padding-right: var(--bui-space-1_5); } - .lg\:bui-px-2 { padding-left: var(--bui-space-2); padding-right: var(--bui-space-2); } - .lg\:bui-px-3 { padding-left: var(--bui-space-3); padding-right: var(--bui-space-3); } - .lg\:bui-px-4 { padding-left: var(--bui-space-4); padding-right: var(--bui-space-4); } - .lg\:bui-px-5 { padding-left: var(--bui-space-5); padding-right: var(--bui-space-5); } - .lg\:bui-px-6 { padding-left: var(--bui-space-6); padding-right: var(--bui-space-6); } - .lg\:bui-px-7 { padding-left: var(--bui-space-7); padding-right: var(--bui-space-7); } - .lg\:bui-px-8 { padding-left: var(--bui-space-8); padding-right: var(--bui-space-8); } - .lg\:bui-px-9 { padding-left: var(--bui-space-9); padding-right: var(--bui-space-9); } - .lg\:bui-px-10 { padding-left: var(--bui-space-10); padding-right: var(--bui-space-10); } - .lg\:bui-px-11 { padding-left: var(--bui-space-11); padding-right: var(--bui-space-11); } - .lg\:bui-px-12 { padding-left: var(--bui-space-12); padding-right: var(--bui-space-12); } - .lg\:bui-px-13 { padding-left: var(--bui-space-13); padding-right: var(--bui-space-13); } - .lg\:bui-px-14 { padding-left: var(--bui-space-14); padding-right: var(--bui-space-14); } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-px { padding-left: var(--px-xl); padding-right: var(--px-xl); } - .xl\:bui-px-0\.5 { padding-left: var(--bui-space-0_5); padding-right: var(--bui-space-0_5); } - .xl\:bui-px-1 { padding-left: var(--bui-space-1); padding-right: var(--bui-space-1); } - .xl\:bui-px-1\.5 { padding-left: var(--bui-space-1_5); padding-right: var(--bui-space-1_5); } - .xl\:bui-px-2 { padding-left: var(--bui-space-2); padding-right: var(--bui-space-2); } - .xl\:bui-px-3 { padding-left: var(--bui-space-3); padding-right: var(--bui-space-3); } - .xl\:bui-px-4 { padding-left: var(--bui-space-4); padding-right: var(--bui-space-4); } - .xl\:bui-px-5 { padding-left: var(--bui-space-5); padding-right: var(--bui-space-5); } - .xl\:bui-px-6 { padding-left: var(--bui-space-6); padding-right: var(--bui-space-6); } - .xl\:bui-px-7 { padding-left: var(--bui-space-7); padding-right: var(--bui-space-7); } - .xl\:bui-px-8 { padding-left: var(--bui-space-8); padding-right: var(--bui-space-8); } - .xl\:bui-px-9 { padding-left: var(--bui-space-9); padding-right: var(--bui-space-9); } - .xl\:bui-px-10 { padding-left: var(--bui-space-10); padding-right: var(--bui-space-10); } - .xl\:bui-px-11 { padding-left: var(--bui-space-11); padding-right: var(--bui-space-11); } - .xl\:bui-px-12 { padding-left: var(--bui-space-12); padding-right: var(--bui-space-12); } - .xl\:bui-px-13 { padding-left: var(--bui-space-13); padding-right: var(--bui-space-13); } - .xl\:bui-px-14 { padding-left: var(--bui-space-14); padding-right: var(--bui-space-14); } } - .bui-m { margin: var(--m); } - .bui-m-0\.5 { margin: var(--bui-space-0_5); } - .bui-m-1 { margin: var(--bui-space-1); } - .bui-m-1\.5 { margin: var(--bui-space-1_5); } - .bui-m-2 { margin: var(--bui-space-2); } - .bui-m-3 { margin: var(--bui-space-3); } - .bui-m-4 { margin: var(--bui-space-4); } - .bui-m-5 { margin: var(--bui-space-5); } - .bui-m-6 { margin: var(--bui-space-6); } - .bui-m-7 { margin: var(--bui-space-7); } - .bui-m-8 { margin: var(--bui-space-8); } - .bui-m-9 { margin: var(--bui-space-9); } - .bui-m-10 { margin: var(--bui-space-10); } - .bui-m-11 { margin: var(--bui-space-11); } - .bui-m-12 { margin: var(--bui-space-12); } - .bui-m-13 { margin: var(--bui-space-13); } - .bui-m-14 { margin: var(--bui-space-14); } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-m { margin: var(--p-xs); } - .xs\:bui-m-0\.5 { margin: var(--bui-space-0_5); } - .xs\:bui-m-1 { margin: var(--bui-space-1); } - .xs\:bui-m-1\.5 { margin: var(--bui-space-1_5); } - .xs\:bui-m-2 { margin: var(--bui-space-2); } - .xs\:bui-m-3 { margin: var(--bui-space-3); } - .xs\:bui-m-4 { margin: var(--bui-space-4); } - .xs\:bui-m-5 { margin: var(--bui-space-5); } - .xs\:bui-m-6 { margin: var(--bui-space-6); } - .xs\:bui-m-7 { margin: var(--bui-space-7); } - .xs\:bui-m-8 { margin: var(--bui-space-8); } - .xs\:bui-m-9 { margin: var(--bui-space-9); } - .xs\:bui-m-10 { margin: var(--bui-space-10); } - .xs\:bui-m-11 { margin: var(--bui-space-11); } - .xs\:bui-m-12 { margin: var(--bui-space-12); } - .xs\:bui-m-13 { margin: var(--bui-space-13); } - .xs\:bui-m-14 { margin: var(--bui-space-14); } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-m { margin: var(--p-sm); } - .sm\:bui-m-0\.5 { margin: var(--bui-space-0_5); } - .sm\:bui-m-1 { margin: var(--bui-space-1); } - .sm\:bui-m-1\.5 { margin: var(--bui-space-1_5); } - .sm\:bui-m-2 { margin: var(--bui-space-2); } - .sm\:bui-m-3 { margin: var(--bui-space-3); } - .sm\:bui-m-4 { margin: var(--bui-space-4); } - .sm\:bui-m-5 { margin: var(--bui-space-5); } - .sm\:bui-m-6 { margin: var(--bui-space-6); } - .sm\:bui-m-7 { margin: var(--bui-space-7); } - .sm\:bui-m-8 { margin: var(--bui-space-8); } - .sm\:bui-m-9 { margin: var(--bui-space-9); } - .sm\:bui-m-10 { margin: var(--bui-space-10); } - .sm\:bui-m-11 { margin: var(--bui-space-11); } - .sm\:bui-m-12 { margin: var(--bui-space-12); } - .sm\:bui-m-13 { margin: var(--bui-space-13); } - .sm\:bui-m-14 { margin: var(--bui-space-14); } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-m { margin: var(--p-md); } - .md\:bui-m-0\.5 { margin: var(--bui-space-0_5); } - .md\:bui-m-1 { margin: var(--bui-space-1); } - .md\:bui-m-1\.5 { margin: var(--bui-space-1_5); } - .md\:bui-m-2 { margin: var(--bui-space-2); } - .md\:bui-m-3 { margin: var(--bui-space-3); } - .md\:bui-m-4 { margin: var(--bui-space-4); } - .md\:bui-m-5 { margin: var(--bui-space-5); } - .md\:bui-m-6 { margin: var(--bui-space-6); } - .md\:bui-m-7 { margin: var(--bui-space-7); } - .md\:bui-m-8 { margin: var(--bui-space-8); } - .md\:bui-m-9 { margin: var(--bui-space-9); } - .md\:bui-m-10 { margin: var(--bui-space-10); } - .md\:bui-m-11 { margin: var(--bui-space-11); } - .md\:bui-m-12 { margin: var(--bui-space-12); } - .md\:bui-m-13 { margin: var(--bui-space-13); } - .md\:bui-m-14 { margin: var(--bui-space-14); } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-m { margin: var(--p-lg); } - .lg\:bui-m-0\.5 { margin: var(--bui-space-0_5); } - .lg\:bui-m-1 { margin: var(--bui-space-1); } - .lg\:bui-m-1\.5 { margin: var(--bui-space-1_5); } - .lg\:bui-m-2 { margin: var(--bui-space-2); } - .lg\:bui-m-3 { margin: var(--bui-space-3); } - .lg\:bui-m-4 { margin: var(--bui-space-4); } - .lg\:bui-m-5 { margin: var(--bui-space-5); } - .lg\:bui-m-6 { margin: var(--bui-space-6); } - .lg\:bui-m-7 { margin: var(--bui-space-7); } - .lg\:bui-m-8 { margin: var(--bui-space-8); } - .lg\:bui-m-9 { margin: var(--bui-space-9); } - .lg\:bui-m-10 { margin: var(--bui-space-10); } - .lg\:bui-m-11 { margin: var(--bui-space-11); } - .lg\:bui-m-12 { margin: var(--bui-space-12); } - .lg\:bui-m-13 { margin: var(--bui-space-13); } - .lg\:bui-m-14 { margin: var(--bui-space-14); } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-m { margin: var(--p-xl); } - .xl\:bui-m-0\.5 { margin: var(--bui-space-0_5); } - .xl\:bui-m-1 { margin: var(--bui-space-1); } - .xl\:bui-m-1\.5 { margin: var(--bui-space-1_5); } - .xl\:bui-m-2 { margin: var(--bui-space-2); } - .xl\:bui-m-3 { margin: var(--bui-space-3); } - .xl\:bui-m-4 { margin: var(--bui-space-4); } - .xl\:bui-m-5 { margin: var(--bui-space-5); } - .xl\:bui-m-6 { margin: var(--bui-space-6); } - .xl\:bui-m-7 { margin: var(--bui-space-7); } - .xl\:bui-m-8 { margin: var(--bui-space-8); } - .xl\:bui-m-9 { margin: var(--bui-space-9); } - .xl\:bui-m-10 { margin: var(--bui-space-10); } - .xl\:bui-m-11 { margin: var(--bui-space-11); } - .xl\:bui-m-12 { margin: var(--bui-space-12); } - .xl\:bui-m-13 { margin: var(--bui-space-13); } - .xl\:bui-m-14 { margin: var(--bui-space-14); } } - .bui-ml { margin-left: var(--ml); } - .bui-ml-0\.5 { margin-left: var(--bui-space-0_5); } - .bui-ml-1 { margin-left: var(--bui-space-1); } - .bui-ml-1\.5 { margin-left: var(--bui-space-1_5); } - .bui-ml-2 { margin-left: var(--bui-space-2); } - .bui-ml-3 { margin-left: var(--bui-space-3); } - .bui-ml-4 { margin-left: var(--bui-space-4); } - .bui-ml-5 { margin-left: var(--bui-space-5); } - .bui-ml-6 { margin-left: var(--bui-space-6); } - .bui-ml-7 { margin-left: var(--bui-space-7); } - .bui-ml-8 { margin-left: var(--bui-space-8); } - .bui-ml-9 { margin-left: var(--bui-space-9); } - .bui-ml-10 { margin-left: var(--bui-space-10); } - .bui-ml-11 { margin-left: var(--bui-space-11); } - .bui-ml-12 { margin-left: var(--bui-space-12); } - .bui-ml-13 { margin-left: var(--bui-space-13); } - .bui-ml-14 { margin-left: var(--bui-space-14); } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-ml { margin-left: var(--ml-xs); } - .xs\:bui-ml-0\.5 { margin-left: var(--bui-space-0_5); } - .xs\:bui-ml-1 { margin-left: var(--bui-space-1); } - .xs\:bui-ml-1\.5 { margin-left: var(--bui-space-1_5); } - .xs\:bui-ml-2 { margin-left: var(--bui-space-2); } - .xs\:bui-ml-3 { margin-left: var(--bui-space-3); } - .xs\:bui-ml-4 { margin-left: var(--bui-space-4); } - .xs\:bui-ml-5 { margin-left: var(--bui-space-5); } - .xs\:bui-ml-6 { margin-left: var(--bui-space-6); } - .xs\:bui-ml-7 { margin-left: var(--bui-space-7); } - .xs\:bui-ml-8 { margin-left: var(--bui-space-8); } - .xs\:bui-ml-9 { margin-left: var(--bui-space-9); } - .xs\:bui-ml-10 { margin-left: var(--bui-space-10); } - .xs\:bui-ml-11 { margin-left: var(--bui-space-11); } - .xs\:bui-ml-12 { margin-left: var(--bui-space-12); } - .xs\:bui-ml-13 { margin-left: var(--bui-space-13); } - .xs\:bui-ml-14 { margin-left: var(--bui-space-14); } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-ml { margin-left: var(--ml-sm); } - .sm\:bui-ml-0\.5 { margin-left: var(--bui-space-0_5); } - .sm\:bui-ml-1 { margin-left: var(--bui-space-1); } - .sm\:bui-ml-1\.5 { margin-left: var(--bui-space-1_5); } - .sm\:bui-ml-2 { margin-left: var(--bui-space-2); } - .sm\:bui-ml-3 { margin-left: var(--bui-space-3); } - .sm\:bui-ml-4 { margin-left: var(--bui-space-4); } - .sm\:bui-ml-5 { margin-left: var(--bui-space-5); } - .sm\:bui-ml-6 { margin-left: var(--bui-space-6); } - .sm\:bui-ml-7 { margin-left: var(--bui-space-7); } - .sm\:bui-ml-8 { margin-left: var(--bui-space-8); } - .sm\:bui-ml-9 { margin-left: var(--bui-space-9); } - .sm\:bui-ml-10 { margin-left: var(--bui-space-10); } - .sm\:bui-ml-11 { margin-left: var(--bui-space-11); } - .sm\:bui-ml-12 { margin-left: var(--bui-space-12); } - .sm\:bui-ml-13 { margin-left: var(--bui-space-13); } - .sm\:bui-ml-14 { margin-left: var(--bui-space-14); } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-ml { margin-left: var(--ml-md); } - .md\:bui-ml-0\.5 { margin-left: var(--bui-space-0_5); } - .md\:bui-ml-1 { margin-left: var(--bui-space-1); } - .md\:bui-ml-1\.5 { margin-left: var(--bui-space-1_5); } - .md\:bui-ml-2 { margin-left: var(--bui-space-2); } - .md\:bui-ml-3 { margin-left: var(--bui-space-3); } - .md\:bui-ml-4 { margin-left: var(--bui-space-4); } - .md\:bui-ml-5 { margin-left: var(--bui-space-5); } - .md\:bui-ml-6 { margin-left: var(--bui-space-6); } - .md\:bui-ml-7 { margin-left: var(--bui-space-7); } - .md\:bui-ml-8 { margin-left: var(--bui-space-8); } - .md\:bui-ml-9 { margin-left: var(--bui-space-9); } - .md\:bui-ml-10 { margin-left: var(--bui-space-10); } - .md\:bui-ml-11 { margin-left: var(--bui-space-11); } - .md\:bui-ml-12 { margin-left: var(--bui-space-12); } - .md\:bui-ml-13 { margin-left: var(--bui-space-13); } - .md\:bui-ml-14 { margin-left: var(--bui-space-14); } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-ml { margin-left: var(--ml-lg); } - .lg\:bui-ml-0\.5 { margin-left: var(--bui-space-0_5); } - .lg\:bui-ml-1 { margin-left: var(--bui-space-1); } - .lg\:bui-ml-1\.5 { margin-left: var(--bui-space-1_5); } - .lg\:bui-ml-2 { margin-left: var(--bui-space-2); } - .lg\:bui-ml-3 { margin-left: var(--bui-space-3); } - .lg\:bui-ml-4 { margin-left: var(--bui-space-4); } - .lg\:bui-ml-5 { margin-left: var(--bui-space-5); } - .lg\:bui-ml-6 { margin-left: var(--bui-space-6); } - .lg\:bui-ml-7 { margin-left: var(--bui-space-7); } - .lg\:bui-ml-8 { margin-left: var(--bui-space-8); } - .lg\:bui-ml-9 { margin-left: var(--bui-space-9); } - .lg\:bui-ml-10 { margin-left: var(--bui-space-10); } - .lg\:bui-ml-11 { margin-left: var(--bui-space-11); } - .lg\:bui-ml-12 { margin-left: var(--bui-space-12); } - .lg\:bui-ml-13 { margin-left: var(--bui-space-13); } - .lg\:bui-ml-14 { margin-left: var(--bui-space-14); } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-ml { margin-left: var(--ml-xl); } - .xl\:bui-ml-0\.5 { margin-left: var(--bui-space-0_5); } - .xl\:bui-ml-1 { margin-left: var(--bui-space-1); } - .xl\:bui-ml-1\.5 { margin-left: var(--bui-space-1_5); } - .xl\:bui-ml-2 { margin-left: var(--bui-space-2); } - .xl\:bui-ml-3 { margin-left: var(--bui-space-3); } - .xl\:bui-ml-4 { margin-left: var(--bui-space-4); } - .xl\:bui-ml-5 { margin-left: var(--bui-space-5); } - .xl\:bui-ml-6 { margin-left: var(--bui-space-6); } - .xl\:bui-ml-7 { margin-left: var(--bui-space-7); } - .xl\:bui-ml-8 { margin-left: var(--bui-space-8); } - .xl\:bui-ml-9 { margin-left: var(--bui-space-9); } - .xl\:bui-ml-10 { margin-left: var(--bui-space-10); } - .xl\:bui-ml-11 { margin-left: var(--bui-space-11); } - .xl\:bui-ml-12 { margin-left: var(--bui-space-12); } - .xl\:bui-ml-13 { margin-left: var(--bui-space-13); } - .xl\:bui-ml-14 { margin-left: var(--bui-space-14); } } - .bui-mr { margin-right: var(--mr); } - .bui-mr-0\.5 { margin-right: var(--bui-space-0_5); } - .bui-mr-1 { margin-right: var(--bui-space-1); } - .bui-mr-1\.5 { margin-right: var(--bui-space-1_5); } - .bui-mr-2 { margin-right: var(--bui-space-2); } - .bui-mr-3 { margin-right: var(--bui-space-3); } - .bui-mr-4 { margin-right: var(--bui-space-4); } - .bui-mr-5 { margin-right: var(--bui-space-5); } - .bui-mr-6 { margin-right: var(--bui-space-6); } - .bui-mr-7 { margin-right: var(--bui-space-7); } - .bui-mr-8 { margin-right: var(--bui-space-8); } - .bui-mr-9 { margin-right: var(--bui-space-9); } - .bui-mr-10 { margin-right: var(--bui-space-10); } - .bui-mr-11 { margin-right: var(--bui-space-11); } - .bui-mr-12 { margin-right: var(--bui-space-12); } - .bui-mr-13 { margin-right: var(--bui-space-13); } - .bui-mr-14 { margin-right: var(--bui-space-14); } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-mr { margin-right: var(--mr-xs); } - .xs\:bui-mr-0\.5 { margin-right: var(--bui-space-0_5); } - .xs\:bui-mr-1 { margin-right: var(--bui-space-1); } - .xs\:bui-mr-1\.5 { margin-right: var(--bui-space-1_5); } - .xs\:bui-mr-2 { margin-right: var(--bui-space-2); } - .xs\:bui-mr-3 { margin-right: var(--bui-space-3); } - .xs\:bui-mr-4 { margin-right: var(--bui-space-4); } - .xs\:bui-mr-5 { margin-right: var(--bui-space-5); } - .xs\:bui-mr-6 { margin-right: var(--bui-space-6); } - .xs\:bui-mr-7 { margin-right: var(--bui-space-7); } - .xs\:bui-mr-8 { margin-right: var(--bui-space-8); } - .xs\:bui-mr-9 { margin-right: var(--bui-space-9); } - .xs\:bui-mr-10 { margin-right: var(--bui-space-10); } - .xs\:bui-mr-11 { margin-right: var(--bui-space-11); } - .xs\:bui-mr-12 { margin-right: var(--bui-space-12); } - .xs\:bui-mr-13 { margin-right: var(--bui-space-13); } - .xs\:bui-mr-14 { margin-right: var(--bui-space-14); } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-mr { margin-right: var(--mr-sm); } - .sm\:bui-mr-0\.5 { margin-right: var(--bui-space-0_5); } - .sm\:bui-mr-1 { margin-right: var(--bui-space-1); } - .sm\:bui-mr-1\.5 { margin-right: var(--bui-space-1_5); } - .sm\:bui-mr-2 { margin-right: var(--bui-space-2); } - .sm\:bui-mr-3 { margin-right: var(--bui-space-3); } - .sm\:bui-mr-4 { margin-right: var(--bui-space-4); } - .sm\:bui-mr-5 { margin-right: var(--bui-space-5); } - .sm\:bui-mr-6 { margin-right: var(--bui-space-6); } - .sm\:bui-mr-7 { margin-right: var(--bui-space-7); } - .sm\:bui-mr-8 { margin-right: var(--bui-space-8); } - .sm\:bui-mr-9 { margin-right: var(--bui-space-9); } - .sm\:bui-mr-10 { margin-right: var(--bui-space-10); } - .sm\:bui-mr-11 { margin-right: var(--bui-space-11); } - .sm\:bui-mr-12 { margin-right: var(--bui-space-12); } - .sm\:bui-mr-13 { margin-right: var(--bui-space-13); } - .sm\:bui-mr-14 { margin-right: var(--bui-space-14); } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-mr { margin-right: var(--mr-md); } - .md\:bui-mr-0\.5 { margin-right: var(--bui-space-0_5); } - .md\:bui-mr-1 { margin-right: var(--bui-space-1); } - .md\:bui-mr-1\.5 { margin-right: var(--bui-space-1_5); } - .md\:bui-mr-2 { margin-right: var(--bui-space-2); } - .md\:bui-mr-3 { margin-right: var(--bui-space-3); } - .md\:bui-mr-4 { margin-right: var(--bui-space-4); } - .md\:bui-mr-5 { margin-right: var(--bui-space-5); } - .md\:bui-mr-6 { margin-right: var(--bui-space-6); } - .md\:bui-mr-7 { margin-right: var(--bui-space-7); } - .md\:bui-mr-8 { margin-right: var(--bui-space-8); } - .md\:bui-mr-9 { margin-right: var(--bui-space-9); } - .md\:bui-mr-10 { margin-right: var(--bui-space-10); } - .md\:bui-mr-11 { margin-right: var(--bui-space-11); } - .md\:bui-mr-12 { margin-right: var(--bui-space-12); } - .md\:bui-mr-13 { margin-right: var(--bui-space-13); } - .md\:bui-mr-14 { margin-right: var(--bui-space-14); } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-mr { margin-right: var(--mr-lg); } - .lg\:bui-mr-0\.5 { margin-right: var(--bui-space-0_5); } - .lg\:bui-mr-1 { margin-right: var(--bui-space-1); } - .lg\:bui-mr-1\.5 { margin-right: var(--bui-space-1_5); } - .lg\:bui-mr-2 { margin-right: var(--bui-space-2); } - .lg\:bui-mr-3 { margin-right: var(--bui-space-3); } - .lg\:bui-mr-4 { margin-right: var(--bui-space-4); } - .lg\:bui-mr-5 { margin-right: var(--bui-space-5); } - .lg\:bui-mr-6 { margin-right: var(--bui-space-6); } - .lg\:bui-mr-7 { margin-right: var(--bui-space-7); } - .lg\:bui-mr-8 { margin-right: var(--bui-space-8); } - .lg\:bui-mr-9 { margin-right: var(--bui-space-9); } - .lg\:bui-mr-10 { margin-right: var(--bui-space-10); } - .lg\:bui-mr-11 { margin-right: var(--bui-space-11); } - .lg\:bui-mr-12 { margin-right: var(--bui-space-12); } - .lg\:bui-mr-13 { margin-right: var(--bui-space-13); } - .lg\:bui-mr-14 { margin-right: var(--bui-space-14); } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-mr { margin-right: var(--mr-xl); } - .xl\:bui-mr-0\.5 { margin-right: var(--bui-space-0_5); } - .xl\:bui-mr-1 { margin-right: var(--bui-space-1); } - .xl\:bui-mr-1\.5 { margin-right: var(--bui-space-1_5); } - .xl\:bui-mr-2 { margin-right: var(--bui-space-2); } - .xl\:bui-mr-3 { margin-right: var(--bui-space-3); } - .xl\:bui-mr-4 { margin-right: var(--bui-space-4); } - .xl\:bui-mr-5 { margin-right: var(--bui-space-5); } - .xl\:bui-mr-6 { margin-right: var(--bui-space-6); } - .xl\:bui-mr-7 { margin-right: var(--bui-space-7); } - .xl\:bui-mr-8 { margin-right: var(--bui-space-8); } - .xl\:bui-mr-9 { margin-right: var(--bui-space-9); } - .xl\:bui-mr-10 { margin-right: var(--bui-space-10); } - .xl\:bui-mr-11 { margin-right: var(--bui-space-11); } - .xl\:bui-mr-12 { margin-right: var(--bui-space-12); } - .xl\:bui-mr-13 { margin-right: var(--bui-space-13); } - .xl\:bui-mr-14 { margin-right: var(--bui-space-14); } } - .bui-mt { margin-top: var(--mt); } - .bui-mt-0\.5 { margin-top: var(--bui-space-0_5); } - .bui-mt-1 { margin-top: var(--bui-space-1); } - .bui-mt-1\.5 { margin-top: var(--bui-space-1_5); } - .bui-mt-2 { margin-top: var(--bui-space-2); } - .bui-mt-3 { margin-top: var(--bui-space-3); } - .bui-mt-4 { margin-top: var(--bui-space-4); } - .bui-mt-5 { margin-top: var(--bui-space-5); } - .bui-mt-6 { margin-top: var(--bui-space-6); } - .bui-mt-7 { margin-top: var(--bui-space-7); } - .bui-mt-8 { margin-top: var(--bui-space-8); } - .bui-mt-9 { margin-top: var(--bui-space-9); } - .bui-mt-10 { margin-top: var(--bui-space-10); } - .bui-mt-11 { margin-top: var(--bui-space-11); } - .bui-mt-12 { margin-top: var(--bui-space-12); } - .bui-mt-13 { margin-top: var(--bui-space-13); } - .bui-mt-14 { margin-top: var(--bui-space-14); } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-mt { margin-top: var(--mt-xs); } - .xs\:bui-mt-0\.5 { margin-top: var(--bui-space-0_5); } - .xs\:bui-mt-1 { margin-top: var(--bui-space-1); } - .xs\:bui-mt-1\.5 { margin-top: var(--bui-space-1_5); } - .xs\:bui-mt-2 { margin-top: var(--bui-space-2); } - .xs\:bui-mt-3 { margin-top: var(--bui-space-3); } - .xs\:bui-mt-4 { margin-top: var(--bui-space-4); } - .xs\:bui-mt-5 { margin-top: var(--bui-space-5); } - .xs\:bui-mt-6 { margin-top: var(--bui-space-6); } - .xs\:bui-mt-7 { margin-top: var(--bui-space-7); } - .xs\:bui-mt-8 { margin-top: var(--bui-space-8); } - .xs\:bui-mt-9 { margin-top: var(--bui-space-9); } - .xs\:bui-mt-10 { margin-top: var(--bui-space-10); } - .xs\:bui-mt-11 { margin-top: var(--bui-space-11); } - .xs\:bui-mt-12 { margin-top: var(--bui-space-12); } - .xs\:bui-mt-13 { margin-top: var(--bui-space-13); } - .xs\:bui-mt-14 { margin-top: var(--bui-space-14); } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-mt { margin-top: var(--mt-sm); } - .sm\:bui-mt-0\.5 { margin-top: var(--bui-space-0_5); } - .sm\:bui-mt-1 { margin-top: var(--bui-space-1); } - .sm\:bui-mt-1\.5 { margin-top: var(--bui-space-1_5); } - .sm\:bui-mt-2 { margin-top: var(--bui-space-2); } - .sm\:bui-mt-3 { margin-top: var(--bui-space-3); } - .sm\:bui-mt-4 { margin-top: var(--bui-space-4); } - .sm\:bui-mt-5 { margin-top: var(--bui-space-5); } - .sm\:bui-mt-6 { margin-top: var(--bui-space-6); } - .sm\:bui-mt-7 { margin-top: var(--bui-space-7); } - .sm\:bui-mt-8 { margin-top: var(--bui-space-8); } - .sm\:bui-mt-9 { margin-top: var(--bui-space-9); } - .sm\:bui-mt-10 { margin-top: var(--bui-space-10); } - .sm\:bui-mt-11 { margin-top: var(--bui-space-11); } - .sm\:bui-mt-12 { margin-top: var(--bui-space-12); } - .sm\:bui-mt-13 { margin-top: var(--bui-space-13); } - .sm\:bui-mt-14 { margin-top: var(--bui-space-14); } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-mt { margin-top: var(--mt-md); } - .md\:bui-mt-0\.5 { margin-top: var(--bui-space-0_5); } - .md\:bui-mt-1 { margin-top: var(--bui-space-1); } - .md\:bui-mt-1\.5 { margin-top: var(--bui-space-1_5); } - .md\:bui-mt-2 { margin-top: var(--bui-space-2); } - .md\:bui-mt-3 { margin-top: var(--bui-space-3); } - .md\:bui-mt-4 { margin-top: var(--bui-space-4); } - .md\:bui-mt-5 { margin-top: var(--bui-space-5); } - .md\:bui-mt-6 { margin-top: var(--bui-space-6); } - .md\:bui-mt-7 { margin-top: var(--bui-space-7); } - .md\:bui-mt-8 { margin-top: var(--bui-space-8); } - .md\:bui-mt-9 { margin-top: var(--bui-space-9); } - .md\:bui-mt-10 { margin-top: var(--bui-space-10); } - .md\:bui-mt-11 { margin-top: var(--bui-space-11); } - .md\:bui-mt-12 { margin-top: var(--bui-space-12); } - .md\:bui-mt-13 { margin-top: var(--bui-space-13); } - .md\:bui-mt-14 { margin-top: var(--bui-space-14); } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-mt { margin-top: var(--mt-lg); } - .lg\:bui-mt-0\.5 { margin-top: var(--bui-space-0_5); } - .lg\:bui-mt-1 { margin-top: var(--bui-space-1); } - .lg\:bui-mt-1\.5 { margin-top: var(--bui-space-1_5); } - .lg\:bui-mt-2 { margin-top: var(--bui-space-2); } - .lg\:bui-mt-3 { margin-top: var(--bui-space-3); } - .lg\:bui-mt-4 { margin-top: var(--bui-space-4); } - .lg\:bui-mt-5 { margin-top: var(--bui-space-5); } - .lg\:bui-mt-6 { margin-top: var(--bui-space-6); } - .lg\:bui-mt-7 { margin-top: var(--bui-space-7); } - .lg\:bui-mt-8 { margin-top: var(--bui-space-8); } - .lg\:bui-mt-9 { margin-top: var(--bui-space-9); } - .lg\:bui-mt-10 { margin-top: var(--bui-space-10); } - .lg\:bui-mt-11 { margin-top: var(--bui-space-11); } - .lg\:bui-mt-12 { margin-top: var(--bui-space-12); } - .lg\:bui-mt-13 { margin-top: var(--bui-space-13); } - .lg\:bui-mt-14 { margin-top: var(--bui-space-14); } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-mt { margin-top: var(--mt-xl); } - .xl\:bui-mt-0\.5 { margin-top: var(--bui-space-0_5); } - .xl\:bui-mt-1 { margin-top: var(--bui-space-1); } - .xl\:bui-mt-1\.5 { margin-top: var(--bui-space-1_5); } - .xl\:bui-mt-2 { margin-top: var(--bui-space-2); } - .xl\:bui-mt-3 { margin-top: var(--bui-space-3); } - .xl\:bui-mt-4 { margin-top: var(--bui-space-4); } - .xl\:bui-mt-5 { margin-top: var(--bui-space-5); } - .xl\:bui-mt-6 { margin-top: var(--bui-space-6); } - .xl\:bui-mt-7 { margin-top: var(--bui-space-7); } - .xl\:bui-mt-8 { margin-top: var(--bui-space-8); } - .xl\:bui-mt-9 { margin-top: var(--bui-space-9); } - .xl\:bui-mt-10 { margin-top: var(--bui-space-10); } - .xl\:bui-mt-11 { margin-top: var(--bui-space-11); } - .xl\:bui-mt-12 { margin-top: var(--bui-space-12); } - .xl\:bui-mt-13 { margin-top: var(--bui-space-13); } - .xl\:bui-mt-14 { margin-top: var(--bui-space-14); } } - .bui-mb { margin-bottom: var(--mb); } - .bui-mb-0\.5 { margin-bottom: var(--bui-space-0_5); } - .bui-mb-1 { margin-bottom: var(--bui-space-1); } - .bui-mb-1\.5 { margin-bottom: var(--bui-space-1_5); } - .bui-mb-2 { margin-bottom: var(--bui-space-2); } - .bui-mb-3 { margin-bottom: var(--bui-space-3); } - .bui-mb-4 { margin-bottom: var(--bui-space-4); } - .bui-mb-5 { margin-bottom: var(--bui-space-5); } - .bui-mb-6 { margin-bottom: var(--bui-space-6); } - .bui-mb-7 { margin-bottom: var(--bui-space-7); } - .bui-mb-8 { margin-bottom: var(--bui-space-8); } - .bui-mb-9 { margin-bottom: var(--bui-space-9); } - .bui-mb-10 { margin-bottom: var(--bui-space-10); } - .bui-mb-11 { margin-bottom: var(--bui-space-11); } - .bui-mb-12 { margin-bottom: var(--bui-space-12); } - .bui-mb-13 { margin-bottom: var(--bui-space-13); } - .bui-mb-14 { margin-bottom: var(--bui-space-14); } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-mb { margin-bottom: var(--mb-xs); } - .xs\:bui-mb-0\.5 { margin-bottom: var(--bui-space-0_5); } - .xs\:bui-mb-1 { margin-bottom: var(--bui-space-1); } - .xs\:bui-mb-1\.5 { margin-bottom: var(--bui-space-1_5); } - .xs\:bui-mb-2 { margin-bottom: var(--bui-space-2); } - .xs\:bui-mb-3 { margin-bottom: var(--bui-space-3); } - .xs\:bui-mb-4 { margin-bottom: var(--bui-space-4); } - .xs\:bui-mb-5 { margin-bottom: var(--bui-space-5); } - .xs\:bui-mb-6 { margin-bottom: var(--bui-space-6); } - .xs\:bui-mb-7 { margin-bottom: var(--bui-space-7); } - .xs\:bui-mb-8 { margin-bottom: var(--bui-space-8); } - .xs\:bui-mb-9 { margin-bottom: var(--bui-space-9); } - .xs\:bui-mb-10 { margin-bottom: var(--bui-space-10); } - .xs\:bui-mb-11 { margin-bottom: var(--bui-space-11); } - .xs\:bui-mb-12 { margin-bottom: var(--bui-space-12); } - .xs\:bui-mb-13 { margin-bottom: var(--bui-space-13); } - .xs\:bui-mb-14 { margin-bottom: var(--bui-space-14); } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-mb { margin-bottom: var(--mb-sm); } - .sm\:bui-mb-0\.5 { margin-bottom: var(--bui-space-0_5); } - .sm\:bui-mb-1 { margin-bottom: var(--bui-space-1); } - .sm\:bui-mb-1\.5 { margin-bottom: var(--bui-space-1_5); } - .sm\:bui-mb-2 { margin-bottom: var(--bui-space-2); } - .sm\:bui-mb-3 { margin-bottom: var(--bui-space-3); } - .sm\:bui-mb-4 { margin-bottom: var(--bui-space-4); } - .sm\:bui-mb-5 { margin-bottom: var(--bui-space-5); } - .sm\:bui-mb-6 { margin-bottom: var(--bui-space-6); } - .sm\:bui-mb-7 { margin-bottom: var(--bui-space-7); } - .sm\:bui-mb-8 { margin-bottom: var(--bui-space-8); } - .sm\:bui-mb-9 { margin-bottom: var(--bui-space-9); } - .sm\:bui-mb-10 { margin-bottom: var(--bui-space-10); } - .sm\:bui-mb-11 { margin-bottom: var(--bui-space-11); } - .sm\:bui-mb-12 { margin-bottom: var(--bui-space-12); } - .sm\:bui-mb-13 { margin-bottom: var(--bui-space-13); } - .sm\:bui-mb-14 { margin-bottom: var(--bui-space-14); } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-mb { margin-bottom: var(--mb-md); } - .md\:bui-mb-0\.5 { margin-bottom: var(--bui-space-0_5); } - .md\:bui-mb-1 { margin-bottom: var(--bui-space-1); } - .md\:bui-mb-1\.5 { margin-bottom: var(--bui-space-1_5); } - .md\:bui-mb-2 { margin-bottom: var(--bui-space-2); } - .md\:bui-mb-3 { margin-bottom: var(--bui-space-3); } - .md\:bui-mb-4 { margin-bottom: var(--bui-space-4); } - .md\:bui-mb-5 { margin-bottom: var(--bui-space-5); } - .md\:bui-mb-6 { margin-bottom: var(--bui-space-6); } - .md\:bui-mb-7 { margin-bottom: var(--bui-space-7); } - .md\:bui-mb-8 { margin-bottom: var(--bui-space-8); } - .md\:bui-mb-9 { margin-bottom: var(--bui-space-9); } - .md\:bui-mb-10 { margin-bottom: var(--bui-space-10); } - .md\:bui-mb-11 { margin-bottom: var(--bui-space-11); } - .md\:bui-mb-12 { margin-bottom: var(--bui-space-12); } - .md\:bui-mb-13 { margin-bottom: var(--bui-space-13); } - .md\:bui-mb-14 { margin-bottom: var(--bui-space-14); } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-mb { margin-bottom: var(--mb-lg); } - .lg\:bui-mb-0\.5 { margin-bottom: var(--bui-space-0_5); } - .lg\:bui-mb-1 { margin-bottom: var(--bui-space-1); } - .lg\:bui-mb-1\.5 { margin-bottom: var(--bui-space-1_5); } - .lg\:bui-mb-2 { margin-bottom: var(--bui-space-2); } - .lg\:bui-mb-3 { margin-bottom: var(--bui-space-3); } - .lg\:bui-mb-4 { margin-bottom: var(--bui-space-4); } - .lg\:bui-mb-5 { margin-bottom: var(--bui-space-5); } - .lg\:bui-mb-6 { margin-bottom: var(--bui-space-6); } - .lg\:bui-mb-7 { margin-bottom: var(--bui-space-7); } - .lg\:bui-mb-8 { margin-bottom: var(--bui-space-8); } - .lg\:bui-mb-9 { margin-bottom: var(--bui-space-9); } - .lg\:bui-mb-10 { margin-bottom: var(--bui-space-10); } - .lg\:bui-mb-11 { margin-bottom: var(--bui-space-11); } - .lg\:bui-mb-12 { margin-bottom: var(--bui-space-12); } - .lg\:bui-mb-13 { margin-bottom: var(--bui-space-13); } - .lg\:bui-mb-14 { margin-bottom: var(--bui-space-14); } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-mb { margin-bottom: var(--mb-xl); } - .xl\:bui-mb-0\.5 { margin-bottom: var(--bui-space-0_5); } - .xl\:bui-mb-1 { margin-bottom: var(--bui-space-1); } - .xl\:bui-mb-1\.5 { margin-bottom: var(--bui-space-1_5); } - .xl\:bui-mb-2 { margin-bottom: var(--bui-space-2); } - .xl\:bui-mb-3 { margin-bottom: var(--bui-space-3); } - .xl\:bui-mb-4 { margin-bottom: var(--bui-space-4); } - .xl\:bui-mb-5 { margin-bottom: var(--bui-space-5); } - .xl\:bui-mb-6 { margin-bottom: var(--bui-space-6); } - .xl\:bui-mb-7 { margin-bottom: var(--bui-space-7); } - .xl\:bui-mb-8 { margin-bottom: var(--bui-space-8); } - .xl\:bui-mb-9 { margin-bottom: var(--bui-space-9); } - .xl\:bui-mb-10 { margin-bottom: var(--bui-space-10); } - .xl\:bui-mb-11 { margin-bottom: var(--bui-space-11); } - .xl\:bui-mb-12 { margin-bottom: var(--bui-space-12); } - .xl\:bui-mb-13 { margin-bottom: var(--bui-space-13); } - .xl\:bui-mb-14 { margin-bottom: var(--bui-space-14); } } - .bui-my { margin-top: var(--my); margin-bottom: var(--my); } - .bui-my-0\.5 { margin-top: var(--bui-space-0_5); margin-bottom: var(--bui-space-0_5); } - .bui-my-1 { margin-top: var(--bui-space-1); margin-bottom: var(--bui-space-1); } - .bui-my-1\.5 { margin-top: var(--bui-space-1_5); margin-bottom: var(--bui-space-1_5); } - .bui-my-2 { margin-top: var(--bui-space-2); margin-bottom: var(--bui-space-2); } - .bui-my-3 { margin-top: var(--bui-space-3); margin-bottom: var(--bui-space-3); } - .bui-my-4 { margin-top: var(--bui-space-4); margin-bottom: var(--bui-space-4); } - .bui-my-5 { margin-top: var(--bui-space-5); margin-bottom: var(--bui-space-5); } - .bui-my-6 { margin-top: var(--bui-space-6); margin-bottom: var(--bui-space-6); } - .bui-my-7 { margin-top: var(--bui-space-7); margin-bottom: var(--bui-space-7); } - .bui-my-8 { margin-top: var(--bui-space-8); margin-bottom: var(--bui-space-8); } - .bui-my-9 { margin-top: var(--bui-space-9); margin-bottom: var(--bui-space-9); } - .bui-my-10 { margin-top: var(--bui-space-10); margin-bottom: var(--bui-space-10); } - .bui-my-11 { margin-top: var(--bui-space-11); margin-bottom: var(--bui-space-11); } - .bui-my-12 { margin-top: var(--bui-space-12); margin-bottom: var(--bui-space-12); } - .bui-my-13 { margin-top: var(--bui-space-13); margin-bottom: var(--bui-space-13); } - .bui-my-14 { margin-top: var(--bui-space-14); margin-bottom: var(--bui-space-14); } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-my { margin-top: var(--my-xs); margin-bottom: var(--my-xs); } - .xs\:bui-my-0\.5 { margin-top: var(--bui-space-0_5); margin-bottom: var(--bui-space-0_5); } - .xs\:bui-my-1 { margin-top: var(--bui-space-1); margin-bottom: var(--bui-space-1); } - .xs\:bui-my-1\.5 { margin-top: var(--bui-space-1_5); margin-bottom: var(--bui-space-1_5); } - .xs\:bui-my-2 { margin-top: var(--bui-space-2); margin-bottom: var(--bui-space-2); } - .xs\:bui-my-3 { margin-top: var(--bui-space-3); margin-bottom: var(--bui-space-3); } - .xs\:bui-my-4 { margin-top: var(--bui-space-4); margin-bottom: var(--bui-space-4); } - .xs\:bui-my-5 { margin-top: var(--bui-space-5); margin-bottom: var(--bui-space-5); } - .xs\:bui-my-6 { margin-top: var(--bui-space-6); margin-bottom: var(--bui-space-6); } - .xs\:bui-my-7 { margin-top: var(--bui-space-7); margin-bottom: var(--bui-space-7); } - .xs\:bui-my-8 { margin-top: var(--bui-space-8); margin-bottom: var(--bui-space-8); } - .xs\:bui-my-9 { margin-top: var(--bui-space-9); margin-bottom: var(--bui-space-9); } - .xs\:bui-my-10 { margin-top: var(--bui-space-10); margin-bottom: var(--bui-space-10); } - .xs\:bui-my-11 { margin-top: var(--bui-space-11); margin-bottom: var(--bui-space-11); } - .xs\:bui-my-12 { margin-top: var(--bui-space-12); margin-bottom: var(--bui-space-12); } - .xs\:bui-my-13 { margin-top: var(--bui-space-13); margin-bottom: var(--bui-space-13); } - .xs\:bui-my-14 { margin-top: var(--bui-space-14); margin-bottom: var(--bui-space-14); } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-my { margin-top: var(--my-sm); margin-bottom: var(--my-sm); } - .sm\:bui-my-0\.5 { margin-top: var(--bui-space-0_5); margin-bottom: var(--bui-space-0_5); } - .sm\:bui-my-1 { margin-top: var(--bui-space-1); margin-bottom: var(--bui-space-1); } - .sm\:bui-my-1\.5 { margin-top: var(--bui-space-1_5); margin-bottom: var(--bui-space-1_5); } - .sm\:bui-my-2 { margin-top: var(--bui-space-2); margin-bottom: var(--bui-space-2); } - .sm\:bui-my-3 { margin-top: var(--bui-space-3); margin-bottom: var(--bui-space-3); } - .sm\:bui-my-4 { margin-top: var(--bui-space-4); margin-bottom: var(--bui-space-4); } - .sm\:bui-my-5 { margin-top: var(--bui-space-5); margin-bottom: var(--bui-space-5); } - .sm\:bui-my-6 { margin-top: var(--bui-space-6); margin-bottom: var(--bui-space-6); } - .sm\:bui-my-7 { margin-top: var(--bui-space-7); margin-bottom: var(--bui-space-7); } - .sm\:bui-my-8 { margin-top: var(--bui-space-8); margin-bottom: var(--bui-space-8); } - .sm\:bui-my-9 { margin-top: var(--bui-space-9); margin-bottom: var(--bui-space-9); } - .sm\:bui-my-10 { margin-top: var(--bui-space-10); margin-bottom: var(--bui-space-10); } - .sm\:bui-my-11 { margin-top: var(--bui-space-11); margin-bottom: var(--bui-space-11); } - .sm\:bui-my-12 { margin-top: var(--bui-space-12); margin-bottom: var(--bui-space-12); } - .sm\:bui-my-13 { margin-top: var(--bui-space-13); margin-bottom: var(--bui-space-13); } - .sm\:bui-my-14 { margin-top: var(--bui-space-14); margin-bottom: var(--bui-space-14); } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-my { margin-top: var(--my-md); margin-bottom: var(--my-md); } - .md\:bui-my-0\.5 { margin-top: var(--bui-space-0_5); margin-bottom: var(--bui-space-0_5); } - .md\:bui-my-1 { margin-top: var(--bui-space-1); margin-bottom: var(--bui-space-1); } - .md\:bui-my-1\.5 { margin-top: var(--bui-space-1_5); margin-bottom: var(--bui-space-1_5); } - .md\:bui-my-2 { margin-top: var(--bui-space-2); margin-bottom: var(--bui-space-2); } - .md\:bui-my-3 { margin-top: var(--bui-space-3); margin-bottom: var(--bui-space-3); } - .md\:bui-my-4 { margin-top: var(--bui-space-4); margin-bottom: var(--bui-space-4); } - .md\:bui-my-5 { margin-top: var(--bui-space-5); margin-bottom: var(--bui-space-5); } - .md\:bui-my-6 { margin-top: var(--bui-space-6); margin-bottom: var(--bui-space-6); } - .md\:bui-my-7 { margin-top: var(--bui-space-7); margin-bottom: var(--bui-space-7); } - .md\:bui-my-8 { margin-top: var(--bui-space-8); margin-bottom: var(--bui-space-8); } - .md\:bui-my-9 { margin-top: var(--bui-space-9); margin-bottom: var(--bui-space-9); } - .md\:bui-my-10 { margin-top: var(--bui-space-10); margin-bottom: var(--bui-space-10); } - .md\:bui-my-11 { margin-top: var(--bui-space-11); margin-bottom: var(--bui-space-11); } - .md\:bui-my-12 { margin-top: var(--bui-space-12); margin-bottom: var(--bui-space-12); } - .md\:bui-my-13 { margin-top: var(--bui-space-13); margin-bottom: var(--bui-space-13); } - .md\:bui-my-14 { margin-top: var(--bui-space-14); margin-bottom: var(--bui-space-14); } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-my { margin-top: var(--my-lg); margin-bottom: var(--my-lg); } - .lg\:bui-my-0\.5 { margin-top: var(--bui-space-0_5); margin-bottom: var(--bui-space-0_5); } - .lg\:bui-my-1 { margin-top: var(--bui-space-1); margin-bottom: var(--bui-space-1); } - .lg\:bui-my-1\.5 { margin-top: var(--bui-space-1_5); margin-bottom: var(--bui-space-1_5); } - .lg\:bui-my-2 { margin-top: var(--bui-space-2); margin-bottom: var(--bui-space-2); } - .lg\:bui-my-3 { margin-top: var(--bui-space-3); margin-bottom: var(--bui-space-3); } - .lg\:bui-my-4 { margin-top: var(--bui-space-4); margin-bottom: var(--bui-space-4); } - .lg\:bui-my-5 { margin-top: var(--bui-space-5); margin-bottom: var(--bui-space-5); } - .lg\:bui-my-6 { margin-top: var(--bui-space-6); margin-bottom: var(--bui-space-6); } - .lg\:bui-my-7 { margin-top: var(--bui-space-7); margin-bottom: var(--bui-space-7); } - .lg\:bui-my-8 { margin-top: var(--bui-space-8); margin-bottom: var(--bui-space-8); } - .lg\:bui-my-9 { margin-top: var(--bui-space-9); margin-bottom: var(--bui-space-9); } - .lg\:bui-my-10 { margin-top: var(--bui-space-10); margin-bottom: var(--bui-space-10); } - .lg\:bui-my-11 { margin-top: var(--bui-space-11); margin-bottom: var(--bui-space-11); } - .lg\:bui-my-12 { margin-top: var(--bui-space-12); margin-bottom: var(--bui-space-12); } - .lg\:bui-my-13 { margin-top: var(--bui-space-13); margin-bottom: var(--bui-space-13); } - .lg\:bui-my-14 { margin-top: var(--bui-space-14); margin-bottom: var(--bui-space-14); } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-my { margin-top: var(--my-xl); margin-bottom: var(--my-xl); } - .xl\:bui-my-0\.5 { margin-top: var(--bui-space-0_5); margin-bottom: var(--bui-space-0_5); } - .xl\:bui-my-1 { margin-top: var(--bui-space-1); margin-bottom: var(--bui-space-1); } - .xl\:bui-my-1\.5 { margin-top: var(--bui-space-1_5); margin-bottom: var(--bui-space-1_5); } - .xl\:bui-my-2 { margin-top: var(--bui-space-2); margin-bottom: var(--bui-space-2); } - .xl\:bui-my-3 { margin-top: var(--bui-space-3); margin-bottom: var(--bui-space-3); } - .xl\:bui-my-4 { margin-top: var(--bui-space-4); margin-bottom: var(--bui-space-4); } - .xl\:bui-my-5 { margin-top: var(--bui-space-5); margin-bottom: var(--bui-space-5); } - .xl\:bui-my-6 { margin-top: var(--bui-space-6); margin-bottom: var(--bui-space-6); } - .xl\:bui-my-7 { margin-top: var(--bui-space-7); margin-bottom: var(--bui-space-7); } - .xl\:bui-my-8 { margin-top: var(--bui-space-8); margin-bottom: var(--bui-space-8); } - .xl\:bui-my-9 { margin-top: var(--bui-space-9); margin-bottom: var(--bui-space-9); } - .xl\:bui-my-10 { margin-top: var(--bui-space-10); margin-bottom: var(--bui-space-10); } - .xl\:bui-my-11 { margin-top: var(--bui-space-11); margin-bottom: var(--bui-space-11); } - .xl\:bui-my-12 { margin-top: var(--bui-space-12); margin-bottom: var(--bui-space-12); } - .xl\:bui-my-13 { margin-top: var(--bui-space-13); margin-bottom: var(--bui-space-13); } - .xl\:bui-my-14 { margin-top: var(--bui-space-14); margin-bottom: var(--bui-space-14); } } - .bui-mx { margin-left: var(--mx); margin-right: var(--mx); } - .bui-mx-0\.5 { margin-left: var(--bui-space-0_5); margin-right: var(--bui-space-0_5); } - .bui-mx-1 { margin-left: var(--bui-space-1); margin-right: var(--bui-space-1); } - .bui-mx-1\.5 { margin-left: var(--bui-space-1_5); margin-right: var(--bui-space-1_5); } - .bui-mx-2 { margin-left: var(--bui-space-2); margin-right: var(--bui-space-2); } - .bui-mx-3 { margin-left: var(--bui-space-3); margin-right: var(--bui-space-3); } - .bui-mx-4 { margin-left: var(--bui-space-4); margin-right: var(--bui-space-4); } - .bui-mx-5 { margin-left: var(--bui-space-5); margin-right: var(--bui-space-5); } - .bui-mx-6 { margin-left: var(--bui-space-6); margin-right: var(--bui-space-6); } - .bui-mx-7 { margin-left: var(--bui-space-7); margin-right: var(--bui-space-7); } - .bui-mx-8 { margin-left: var(--bui-space-8); margin-right: var(--bui-space-8); } - .bui-mx-9 { margin-left: var(--bui-space-9); margin-right: var(--bui-space-9); } - .bui-mx-10 { margin-left: var(--bui-space-10); margin-right: var(--bui-space-10); } - .bui-mx-11 { margin-left: var(--bui-space-11); margin-right: var(--bui-space-11); } - .bui-mx-12 { margin-left: var(--bui-space-12); margin-right: var(--bui-space-12); } - .bui-mx-13 { margin-left: var(--bui-space-13); margin-right: var(--bui-space-13); } - .bui-mx-14 { margin-left: var(--bui-space-14); margin-right: var(--bui-space-14); } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-mx { margin-left: var(--mx-xs); margin-right: var(--mx-xs); } - .xs\:bui-mx-0\.5 { margin-left: var(--bui-space-0_5); margin-right: var(--bui-space-0_5); } - .xs\:bui-mx-1 { margin-left: var(--bui-space-1); margin-right: var(--bui-space-1); } - .xs\:bui-mx-1\.5 { margin-left: var(--bui-space-1_5); margin-right: var(--bui-space-1_5); } - .xs\:bui-mx-2 { margin-left: var(--bui-space-2); margin-right: var(--bui-space-2); } - .xs\:bui-mx-3 { margin-left: var(--bui-space-3); margin-right: var(--bui-space-3); } - .xs\:bui-mx-4 { margin-left: var(--bui-space-4); margin-right: var(--bui-space-4); } - .xs\:bui-mx-5 { margin-left: var(--bui-space-5); margin-right: var(--bui-space-5); } - .xs\:bui-mx-6 { margin-left: var(--bui-space-6); margin-right: var(--bui-space-6); } - .xs\:bui-mx-7 { margin-left: var(--bui-space-7); margin-right: var(--bui-space-7); } - .xs\:bui-mx-8 { margin-left: var(--bui-space-8); margin-right: var(--bui-space-8); } - .xs\:bui-mx-9 { margin-left: var(--bui-space-9); margin-right: var(--bui-space-9); } - .xs\:bui-mx-10 { margin-left: var(--bui-space-10); margin-right: var(--bui-space-10); } - .xs\:bui-mx-11 { margin-left: var(--bui-space-11); margin-right: var(--bui-space-11); } - .xs\:bui-mx-12 { margin-left: var(--bui-space-12); margin-right: var(--bui-space-12); } - .xs\:bui-mx-13 { margin-left: var(--bui-space-13); margin-right: var(--bui-space-13); } - .xs\:bui-mx-14 { margin-left: var(--bui-space-14); margin-right: var(--bui-space-14); } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-mx { margin-left: var(--mx-sm); margin-right: var(--mx-sm); } - .sm\:bui-mx-0\.5 { margin-left: var(--bui-space-0_5); margin-right: var(--bui-space-0_5); } - .sm\:bui-mx-1 { margin-left: var(--bui-space-1); margin-right: var(--bui-space-1); } - .sm\:bui-mx-1\.5 { margin-left: var(--bui-space-1_5); margin-right: var(--bui-space-1_5); } - .sm\:bui-mx-2 { margin-left: var(--bui-space-2); margin-right: var(--bui-space-2); } - .sm\:bui-mx-3 { margin-left: var(--bui-space-3); margin-right: var(--bui-space-3); } - .sm\:bui-mx-4 { margin-left: var(--bui-space-4); margin-right: var(--bui-space-4); } - .sm\:bui-mx-5 { margin-left: var(--bui-space-5); margin-right: var(--bui-space-5); } - .sm\:bui-mx-6 { margin-left: var(--bui-space-6); margin-right: var(--bui-space-6); } - .sm\:bui-mx-7 { margin-left: var(--bui-space-7); margin-right: var(--bui-space-7); } - .sm\:bui-mx-8 { margin-left: var(--bui-space-8); margin-right: var(--bui-space-8); } - .sm\:bui-mx-9 { margin-left: var(--bui-space-9); margin-right: var(--bui-space-9); } - .sm\:bui-mx-10 { margin-left: var(--bui-space-10); margin-right: var(--bui-space-10); } - .sm\:bui-mx-11 { margin-left: var(--bui-space-11); margin-right: var(--bui-space-11); } - .sm\:bui-mx-12 { margin-left: var(--bui-space-12); margin-right: var(--bui-space-12); } - .sm\:bui-mx-13 { margin-left: var(--bui-space-13); margin-right: var(--bui-space-13); } - .sm\:bui-mx-14 { margin-left: var(--bui-space-14); margin-right: var(--bui-space-14); } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-mx { margin-left: var(--mx-md); margin-right: var(--mx-md); } - .md\:bui-mx-0\.5 { margin-left: var(--bui-space-0_5); margin-right: var(--bui-space-0_5); } - .md\:bui-mx-1 { margin-left: var(--bui-space-1); margin-right: var(--bui-space-1); } - .md\:bui-mx-1\.5 { margin-left: var(--bui-space-1_5); margin-right: var(--bui-space-1_5); } - .md\:bui-mx-2 { margin-left: var(--bui-space-2); margin-right: var(--bui-space-2); } - .md\:bui-mx-3 { margin-left: var(--bui-space-3); margin-right: var(--bui-space-3); } - .md\:bui-mx-4 { margin-left: var(--bui-space-4); margin-right: var(--bui-space-4); } - .md\:bui-mx-5 { margin-left: var(--bui-space-5); margin-right: var(--bui-space-5); } - .md\:bui-mx-6 { margin-left: var(--bui-space-6); margin-right: var(--bui-space-6); } - .md\:bui-mx-7 { margin-left: var(--bui-space-7); margin-right: var(--bui-space-7); } - .md\:bui-mx-8 { margin-left: var(--bui-space-8); margin-right: var(--bui-space-8); } - .md\:bui-mx-9 { margin-left: var(--bui-space-9); margin-right: var(--bui-space-9); } - .md\:bui-mx-10 { margin-left: var(--bui-space-10); margin-right: var(--bui-space-10); } - .md\:bui-mx-11 { margin-left: var(--bui-space-11); margin-right: var(--bui-space-11); } - .md\:bui-mx-12 { margin-left: var(--bui-space-12); margin-right: var(--bui-space-12); } - .md\:bui-mx-13 { margin-left: var(--bui-space-13); margin-right: var(--bui-space-13); } - .md\:bui-mx-14 { margin-left: var(--bui-space-14); margin-right: var(--bui-space-14); } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-mx { margin-left: var(--mx-lg); margin-right: var(--mx-lg); } - .lg\:bui-mx-0\.5 { margin-left: var(--bui-space-0_5); margin-right: var(--bui-space-0_5); } - .lg\:bui-mx-1 { margin-left: var(--bui-space-1); margin-right: var(--bui-space-1); } - .lg\:bui-mx-1\.5 { margin-left: var(--bui-space-1_5); margin-right: var(--bui-space-1_5); } - .lg\:bui-mx-2 { margin-left: var(--bui-space-2); margin-right: var(--bui-space-2); } - .lg\:bui-mx-3 { margin-left: var(--bui-space-3); margin-right: var(--bui-space-3); } - .lg\:bui-mx-4 { margin-left: var(--bui-space-4); margin-right: var(--bui-space-4); } - .lg\:bui-mx-5 { margin-left: var(--bui-space-5); margin-right: var(--bui-space-5); } - .lg\:bui-mx-6 { margin-left: var(--bui-space-6); margin-right: var(--bui-space-6); } - .lg\:bui-mx-7 { margin-left: var(--bui-space-7); margin-right: var(--bui-space-7); } - .lg\:bui-mx-8 { margin-left: var(--bui-space-8); margin-right: var(--bui-space-8); } - .lg\:bui-mx-9 { margin-left: var(--bui-space-9); margin-right: var(--bui-space-9); } - .lg\:bui-mx-10 { margin-left: var(--bui-space-10); margin-right: var(--bui-space-10); } - .lg\:bui-mx-11 { margin-left: var(--bui-space-11); margin-right: var(--bui-space-11); } - .lg\:bui-mx-12 { margin-left: var(--bui-space-12); margin-right: var(--bui-space-12); } - .lg\:bui-mx-13 { margin-left: var(--bui-space-13); margin-right: var(--bui-space-13); } - .lg\:bui-mx-14 { margin-left: var(--bui-space-14); margin-right: var(--bui-space-14); } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-mx { margin-left: var(--mx-xl); margin-right: var(--mx-xl); } - .xl\:bui-mx-0\.5 { margin-left: var(--bui-space-0_5); margin-right: var(--bui-space-0_5); } - .xl\:bui-mx-1 { margin-left: var(--bui-space-1); margin-right: var(--bui-space-1); } - .xl\:bui-mx-1\.5 { margin-left: var(--bui-space-1_5); margin-right: var(--bui-space-1_5); } - .xl\:bui-mx-2 { margin-left: var(--bui-space-2); margin-right: var(--bui-space-2); } - .xl\:bui-mx-3 { margin-left: var(--bui-space-3); margin-right: var(--bui-space-3); } - .xl\:bui-mx-4 { margin-left: var(--bui-space-4); margin-right: var(--bui-space-4); } - .xl\:bui-mx-5 { margin-left: var(--bui-space-5); margin-right: var(--bui-space-5); } - .xl\:bui-mx-6 { margin-left: var(--bui-space-6); margin-right: var(--bui-space-6); } - .xl\:bui-mx-7 { margin-left: var(--bui-space-7); margin-right: var(--bui-space-7); } - .xl\:bui-mx-8 { margin-left: var(--bui-space-8); margin-right: var(--bui-space-8); } - .xl\:bui-mx-9 { margin-left: var(--bui-space-9); margin-right: var(--bui-space-9); } - .xl\:bui-mx-10 { margin-left: var(--bui-space-10); margin-right: var(--bui-space-10); } - .xl\:bui-mx-11 { margin-left: var(--bui-space-11); margin-right: var(--bui-space-11); } - .xl\:bui-mx-12 { margin-left: var(--bui-space-12); margin-right: var(--bui-space-12); } - .xl\:bui-mx-13 { margin-left: var(--bui-space-13); margin-right: var(--bui-space-13); } - .xl\:bui-mx-14 { margin-left: var(--bui-space-14); margin-right: var(--bui-space-14); } } - .bui-display-none { display: none; } - .bui-display-inline { display: inline; } - .bui-display-inline-block { display: inline-block; } - .bui-display-block { display: block; } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-display-none { display: none; } - .xs\:bui-display-inline { display: inline; } - .xs\:bui-display-inline-block { display: inline-block; } - .xs\:bui-display-block { display: block; } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-display-none { display: none; } - .sm\:bui-display-inline { display: inline; } - .sm\:bui-display-inline-block { display: inline-block; } - .sm\:bui-display-block { display: block; } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-display-none { display: none; } - .md\:bui-display-inline { display: inline; } - .md\:bui-display-inline-block { display: inline-block; } - .md\:bui-display-block { display: block; } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-display-none { display: none; } - .lg\:bui-display-inline { display: inline; } - .lg\:bui-display-inline-block { display: inline-block; } - .lg\:bui-display-block { display: block; } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-display-none { display: none; } - .xl\:bui-display-inline { display: inline; } - .xl\:bui-display-inline-block { display: inline-block; } - .xl\:bui-display-block { display: block; } } - .bui-w { width: var(--width); } - .bui-min-w { min-width: var(--min-width); } - .bui-max-w { max-width: var(--max-width); } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-w { width: var(--width); } - .xs\:bui-min-w { min-width: var(--min-width); } - .xs\:bui-max-w { max-width: var(--max-width); } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-w { width: var(--width); } - .sm\:bui-min-w { min-width: var(--min-width); } - .sm\:bui-max-w { max-width: var(--max-width); } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-w { width: var(--width); } - .md\:bui-min-w { min-width: var(--min-width); } - .md\:bui-max-w { max-width: var(--max-width); } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-w { width: var(--width); } - .lg\:bui-min-w { min-width: var(--min-width); } - .lg\:bui-max-w { max-width: var(--max-width); } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-w { width: var(--width); } - .xl\:bui-min-w { min-width: var(--min-width); } - .xl\:bui-max-w { max-width: var(--max-width); } } - .bui-h { height: var(--height); } - .bui-min-h { min-height: var(--min-height); } - .bui-max-h { max-height: var(--max-height); } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-h { height: var(--height); } - .xs\:bui-min-h { min-height: var(--min-height); } - .xs\:bui-max-h { max-height: var(--max-height); } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-h { height: var(--height); } - .sm\:bui-min-h { min-height: var(--min-height); } - .sm\:bui-max-h { max-height: var(--max-height); } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-h { height: var(--height); } - .md\:bui-min-h { min-height: var(--min-height); } - .md\:bui-max-h { max-height: var(--max-height); } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-h { height: var(--height); } - .lg\:bui-min-h { min-height: var(--min-height); } - .lg\:bui-max-h { max-height: var(--max-height); } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-h { height: var(--height); } - .xl\:bui-min-h { min-height: var(--min-height); } - .xl\:bui-max-h { max-height: var(--max-height); } } - .bui-position-absolute { position: absolute; } - .bui-position-fixed { position: fixed; } - .bui-position-sticky { position: sticky; } - .bui-position-relative { position: relative; } - .bui-position-static { position: static; } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-position-absolute { position: absolute; } - .xs\:bui-position-fixed { position: fixed; } - .xs\:bui-position-sticky { position: sticky; } - .xs\:bui-position-relative { position: relative; } - .xs\:bui-position-static { position: static; } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-position-absolute { position: absolute; } - .sm\:bui-position-fixed { position: fixed; } - .sm\:bui-position-sticky { position: sticky; } - .sm\:bui-position-relative { position: relative; } - .sm\:bui-position-static { position: static; } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-position-absolute { position: absolute; } - .md\:bui-position-fixed { position: fixed; } - .md\:bui-position-sticky { position: sticky; } - .md\:bui-position-relative { position: relative; } - .md\:bui-position-static { position: static; } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-position-absolute { position: absolute; } - .lg\:bui-position-fixed { position: fixed; } - .lg\:bui-position-sticky { position: sticky; } - .lg\:bui-position-relative { position: relative; } - .lg\:bui-position-static { position: static; } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-position-absolute { position: absolute; } - .xl\:bui-position-fixed { position: fixed; } - .xl\:bui-position-sticky { position: sticky; } - .xl\:bui-position-relative { position: relative; } - .xl\:bui-position-static { position: static; } } - .bui-columns-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } - .bui-columns-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } - .bui-columns-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } - .bui-columns-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } - .bui-columns-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); } - .bui-columns-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); } - .bui-columns-7 { grid-template-columns: repeat(7, minmax(0, 1fr)); } - .bui-columns-8 { grid-template-columns: repeat(8, minmax(0, 1fr)); } - .bui-columns-9 { grid-template-columns: repeat(9, minmax(0, 1fr)); } - .bui-columns-10 { grid-template-columns: repeat(10, minmax(0, 1fr)); } - .bui-columns-11 { grid-template-columns: repeat(11, minmax(0, 1fr)); } - .bui-columns-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); } - .bui-columns-auto { grid-template-columns: repeat(auto-fit, minmax(0, 1fr)); } - .bui-col-span-1 { grid-column: span 1 / span 1; } - .bui-col-span-2 { grid-column: span 2 / span 2; } - .bui-col-span-3 { grid-column: span 3 / span 3; } - .bui-col-span-4 { grid-column: span 4 / span 4; } - .bui-col-span-5 { grid-column: span 5 / span 5; } - .bui-col-span-6 { grid-column: span 6 / span 6; } - .bui-col-span-7 { grid-column: span 7 / span 7; } - .bui-col-span-8 { grid-column: span 8 / span 8; } - .bui-col-span-9 { grid-column: span 9 / span 9; } - .bui-col-span-10 { grid-column: span 10 / span 10; } - .bui-col-span-11 { grid-column: span 11 / span 11; } - .bui-col-span-12 { grid-column: span 12 / span 12; } - .bui-col-span-auto { - grid-column: span auto / span auto; + grid-column: span auto/span auto; } - .bui-col-start-1 { grid-column-start: 1; } - .bui-col-start-2 { grid-column-start: 2; } - .bui-col-start-3 { grid-column-start: 3; } - .bui-col-start-4 { grid-column-start: 4; } - .bui-col-start-5 { grid-column-start: 5; } - .bui-col-start-6 { grid-column-start: 6; } - .bui-col-start-7 { grid-column-start: 7; } - .bui-col-start-8 { grid-column-start: 8; } - .bui-col-start-9 { grid-column-start: 9; } - .bui-col-start-10 { grid-column-start: 10; } - .bui-col-start-11 { grid-column-start: 11; } - .bui-col-start-12 { grid-column-start: 12; } - .bui-col-start-13 { grid-column-start: 13; } - .bui-col-start-auto { grid-column-start: auto; } - .bui-col-end-1 { grid-column-end: 1; } - .bui-col-end-2 { grid-column-end: 2; } - .bui-col-end-3 { grid-column-end: 3; } - .bui-col-end-4 { grid-column-end: 4; } - .bui-col-end-5 { grid-column-end: 5; } - .bui-col-end-6 { grid-column-end: 6; } - .bui-col-end-7 { grid-column-end: 7; } - .bui-col-end-8 { grid-column-end: 8; } - .bui-col-end-9 { grid-column-end: 9; } - .bui-col-end-10 { grid-column-end: 10; } - .bui-col-end-11 { grid-column-end: 11; } - .bui-col-end-12 { grid-column-end: 12; } - .bui-col-end-13 { grid-column-end: 13; } - .bui-col-end-auto { grid-column-end: auto; } - .bui-row-span-1 { grid-row: span 1 / span 1; } - .bui-row-span-2 { grid-row: span 2 / span 2; } - .bui-row-span-3 { grid-row: span 3 / span 3; } - .bui-row-span-4 { grid-row: span 4 / span 4; } - .bui-row-span-5 { grid-row: span 5 / span 5; } - .bui-row-span-6 { grid-row: span 6 / span 6; } - .bui-row-span-7 { grid-row: span 7 / span 7; } - .bui-row-span-8 { grid-row: span 8 / span 8; } - .bui-row-span-9 { grid-row: span 9 / span 9; } - .bui-row-span-10 { grid-row: span 10 / span 10; } - .bui-row-span-11 { grid-row: span 11 / span 11; } - .bui-row-span-12 { grid-row: span 12 / span 12; } - .bui-row-span-auto { - grid-row: span auto / span auto; + grid-row: span auto/span auto; } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-columns-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } - .xs\:bui-columns-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } - .xs\:bui-columns-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } - .xs\:bui-columns-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } - .xs\:bui-columns-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); } - .xs\:bui-columns-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); } - .xs\:bui-columns-7 { grid-template-columns: repeat(7, minmax(0, 1fr)); } - .xs\:bui-columns-8 { grid-template-columns: repeat(8, minmax(0, 1fr)); } - .xs\:bui-columns-9 { grid-template-columns: repeat(9, minmax(0, 1fr)); } - .xs\:bui-columns-10 { grid-template-columns: repeat(10, minmax(0, 1fr)); } - .xs\:bui-columns-11 { grid-template-columns: repeat(11, minmax(0, 1fr)); } - .xs\:bui-columns-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); } - .xs\:bui-columns-auto { grid-template-columns: repeat(auto-fit, minmax(0, 1fr)); } - .xs\:bui-col-span-1 { grid-column: span 1 / span 1; } - .xs\:bui-col-span-2 { grid-column: span 2 / span 2; } - .xs\:bui-col-span-3 { grid-column: span 3 / span 3; } - .xs\:bui-col-span-4 { grid-column: span 4 / span 4; } - .xs\:bui-col-span-5 { grid-column: span 5 / span 5; } - .xs\:bui-col-span-6 { grid-column: span 6 / span 6; } - .xs\:bui-col-span-7 { grid-column: span 7 / span 7; } - .xs\:bui-col-span-8 { grid-column: span 8 / span 8; } - .xs\:bui-col-span-9 { grid-column: span 9 / span 9; } - .xs\:bui-col-span-10 { grid-column: span 10 / span 10; } - .xs\:bui-col-span-11 { grid-column: span 11 / span 11; } - .xs\:bui-col-span-12 { grid-column: span 12 / span 12; } - .xs\:bui-col-span-auto { - grid-column: span auto / span auto; + grid-column: span auto/span auto; } - .xs\:bui-col-start-1 { grid-column-start: 1; } - .xs\:bui-col-start-2 { grid-column-start: 2; } - .xs\:bui-col-start-3 { grid-column-start: 3; } - .xs\:bui-col-start-4 { grid-column-start: 4; } - .xs\:bui-col-start-5 { grid-column-start: 5; } - .xs\:bui-col-start-6 { grid-column-start: 6; } - .xs\:bui-col-start-7 { grid-column-start: 7; } - .xs\:bui-col-start-8 { grid-column-start: 8; } - .xs\:bui-col-start-9 { grid-column-start: 9; } - .xs\:bui-col-start-10 { grid-column-start: 10; } - .xs\:bui-col-start-11 { grid-column-start: 11; } - .xs\:bui-col-start-12 { grid-column-start: 12; } - .xs\:bui-col-start-13 { grid-column-start: 13; } - .xs\:bui-col-start-auto { grid-column-start: auto; } - .xs\:bui-col-end-1 { grid-column-end: 1; } - .xs\:bui-col-end-2 { grid-column-end: 2; } - .xs\:bui-col-end-3 { grid-column-end: 3; } - .xs\:bui-col-end-4 { grid-column-end: 4; } - .xs\:bui-col-end-5 { grid-column-end: 5; } - .xs\:bui-col-end-6 { grid-column-end: 6; } - .xs\:bui-col-end-7 { grid-column-end: 7; } - .xs\:bui-col-end-8 { grid-column-end: 8; } - .xs\:bui-col-end-9 { grid-column-end: 9; } - .xs\:bui-col-end-10 { grid-column-end: 10; } - .xs\:bui-col-end-11 { grid-column-end: 11; } - .xs\:bui-col-end-12 { grid-column-end: 12; } - .xs\:bui-col-end-13 { grid-column-end: 13; } - .xs\:bui-col-end-auto { grid-column-end: auto; } - .xs\:bui-row-span-1 { grid-row: span 1 / span 1; } - .xs\:bui-row-span-2 { grid-row: span 2 / span 2; } - .xs\:bui-row-span-3 { grid-row: span 3 / span 3; } - .xs\:bui-row-span-4 { grid-row: span 4 / span 4; } - .xs\:bui-row-span-5 { grid-row: span 5 / span 5; } - .xs\:bui-row-span-6 { grid-row: span 6 / span 6; } - .xs\:bui-row-span-7 { grid-row: span 7 / span 7; } - .xs\:bui-row-span-8 { grid-row: span 8 / span 8; } - .xs\:bui-row-span-9 { grid-row: span 9 / span 9; } - .xs\:bui-row-span-10 { grid-row: span 10 / span 10; } - .xs\:bui-row-span-11 { grid-row: span 11 / span 11; } - .xs\:bui-row-span-12 { grid-row: span 12 / span 12; } - .xs\:bui-row-span-auto { - grid-row: span auto / span auto; + grid-row: span auto/span auto; } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-columns-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } - .sm\:bui-columns-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } - .sm\:bui-columns-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } - .sm\:bui-columns-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } - .sm\:bui-columns-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); } - .sm\:bui-columns-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); } - .sm\:bui-columns-7 { grid-template-columns: repeat(7, minmax(0, 1fr)); } - .sm\:bui-columns-8 { grid-template-columns: repeat(8, minmax(0, 1fr)); } - .sm\:bui-columns-9 { grid-template-columns: repeat(9, minmax(0, 1fr)); } - .sm\:bui-columns-10 { grid-template-columns: repeat(10, minmax(0, 1fr)); } - .sm\:bui-columns-11 { grid-template-columns: repeat(11, minmax(0, 1fr)); } - .sm\:bui-columns-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); } - .sm\:bui-columns-auto { grid-template-columns: repeat(auto-fit, minmax(0, 1fr)); } - .sm\:bui-col-span-1 { grid-column: span 1 / span 1; } - .sm\:bui-col-span-2 { grid-column: span 2 / span 2; } - .sm\:bui-col-span-3 { grid-column: span 3 / span 3; } - .sm\:bui-col-span-4 { grid-column: span 4 / span 4; } - .sm\:bui-col-span-5 { grid-column: span 5 / span 5; } - .sm\:bui-col-span-6 { grid-column: span 6 / span 6; } - .sm\:bui-col-span-7 { grid-column: span 7 / span 7; } - .sm\:bui-col-span-8 { grid-column: span 8 / span 8; } - .sm\:bui-col-span-9 { grid-column: span 9 / span 9; } - .sm\:bui-col-span-10 { grid-column: span 10 / span 10; } - .sm\:bui-col-span-11 { grid-column: span 11 / span 11; } - .sm\:bui-col-span-12 { grid-column: span 12 / span 12; } - .sm\:bui-col-span-auto { - grid-column: span auto / span auto; + grid-column: span auto/span auto; } - .sm\:bui-col-start-1 { grid-column-start: 1; } - .sm\:bui-col-start-2 { grid-column-start: 2; } - .sm\:bui-col-start-3 { grid-column-start: 3; } - .sm\:bui-col-start-4 { grid-column-start: 4; } - .sm\:bui-col-start-5 { grid-column-start: 5; } - .sm\:bui-col-start-6 { grid-column-start: 6; } - .sm\:bui-col-start-7 { grid-column-start: 7; } - .sm\:bui-col-start-8 { grid-column-start: 8; } - .sm\:bui-col-start-9 { grid-column-start: 9; } - .sm\:bui-col-start-10 { grid-column-start: 10; } - .sm\:bui-col-start-11 { grid-column-start: 11; } - .sm\:bui-col-start-12 { grid-column-start: 12; } - .sm\:bui-col-start-13 { grid-column-start: 13; } - .sm\:bui-col-start-auto { grid-column-start: auto; } - .sm\:bui-col-end-1 { grid-column-end: 1; } - .sm\:bui-col-end-2 { grid-column-end: 2; } - .sm\:bui-col-end-3 { grid-column-end: 3; } - .sm\:bui-col-end-4 { grid-column-end: 4; } - .sm\:bui-col-end-5 { grid-column-end: 5; } - .sm\:bui-col-end-6 { grid-column-end: 6; } - .sm\:bui-col-end-7 { grid-column-end: 7; } - .sm\:bui-col-end-8 { grid-column-end: 8; } - .sm\:bui-col-end-9 { grid-column-end: 9; } - .sm\:bui-col-end-10 { grid-column-end: 10; } - .sm\:bui-col-end-11 { grid-column-end: 11; } - .sm\:bui-col-end-12 { grid-column-end: 12; } - .sm\:bui-col-end-13 { grid-column-end: 13; } - .sm\:bui-col-end-auto { grid-column-end: auto; } - .sm\:bui-row-span-1 { grid-row: span 1 / span 1; } - .sm\:bui-row-span-2 { grid-row: span 2 / span 2; } - .sm\:bui-row-span-3 { grid-row: span 3 / span 3; } - .sm\:bui-row-span-4 { grid-row: span 4 / span 4; } - .sm\:bui-row-span-5 { grid-row: span 5 / span 5; } - .sm\:bui-row-span-6 { grid-row: span 6 / span 6; } - .sm\:bui-row-span-7 { grid-row: span 7 / span 7; } - .sm\:bui-row-span-8 { grid-row: span 8 / span 8; } - .sm\:bui-row-span-9 { grid-row: span 9 / span 9; } - .sm\:bui-row-span-10 { grid-row: span 10 / span 10; } - .sm\:bui-row-span-11 { grid-row: span 11 / span 11; } - .sm\:bui-row-span-12 { grid-row: span 12 / span 12; } - .sm\:bui-row-span-auto { - grid-row: span auto / span auto; + grid-row: span auto/span auto; } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-columns-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } - .md\:bui-columns-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } - .md\:bui-columns-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } - .md\:bui-columns-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } - .md\:bui-columns-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); } - .md\:bui-columns-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); } - .md\:bui-columns-7 { grid-template-columns: repeat(7, minmax(0, 1fr)); } - .md\:bui-columns-8 { grid-template-columns: repeat(8, minmax(0, 1fr)); } - .md\:bui-columns-9 { grid-template-columns: repeat(9, minmax(0, 1fr)); } - .md\:bui-columns-10 { grid-template-columns: repeat(10, minmax(0, 1fr)); } - .md\:bui-columns-11 { grid-template-columns: repeat(11, minmax(0, 1fr)); } - .md\:bui-columns-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); } - .md\:bui-columns-auto { grid-template-columns: repeat(auto-fit, minmax(0, 1fr)); } - .md\:bui-col-span-1 { grid-column: span 1 / span 1; } - .md\:bui-col-span-2 { grid-column: span 2 / span 2; } - .md\:bui-col-span-3 { grid-column: span 3 / span 3; } - .md\:bui-col-span-4 { grid-column: span 4 / span 4; } - .md\:bui-col-span-5 { grid-column: span 5 / span 5; } - .md\:bui-col-span-6 { grid-column: span 6 / span 6; } - .md\:bui-col-span-7 { grid-column: span 7 / span 7; } - .md\:bui-col-span-8 { grid-column: span 8 / span 8; } - .md\:bui-col-span-9 { grid-column: span 9 / span 9; } - .md\:bui-col-span-10 { grid-column: span 10 / span 10; } - .md\:bui-col-span-11 { grid-column: span 11 / span 11; } - .md\:bui-col-span-12 { grid-column: span 12 / span 12; } - .md\:bui-col-span-auto { - grid-column: span auto / span auto; + grid-column: span auto/span auto; } - .md\:bui-col-start-1 { grid-column-start: 1; } - .md\:bui-col-start-2 { grid-column-start: 2; } - .md\:bui-col-start-3 { grid-column-start: 3; } - .md\:bui-col-start-4 { grid-column-start: 4; } - .md\:bui-col-start-5 { grid-column-start: 5; } - .md\:bui-col-start-6 { grid-column-start: 6; } - .md\:bui-col-start-7 { grid-column-start: 7; } - .md\:bui-col-start-8 { grid-column-start: 8; } - .md\:bui-col-start-9 { grid-column-start: 9; } - .md\:bui-col-start-10 { grid-column-start: 10; } - .md\:bui-col-start-11 { grid-column-start: 11; } - .md\:bui-col-start-12 { grid-column-start: 12; } - .md\:bui-col-start-13 { grid-column-start: 13; } - .md\:bui-col-start-auto { grid-column-start: auto; } - .md\:bui-col-end-1 { grid-column-end: 1; } - .md\:bui-col-end-2 { grid-column-end: 2; } - .md\:bui-col-end-3 { grid-column-end: 3; } - .md\:bui-col-end-4 { grid-column-end: 4; } - .md\:bui-col-end-5 { grid-column-end: 5; } - .md\:bui-col-end-6 { grid-column-end: 6; } - .md\:bui-col-end-7 { grid-column-end: 7; } - .md\:bui-col-end-8 { grid-column-end: 8; } - .md\:bui-col-end-9 { grid-column-end: 9; } - .md\:bui-col-end-10 { grid-column-end: 10; } - .md\:bui-col-end-11 { grid-column-end: 11; } - .md\:bui-col-end-12 { grid-column-end: 12; } - .md\:bui-col-end-13 { grid-column-end: 13; } - .md\:bui-col-end-auto { grid-column-end: auto; } - .md\:bui-row-span-1 { grid-row: span 1 / span 1; } - .md\:bui-row-span-2 { grid-row: span 2 / span 2; } - .md\:bui-row-span-3 { grid-row: span 3 / span 3; } - .md\:bui-row-span-4 { grid-row: span 4 / span 4; } - .md\:bui-row-span-5 { grid-row: span 5 / span 5; } - .md\:bui-row-span-6 { grid-row: span 6 / span 6; } - .md\:bui-row-span-7 { grid-row: span 7 / span 7; } - .md\:bui-row-span-8 { grid-row: span 8 / span 8; } - .md\:bui-row-span-9 { grid-row: span 9 / span 9; } - .md\:bui-row-span-10 { grid-row: span 10 / span 10; } - .md\:bui-row-span-11 { grid-row: span 11 / span 11; } - .md\:bui-row-span-12 { grid-row: span 12 / span 12; } - .md\:bui-row-span-auto { - grid-row: span auto / span auto; + grid-row: span auto/span auto; } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-columns-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } - .lg\:bui-columns-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } - .lg\:bui-columns-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } - .lg\:bui-columns-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } - .lg\:bui-columns-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); } - .lg\:bui-columns-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); } - .lg\:bui-columns-7 { grid-template-columns: repeat(7, minmax(0, 1fr)); } - .lg\:bui-columns-8 { grid-template-columns: repeat(8, minmax(0, 1fr)); } - .lg\:bui-columns-9 { grid-template-columns: repeat(9, minmax(0, 1fr)); } - .lg\:bui-columns-10 { grid-template-columns: repeat(10, minmax(0, 1fr)); } - .lg\:bui-columns-11 { grid-template-columns: repeat(11, minmax(0, 1fr)); } - .lg\:bui-columns-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); } - .lg\:bui-columns-auto { grid-template-columns: repeat(auto-fit, minmax(0, 1fr)); } - .lg\:bui-col-span-1 { grid-column: span 1 / span 1; } - .lg\:bui-col-span-2 { grid-column: span 2 / span 2; } - .lg\:bui-col-span-3 { grid-column: span 3 / span 3; } - .lg\:bui-col-span-4 { grid-column: span 4 / span 4; } - .lg\:bui-col-span-5 { grid-column: span 5 / span 5; } - .lg\:bui-col-span-6 { grid-column: span 6 / span 6; } - .lg\:bui-col-span-7 { grid-column: span 7 / span 7; } - .lg\:bui-col-span-8 { grid-column: span 8 / span 8; } - .lg\:bui-col-span-9 { grid-column: span 9 / span 9; } - .lg\:bui-col-span-10 { grid-column: span 10 / span 10; } - .lg\:bui-col-span-11 { grid-column: span 11 / span 11; } - .lg\:bui-col-span-12 { grid-column: span 12 / span 12; } - .lg\:bui-col-span-auto { - grid-column: span auto / span auto; + grid-column: span auto/span auto; } - .lg\:bui-col-start-1 { grid-column-start: 1; } - .lg\:bui-col-start-2 { grid-column-start: 2; } - .lg\:bui-col-start-3 { grid-column-start: 3; } - .lg\:bui-col-start-4 { grid-column-start: 4; } - .lg\:bui-col-start-5 { grid-column-start: 5; } - .lg\:bui-col-start-6 { grid-column-start: 6; } - .lg\:bui-col-start-7 { grid-column-start: 7; } - .lg\:bui-col-start-8 { grid-column-start: 8; } - .lg\:bui-col-start-9 { grid-column-start: 9; } - .lg\:bui-col-start-10 { grid-column-start: 10; } - .lg\:bui-col-start-11 { grid-column-start: 11; } - .lg\:bui-col-start-12 { grid-column-start: 12; } - .lg\:bui-col-start-13 { grid-column-start: 13; } - .lg\:bui-col-start-auto { grid-column-start: auto; } - .lg\:bui-col-end-1 { grid-column-end: 1; } - .lg\:bui-col-end-2 { grid-column-end: 2; } - .lg\:bui-col-end-3 { grid-column-end: 3; } - .lg\:bui-col-end-4 { grid-column-end: 4; } - .lg\:bui-col-end-5 { grid-column-end: 5; } - .lg\:bui-col-end-6 { grid-column-end: 6; } - .lg\:bui-col-end-7 { grid-column-end: 7; } - .lg\:bui-col-end-8 { grid-column-end: 8; } - .lg\:bui-col-end-9 { grid-column-end: 9; } - .lg\:bui-col-end-10 { grid-column-end: 10; } - .lg\:bui-col-end-11 { grid-column-end: 11; } - .lg\:bui-col-end-12 { grid-column-end: 12; } - .lg\:bui-col-end-13 { grid-column-end: 13; } - .lg\:bui-col-end-auto { grid-column-end: auto; } - .lg\:bui-row-span-1 { grid-row: span 1 / span 1; } - .lg\:bui-row-span-2 { grid-row: span 2 / span 2; } - .lg\:bui-row-span-3 { grid-row: span 3 / span 3; } - .lg\:bui-row-span-4 { grid-row: span 4 / span 4; } - .lg\:bui-row-span-5 { grid-row: span 5 / span 5; } - .lg\:bui-row-span-6 { grid-row: span 6 / span 6; } - .lg\:bui-row-span-7 { grid-row: span 7 / span 7; } - .lg\:bui-row-span-8 { grid-row: span 8 / span 8; } - .lg\:bui-row-span-9 { grid-row: span 9 / span 9; } - .lg\:bui-row-span-10 { grid-row: span 10 / span 10; } - .lg\:bui-row-span-11 { grid-row: span 11 / span 11; } - .lg\:bui-row-span-12 { grid-row: span 12 / span 12; } - .lg\:bui-row-span-auto { - grid-row: span auto / span auto; + grid-row: span auto/span auto; } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-columns-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } - .xl\:bui-columns-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } - .xl\:bui-columns-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } - .xl\:bui-columns-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } - .xl\:bui-columns-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); } - .xl\:bui-columns-6 { grid-template-columns: repeat(6, minmax(0, 1fr)); } - .xl\:bui-columns-7 { grid-template-columns: repeat(7, minmax(0, 1fr)); } - .xl\:bui-columns-8 { grid-template-columns: repeat(8, minmax(0, 1fr)); } - .xl\:bui-columns-9 { grid-template-columns: repeat(9, minmax(0, 1fr)); } - .xl\:bui-columns-10 { grid-template-columns: repeat(10, minmax(0, 1fr)); } - .xl\:bui-columns-11 { grid-template-columns: repeat(11, minmax(0, 1fr)); } - .xl\:bui-columns-12 { grid-template-columns: repeat(12, minmax(0, 1fr)); } - .xl\:bui-columns-auto { grid-template-columns: repeat(auto-fit, minmax(0, 1fr)); } - .xl\:bui-col-span-1 { grid-column: span 1 / span 1; } - .xl\:bui-col-span-2 { grid-column: span 2 / span 2; } - .xl\:bui-col-span-3 { grid-column: span 3 / span 3; } - .xl\:bui-col-span-4 { grid-column: span 4 / span 4; } - .xl\:bui-col-span-5 { grid-column: span 5 / span 5; } - .xl\:bui-col-span-6 { grid-column: span 6 / span 6; } - .xl\:bui-col-span-7 { grid-column: span 7 / span 7; } - .xl\:bui-col-span-8 { grid-column: span 8 / span 8; } - .xl\:bui-col-span-9 { grid-column: span 9 / span 9; } - .xl\:bui-col-span-10 { grid-column: span 10 / span 10; } - .xl\:bui-col-span-11 { grid-column: span 11 / span 11; } - .xl\:bui-col-span-12 { grid-column: span 12 / span 12; } - .xl\:bui-col-span-auto { - grid-column: span auto / span auto; + grid-column: span auto/span auto; } - .xl\:bui-col-start-1 { grid-column-start: 1; } - .xl\:bui-col-start-2 { grid-column-start: 2; } - .xl\:bui-col-start-3 { grid-column-start: 3; } - .xl\:bui-col-start-4 { grid-column-start: 4; } - .xl\:bui-col-start-5 { grid-column-start: 5; } - .xl\:bui-col-start-6 { grid-column-start: 6; } - .xl\:bui-col-start-7 { grid-column-start: 7; } - .xl\:bui-col-start-8 { grid-column-start: 8; } - .xl\:bui-col-start-9 { grid-column-start: 9; } - .xl\:bui-col-start-10 { grid-column-start: 10; } - .xl\:bui-col-start-11 { grid-column-start: 11; } - .xl\:bui-col-start-12 { grid-column-start: 12; } - .xl\:bui-col-start-13 { grid-column-start: 13; } - .xl\:bui-col-start-auto { grid-column-start: auto; } - .xl\:bui-col-end-1 { grid-column-end: 1; } - .xl\:bui-col-end-2 { grid-column-end: 2; } - .xl\:bui-col-end-3 { grid-column-end: 3; } - .xl\:bui-col-end-4 { grid-column-end: 4; } - .xl\:bui-col-end-5 { grid-column-end: 5; } - .xl\:bui-col-end-6 { grid-column-end: 6; } - .xl\:bui-col-end-7 { grid-column-end: 7; } - .xl\:bui-col-end-8 { grid-column-end: 8; } - .xl\:bui-col-end-9 { grid-column-end: 9; } - .xl\:bui-col-end-10 { grid-column-end: 10; } - .xl\:bui-col-end-11 { grid-column-end: 11; } - .xl\:bui-col-end-12 { grid-column-end: 12; } - .xl\:bui-col-end-13 { grid-column-end: 13; } - .xl\:bui-col-end-auto { grid-column-end: auto; } - .xl\:bui-row-span-1 { grid-row: span 1 / span 1; } - .xl\:bui-row-span-2 { grid-row: span 2 / span 2; } - .xl\:bui-row-span-3 { grid-row: span 3 / span 3; } - .xl\:bui-row-span-4 { grid-row: span 4 / span 4; } - .xl\:bui-row-span-5 { grid-row: span 5 / span 5; } - .xl\:bui-row-span-6 { grid-row: span 6 / span 6; } - .xl\:bui-row-span-7 { grid-row: span 7 / span 7; } - .xl\:bui-row-span-8 { grid-row: span 8 / span 8; } - .xl\:bui-row-span-9 { grid-row: span 9 / span 9; } - .xl\:bui-row-span-10 { grid-row: span 10 / span 10; } - .xl\:bui-row-span-11 { grid-row: span 11 / span 11; } - .xl\:bui-row-span-12 { grid-row: span 12 / span 12; } - .xl\:bui-row-span-auto { - grid-row: span auto / span auto; + grid-row: span auto/span auto; } } - .bui-gap { gap: var(--gap); } - .bui-gap-0\.5 { gap: var(--bui-space-0_5); } - .bui-gap-1 { gap: var(--bui-space-1); } - .bui-gap-1\.5 { gap: var(--bui-space-1_5); } - .bui-gap-2 { gap: var(--bui-space-2); } - .bui-gap-3 { gap: var(--bui-space-3); } - .bui-gap-4 { gap: var(--bui-space-4); } - .bui-gap-5 { gap: var(--bui-space-5); } - .bui-gap-6 { gap: var(--bui-space-6); } - .bui-gap-7 { gap: var(--bui-space-7); } - .bui-gap-8 { gap: var(--bui-space-8); } - .bui-gap-9 { gap: var(--bui-space-9); } - .bui-gap-10 { gap: var(--bui-space-10); } - .bui-gap-11 { gap: var(--bui-space-11); } - .bui-gap-12 { gap: var(--bui-space-12); } - .bui-gap-13 { gap: var(--bui-space-13); } - .bui-gap-14 { gap: var(--bui-space-14); } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-gap { gap: var(--gap-xs); } - .xs\:bui-gap-0\.5 { gap: var(--bui-space-0_5); } - .xs\:bui-gap-1 { gap: var(--bui-space-1); } - .xs\:bui-gap-1\.5 { gap: var(--bui-space-1_5); } - .xs\:bui-gap-2 { gap: var(--bui-space-2); } - .xs\:bui-gap-3 { gap: var(--bui-space-3); } - .xs\:bui-gap-4 { gap: var(--bui-space-4); } - .xs\:bui-gap-5 { gap: var(--bui-space-5); } - .xs\:bui-gap-6 { gap: var(--bui-space-6); } - .xs\:bui-gap-7 { gap: var(--bui-space-7); } - .xs\:bui-gap-8 { gap: var(--bui-space-8); } - .xs\:bui-gap-9 { gap: var(--bui-space-9); } - .xs\:bui-gap-10 { gap: var(--bui-space-10); } - .xs\:bui-gap-11 { gap: var(--bui-space-11); } - .xs\:bui-gap-12 { gap: var(--bui-space-12); } - .xs\:bui-gap-13 { gap: var(--bui-space-13); } - .xs\:bui-gap-14 { gap: var(--bui-space-14); } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-gap { gap: var(--gap-sm); } - .sm\:bui-gap-0\.5 { gap: var(--bui-space-0_5); } - .sm\:bui-gap-1 { gap: var(--bui-space-1); } - .sm\:bui-gap-1\.5 { gap: var(--bui-space-1_5); } - .sm\:bui-gap-2 { gap: var(--bui-space-2); } - .sm\:bui-gap-3 { gap: var(--bui-space-3); } - .sm\:bui-gap-4 { gap: var(--bui-space-4); } - .sm\:bui-gap-5 { gap: var(--bui-space-5); } - .sm\:bui-gap-6 { gap: var(--bui-space-6); } - .sm\:bui-gap-7 { gap: var(--bui-space-7); } - .sm\:bui-gap-8 { gap: var(--bui-space-8); } - .sm\:bui-gap-9 { gap: var(--bui-space-9); } - .sm\:bui-gap-10 { gap: var(--bui-space-10); } - .sm\:bui-gap-11 { gap: var(--bui-space-11); } - .sm\:bui-gap-12 { gap: var(--bui-space-12); } - .sm\:bui-gap-13 { gap: var(--bui-space-13); } - .sm\:bui-gap-14 { gap: var(--bui-space-14); } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-gap { gap: var(--gap-md); } - .md\:bui-gap-0\.5 { gap: var(--bui-space-0_5); } - .md\:bui-gap-1 { gap: var(--bui-space-1); } - .md\:bui-gap-1\.5 { gap: var(--bui-space-1_5); } - .md\:bui-gap-2 { gap: var(--bui-space-2); } - .md\:bui-gap-3 { gap: var(--bui-space-3); } - .md\:bui-gap-4 { gap: var(--bui-space-4); } - .md\:bui-gap-5 { gap: var(--bui-space-5); } - .md\:bui-gap-6 { gap: var(--bui-space-6); } - .md\:bui-gap-7 { gap: var(--bui-space-7); } - .md\:bui-gap-8 { gap: var(--bui-space-8); } - .md\:bui-gap-9 { gap: var(--bui-space-9); } - .md\:bui-gap-10 { gap: var(--bui-space-10); } - .md\:bui-gap-11 { gap: var(--bui-space-11); } - .md\:bui-gap-12 { gap: var(--bui-space-12); } - .md\:bui-gap-13 { gap: var(--bui-space-13); } - .md\:bui-gap-14 { gap: var(--bui-space-14); } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-gap { gap: var(--gap-lg); } - .lg\:bui-gap-0\.5 { gap: var(--bui-space-0_5); } - .lg\:bui-gap-1 { gap: var(--bui-space-1); } - .lg\:bui-gap-1\.5 { gap: var(--bui-space-1_5); } - .lg\:bui-gap-2 { gap: var(--bui-space-2); } - .lg\:bui-gap-3 { gap: var(--bui-space-3); } - .lg\:bui-gap-4 { gap: var(--bui-space-4); } - .lg\:bui-gap-5 { gap: var(--bui-space-5); } - .lg\:bui-gap-6 { gap: var(--bui-space-6); } - .lg\:bui-gap-7 { gap: var(--bui-space-7); } - .lg\:bui-gap-8 { gap: var(--bui-space-8); } - .lg\:bui-gap-9 { gap: var(--bui-space-9); } - .lg\:bui-gap-10 { gap: var(--bui-space-10); } - .lg\:bui-gap-11 { gap: var(--bui-space-11); } - .lg\:bui-gap-12 { gap: var(--bui-space-12); } - .lg\:bui-gap-13 { gap: var(--bui-space-13); } - .lg\:bui-gap-14 { gap: var(--bui-space-14); } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-gap { gap: var(--gap-xl); } - .xl\:bui-gap-0\.5 { gap: var(--bui-space-0_5); } - .xl\:bui-gap-1 { gap: var(--bui-space-1); } - .xl\:bui-gap-1\.5 { gap: var(--bui-space-1_5); } - .xl\:bui-gap-2 { gap: var(--bui-space-2); } - .xl\:bui-gap-3 { gap: var(--bui-space-3); } - .xl\:bui-gap-4 { gap: var(--bui-space-4); } - .xl\:bui-gap-5 { gap: var(--bui-space-5); } - .xl\:bui-gap-6 { gap: var(--bui-space-6); } - .xl\:bui-gap-7 { gap: var(--bui-space-7); } - .xl\:bui-gap-8 { gap: var(--bui-space-8); } - .xl\:bui-gap-9 { gap: var(--bui-space-9); } - .xl\:bui-gap-10 { gap: var(--bui-space-10); } - .xl\:bui-gap-11 { gap: var(--bui-space-11); } - .xl\:bui-gap-12 { gap: var(--bui-space-12); } - .xl\:bui-gap-13 { gap: var(--bui-space-13); } - .xl\:bui-gap-14 { gap: var(--bui-space-14); } } - .bui-align-start { align-items: start; } - .bui-align-center { align-items: center; } - .bui-align-end { align-items: end; } - .bui-align-baseline { align-items: baseline; } - .bui-align-stretch { align-items: stretch; } - .bui-jc-start { justify-content: start; } - .bui-jc-center { justify-content: center; } - .bui-jc-end { justify-content: end; } - .bui-jc-between { justify-content: space-between; } - .bui-fd-row { flex-direction: row; } - .bui-fd-column { flex-direction: column; } - .bui-fd-row-reverse { flex-direction: row-reverse; } - .bui-fd-column-reverse { flex-direction: column-reverse; } - - @media (width >= 640px) { + @media (width>=640px) { .xs\:bui-align-start { align-items: start; } - .xs\:bui-align-center { align-items: center; } - .xs\:bui-align-end { align-items: end; } - .xs\:bui-align-stretch { align-items: stretch; } - .xs\:bui-jc-start { justify-content: start; } - .xs\:bui-jc-center { justify-content: center; } - .xs\:bui-jc-end { justify-content: end; } - .xs\:bui-jc-between { justify-content: space-between; } - .xs\:bui-fd-row { flex-direction: row; } - .xs\:bui-fd-column { flex-direction: column; } - .xs\:bui-fd-row-reverse { flex-direction: row-reverse; } - .xs\:bui-fd-column-reverse { flex-direction: column-reverse; } } - - @media (width >= 768px) { + @media (width>=768px) { .sm\:bui-align-start { align-items: start; } - .sm\:bui-align-center { align-items: center; } - .sm\:bui-align-end { align-items: end; } - .sm\:bui-align-stretch { align-items: stretch; } - .sm\:bui-jc-start { justify-content: start; } - .sm\:bui-jc-center { justify-content: center; } - .sm\:bui-jc-end { justify-content: end; } - .sm\:bui-jc-between { justify-content: space-between; } - .sm\:bui-fd-row { flex-direction: row; } - .sm\:bui-fd-column { flex-direction: column; } - .sm\:bui-fd-row-reverse { flex-direction: row-reverse; } - .sm\:bui-fd-column-reverse { flex-direction: column-reverse; } } - - @media (width >= 1024px) { + @media (width>=1024px) { .md\:bui-align-start { align-items: start; } - .md\:bui-align-center { align-items: center; } - .md\:bui-align-end { align-items: end; } - .md\:bui-align-stretch { align-items: stretch; } - .md\:bui-jc-start { justify-content: start; } - .md\:bui-jc-center { justify-content: center; } - .md\:bui-jc-end { justify-content: end; } - .md\:bui-jc-between { justify-content: space-between; } - .md\:bui-fd-row { flex-direction: row; } - .md\:bui-fd-column { flex-direction: column; } - .md\:bui-fd-row-reverse { flex-direction: row-reverse; } - .md\:bui-fd-column-reverse { flex-direction: column-reverse; } } - - @media (width >= 1280px) { + @media (width>=1280px) { .lg\:bui-align-start { align-items: start; } - .lg\:bui-align-center { align-items: center; } - .lg\:bui-align-end { align-items: end; } - .lg\:bui-align-stretch { align-items: stretch; } - .lg\:bui-jc-start { justify-content: start; } - .lg\:bui-jc-center { justify-content: center; } - .lg\:bui-jc-end { justify-content: end; } - .lg\:bui-jc-between { justify-content: space-between; } - .lg\:bui-fd-row { flex-direction: row; } - .lg\:bui-fd-column { flex-direction: column; } - .lg\:bui-fd-row-reverse { flex-direction: row-reverse; } - .lg\:bui-fd-column-reverse { flex-direction: column-reverse; } } - - @media (width >= 1536px) { + @media (width>=1536px) { .xl\:bui-align-start { align-items: start; } - .xl\:bui-align-center { align-items: center; } - .xl\:bui-align-end { align-items: end; } - .xl\:bui-align-stretch { align-items: stretch; } - .xl\:bui-jc-start { justify-content: start; } - .xl\:bui-jc-center { justify-content: center; } - .xl\:bui-jc-end { justify-content: end; } - .xl\:bui-jc-between { justify-content: space-between; } - .xl\:bui-fd-row { flex-direction: row; } - .xl\:bui-fd-column { flex-direction: column; } - .xl\:bui-fd-row-reverse { flex-direction: row-reverse; } - .xl\:bui-fd-column-reverse { flex-direction: column-reverse; } diff --git a/docs-ui/src/css/theme-spotify.css b/docs-ui/src/css/theme-spotify.css new file mode 100644 index 0000000000..64afbb6d75 --- /dev/null +++ b/docs-ui/src/css/theme-spotify.css @@ -0,0 +1,233 @@ +@font-face { + font-family: CircularSpTitle; + font-weight: 900; + font-display: swap; + unicode-range: U+0, U+D, U+20-7E, U+A0-17E, U+18F, U+192, U+1A0-1A1, U+1AF-1B0, + U+1B5-1B6, U+1C4-1C6, U+1F1-1F3, U+1FA-1FF, U+218-21B, U+237, U+259, + U+2BB-2BC, U+2C6-2C7, U+2C9, U+2D8-2DD, U+300-301, U+303, U+309, U+323, + U+394, U+3A9, U+3BC, U+3C0, U+1E80-1E85, U+1E8A-1E8B, U+1EA0-1EF9, U+1FD6, + U+2007-2008, U+200B, U+2010-2011, U+2013-2014, U+2018-201A, U+201C-201E, + U+2020-2022, U+2026, U+2030, U+2032-2033, U+2039-203A, U+2042, U+2044, + U+2051, U+2070, U+2074-2079, U+2080-2089, U+20AB-20AC, U+2113, U+2117, + U+2122, U+2126, U+2160-2169, U+216C-216F, U+2190-2193, U+2196-2199, U+21A9, + U+21B0-21B5, U+21C6, U+2202, U+2206, U+220F, U+2211-2212, U+2215, + U+2219-221A, U+221E, U+222B, U+2248, U+2260, U+2264-2265, U+22C5, U+24C5, + U+25A0-25A1, U+25AF, U+25B2-25B3, U+25CA-25CB, U+25CF, U+262E, U+2713, + U+2715, U+2780-2788, U+E000, U+E002, U+F6C3, U+FB00-FB04, U+FEFF, U+FF0C, + U+FF0E, U+FF1A-FF1B, U+FFFF; + src: url(https://encore.scdn.co/fonts/CircularSpTitle-Black-4588c99025b967475c31695b0743dd1a.woff2) + format('woff2'), + url(https://encore.scdn.co/fonts/CircularSpTitle-Black-506746f387a26f25aa3d023b3e501d34.woff) + format('woff'); +} +@font-face { + font-family: CircularSpTitle; + font-weight: 700; + font-display: swap; + unicode-range: U+0, U+D, U+20-7E, U+A0-17E, U+18F, U+192, U+1A0-1A1, U+1AF-1B0, + U+1B5-1B6, U+1C4-1C6, U+1F1-1F3, U+1FA-1FF, U+218-21B, U+237, U+259, + U+2BB-2BC, U+2C6-2C7, U+2C9, U+2D8-2DD, U+300-301, U+303, U+309, U+323, + U+394, U+3A9, U+3BC, U+3C0, U+1E80-1E85, U+1E8A-1E8B, U+1EA0-1EF9, U+1FD6, + U+2007-2008, U+200B, U+2010-2011, U+2013-2014, U+2018-201A, U+201C-201E, + U+2020-2022, U+2026, U+2030, U+2032-2033, U+2039-203A, U+2042, U+2044, + U+2051, U+2070, U+2074-2079, U+2080-2089, U+20AB-20AC, U+2113, U+2117, + U+2122, U+2126, U+2160-2169, U+216C-216F, U+2190-2193, U+2196-2199, U+21A9, + U+21B0-21B5, U+21C6, U+2202, U+2206, U+220F, U+2211-2212, U+2215, + U+2219-221A, U+221E, U+222B, U+2248, U+2260, U+2264-2265, U+22C5, U+24C5, + U+25A0-25A1, U+25AF, U+25B2-25B3, U+25CA-25CB, U+25CF, U+262E, U+2713, + U+2715, U+2780-2788, U+E000, U+E002, U+F6C3, U+FB00-FB04, U+FEFF, U+FF0C, + U+FF0E, U+FF1A-FF1B, U+FFFF; + src: url(https://encore.scdn.co/fonts/CircularSpTitle-Bold-b2586b06a2e1522e9d879d84c2792a58.woff2) + format('woff2'), + url(https://encore.scdn.co/fonts/CircularSpTitle-Bold-1624fb2df28c20d7203d7fb86ce8b481.woff) + format('woff'); +} +@font-face { + font-family: CircularSp; + font-weight: 700; + font-display: swap; + unicode-range: U+0, U+D, U+20-7E, U+A0-17E, U+18F, U+192, U+1A0-1A1, U+1AF-1B0, + U+1B5-1B6, U+1C4-1C6, U+1F1-1F3, U+1FA-1FF, U+218-21B, U+237, U+259, + U+2BB-2BC, U+2C6-2C7, U+2C9, U+2D8-2DD, U+300-301, U+303, U+309, U+323, + U+394, U+3A9, U+3BC, U+3C0, U+1E80-1E85, U+1E8A-1E8B, U+1EA0-1EF9, U+1FD6, + U+2007-2008, U+200B, U+2010-2011, U+2013-2014, U+2018-201A, U+201C-201E, + U+2020-2022, U+2026, U+2030, U+2032-2033, U+2039-203A, U+2042, U+2044, + U+2051, U+2070, U+2074-2079, U+2080-2089, U+20AB-20AC, U+2113, U+2117, + U+2122, U+2126, U+2160-2169, U+216C-216F, U+2190-2193, U+2196-2199, U+21A9, + U+21B0-21B5, U+21C6, U+2202, U+2206, U+220F, U+2211-2212, U+2215, + U+2219-221A, U+221E, U+222B, U+2248, U+2260, U+2264-2265, U+22C5, U+24C5, + U+25A0-25A1, U+25AF, U+25B2-25B3, U+25CA-25CB, U+25CF, U+262E, U+2713, + U+2715, U+2780-2788, U+E000, U+E002, U+F6C3, U+FB00-FB04, U+FEFF, U+FF0C, + U+FF0E, U+FF1A-FF1B, U+FFFF; + src: url(https://encore.scdn.co/fonts/CircularSp-Bold-602e7aefc706aa36c6ec1324b9bbc461.woff2) + format('woff2'), + url(https://encore.scdn.co/fonts/CircularSp-Bold-856afe2da4ba4e61239b129e2c16d633.woff) + format('woff'); +} +@font-face { + font-family: CircularSp; + font-weight: 400; + font-display: swap; + unicode-range: U+0, U+D, U+20-7E, U+A0-17E, U+18F, U+192, U+1A0-1A1, U+1AF-1B0, + U+1B5-1B6, U+1C4-1C6, U+1F1-1F3, U+1FA-1FF, U+218-21B, U+237, U+259, + U+2BB-2BC, U+2C6-2C7, U+2C9, U+2D8-2DD, U+300-301, U+303, U+309, U+323, + U+394, U+3A9, U+3BC, U+3C0, U+1E80-1E85, U+1E8A-1E8B, U+1EA0-1EF9, U+1FD6, + U+2007-2008, U+200B, U+2010-2011, U+2013-2014, U+2018-201A, U+201C-201E, + U+2020-2022, U+2026, U+2030, U+2032-2033, U+2039-203A, U+2042, U+2044, + U+2051, U+2070, U+2074-2079, U+2080-2089, U+20AB-20AC, U+2113, U+2117, + U+2122, U+2126, U+2160-2169, U+216C-216F, U+2190-2193, U+2196-2199, U+21A9, + U+21B0-21B5, U+21C6, U+2202, U+2206, U+220F, U+2211-2212, U+2215, + U+2219-221A, U+221E, U+222B, U+2248, U+2260, U+2264-2265, U+22C5, U+24C5, + U+25A0-25A1, U+25AF, U+25B2-25B3, U+25CA-25CB, U+25CF, U+262E, U+2713, + U+2715, U+2780-2788, U+E000, U+E002, U+F6C3, U+FB00-FB04, U+FEFF, U+FF0C, + U+FF0E, U+FF1A-FF1B, U+FFFF; + src: url(https://encore.scdn.co/fonts/CircularSp-Book-a00e99ef9996a3a157fb6b746856d04f.woff2) + format('woff2'), + url(https://encore.scdn.co/fonts/CircularSp-Book-3f73da7d35bd81c706bce7bbb84964de.woff) + format('woff'); +} +@font-face { + font-family: CircularSp; + font-weight: 700; + font-display: swap; + unicode-range: U+0, U+D, U+20-7E, U+A0-17E, U+18F, U+192, U+1A0-1A1, U+1AF-1B0, + U+1B5-1B6, U+1C4-1C6, U+1F1-1F3, U+1FA-1FF, U+218-21B, U+237, U+259, + U+2BB-2BC, U+2C6-2C7, U+2C9, U+2D8-2DD, U+300-301, U+303, U+309, U+323, + U+394, U+3A9, U+3BC, U+3C0, U+1E80-1E85, U+1E8A-1E8B, U+1EA0-1EF9, U+1FD6, + U+2007-2008, U+200B, U+2010-2011, U+2013-2014, U+2018-201A, U+201C-201E, + U+2020-2022, U+2026, U+2030, U+2032-2033, U+2039-203A, U+2042, U+2044, + U+2051, U+2070, U+2074-2079, U+2080-2089, U+20AB-20AC, U+2113, U+2117, + U+2122, U+2126, U+2160-2169, U+216C-216F, U+2190-2193, U+2196-2199, U+21A9, + U+21B0-21B5, U+21C6, U+2202, U+2206, U+220F, U+2211-2212, U+2215, + U+2219-221A, U+221E, U+222B, U+2248, U+2260, U+2264-2265, U+22C5, U+24C5, + U+25A0-25A1, U+25AF, U+25B2-25B3, U+25CA-25CB, U+25CF, U+262E, U+2713, + U+2715, U+2780-2788, U+E000, U+E002, U+F6C3, U+FB00-FB04, U+FEFF, U+FF0C, + U+FF0E, U+FF1A-FF1B, U+FFFF; + src: url(https://encore.scdn.co/fonts/CircularSp-Bold-602e7aefc706aa36c6ec1324b9bbc461.woff2) + format('woff2'), + url(https://encore.scdn.co/fonts/CircularSp-Bold-856afe2da4ba4e61239b129e2c16d633.woff) + format('woff'); +} +[data-theme-name='spotify'] { + --bui-font-text: CircularSp, CircularSp-Arab, CircularSp-Hebr, CircularSp-Cyrl, + CircularSp-Grek, CircularSp-Deva; + --bui-font-title: CircularSpTitle, CircularSp-Arab, CircularSp-Hebr, + CircularSp-Cyrl, CircularSp-Grek, CircularSp-Deva; + --bui-font-regular: CircularSp, CircularSp-Arab, CircularSp-Hebr, + CircularSp-Cyrl, CircularSp-Grek, CircularSp-Deva; + & .bui-Button { + border-radius: var(--bui-radius-3); + padding-inline: var(--bui-space-3); + } + & .bui-ButtonIcon { + padding: 0; + } + & .bui-MenuPopup { + box-sizing: border-box; + max-width: 21.25rem; + } + & .bui-MenuSubmenuTrigger, + & .bui-MenuItem { + height: auto; + min-height: 2rem; + } + & .bui-Text { + font-family: var(--bui-font-text); + } + & .bui-Heading { + font-family: var(--bui-font-title); + } + & .bui-TableRow { + border-radius: var(--bui-radius-4); + border: none; + } + & .bui-TableRow:hover td:first-child { + border-top-left-radius: var(--bui-radius-2); + border-bottom-left-radius: var(--bui-radius-2); + } + & .bui-TableRow:hover td:last-child { + border-top-right-radius: var(--bui-radius-2); + border-bottom-right-radius: var(--bui-radius-2); + } + & .bui-TableBody:before, + & .bui-TableBody:after { + line-height: var(--bui-space-1); + content: '‌'; + display: block; + } + & .bui-TableHeader .bui-TableRow { + border-bottom: 1px solid var(--bui-border-2); + } + & .bui-TableHead { + font-size: var(--bui-font-size-2); + color: var(--bui-fg-secondary); + font-weight: var(--bui-font-weight-regular); + } + & .bui-HeaderToolbar { + padding-top: var(--bui-space-2); + padding-inline: var(--bui-space-2); + } + & .bui-HeaderToolbarWrapper { + border-radius: var(--bui-radius-3); + padding-inline: var(--bui-space-3); + border: none; + } + & .bui-HeaderToolbarControls { + right: calc(var(--bui-space-3) - 1px); + } + & .bui-HeaderTabsWrapper { + margin-top: var(--bui-space-2); + margin-inline: var(--bui-space-2); + border-radius: var(--bui-radius-3); + padding-inline: var(--bui-space-1); + border: none; + } + & .bui-Input { + border-radius: var(--bui-radius-3); + } + & .bui-Tag { + border-radius: var(--bui-radius-full); + } +} +[data-theme-mode='light'][data-theme-name='spotify'] { + --bui-bg-solid: #1ed760; + --bui-bg-solid-hover: #3be477; + --bui-bg-solid-pressed: #1abc54; + --bui-bg-solid-disabled: #0f6c30; + --bui-fg-primary: var(--bui-black); + --bui-fg-secondary: #757575; + --bui-fg-solid: var(--bui-black); + --bui-fg-solid-disabled: #62ab7c; + --bui-border-2: #d9d9d9; + --bui-border-danger: #f87a7a; + --bui-border-warning: #e36d05; + --bui-border-success: #53db83; + --bui-ring: #0003; + & .bui-HeaderToolbarWrapper, + & .bui-HeaderTabsWrapper { + border: 1px solid var(--bui-border-2); + } +} +[data-theme-mode='dark'][data-theme-name='spotify'] { + --bui-bg-app: var(--bui-black); + --bui-bg-solid: #1ed760; + --bui-bg-solid-hover: #3be477; + --bui-bg-solid-pressed: #1abc54; + --bui-bg-solid-disabled: #0f6c30; + --bui-bg-danger: #3b1219; + --bui-bg-warning: #302008; + --bui-bg-success: #132d21; + --bui-fg-primary: var(--bui-white); + --bui-fg-secondary: #9e9e9e; + --bui-fg-disabled: #575757; + --bui-fg-solid: var(--bui-black); + --bui-fg-solid-disabled: #072f15; + --bui-fg-danger: #e22b2b; + --bui-fg-warning: #e36d05; + --bui-fg-success: #1db954; + --bui-border-2: #373737; + --bui-border-danger: #f87a7a; + --bui-border-warning: #e36d05; + --bui-border-success: #53db83; + --bui-ring: #fff3; +} diff --git a/docs-ui/src/mdx-components.tsx b/docs-ui/src/mdx-components.tsx index bae798bf7c..75959f2e47 100644 --- a/docs-ui/src/mdx-components.tsx +++ b/docs-ui/src/mdx-components.tsx @@ -81,7 +81,7 @@ export const formattedMDXComponents: MDXComponents = { backgroundColor: 'var(--bg)', padding: '0.2rem 0.375rem', borderRadius: '0.25rem', - color: 'var(--secondary)', + color: 'var(--primary)', border: '1px solid var(--border)', fontSize: '0.875rem', }} @@ -97,6 +97,11 @@ export const formattedMDXComponents: MDXComponents = { {...(rest as Omit)} /> ), + table: ({ children }) => ( + {children as ReactNode}
    + ), + th: ({ children }) => {children as ReactNode}, + td: ({ children }) => {children as ReactNode}, }; export function useMDXComponents(components: MDXComponents): MDXComponents { diff --git a/docs-ui/src/snippets/code-snippets.ts b/docs-ui/src/snippets/code-snippets.ts index 1a22a24340..30d036461f 100644 --- a/docs-ui/src/snippets/code-snippets.ts +++ b/docs-ui/src/snippets/code-snippets.ts @@ -4,8 +4,8 @@ export const customTheme = `:root { --bui-font-regular: system-ui; --bui-font-weight-regular: 400; --bui-font-weight-bold: 600; - --bui-bg: #f8f8f8; - --bui-bg-surface-1: #fff; + --bui-bg-app: #f8f8f8; + --bui-bg-neutral-1: #fff; /* ... other CSS variables */ /* Add your custom components styles here */ @@ -19,8 +19,8 @@ export const customTheme = `:root { --bui-font-regular: system-ui; --bui-font-weight-regular: 400; --bui-font-weight-bold: 600; - --bui-bg: #f8f8f8; - --bui-bg-surface-1: #fff; + --bui-bg-app: #f8f8f8; + --bui-bg-neutral-1: #fff; /* ... other CSS variables */ /* Add your custom components styles here */ diff --git a/docs-ui/src/snippets/stories-snippets.tsx b/docs-ui/src/snippets/stories-snippets.tsx deleted file mode 100644 index 0cb6119ce6..0000000000 --- a/docs-ui/src/snippets/stories-snippets.tsx +++ /dev/null @@ -1,80 +0,0 @@ -'use client'; - -import { composeStories } from '@storybook/react'; -import * as BoxStories from '../../../packages/ui/src/components/Box/Box.stories'; -import * as ButtonStories from '../../../packages/ui/src/components/Button/Button.stories'; -import * as ButtonIconStories from '../../../packages/ui/src/components/ButtonIcon/ButtonIcon.stories'; -import * as ButtonLinkStories from '../../../packages/ui/src/components/ButtonLink/ButtonLink.stories'; -import * as CheckboxStories from '../../../packages/ui/src/components/Checkbox/Checkbox.stories'; -import * as ContainerStories from '../../../packages/ui/src/components/Container/Container.stories'; -import * as GridStories from '../../../packages/ui/src/components/Grid/Grid.stories'; -import * as TextFieldStories from '../../../packages/ui/src/components/TextField/TextField.stories'; -import * as TextStories from '../../../packages/ui/src/components/Text/Text.stories'; -import * as FlexStories from '../../../packages/ui/src/components/Flex/Flex.stories'; -import * as SelectStories from '../../../packages/ui/src/components/Select/Select.stories'; -import * as MenuStories from '../../../packages/ui/src/components/Menu/Menu.stories'; -import * as LinkStories from '../../../packages/ui/src/components/Link/Link.stories'; -import * as AvatarStories from '../../../packages/ui/src/components/Avatar/Avatar.stories'; -import * as AccordionStories from '../../../packages/ui/src/components/Accordion/Accordion.stories'; -import * as DialogStories from '../../../packages/ui/src/components/Dialog/Dialog.stories'; -import * as RadioGroupStories from '../../../packages/ui/src/components/RadioGroup/RadioGroup.stories'; -import * as TabsStories from '../../../packages/ui/src/components/Tabs/Tabs.stories'; -import * as SwitchStories from '../../../packages/ui/src/components/Switch/Switch.stories'; -import * as SearchFieldStories from '../../../packages/ui/src/components/SearchField/SearchField.stories'; -import * as TooltipStories from '../../../packages/ui/src/components/Tooltip/Tooltip.stories'; -import * as SkeletonStories from '../../../packages/ui/src/components/Skeleton/Skeleton.stories'; -import * as CardStories from '../../../packages/ui/src/components/Card/Card.stories'; -import * as HeaderStories from '../../../packages/ui/src/components/Header/Header.stories'; -import * as HeaderPageStories from '../../../packages/ui/src/components/HeaderPage/HeaderPage.stories'; -import * as TableStories from '../../../packages/ui/src/components/Table/Table.stories'; -import * as TagGroupStories from '../../../packages/ui/src/components/TagGroup/TagGroup.stories'; -import * as PasswordFieldStories from '../../../packages/ui/src/components/PasswordField/PasswordField.stories'; -import * as VisuallyHiddenStories from '../../../packages/ui/src/components/VisuallyHidden/VisuallyHidden.stories'; - -// Helper function to create snippet components -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const createSnippetComponent = (stories: any) => { - return function SnippetComponent({ story }: { story: string }) { - const composedStories = composeStories(stories); - const StoryComponent = composedStories[ - story as keyof typeof composedStories - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ] as any; - - return StoryComponent ? : null; - }; -}; - -// Create snippet components using the helper function -export const BoxSnippet = createSnippetComponent(BoxStories); -export const ButtonSnippet = createSnippetComponent(ButtonStories); -export const ButtonIconSnippet = createSnippetComponent(ButtonIconStories); -export const ButtonLinkSnippet = createSnippetComponent(ButtonLinkStories); -export const CheckboxSnippet = createSnippetComponent(CheckboxStories); -export const ContainerSnippet = createSnippetComponent(ContainerStories); -export const GridSnippet = createSnippetComponent(GridStories); -export const TextFieldSnippet = createSnippetComponent(TextFieldStories); -export const PasswordFieldSnippet = - createSnippetComponent(PasswordFieldStories); -export const TextSnippet = createSnippetComponent(TextStories); -export const FlexSnippet = createSnippetComponent(FlexStories); -export const SelectSnippet = createSnippetComponent(SelectStories); -export const MenuSnippet = createSnippetComponent(MenuStories); -export const LinkSnippet = createSnippetComponent(LinkStories); -export const AvatarSnippet = createSnippetComponent(AvatarStories); -export const AccordionSnippet = createSnippetComponent(AccordionStories); -export const DialogSnippet = createSnippetComponent(DialogStories); -export const RadioGroupSnippet = createSnippetComponent(RadioGroupStories); -export const TabsSnippet = createSnippetComponent(TabsStories); -export const SwitchSnippet = createSnippetComponent(SwitchStories); -export const SearchFieldSnippet = createSnippetComponent(SearchFieldStories); -export const TooltipSnippet = createSnippetComponent(TooltipStories); -export const SkeletonSnippet = createSnippetComponent(SkeletonStories); -export const CardSnippet = createSnippetComponent(CardStories); -export const HeaderSnippet = createSnippetComponent(HeaderStories); -export const HeaderPageSnippet = createSnippetComponent(HeaderPageStories); -export const TableSnippet = createSnippetComponent(TableStories); -export const TagGroupSnippet = createSnippetComponent(TagGroupStories); -export const VisuallyHiddenSnippet = createSnippetComponent( - VisuallyHiddenStories, -); diff --git a/docs-ui/src/utils/changelog.ts b/docs-ui/src/utils/changelog.ts index 0c3286d051..a99c0e8335 100644 --- a/docs-ui/src/utils/changelog.ts +++ b/docs-ui/src/utils/changelog.ts @@ -1,4 +1,7 @@ export * from './types'; +import { changelog_0_11_0 } from './changelogs/v0.11.0'; +import { changelog_0_10_0 } from './changelogs/v0.10.0'; +import { changelog_0_9_1 } from './changelogs/v0.9.1'; import { changelog_0_9_0 } from './changelogs/v0.9.0'; import { changelog_0_8_2 } from './changelogs/v0.8.2'; import { changelog_0_8_0 } from './changelogs/v0.8.0'; @@ -15,6 +18,9 @@ import { changelog_0_2_0 } from './changelogs/v0.2.0'; import { changelog_0_1_0 } from './changelogs/v0.1.0'; export const changelog = [ + ...changelog_0_11_0, + ...changelog_0_10_0, + ...changelog_0_9_1, ...changelog_0_9_0, ...changelog_0_8_2, ...changelog_0_8_0, diff --git a/docs-ui/src/utils/changelogs/v0.1.0.ts b/docs-ui/src/utils/changelogs/v0.1.0.ts index cf333e92e9..046bb24136 100644 --- a/docs-ui/src/utils/changelogs/v0.1.0.ts +++ b/docs-ui/src/utils/changelogs/v0.1.0.ts @@ -4,113 +4,57 @@ export const changelog_0_1_0: ChangelogProps[] = [ { components: [], version: '0.1.0', - description: `**BREAKING**: Merged the Stack and Inline component into a single component called Flex.`, prs: ['28634'], - type: 'breaking', + description: `**BREAKING**: Merged the Stack and Inline component into a single component called Flex.`, + breaking: true, commitSha: '72c9800', }, { components: [], version: '0.1.0', - description: `This is the first alpha release for Canon. As part of this release we are introducing 5 layout components and 7 components. All theming is done through CSS variables.`, prs: ['28562'], - type: 'breaking', + description: `**BREAKING**: This is the first alpha release for Canon. As part of this release we are introducing 5 layout components and 7 components. All theming is done through CSS variables.`, + breaking: true, commitSha: '65f4acc', }, { components: [], version: '0.1.0', - description: `**BREAKING**: Fixing css structure and making sure that props are applying the correct styles for all responsive values.`, prs: ['28630'], - type: 'breaking', + description: `**BREAKING**: Fixing css structure and making sure that props are applying the correct styles for all responsive values.`, + breaking: true, commitSha: '1e4ccce', }, { components: [], version: '0.1.0', - description: `Updated core CSS tokens and fixing the Button component accordingly.`, prs: ['28789'], - type: 'breaking', + description: `**BREAKING**: Updated core CSS tokens and fixing the Button component accordingly.`, + breaking: true, commitSha: '8309bdb', }, { components: [], version: '0.1.0', - description: `Removed client directive as they are not needed in React 18.`, prs: ['28626'], - type: 'fix', + description: `Removed client directive as they are not needed in React 18.`, + commitSha: '989af25', }, { components: [], version: '0.1.0', - description: `Fix spacing props not being applied for custom values.`, prs: ['28770'], - type: 'fix', + description: `Fix spacing props not being applied for custom values.`, + commitSha: 'f44e5cf', }, { components: [], version: '0.1.0', - description: `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.`, prs: ['28579'], - type: 'fix', - commitSha: '58ec9e7', - }, - { - components: [], - version: '0.1.0', - description: `Updated core CSS tokens and fixing the Button component accordingly.`, - prs: ['28789'], - type: 'breaking', - commitSha: '8309bdb', - }, - { - components: [], - version: '0.1.0', - description: `Fix spacing props not being applied for custom values.`, - prs: ['28770'], - type: 'fix', - commitSha: 'f44e5cf', - }, - { - components: [], - version: '0.1.0', - description: `**BREAKING**: Merged the Stack and Inline component into a single component called Flex.`, - prs: ['28634'], - type: 'breaking', - commitSha: '72c9800', - }, - { - components: [], - version: '0.1.0', - description: `**BREAKING**: Fixing css structure and making sure that props are applying the correct styles for all responsive values.`, - prs: ['28630'], - type: 'breaking', - commitSha: '1e4ccce', - }, - { - components: [], - version: '0.1.0', - description: `Removed client directive as they are not needed in React 18.`, - prs: ['28626'], - type: 'fix', - commitSha: '989af25', - }, - { - components: [], - version: '0.1.0', description: `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.`, - prs: ['28579'], - type: 'fix', + commitSha: '58ec9e7', }, - { - components: [], - version: '0.1.0', - description: `This is the first alpha release for Canon. As part of this release we are introducing 5 layout components and 7 components. All theming is done through CSS variables.`, - prs: ['28562'], - type: 'breaking', - commitSha: '65f4acc', - }, ]; diff --git a/docs-ui/src/utils/changelogs/v0.10.0.ts b/docs-ui/src/utils/changelogs/v0.10.0.ts new file mode 100644 index 0000000000..6b6eb87563 --- /dev/null +++ b/docs-ui/src/utils/changelogs/v0.10.0.ts @@ -0,0 +1,89 @@ +import type { ChangelogProps } from '../types'; + +export const changelog_0_10_0: ChangelogProps[] = [ + { + components: [], + version: '0.10.0', + prs: ['31917'], + description: `**BREAKING**: The \`Cell\` component has been refactored to be a generic wrapper component that accepts \`children\` for custom cell content. The text-specific functionality (previously part of \`Cell\`) has been moved to a new \`CellText\` component.`, + migration: `If you were using \`Cell\` with text-specific props (\`title\`, \`description\`, \`leadingIcon\`, \`href\`), you need to update your code to use \`CellText\` instead: + +**Before:** + +\`\`\`tsx +} + href="/path" +/> +\`\`\` + +**After:** + +\`\`\`tsx +} + href="/path" +/> +\`\`\` + +For custom cell content, use the new generic \`Cell\` component: + +\`\`\`tsx +{/* Your custom content */} +\`\`\``, + breaking: true, + commitSha: '16543fa', + }, + { + components: ['checkbox'], + version: '0.10.0', + prs: ['31904'], + description: `Fixed Checkbox indicator showing checkmark color when unchecked.`, + + commitSha: '50b7927', + }, + { + components: ['button-icon'], + version: '0.10.0', + prs: ['31900'], + description: `Fixed \`ButtonIcon\` incorrectly applying \`className\` to inner elements instead of only the root element.`, + + commitSha: '5bacf55', + }, + { + components: [], + version: '0.10.0', + prs: ['31843'], + description: `Fixed Table Row component to correctly handle cases where no \`href\` is provided, preventing unnecessary router provider wrapping and fixing the cursor incorrectly showing as a pointer despite the element not being a link.`, + + commitSha: 'b3ad928', + }, + { + components: ['table'], + version: '0.10.0', + prs: ['31907'], + description: `Added row selection support with visual state styling for hover, selected, and pressed states. Fixed checkbox rendering to only show for multi-select toggle mode.`, + + commitSha: 'a20d317', + }, + { + components: [], + version: '0.10.0', + prs: ['31817'], + description: `Fixed \`useTable\` hook to prioritize \`providedRowCount\` over data length for accurate row count in server-side pagination scenarios.`, + + commitSha: 'fe7c751', + }, + { + components: [], + version: '0.10.0', + prs: ['31844'], + description: `Fixed Table column sorting indicator to show up arrow when no sort is active, correctly indicating that clicking will sort ascending.`, + + commitSha: 'c145031', + }, +]; diff --git a/docs-ui/src/utils/changelogs/v0.11.0.ts b/docs-ui/src/utils/changelogs/v0.11.0.ts new file mode 100644 index 0000000000..a7dd7ab1ca --- /dev/null +++ b/docs-ui/src/utils/changelogs/v0.11.0.ts @@ -0,0 +1,196 @@ +import type { ChangelogProps } from '../types'; + +export const changelog_0_11_0: ChangelogProps[] = [ + { + components: ['table'], + version: '0.11.0', + prs: ['32050'], + description: `**BREAKING**: Redesigned Table component with new \`useTable\` hook API. + + - The \`Table\` component (React Aria wrapper) is renamed to \`TableRoot\` + - New high-level \`Table\` component that handles data display, pagination, sorting, and selection + - The \`useTable\` hook is completely redesigned with a new API supporting three pagination modes (complete, offset, cursor) + - New types: \`ColumnConfig\`, \`TableProps\`, \`TableItem\`, \`UseTableOptions\`, \`UseTableResult\` + + New features include unified pagination modes, debounced query changes, stale data preservation during reloads, and row selection with toggle/replace behaviors.`, + migration: `1. Update imports and use the new \`useTable\` hook: + +\`\`\`diff +-import { Table, useTable } from '@backstage/ui'; +-const { data, paginationProps } = useTable({ data: items, pagination: {...} }); ++import { Table, useTable, type ColumnConfig } from '@backstage/ui'; ++const { tableProps } = useTable({ ++ mode: 'complete', ++ getData: () => items, ++}); +\`\`\` + +2. Define columns and render with the new Table API: + +\`\`\`diff +- +- ... +- ... +-
    +- ++const columns: ColumnConfig[] = [ ++ { id: 'name', label: 'Name', isRowHeader: true, cell: item => }, ++ { id: 'type', label: 'Type', cell: item => }, ++]; ++ ++ +\`\`\``, + breaking: true, + commitSha: '243e5e7', + }, + { + components: [], + version: '0.11.0', + prs: ['32202'], + description: `**BREAKING**: Updating color tokens to match the new neutral style on different surfaces.`, + migration: `There's no direct replacement for the old tint tokens but you can use the new neutral set of color tokens on surface 0 or 1 as a replacement. + +- \`--bui-bg-tint\` can be replaced by \`--bui-bg-neutral-on-surface-0\` +- \`--bui-bg-tint-hover\` can be replaced by \`--bui-bg-neutral-on-surface-0-hover\` +- \`--bui-bg-tint-pressed\` can be replaced by \`--bui-bg-neutral-on-surface-0-pressed\` +- \`--bui-bg-tint-disabled\` can be replaced by \`--bui-bg-neutral-on-surface-0-disabled\``, + breaking: true, + commitSha: '95246eb', + }, + { + components: [], + version: '0.11.0', + prs: ['32232'], + description: `**BREAKING**: Introduce new \`ToggleButton\` & \`ToggleButtonGroup\` components in Backstage UI`, + breaking: true, + commitSha: 'ea0c6d8', + }, + { + components: [], + version: '0.11.0', + prs: ['32200'], + description: `**BREAKING**: Renamed CSS variable \`--bui-bg\` to \`--bui-bg-surface-0\` for consistency.`, + breaking: true, + commitSha: '4ea1d15', + }, + { + components: ['box'], + version: '0.11.0', + prs: ['32203'], + description: `Fixes app background color on dark mode.`, + + commitSha: '1880402', + }, + { + components: ['checkbox'], + version: '0.11.0', + prs: ['32371'], + description: `Added indeterminate state support to the Checkbox component for handling partial selection scenarios like table header checkboxes.`, + + commitSha: 'd2fdded', + }, + { + components: ['select'], + version: '0.11.0', + prs: ['32337'], + description: `Added missing \`aria-label\` attributes to \`SearchField\` components in \`Select\`, \`MenuAutocomplete\`, and \`MenuAutocompleteListbox\` to fix accessibility warnings.`, + + commitSha: '4fb15d2', + }, + { + components: ['button'], + version: '0.11.0', + prs: ['32297'], + description: `Fixes disabled state in primary and secondary buttons in Backstage UI.`, + + commitSha: '21c87cc', + }, + { + components: [], + version: '0.11.0', + prs: ['32185'], + description: `build(deps-dev): bump \`storybook\` from 10.1.9 to 10.1.10`, + + commitSha: '9c76682', + }, + { + components: ['button'], + version: '0.11.0', + prs: ['32385'], + description: `Fixed disabled tertiary buttons incorrectly showing hover effects on surfaces.`, + + commitSha: 'de80336', + }, + { + components: [], + version: '0.11.0', + prs: ['32313'], + description: `Added new Popover component for Backstage UI with automatic overflow handling, and full placement support. Also introduced \`--bui-shadow\` token for consistent elevation styling across overlay components (Popover, Tooltip, Menu).`, + + commitSha: '133d5c6', + }, + { + components: ['table'], + version: '0.11.0', + prs: ['32350'], + description: `Fixed Table sorting indicator not being visible when a column is actively sorted.`, + + commitSha: '973c839', + }, + { + components: ['menu'], + version: '0.11.0', + prs: ['32347'], + description: `Fixed Menu component trigger button not toggling correctly. Removed custom click-outside handler that was interfering with React Aria's built-in state management, allowing the menu to properly open and close when clicking the trigger button.`, + + commitSha: 'df40cfc', + }, + { + components: ['table'], + version: '0.11.0', + prs: ['32336'], + description: `Added support for column width configuration in Table component. Columns now accept \`width\`, \`defaultWidth\`, \`minWidth\`, and \`maxWidth\` props for responsive layout control.`, + + commitSha: 'b01ab96', + }, + { + components: ['searchfield'], + version: '0.11.0', + prs: ['32123'], + description: `Fixed SearchField \`startCollapsed\` prop not working correctly in Backstage UI. The field now properly starts in a collapsed state, expands when clicked and focused, and collapses back when unfocused with no input. Also fixed CSS logic to work correctly in all layout contexts (flex row, flex column, and regular containers).`, + + commitSha: 'b4a4911', + }, + { + components: [], + version: '0.11.0', + prs: ['32265'], + description: `Fixed \`Link\` component causing hard page refreshes for internal routes. The component now properly uses React Router's navigation instead of full page reloads.`, + + commitSha: 'b3253b6', + }, + { + components: ['table'], + version: '0.11.0', + prs: ['32321'], + description: `Added support for custom pagination options in \`useTable\` hook and \`Table\` component. You can now configure \`pageSizeOptions\` to customize the page size dropdown, and hook into pagination events via \`onPageSizeChange\`, \`onNextPage\`, and \`onPreviousPage\` callbacks. When \`pageSize\` doesn't match any option, the first option is used and a warning is logged.`, + + commitSha: 'fe7fe69', + }, + { + components: ['table'], + version: '0.11.0', + prs: ['32369'], + description: `Fixed missing border styles on table selection cells in multi-select mode.`, + + commitSha: 'cfac8a4', + }, + { + components: ['table'], + version: '0.11.0', + prs: ['32342'], + description: `Added \`className\` and \`style\` props to the \`Table\` component.`, + + commitSha: '2532d2a', + }, +]; diff --git a/docs-ui/src/utils/changelogs/v0.2.0.ts b/docs-ui/src/utils/changelogs/v0.2.0.ts index b90cec0309..9f39331898 100644 --- a/docs-ui/src/utils/changelogs/v0.2.0.ts +++ b/docs-ui/src/utils/changelogs/v0.2.0.ts @@ -2,97 +2,91 @@ import type { ChangelogProps } from '../types'; export const changelog_0_2_0: ChangelogProps[] = [ { - components: ['menu'], + components: [], version: '0.2.0', - description: 'New `Menu` component', - prs: ['29151'], - type: 'new', + prs: ['28961'], + description: `**BREAKING**: Fix CSS imports and move CSS outputs out of the dist folder.`, + breaking: true, + commitSha: '5a5db29', }, { - components: ['button-icon'], + components: [], + version: '0.2.0', + prs: ['29241'], + description: `**BREAKING**: Added a new Tooltip component to Canon.`, + breaking: true, + commitSha: '4557beb', + }, + { + components: [], version: '0.2.0', - description: 'New `IconButton` component', prs: ['29239'], - type: 'new', + description: `**BREAKING**: We added a new IconButton component with fixed sizes showcasing a single icon.`, + breaking: true, + commitSha: '1e4dfdb', }, { - components: ['scrollarea'], + components: [], version: '0.2.0', - description: 'New `ScrollArea` component', - prs: ['29240'], - type: 'new', - }, - { - components: ['button', 'checkbox'], - version: '0.2.0', - description: 'Improve `Button` & `Checkbox` styles', - prs: ['29127', '28789'], - }, - { - components: ['text'], - version: '0.2.0', - description: 'Improve `Text` styles', - prs: ['29200'], - }, - { - components: ['icon'], - version: '0.2.0', - description: 'Renamed `CanonProvider` to `IconProvider`', - prs: ['29002'], - }, - { - components: ['icon'], - version: '0.2.0', - description: 'Added about 40+ new icons', prs: ['29264'], + description: `**BREAKING**: Added about 40 new icons to Canon.`, + breaking: true, + commitSha: 'e8d12f9', }, { components: [], version: '0.2.0', - description: 'Simplified styling into a unique styles.css file', - prs: ['29199'], + prs: ['29002'], + description: `**BREAKING**: We are renaming CanonProvider to IconProvider to improve clarity on how to override icons.`, + breaking: true, + commitSha: '8689010', }, { components: [], version: '0.2.0', - description: 'Added global styles to Backstage', - prs: ['29137'], - type: 'new', + prs: ['29151'], + description: `**BREAKING**: Added a new Menu component to Canon.`, + breaking: true, + commitSha: 'bf319b7', }, { components: [], version: '0.2.0', - description: 'Update global CSS tokens', - prs: ['28804'], + prs: ['29200'], + description: `**BREAKING**: Updating styles for Text and Link components as well as global surface tokens.`, + breaking: true, + commitSha: 'cb7e99d', }, { - components: ['flex'], + components: [], version: '0.2.0', - description: 'Merge Stack + Inline into Flex', - prs: ['28634'], + prs: ['29240'], + description: `**BREAKING**: Added a new ScrollArea component for Canon.`, + breaking: true, + commitSha: 'bd8520d', }, { - components: ['button'], + components: [], version: '0.2.0', - description: 'Improve `Button` types', prs: ['29205'], + description: `Fix Button types that was preventing the use of native attributes like onClick.`, + + commitSha: '56850ca', }, { components: [], version: '0.2.0', - description: 'Move font weight and family back to each components', prs: ['28972'], + description: `To avoid conflicts with Backstage, we removed global styles and set font-family and font-weight for each components.`, + + commitSha: '89e8686', }, { components: [], version: '0.2.0', - description: 'Fix custom values in spacing props', - prs: ['28770'], - }, - { - components: [], - version: '0.2.0', - description: 'Multiple updates on the docs site', - prs: ['28760'], + prs: ['29137'], + description: `Introducing Canon to Backstage. Canon styling system is based on pure CSS. We are adding our styles.css at the top of your Backstage instance.`, + + commitSha: '05e9d41', }, ]; diff --git a/docs-ui/src/utils/changelogs/v0.2.1.ts b/docs-ui/src/utils/changelogs/v0.2.1.ts index cbf0f9be0f..0815a886c3 100644 --- a/docs-ui/src/utils/changelogs/v0.2.1.ts +++ b/docs-ui/src/utils/changelogs/v0.2.1.ts @@ -4,41 +4,41 @@ export const changelog_0_2_1: ChangelogProps[] = [ { components: [], version: '0.2.1', - description: `Internal refactor and fixes to the prop extraction logic for layout components.`, prs: ['29389'], - type: 'fix', + description: `Internal refactor and fixes to the prop extraction logic for layout components.`, + commitSha: 'f7cb538', }, { components: [], version: '0.2.1', - description: `Fix types on the Icon component.`, prs: ['29306'], - type: 'fix', + description: `Fix types on the Icon component.`, + commitSha: '5e80f0b', }, { components: [], version: '0.2.1', - description: `Updated styles for the Menu component in Canon.`, prs: ['29351'], - type: 'fix', + description: `Updated styles for the Menu component in Canon.`, + commitSha: '6af7b16', }, { components: [], version: '0.2.1', - description: `Add global CSS reset for anchor tags.`, prs: ['29357'], - type: 'new', + description: `Add global CSS reset for anchor tags.`, + commitSha: '513477f', }, { components: [], version: '0.2.1', - description: `Fix the Icon component when the name is not found to return null instead of an empty SVG.`, prs: ['29280'], - type: 'fix', + description: `Fix the Icon component when the name is not found to return null instead of an empty SVG.`, + commitSha: '05a5003', }, ]; diff --git a/docs-ui/src/utils/changelogs/v0.3.0.ts b/docs-ui/src/utils/changelogs/v0.3.0.ts index 750ad292cf..4a2e9faa15 100644 --- a/docs-ui/src/utils/changelogs/v0.3.0.ts +++ b/docs-ui/src/utils/changelogs/v0.3.0.ts @@ -1,139 +1,182 @@ import type { ChangelogProps } from '../types'; export const changelog_0_3_0: ChangelogProps[] = [ - { - components: ['datatable'], - version: '0.3.0', - description: 'Add `DataTable` component', - prs: ['29484', '29603'], - type: 'new', - }, - { - components: ['select'], - version: '0.3.0', - description: 'Add `Select` component', - prs: ['29440'], - type: 'new', - }, - { - components: ['avatar'], - version: '0.3.0', - description: 'Add `Avatar` component', - prs: ['29594'], - type: 'new', - }, - { - components: ['collapsible'], - version: '0.3.0', - description: 'Add `Collapsible` component', - prs: ['29617'], - type: 'new', - }, - { - components: ['textfield'], - version: '0.3.0', - description: 'Add `TextField` component instead of `Field` + `Input`', - prs: ['29364'], - type: 'new', - }, - { - components: ['datatable'], - version: '0.3.0', - description: 'Add `TableCellProfile`', - prs: ['29600'], - type: 'new', - }, { components: [], version: '0.3.0', - description: 'Add breakpoint hooks - `up()` and `down()`', - prs: ['29564'], - type: 'new', - }, - { - components: [], - version: '0.3.0', - description: 'Add gray scale css tokens', - prs: ['29543'], - type: 'new', - }, - { - components: [], - version: '0.3.0', - description: - 'Update CSS styling API using `[data-___]` instead of class names for props', prs: ['29560'], + description: `**BREAKING**: Improve class name structure using data attributes instead of class names.`, + breaking: true, + commitSha: 'df4e292', }, { - components: ['checkbox'], + components: [], version: '0.3.0', - description: 'Update `Checkbox` dark mode', - prs: ['29544'], - }, - { - components: ['container'], - version: '0.3.0', - description: 'Update `Container` styles', - prs: ['29475'], - }, - { - components: ['menu'], - version: '0.3.0', - description: 'Update `Menu` styles', - prs: ['29351'], - }, - { - components: ['select'], - version: '0.3.0', - description: 'Fix `Select` styles on small sizes + with long option names', - prs: ['29545'], - }, - { - components: ['link'], - version: '0.3.0', - description: 'Fix render prop on `Link`', - prs: ['29247'], - }, - { - components: ['textfield', 'select'], - version: '0.3.0', - description: 'Remove `Field` from `TextField` + `Select`', prs: ['29482'], - }, - { - components: ['text', 'heading'], - version: '0.3.0', - description: 'Update `textDecoration` to `none` on `Text` / `Heading`', - prs: ['29357'], - }, - { - components: ['text', 'heading'], - version: '0.3.0', - description: 'Update `textDecoration` to `none` on `Text` / `Heading`', - prs: ['29357'], + description: `**BREAKING**: Updated TextField and Select component to work with React Hook Form.`, + breaking: true, + commitSha: 'f038613', + }, + { + components: [], + version: '0.3.0', + prs: ['29440'], + description: `**BREAKING**: Add new Select component for Canon`, + breaking: true, + commitSha: '1b0cf40', + }, + { + components: [], + version: '0.3.0', + prs: ['29364'], + description: `**BREAKING**: Added a new TextField component to replace the Field and Input component. After feedback, it became clear that we needed to build a more opinionated version to avoid any problem in the future.`, + breaking: true, + commitSha: '5074d61', + }, + { + components: [], + version: '0.3.0', + prs: ['29351'], + description: `Updated styles for the Menu component in Canon.`, + + commitSha: '6af7b16', + }, + { + components: [], + version: '0.3.0', + prs: ['29544'], + description: `Fix Checkbox styles on dark theme in Canon.`, + + commitSha: 'bcbc593', + }, + { + components: [], + version: '0.3.0', + prs: ['29564'], + description: `Add new breakpoint helpers up(), down() and current breakpoint to help you use our breakpoints in your React components.`, + + commitSha: 'e7efb7d', + }, + { + components: [], + version: '0.3.0', + prs: ['29389'], + description: `Internal refactor and fixes to the prop extraction logic for layout components.`, + + commitSha: 'f7cb538', + }, + { + components: [], + version: '0.3.0', + prs: ['29617'], + description: `Add new Collapsible component for Canon.`, + + commitSha: '35b36ec', + }, + { + components: [], + version: '0.3.0', + prs: ['29499'], + description: `Removes instances of default React imports, a necessary update for the upcoming React 19 migration. + + https://legacy.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html`, + + commitSha: 'a47fd39', + }, + { + components: [], + version: '0.3.0', + prs: ['29357'], + description: `Add global CSS reset for anchor tags.`, + + commitSha: '513477f', + }, + { + components: [], + version: '0.3.0', + prs: ['29475'], + description: `Improved Container styles, changing our max-width to 120rem and improving padding on smaller screens.`, + + commitSha: '24f0e08', + }, + { + components: [], + version: '0.3.0', + prs: ['29594'], + description: `Add new Avatar component to Canon.`, + + commitSha: '851779d', + }, + { + components: [], + version: '0.3.0', + prs: ['29600'], + description: `Add new TableCellProfile component for Table and DataTable in Canon.`, + + commitSha: 'ec5ebd1', }, { components: [], version: '0.3.0', - description: 'Docs - Use stories from Storybook for all examples in Nextjs', prs: ['29306'], + description: `Fix types on the Icon component.`, + + commitSha: '5e80f0b', }, { components: [], version: '0.3.0', - description: 'Docs - Add release page (this one 🤗)', - prs: ['29461'], + prs: ['29484'], + description: `Add new DataTable component and update Table component styles.`, + + commitSha: '0e654bf', }, { components: [], version: '0.3.0', - description: 'Docs - Add docs for Menu, Link', - prs: ['29576'], + prs: ['29466'], + description: `Move styles to the root of the TextField component.`, + + commitSha: '7ae28ba', }, { components: [], version: '0.3.0', - description: 'Fix CSS watch mode', - prs: ['29352'], + prs: ['29247'], + description: `We added a render prop to the Link component to make sure it can work with React Router.`, + + commitSha: '4fe5b08', + }, + { + components: [], + version: '0.3.0', + prs: ['29545'], + description: `Fix Select styles on small sizes + with long option names in Canon.`, + + commitSha: '74d463c', + }, + { + components: [], + version: '0.3.0', + prs: ['29543'], + description: `Added a new gray scale for Canon for both light and dark theme.`, + + commitSha: 'f25a5be', + }, + { + components: [], + version: '0.3.0', + prs: ['29603'], + description: `Add support for column sizing in DataTable.`, + + commitSha: '5ee4fc2', + }, + { + components: [], + version: '0.3.0', + prs: ['29280'], + description: `Fix the Icon component when the name is not found to return null instead of an empty SVG.`, + + commitSha: '05a5003', }, ]; diff --git a/docs-ui/src/utils/changelogs/v0.3.2.ts b/docs-ui/src/utils/changelogs/v0.3.2.ts index 26dd225299..93ae7f7e63 100644 --- a/docs-ui/src/utils/changelogs/v0.3.2.ts +++ b/docs-ui/src/utils/changelogs/v0.3.2.ts @@ -4,9 +4,9 @@ export const changelog_0_3_2: ChangelogProps[] = [ { components: [], version: '0.3.2', - description: `Fix Canon missing dependencies`, prs: ['29642'], - type: 'fix', + description: `Fix Canon missing dependencies`, + commitSha: 'e996368', }, ]; diff --git a/docs-ui/src/utils/changelogs/v0.4.0.ts b/docs-ui/src/utils/changelogs/v0.4.0.ts index 91cd641f4d..a85f59c0dc 100644 --- a/docs-ui/src/utils/changelogs/v0.4.0.ts +++ b/docs-ui/src/utils/changelogs/v0.4.0.ts @@ -2,86 +2,115 @@ import type { ChangelogProps } from '../types'; export const changelog_0_4_0: ChangelogProps[] = [ { - components: ['tabs'], + components: [], version: '0.4.0', - description: 'New `Tabs` component', - prs: ['29996'], - type: 'new', - }, - { - components: ['text', 'heading'], - version: '0.4.0', - description: 'Add `truncate` prop to `Text` and `Heading`', - prs: ['29988'], - type: 'new', - }, - { - components: ['menu'], - version: '0.4.0', - description: 'Add combobox option to `Menu`', - prs: ['29986'], - type: 'new', - }, - { - components: ['textfield'], - version: '0.4.0', - description: 'Add icon prop on `TextField`', - prs: ['29820'], - type: 'new', - }, - { - components: ['button', 'button-icon'], - version: '0.4.0', - description: 'Improve icon props on `Button` and `IconButton`', prs: ['29667'], - }, - { - components: ['text', 'heading'], - version: '0.4.0', - description: - 'Improve the way we treat custom render on `Text` and `Heading`', - prs: ['29989'], - }, - { - components: ['menu'], - version: '0.4.0', - description: 'Improve `Menu` styles', - prs: ['29986'], - }, - { - components: ['textfield'], - version: '0.4.0', - description: 'Improve `TextField` styles', - prs: ['29974'], - }, - { - components: ['textfield'], - version: '0.4.0', - description: 'Improve clear button on `TextField`', - prs: ['29878'], - }, - { - components: ['flex'], - version: '0.4.0', - description: 'Fix spacing props on all layout components', - prs: ['30013'], + description: `**BREAKING**: Icons on Button and IconButton now need to be imported and placed like this: \`} /> +- Content +- - - - - } /> - - Content - - ++ ++ ++ Content ++ +\`\`\` - + - + - + Content - + - \`\`\` +CSS classes: \`.bui-CollapsibleRoot\` → \`.bui-Accordion\`, \`.bui-CollapsibleTrigger\` → \`.bui-AccordionTrigger\` (now on heading element), \`.bui-CollapsiblePanel\` → \`.bui-AccordionPanel\` - CSS classes: \`.bui-CollapsibleRoot\` → \`.bui-Accordion\`, \`.bui-CollapsibleTrigger\` → \`.bui-AccordionTrigger\` (now on heading element), \`.bui-CollapsiblePanel\` → \`.bui-AccordionPanel\` +**Path 2: React Aria Disclosure (Full Customization)** - ## Migration Path 2: React Aria Disclosure (Full Customization) +For custom styling without preset styles: - For custom styling without preset styles: +\`\`\`tsx +import { Disclosure, Button, DisclosurePanel } from 'react-aria-components'; - \`\`\`tsx - import { Disclosure, Button, DisclosurePanel } from 'react-aria-components'; - - - - Content - ; - \`\`\``, - type: 'breaking', + + + Content +; +\`\`\``, + breaking: true, commitSha: '83c100e', }, { @@ -185,10 +165,9 @@ export const changelog_0_9_0: ChangelogProps[] = [ prs: ['31649'], description: `**BREAKING**: The \`SelectProps\` interface now accepts a generic type parameter for selection mode. - Added searchable and multiple selection support to Select component. The component now accepts \`searchable\`, \`selectionMode\`, and \`searchPlaceholder\` props to enable filtering and multi-selection modes. - - Migration: If you're using \`SelectProps\` type directly, update from \`SelectProps\` to \`SelectProps<'single' | 'multiple'>\`. Component usage remains backward compatible.`, - type: 'breaking', + Added searchable and multiple selection support to Select component. The component now accepts \`searchable\`, \`selectionMode\`, and \`searchPlaceholder\` props to enable filtering and multi-selection modes.`, + migration: `If you're using \`SelectProps\` type directly, update from \`SelectProps\` to \`SelectProps<'single' | 'multiple'>\`. Component usage remains backward compatible.`, + breaking: true, commitSha: '816af0f', }, { @@ -196,7 +175,7 @@ export const changelog_0_9_0: ChangelogProps[] = [ version: '0.9.0', prs: ['31525'], description: `Fix broken external links in Backstage UI Header component.`, - type: 'fix', + commitSha: 'd01de00', }, { @@ -204,23 +183,23 @@ export const changelog_0_9_0: ChangelogProps[] = [ version: '0.9.0', prs: ['31618'], description: `Fixed CSS issues in Select component including popover width constraints, focus outline behavior, and overflow handling.`, - type: 'fix', + commitSha: '35a3614', }, { - components: ['password-field', 'searchfield', 'menu'], + components: ['password-field', 'searchfield'], version: '0.9.0', prs: ['31679'], description: `Improved visual consistency of PasswordField, SearchField, and MenuAutocomplete components.`, - type: 'fix', + commitSha: '01476f0', }, { - components: [], + components: ['text'], version: '0.9.0', prs: ['31429'], description: `Fix default text color in Backstage UI`, - type: 'fix', + commitSha: '26c6a78', }, { @@ -228,7 +207,7 @@ export const changelog_0_9_0: ChangelogProps[] = [ version: '0.9.0', prs: ['31615'], description: `Fixed Text component to prevent \`truncate\` prop from being spread to the underlying DOM element.`, - type: 'fix', + commitSha: 'deaa427', }, { @@ -236,7 +215,7 @@ export const changelog_0_9_0: ChangelogProps[] = [ version: '0.9.0', prs: ['31524'], description: `Improved the Link component structure in Backstage UI.`, - type: 'fix', + commitSha: '1059f95', }, { @@ -244,15 +223,15 @@ export const changelog_0_9_0: ChangelogProps[] = [ version: '0.9.0', prs: ['31673'], description: `Fixed dialog backdrop appearance in dark mode.`, - type: 'fix', + commitSha: '836b0c7', }, { - components: ['table', 'avatar'], + components: ['avatar'], version: '0.9.0', prs: ['31608'], description: `Migrated CellProfile component from Base UI Avatar to Backstage UI Avatar component.`, - type: 'fix', + commitSha: '6874094', }, { @@ -260,7 +239,7 @@ export const changelog_0_9_0: ChangelogProps[] = [ version: '0.9.0', prs: ['31623'], description: `Avatar components in x-small and small sizes now display only one initial instead of two, improving readability at smaller dimensions.`, - type: 'fix', + commitSha: '719d772', }, { @@ -268,7 +247,7 @@ export const changelog_0_9_0: ChangelogProps[] = [ version: '0.9.0', prs: ['31672'], description: `Removed \`@base-ui-components/react\` dependency as all components now use React Aria Components.`, - type: 'fix', + commitSha: '6d35a6b', }, { @@ -276,7 +255,7 @@ export const changelog_0_9_0: ChangelogProps[] = [ version: '0.9.0', prs: ['31435'], description: `Fix the default font size in Backstage UI.`, - type: 'fix', + commitSha: 'dac851f', }, { @@ -284,15 +263,15 @@ export const changelog_0_9_0: ChangelogProps[] = [ version: '0.9.0', prs: ['31448'], description: `Fix CSS layer ordering in Backstage UI to make sure component styles are loaded after tokens and base declarations.`, - type: 'fix', + commitSha: '3c0ea67', }, { - components: ['radiogroup'], + components: ['radio-group'], version: '0.9.0', prs: ['31576'], description: `Fixed RadioGroup radio button ellipse distortion by preventing flex shrink and grow.`, - type: 'fix', + commitSha: '3b18d80', }, { @@ -300,7 +279,7 @@ export const changelog_0_9_0: ChangelogProps[] = [ version: '0.9.0', prs: ['31444'], description: `Fix font smoothing as default in Backstage UI.`, - type: 'fix', + commitSha: '4eb455c', }, { @@ -308,7 +287,7 @@ export const changelog_0_9_0: ChangelogProps[] = [ version: '0.9.0', prs: ['31516'], description: `Enable tree-shaking of imports other than \`*.css\`.`, - type: 'fix', + commitSha: 'ff9f0c3', }, { @@ -316,7 +295,7 @@ export const changelog_0_9_0: ChangelogProps[] = [ version: '0.9.0', prs: ['31681'], description: `Added \`loading\` prop to Button and ButtonIcon components for displaying spinner during async operations.`, - type: 'new', + commitSha: '7839e7b', }, { @@ -324,7 +303,7 @@ export const changelog_0_9_0: ChangelogProps[] = [ version: '0.9.0', prs: ['31680'], description: `Fixed Table Row component to properly support opening links in new tabs via right-click or Cmd+Click when using the \`href\` prop.`, - type: 'fix', + commitSha: 'a00fb88', }, { @@ -332,7 +311,7 @@ export const changelog_0_9_0: ChangelogProps[] = [ version: '0.9.0', prs: ['31469'], description: `Set the color-scheme property depending on theme`, - type: 'fix', + commitSha: 'e16ece5', }, { @@ -340,15 +319,15 @@ export const changelog_0_9_0: ChangelogProps[] = [ version: '0.9.0', prs: ['31484'], description: `Added new VisuallyHidden component for hiding content visually while keeping it accessible to screen readers.`, - type: 'new', + commitSha: '1ef3ca4', }, { components: [], version: '0.9.0', prs: ['31432'], - description: `Fix default font wight and font family in Backstage UI.`, - type: 'fix', + description: `Fix default font weight and font family in Backstage UI.`, + commitSha: '00bfb83', }, ]; diff --git a/docs-ui/src/utils/changelogs/v0.9.1.ts b/docs-ui/src/utils/changelogs/v0.9.1.ts new file mode 100644 index 0000000000..c71c10a2e0 --- /dev/null +++ b/docs-ui/src/utils/changelogs/v0.9.1.ts @@ -0,0 +1,28 @@ +import type { ChangelogProps } from '../types'; + +export const changelog_0_9_1: ChangelogProps[] = [ + { + components: [], + version: '0.9.1', + prs: ['31843'], + description: `Fixed Table Row component to correctly handle cases where no \`href\` is provided, preventing unnecessary router provider wrapping and fixing the cursor incorrectly showing as a pointer despite the element not being a link.`, + + commitSha: 'b3ad928', + }, + { + components: [], + version: '0.9.1', + prs: ['31817'], + description: `Fixed \`useTable\` hook to prioritize \`providedRowCount\` over data length for accurate row count in server-side pagination scenarios.`, + + commitSha: 'fe7c751', + }, + { + components: [], + version: '0.9.1', + prs: ['31844'], + description: `Fixed Table column sorting indicator to show up arrow when no sort is active, correctly indicating that clicking will sort ascending.`, + + commitSha: 'c145031', + }, +]; diff --git a/docs-ui/src/utils/data.ts b/docs-ui/src/utils/data.ts index de369043d1..7426b16130 100644 --- a/docs-ui/src/utils/data.ts +++ b/docs-ui/src/utils/data.ts @@ -4,34 +4,23 @@ interface Page { status?: 'alpha' | 'beta' | 'stable' | 'deprecated' | 'inProgress' | 'new'; } -export const layoutComponents: Page[] = [ - { - title: 'Box', - slug: 'box', - }, - { - title: 'Container', - slug: 'container', - }, - { - title: 'Grid', - slug: 'grid', - }, - { - title: 'Flex', - slug: 'flex', - }, -]; - export const components: Page[] = [ { title: 'Accordion', slug: 'accordion', }, + { + title: 'Alert', + slug: 'alert', + }, { title: 'Avatar', slug: 'avatar', }, + { + title: 'Box', + slug: 'box', + }, { title: 'Button', slug: 'button', @@ -52,10 +41,22 @@ export const components: Page[] = [ title: 'Checkbox', slug: 'checkbox', }, + { + title: 'Container', + slug: 'container', + }, { title: 'Dialog', slug: 'dialog', }, + { + title: 'Flex', + slug: 'flex', + }, + { + title: 'Grid', + slug: 'grid', + }, { title: 'Header', slug: 'header', @@ -76,6 +77,10 @@ export const components: Page[] = [ title: 'PasswordField', slug: 'password-field', }, + { + title: 'Popover', + slug: 'popover', + }, { title: 'RadioGroup', slug: 'radio-group', @@ -116,6 +121,14 @@ export const components: Page[] = [ title: 'TextField', slug: 'text-field', }, + { + title: 'ToggleButton', + slug: 'toggle-button', + }, + { + title: 'ToggleButtonGroup', + slug: 'toggle-button-group', + }, { title: 'Tooltip', slug: 'tooltip', diff --git a/docs-ui/src/utils/definitions.ts b/docs-ui/src/utils/definitions.ts index d279d73775..452a519980 100644 --- a/docs-ui/src/utils/definitions.ts +++ b/docs-ui/src/utils/definitions.ts @@ -1 +1,12 @@ +'use client'; + +/** + * Client-side re-export of UI component definitions. + * + * The 'use client' directive here creates a boundary that prevents Next.js + * from analyzing the transitive dependencies (hooks) during SSR/SSG. + * + * This allows the UI package to remain pure and free of Next.js-specific + * directives while still working correctly in the Next.js App Router. + */ export * from '../../../packages/ui/src/definitions'; diff --git a/docs-ui/src/utils/getPageName.ts b/docs-ui/src/utils/getPageName.ts index 7a1ccbf2a1..252c80c6c1 100644 --- a/docs-ui/src/utils/getPageName.ts +++ b/docs-ui/src/utils/getPageName.ts @@ -1,17 +1,10 @@ -import { components, layoutComponents } from './data'; +import { components } from './data'; export function getPageName(slug: string): string | null { - // Search in components array const component = components.find(c => c.slug === slug); if (component) { return component.title; } - // Search in layoutComponents array - const layoutComponent = layoutComponents.find(c => c.slug === slug); - if (layoutComponent) { - return layoutComponent.title; - } - return null; } diff --git a/docs-ui/src/utils/playground-context.tsx b/docs-ui/src/utils/playground-context.tsx index a1cee6ecba..252194535b 100644 --- a/docs-ui/src/utils/playground-context.tsx +++ b/docs-ui/src/utils/playground-context.tsx @@ -4,6 +4,7 @@ import { ReactNode, useState, useEffect, + useSyncExternalStore, } from 'react'; import { components } from './data'; @@ -31,6 +32,14 @@ const PlaygroundContext = createContext<{ setSelectedThemeName: () => {}, }); +// Stable server snapshots (outside component to avoid recreating) +const defaultThemeSet = new Set(['light']); +const defaultThemeName: ThemeName = 'backstage'; + +// Cache for theme Sets to avoid creating new objects on every getSnapshot call +let cachedThemeValue: string | null = null; +let cachedThemeSet: Set = defaultThemeSet; + // Create a provider component export const PlaygroundProvider = ({ children }: { children: ReactNode }) => { // Check if running in a browser environment @@ -40,57 +49,72 @@ export const PlaygroundProvider = ({ children }: { children: ReactNode }) => { const [selectedComponents, setSelectedComponents] = useState( components.map(component => component.slug), ); - const [selectedTheme, setSelectedTheme] = useState>( - new Set(['light']), - ); - const [selectedThemeName, setSelectedThemeName] = - useState('backstage'); - // Load saved theme from localStorage after hydration - useEffect(() => { - if (isBrowser) { - const savedThemeString = localStorage.getItem('theme-mode'); - if (savedThemeString) { - // Parse the comma-separated string back into a Set - const themeArray = savedThemeString - .split(',') - .filter(Boolean) as Theme[]; - setSelectedTheme(new Set(themeArray)); + // Use useSyncExternalStore for SSR-safe localStorage access + const selectedTheme = useSyncExternalStore( + callback => { + window.addEventListener('storage', callback); + return () => window.removeEventListener('storage', callback); + }, + () => { + const saved = localStorage.getItem('theme-mode'); + + // Return cached Set if value hasn't changed + if (saved === cachedThemeValue) { + return cachedThemeSet; + } + + // Update cache with new value + cachedThemeValue = saved; + if (saved) { + const themeArray = saved.split(',').filter(Boolean) as Theme[]; + cachedThemeSet = new Set(themeArray); } else { - setSelectedTheme(new Set(['light'])); + cachedThemeSet = defaultThemeSet; } - } - }, [isBrowser]); - // Load saved theme name from localStorage after hydration + return cachedThemeSet; + }, + () => defaultThemeSet, // Stable server snapshot + ); + + const selectedThemeName = useSyncExternalStore( + callback => { + window.addEventListener('storage', callback); + return () => window.removeEventListener('storage', callback); + }, + () => { + const saved = localStorage.getItem('theme-name') as ThemeName; + return saved || defaultThemeName; + }, + () => defaultThemeName, // Stable server snapshot + ); + + // Keep setter functions that update both state and localStorage + const setSelectedTheme = (keys: Set) => { + const value = Array.from(keys).join(','); + localStorage.setItem('theme-mode', value); + // Invalidate cache + cachedThemeValue = null; + window.dispatchEvent(new Event('storage')); + }; + + const setSelectedThemeName = (name: ThemeName) => { + localStorage.setItem('theme-name', name); + window.dispatchEvent(new Event('storage')); + }; + + // Sync to DOM attributes when values change useEffect(() => { - if (isBrowser) { - const savedThemeName = localStorage.getItem('theme-name') as ThemeName; - if (savedThemeName) { - setSelectedThemeName(savedThemeName); - } - } - }, [isBrowser]); + document.documentElement.setAttribute( + 'data-theme-mode', + Array.from(selectedTheme).join(','), + ); + }, [selectedTheme]); useEffect(() => { - if (isBrowser) { - document.documentElement.setAttribute( - 'data-theme-mode', - Array.from(selectedTheme).join(','), - ); - localStorage.setItem('theme-mode', Array.from(selectedTheme).join(',')); - } - }, [selectedTheme, isBrowser]); - - useEffect(() => { - if (isBrowser) { - document.documentElement.setAttribute( - 'data-theme-name', - selectedThemeName || 'backstage', - ); - localStorage.setItem('theme-name', selectedThemeName || 'backstage'); - } - }, [selectedThemeName, isBrowser]); + document.documentElement.setAttribute('data-theme-name', selectedThemeName); + }, [selectedThemeName]); return ( ; }; +export type SpacingProp = { + name: string; + description: ReactNode; + default?: string; +}; + +export type SpacingGroupDef = { + props: SpacingProp[]; + values: string[]; + responsive: boolean; +}; + export type PropDef = { type: | 'string' @@ -22,19 +35,22 @@ export type PropDef = { | 'number' | 'boolean' | 'spacing' + | 'spacing-group' | 'complex'; values?: string | string[]; complexType?: ComplexTypeDef; + spacingGroup?: SpacingGroupDef; default?: string; required?: boolean; responsive?: boolean; - description?: string; + description?: ReactNode; }; export { breakpoints }; export type { Breakpoint }; export const spacingValues = [ + '0', '0.5', '1', '1.5', @@ -49,47 +65,53 @@ export const spacingValues = [ '10', '11', '12', - '13', - '14', + 'auto', ]; export const paddingPropDefs = ( spacingValues: string[], ): Record => ({ p: { - type: 'enum | string', + type: 'spacing', values: spacingValues, responsive: true, + description: 'Padding on all sides.', }, px: { - type: 'enum | string', + type: 'spacing', values: spacingValues, responsive: true, + description: 'Horizontal padding (left and right).', }, py: { - type: 'enum | string', + type: 'spacing', values: spacingValues, responsive: true, + description: 'Vertical padding (top and bottom).', }, pt: { - type: 'enum | string', + type: 'spacing', values: spacingValues, responsive: true, + description: 'Padding on the top.', }, pr: { - type: 'enum | string', + type: 'spacing', values: spacingValues, responsive: true, + description: 'Padding on the right.', }, pb: { - type: 'enum | string', + type: 'spacing', values: spacingValues, responsive: true, + description: 'Padding on the bottom.', }, pl: { - type: 'enum | string', + type: 'spacing', values: spacingValues, responsive: true, + description: 'Padding on the left.', }, }); @@ -97,39 +119,46 @@ export const marginPropDefs = ( spacingValues: string[], ): Record => ({ m: { - type: 'enum | string', + type: 'spacing', values: spacingValues, responsive: true, + description: 'Margin on all sides.', }, mx: { - type: 'enum | string', + type: 'spacing', values: spacingValues, responsive: true, + description: 'Horizontal margin (left and right).', }, my: { - type: 'enum | string', + type: 'spacing', values: spacingValues, responsive: true, + description: 'Vertical margin (top and bottom).', }, mt: { - type: 'enum | string', + type: 'spacing', values: spacingValues, responsive: true, + description: 'Margin on the top.', }, mr: { - type: 'enum | string', + type: 'spacing', values: spacingValues, responsive: true, + description: 'Margin on the right.', }, mb: { - type: 'enum | string', + type: 'spacing', values: spacingValues, responsive: true, + description: 'Margin on the bottom.', }, ml: { - type: 'enum | string', + type: 'spacing', values: spacingValues, responsive: true, + description: 'Margin on the left.', }, }); @@ -138,6 +167,76 @@ export const spacingPropDefs = { ...marginPropDefs(spacingValues), }; +// Spacing prop metadata for creating groups +const spacingPropMetadata: Record = { + p: { name: 'p', description: 'Padding on all sides.' }, + px: { name: 'px', description: 'Horizontal padding (left and right).' }, + py: { name: 'py', description: 'Vertical padding (top and bottom).' }, + pt: { name: 'pt', description: 'Padding on the top.' }, + pr: { name: 'pr', description: 'Padding on the right.' }, + pb: { name: 'pb', description: 'Padding on the bottom.' }, + pl: { name: 'pl', description: 'Padding on the left.' }, + m: { name: 'm', description: 'Margin on all sides.' }, + mx: { name: 'mx', description: 'Horizontal margin (left and right).' }, + my: { name: 'my', description: 'Vertical margin (top and bottom).' }, + mt: { name: 'mt', description: 'Margin on the top.' }, + mr: { name: 'mr', description: 'Margin on the right.' }, + mb: { name: 'mb', description: 'Margin on the bottom.' }, + ml: { name: 'ml', description: 'Margin on the left.' }, +}; + +export const createSpacingGroup = ( + propNames: string[], + description?: ReactNode, +): PropDef => { + const props = propNames + .map(name => spacingPropMetadata[name]) + .filter(Boolean); + + return { + type: 'spacing-group', + spacingGroup: { + props, + values: spacingValues, + responsive: true, + }, + description: + description || 'Spacing properties for controlling padding and margin.', + responsive: true, + }; +}; + +// Pre-built spacing groups +export const spacingGroupAll = createSpacingGroup( + [ + 'p', + 'px', + 'py', + 'pt', + 'pr', + 'pb', + 'pl', + 'm', + 'mx', + 'my', + 'mt', + 'mr', + 'mb', + 'ml', + ], + 'Padding and margin properties for controlling spacing around the element.', +); + +export const spacingGroupPadding = createSpacingGroup( + ['p', 'px', 'py', 'pt', 'pr', 'pb', 'pl'], + 'Padding properties for controlling internal spacing.', +); + +export const spacingGroupMargin = createSpacingGroup( + ['m', 'mx', 'my', 'mt', 'mr', 'mb', 'ml'], + 'Margin properties for controlling external spacing.', +); + export const displayPropDefs: Record = { display: { type: 'enum', @@ -149,7 +248,7 @@ export const displayPropDefs: Record = { export const gapPropDefs: Record = { gap: { - type: 'enum | string', + type: 'spacing', values: spacingValues, responsive: true, default: '4', @@ -159,36 +258,36 @@ export const gapPropDefs: Record = { export const widthPropDefs: Record = { width: { type: 'string', - default: '0', responsive: true, + description: 'Sets the width of the element. Accepts CSS values.', }, minWidth: { type: 'string', - default: '0', responsive: true, + description: 'Sets the minimum width. Element cannot shrink below this.', }, maxWidth: { type: 'string', - default: '0', responsive: true, + description: 'Sets the maximum width. Element cannot grow beyond this.', }, }; export const heightPropDefs: Record = { height: { type: 'string', - default: '0', responsive: true, + description: 'Sets the height of the element. Accepts CSS values.', }, minHeight: { type: 'string', - default: '0', responsive: true, + description: 'Sets the minimum height. Element cannot shrink below this.', }, maxHeight: { type: 'string', - default: '0', responsive: true, + description: 'Sets the maximum height. Element cannot grow beyond this.', }, }; @@ -196,8 +295,8 @@ export const positionPropDefs: Record = { position: { type: 'enum', values: ['static', 'relative', 'absolute', 'fixed', 'sticky'], - default: 'static', responsive: true, + description: 'CSS positioning scheme for the element.', }, }; @@ -205,6 +304,7 @@ export const classNamePropDefs: Record = { className: { type: 'string', responsive: false, + description: 'Additional CSS class name for custom styling.', }, }; @@ -213,6 +313,7 @@ export const stylePropDefs: Record = { type: 'enum', values: ['CSSProperties'], responsive: false, + description: 'Inline CSS styles object.', }, }; diff --git a/docs-ui/src/utils/types.ts b/docs-ui/src/utils/types.ts index f2f773ebc2..21acc950a0 100644 --- a/docs-ui/src/utils/types.ts +++ b/docs-ui/src/utils/types.ts @@ -1,38 +1,39 @@ export type Component = + | 'accordion' + | 'alert' | 'avatar' | 'box' | 'button' - | 'button-link' - | 'heading' - | 'text' | 'button-icon' - | 'icon' - | 'tabs' - | 'menu' - | 'textfield' - | 'datatable' - | 'select' - | 'collapsible' - | 'accordion' - | 'checkbox' - | 'container' - | 'link' - | 'tooltip' - | 'scrollarea' - | 'flex' - | 'switch' - | 'grid' - | 'searchfield' - | 'radio-group' + | 'button-link' | 'card' - | 'skeleton' + | 'checkbox' + | 'collapsible' + | 'container' + | 'datatable' + | 'dialog' + | 'flex' + | 'grid' | 'header' | 'header-page' + | 'heading' + | 'icon' + | 'link' + | 'menu' | 'password-field' + | 'radio-group' + | 'scrollarea' + | 'searchfield' + | 'select' + | 'skeleton' + | 'switch' | 'table' - | 'visually-hidden' - | 'dialog' - | 'tag-group'; + | 'tabs' + | 'tag-group' + | 'text' + | 'textfield' + | 'tooltip' + | 'visually-hidden'; export type Version = `${number}.${number}.${number}`; @@ -41,6 +42,7 @@ export interface ChangelogProps { description: string; version: Version; prs: string[]; - type?: 'breaking' | 'new' | 'fix'; + breaking?: boolean; commitSha?: string; + migration?: string; } diff --git a/docs-ui/tsconfig.json b/docs-ui/tsconfig.json index e1b3951aa8..bb167b721d 100644 --- a/docs-ui/tsconfig.json +++ b/docs-ui/tsconfig.json @@ -10,7 +10,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve", + "jsx": "react-jsx", "incremental": true, "noImplicitAny": false, "plugins": [ @@ -29,7 +29,9 @@ "**/*.tsx", ".next/types/**/*.ts", "dist/types/**/*.ts", - "src/types/**/*.d.ts" + "src/types/**/*.d.ts", + "dist/dev/types/**/*.ts", + ".next/dev/types/**/*.ts" ], "exclude": ["node_modules"] } diff --git a/docs-ui/yarn.lock b/docs-ui/yarn.lock index 3c51c27aa8..5b388354d6 100644 --- a/docs-ui/yarn.lock +++ b/docs-ui/yarn.lock @@ -5,21 +5,142 @@ __metadata: version: 8 cacheKey: 10 -"@babel/code-frame@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/code-frame@npm:7.27.1" +"@babel/code-frame@npm:^7.27.1, @babel/code-frame@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/code-frame@npm:7.28.6" dependencies: - "@babel/helper-validator-identifier": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.28.5" js-tokens: "npm:^4.0.0" picocolors: "npm:^1.1.1" - checksum: 10/721b8a6e360a1fa0f1c9fe7351ae6c874828e119183688b533c477aa378f1010f37cc9afbfc4722c686d1f5cdd00da02eab4ba7278a0c504fa0d7a321dcd4fdf + checksum: 10/93e7ed9e039e3cb661bdb97c26feebafacc6ec13d745881dae5c7e2708f579475daebe7a3b5d23b183bb940b30744f52f4a5bcb65b4df03b79d82fcb38495784 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.27.1": +"@babel/compat-data@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/compat-data@npm:7.28.6" + checksum: 10/dc17dfb55711a15f006e34c4610c49b7335fc11b23e192f9e5f625e8ea0f48805e61a57b6b4f5550879332782c93af0b5d6952825fffbb8d4e604b14d698249f + languageName: node + linkType: hard + +"@babel/core@npm:^7.24.4": + version: 7.28.6 + resolution: "@babel/core@npm:7.28.6" + dependencies: + "@babel/code-frame": "npm:^7.28.6" + "@babel/generator": "npm:^7.28.6" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-module-transforms": "npm:^7.28.6" + "@babel/helpers": "npm:^7.28.6" + "@babel/parser": "npm:^7.28.6" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + "@jridgewell/remapping": "npm:^2.3.5" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10/1a150a69c547daf13c457be1fdaf1a0935d02b94605e777e049537ec2f279b4bb442ffbe1c2d8ff62c688878b1d5530a5784daf72ece950d1917fb78717f51d2 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/generator@npm:7.28.6" + dependencies: + "@babel/parser": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" + jsesc: "npm:^3.0.2" + checksum: 10/ef2af927e8e0985d02ec4321a242da761a934e927539147c59fdd544034dc7f0e9846f6bf86209aca7a28aee2243ed0fad668adccd48f96d7d6866215173f9af + languageName: node + linkType: hard + +"@babel/helper-compilation-targets@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-compilation-targets@npm:7.28.6" + dependencies: + "@babel/compat-data": "npm:^7.28.6" + "@babel/helper-validator-option": "npm:^7.27.1" + browserslist: "npm:^4.24.0" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10/f512a5aeee4dfc6ea8807f521d085fdca8d66a7d068a6dd5e5b37da10a6081d648c0bbf66791a081e4e8e6556758da44831b331540965dfbf4f5275f3d0a8788 + languageName: node + linkType: hard + +"@babel/helper-globals@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/helper-globals@npm:7.28.0" + checksum: 10/91445f7edfde9b65dcac47f4f858f68dc1661bf73332060ab67ad7cc7b313421099a2bfc4bda30c3db3842cfa1e86fffbb0d7b2c5205a177d91b22c8d7d9cb47 + languageName: node + linkType: hard + +"@babel/helper-module-imports@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-module-imports@npm:7.28.6" + dependencies: + "@babel/traverse": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/64b1380d74425566a3c288074d7ce4dea56d775d2d3325a3d4a6df1dca702916c1d268133b6f385de9ba5b822b3c6e2af5d3b11ac88e5453d5698d77264f0ec0 + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-module-transforms@npm:7.28.6" + dependencies: + "@babel/helper-module-imports": "npm:^7.28.6" + "@babel/helper-validator-identifier": "npm:^7.28.5" + "@babel/traverse": "npm:^7.28.6" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/2e421c7db743249819ee51e83054952709dc2e197c7d5d415b4bdddc718580195704bfcdf38544b3f674efc2eccd4d29a65d38678fc827ed3934a7690984cd8b + languageName: node + linkType: hard + +"@babel/helper-string-parser@npm:^7.27.1": version: 7.27.1 - resolution: "@babel/helper-validator-identifier@npm:7.27.1" - checksum: 10/75041904d21bdc0cd3b07a8ac90b11d64cd3c881e89cb936fa80edd734bf23c35e6bd1312611e8574c4eab1f3af0f63e8a5894f4699e9cfdf70c06fcf4252320 + resolution: "@babel/helper-string-parser@npm:7.27.1" + checksum: 10/0ae29cc2005084abdae2966afdb86ed14d41c9c37db02c3693d5022fba9f5d59b011d039380b8e537c34daf117c549f52b452398f576e908fb9db3c7abbb3a00 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-validator-identifier@npm:7.28.5" + checksum: 10/8e5d9b0133702cfacc7f368bf792f0f8ac0483794877c6dca5fcb73810ee138e27527701826fb58a40a004f3a5ec0a2f3c3dd5e326d262530b119918f3132ba7 + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-option@npm:7.27.1" + checksum: 10/db73e6a308092531c629ee5de7f0d04390835b21a263be2644276cb27da2384b64676cab9f22cd8d8dbd854c92b1d7d56fc8517cf0070c35d1c14a8c828b0903 + languageName: node + linkType: hard + +"@babel/helpers@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helpers@npm:7.28.6" + dependencies: + "@babel/template": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/213485cdfffc4deb81fc1bf2cefed61bc825049322590ef69690e223faa300a2a4d1e7d806c723bb1f1f538226b9b1b6c356ca94eb47fa7c6d9e9f251ee425e6 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.24.4, @babel/parser@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/parser@npm:7.28.6" + dependencies: + "@babel/types": "npm:^7.28.6" + bin: + parser: ./bin/babel-parser.js + checksum: 10/483a6fb5f9876ec9cbbb98816f2c94f39ae4d1158d35f87e1c4bf19a1f56027c96a1a3962ff0c8c46e8322a6d9e1c80d26b7f9668410df13d5b5769d9447b010 languageName: node linkType: hard @@ -30,6 +151,42 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/template@npm:7.28.6" + dependencies: + "@babel/code-frame": "npm:^7.28.6" + "@babel/parser": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/0ad6e32bf1e7e31bf6b52c20d15391f541ddd645cbd488a77fe537a15b280ee91acd3a777062c52e03eedbc2e1f41548791f6a3697c02476ec5daf49faa38533 + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/traverse@npm:7.28.6" + dependencies: + "@babel/code-frame": "npm:^7.28.6" + "@babel/generator": "npm:^7.28.6" + "@babel/helper-globals": "npm:^7.28.0" + "@babel/parser": "npm:^7.28.6" + "@babel/template": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + debug: "npm:^4.3.1" + checksum: 10/dd71efe9412433169b805d5c346a6473e539ce30f605752a0d40a0733feba37259bd72bb4ad2ab591e2eaff1ee56633de160c1e98efdc8f373cf33a4a8660275 + languageName: node + linkType: hard + +"@babel/types@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/types@npm:7.28.6" + dependencies: + "@babel/helper-string-parser": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.28.5" + checksum: 10/f9c6e52b451065aae5654686ecfc7de2d27dd0fbbc204ee2bd912a71daa359521a32f378981b1cf333ace6c8f86928814452cb9f388a7da59ad468038deb6b5f + languageName: node + linkType: hard + "@base-ui-components/react@npm:^1.0.0-beta.4": version: 1.0.0-rc.0 resolution: "@base-ui-components/react@npm:1.0.0-rc.0" @@ -179,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.38.8 - resolution: "@codemirror/view@npm:6.38.8" + version: 6.39.12 + resolution: "@codemirror/view@npm:6.39.12" dependencies: "@codemirror/state": "npm:^6.5.0" crelt: "npm:^1.0.6" style-mod: "npm:^4.1.0" w3c-keyname: "npm:^2.2.4" - checksum: 10/81b1508015a378e4719d0239254173f0c5cd340c2abf96eb488fe5fb474bdb37ec1f010b9890ced774accd7aeb9443e7337cb6a89544b954273e5ddabece7cea + checksum: 10/acd476d485914095fe38009bb29c7a6ac4cf3de2d3921172e27fc40639eb5bce0534766fd6e093c94aa60f076f263ce90a670a8052e220244bf4065f95c064bb languageName: node linkType: hard @@ -200,12 +357,12 @@ __metadata: languageName: node linkType: hard -"@emnapi/runtime@npm:^1.4.3, @emnapi/runtime@npm:^1.4.4": - version: 1.4.5 - resolution: "@emnapi/runtime@npm:1.4.5" +"@emnapi/runtime@npm:^1.4.3, @emnapi/runtime@npm:^1.7.0": + version: 1.8.1 + resolution: "@emnapi/runtime@npm:1.8.1" dependencies: tslib: "npm:^2.4.0" - checksum: 10/1d6f406ff116d2363e60aef3ed49eb8d577387f4941abea508ba376900d8831609d5cce92a58076b1a9613f8e83c75c2e3fea71e4fbcdbe06019876144c2559b + checksum: 10/26725e202d4baefdc4a6ba770f703dfc80825a27c27a08c22bac1e1ce6f8f75c47b4fe9424d9b63239463c33ef20b650f08d710da18dfa1164a95e5acb865dba languageName: node linkType: hard @@ -218,227 +375,91 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/aix-ppc64@npm:0.25.9" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/android-arm64@npm:0.25.9" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/android-arm@npm:0.25.9" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/android-x64@npm:0.25.9" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/darwin-arm64@npm:0.25.9" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/darwin-x64@npm:0.25.9" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/freebsd-arm64@npm:0.25.9" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/freebsd-x64@npm:0.25.9" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-arm64@npm:0.25.9" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-arm@npm:0.25.9" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-ia32@npm:0.25.9" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-loong64@npm:0.25.9" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-mips64el@npm:0.25.9" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-ppc64@npm:0.25.9" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-riscv64@npm:0.25.9" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-s390x@npm:0.25.9" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/linux-x64@npm:0.25.9" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/netbsd-arm64@npm:0.25.9" - conditions: os=netbsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/netbsd-x64@npm:0.25.9" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/openbsd-arm64@npm:0.25.9" - conditions: os=openbsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/openbsd-x64@npm:0.25.9" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openharmony-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/openharmony-arm64@npm:0.25.9" - conditions: os=openharmony & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/sunos-x64@npm:0.25.9" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/win32-arm64@npm:0.25.9" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/win32-ia32@npm:0.25.9" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.25.9": - version: 0.25.9 - resolution: "@esbuild/win32-x64@npm:0.25.9" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.7.0": - version: 4.7.0 - resolution: "@eslint-community/eslint-utils@npm:4.7.0" +"@eslint-community/eslint-utils@npm:^4.8.0, @eslint-community/eslint-utils@npm:^4.9.1": + version: 4.9.1 + resolution: "@eslint-community/eslint-utils@npm:4.9.1" dependencies: eslint-visitor-keys: "npm:^3.4.3" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10/43ed5d391526d9f5bbe452aef336389a473026fca92057cf97c576db11401ce9bcf8ef0bf72625bbaf6207ed8ba6bf0dcf4d7e809c24f08faa68a28533c491a7 + checksum: 10/863b5467868551c9ae34d03eefe634633d08f623fc7b19d860f8f26eb6f303c1a5934253124163bee96181e45ed22bf27473dccc295937c3078493a4a8c9eddd languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": - version: 4.12.1 - resolution: "@eslint-community/regexpp@npm:4.12.1" - checksum: 10/c08f1dd7dd18fbb60bdd0d85820656d1374dd898af9be7f82cb00451313402a22d5e30569c150315b4385907cdbca78c22389b2a72ab78883b3173be317620cc +"@eslint-community/regexpp@npm:^4.12.1, @eslint-community/regexpp@npm:^4.12.2": + version: 4.12.2 + resolution: "@eslint-community/regexpp@npm:4.12.2" + checksum: 10/049b280fddf71dd325514e0a520024969431dc3a8b02fa77476e6820e9122f28ab4c9168c11821f91a27982d2453bcd7a66193356ea84e84fb7c8d793be1ba0c languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" +"@eslint/config-array@npm:^0.21.1": + version: 0.21.1 + resolution: "@eslint/config-array@npm:0.21.1" + dependencies: + "@eslint/object-schema": "npm:^2.1.7" + debug: "npm:^4.3.1" + minimatch: "npm:^3.1.2" + checksum: 10/6eaa0435972f735ce52d581f355a0b616e50a9b8a73304a7015398096e252798b9b3b968a67b524eefb0fdeacc57c4d960f0ec6432abe1c1e24be815b88c5d18 + languageName: node + linkType: hard + +"@eslint/config-helpers@npm:^0.4.2": + version: 0.4.2 + resolution: "@eslint/config-helpers@npm:0.4.2" + dependencies: + "@eslint/core": "npm:^0.17.0" + checksum: 10/3f2b4712d8e391c36ec98bc200f7dea423dfe518e42956569666831b89ede83b33120c761dfd3ab6347d8e8894a6d4af47254a18d464a71c6046fd88065f6daf + languageName: node + linkType: hard + +"@eslint/core@npm:^0.17.0": + version: 0.17.0 + resolution: "@eslint/core@npm:0.17.0" + dependencies: + "@types/json-schema": "npm:^7.0.15" + checksum: 10/f9a428cc651ec15fb60d7d60c2a7bacad4666e12508320eafa98258e976fafaa77d7be7be91519e75f801f15f830105420b14a458d4aab121a2b0a59bc43517b + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^3.3.1": + version: 3.3.3 + resolution: "@eslint/eslintrc@npm:3.3.3" dependencies: ajv: "npm:^6.12.4" debug: "npm:^4.3.2" - espree: "npm:^9.6.0" - globals: "npm:^13.19.0" + espree: "npm:^10.0.1" + globals: "npm:^14.0.0" ignore: "npm:^5.2.0" import-fresh: "npm:^3.2.1" - js-yaml: "npm:^4.1.0" + js-yaml: "npm:^4.1.1" minimatch: "npm:^3.1.2" strip-json-comments: "npm:^3.1.1" - checksum: 10/7a3b14f4b40fc1a22624c3f84d9f467a3d9ea1ca6e9a372116cb92507e485260359465b58e25bcb6c9981b155416b98c9973ad9b796053fd7b3f776a6946bce8 + checksum: 10/b586a364ff15ce1b68993aefc051ca330b1fece15fb5baf4a708d00113f9a14895cffd84a5f24c5a97bd4b4321130ab2314f90aa462a250f6b859c2da2cba1f3 languageName: node linkType: hard -"@eslint/js@npm:8.57.1": - version: 8.57.1 - resolution: "@eslint/js@npm:8.57.1" - checksum: 10/7562b21be10c2adbfa4aa5bb2eccec2cb9ac649a3569560742202c8d1cb6c931ce634937a2f0f551e078403a1c1285d6c2c0aa345dafc986149665cd69fe8b59 +"@eslint/js@npm:9.39.2": + version: 9.39.2 + resolution: "@eslint/js@npm:9.39.2" + checksum: 10/6b7f676746f3111b5d1b23715319212ab9297868a0fa9980d483c3da8965d5841673aada2d5653e85a3f7156edee0893a7ae7035211b4efdcb2848154bb947f2 + languageName: node + linkType: hard + +"@eslint/object-schema@npm:^2.1.7": + version: 2.1.7 + resolution: "@eslint/object-schema@npm:2.1.7" + checksum: 10/946ef5d6235b4d1c0907c6c6e6429c8895f535380c562b7705c131f63f2e961b06e8785043c86a293da48e0a60c6286d98ba395b8b32ea55561fe6e4417cb7e4 + languageName: node + linkType: hard + +"@eslint/plugin-kit@npm:^0.4.1": + version: 0.4.1 + resolution: "@eslint/plugin-kit@npm:0.4.1" + dependencies: + "@eslint/core": "npm:^0.17.0" + levn: "npm:^0.4.1" + checksum: 10/c5947d0ffeddca77d996ac1b886a66060c1a15ed1d5e425d0c7e7d7044a4bd3813fc968892d03950a7831c9b89368a2f7b281e45dd3c74a048962b74bf3a1cb4 languageName: node linkType: hard @@ -480,14 +501,20 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.13.0": - version: 0.13.0 - resolution: "@humanwhocodes/config-array@npm:0.13.0" +"@humanfs/core@npm:^0.19.1": + version: 0.19.1 + resolution: "@humanfs/core@npm:0.19.1" + checksum: 10/270d936be483ab5921702623bc74ce394bf12abbf57d9145a69e8a0d1c87eb1c768bd2d93af16c5705041e257e6d9cc7529311f63a1349f3678abc776fc28523 + languageName: node + linkType: hard + +"@humanfs/node@npm:^0.16.6": + version: 0.16.7 + resolution: "@humanfs/node@npm:0.16.7" dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.3" - debug: "npm:^4.3.1" - minimatch: "npm:^3.0.5" - checksum: 10/524df31e61a85392a2433bf5d03164e03da26c03d009f27852e7dcfdafbc4a23f17f021dacf88e0a7a9fe04ca032017945d19b57a16e2676d9114c22a53a9d11 + "@humanfs/core": "npm:^0.19.1" + "@humanwhocodes/retry": "npm:^0.4.0" + checksum: 10/b3633d3dce898592cac515ba5e6693c78e6be92863541d3eaf2c009b10f52b2fa62ff6e6e06f240f2447ddbe7b5f1890bc34e9308470675c876eee207553a08d languageName: node linkType: hard @@ -498,18 +525,25 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.3": - version: 2.0.3 - resolution: "@humanwhocodes/object-schema@npm:2.0.3" - checksum: 10/05bb99ed06c16408a45a833f03a732f59bf6184795d4efadd33238ff8699190a8c871ad1121241bb6501589a9598dc83bf25b99dcbcf41e155cdf36e35e937a3 +"@humanwhocodes/retry@npm:^0.4.0, @humanwhocodes/retry@npm:^0.4.2": + version: 0.4.3 + resolution: "@humanwhocodes/retry@npm:0.4.3" + checksum: 10/0b32cfd362bea7a30fbf80bb38dcaf77fee9c2cae477ee80b460871d03590110ac9c77d654f04ec5beaf71b6f6a89851bdf6c1e34ccdf2f686bd86fcd97d9e61 languageName: node linkType: hard -"@img/sharp-darwin-arm64@npm:0.34.3": - version: 0.34.3 - resolution: "@img/sharp-darwin-arm64@npm:0.34.3" +"@img/colour@npm:^1.0.0": + version: 1.0.0 + resolution: "@img/colour@npm:1.0.0" + checksum: 10/bd248d7c4b8ba99a72b22a005a63f1d3309ee8343a74b6d0d1314bae300a3096919991a09e9a9243cf6ca50e393b4c5a7e065488ed616c3b58d052473240b812 + languageName: node + linkType: hard + +"@img/sharp-darwin-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-darwin-arm64@npm:0.34.5" dependencies: - "@img/sharp-libvips-darwin-arm64": "npm:1.2.0" + "@img/sharp-libvips-darwin-arm64": "npm:1.2.4" dependenciesMeta: "@img/sharp-libvips-darwin-arm64": optional: true @@ -517,11 +551,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-darwin-x64@npm:0.34.3": - version: 0.34.3 - resolution: "@img/sharp-darwin-x64@npm:0.34.3" +"@img/sharp-darwin-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-darwin-x64@npm:0.34.5" dependencies: - "@img/sharp-libvips-darwin-x64": "npm:1.2.0" + "@img/sharp-libvips-darwin-x64": "npm:1.2.4" dependenciesMeta: "@img/sharp-libvips-darwin-x64": optional: true @@ -529,74 +563,81 @@ __metadata: languageName: node linkType: hard -"@img/sharp-libvips-darwin-arm64@npm:1.2.0": - version: 1.2.0 - resolution: "@img/sharp-libvips-darwin-arm64@npm:1.2.0" +"@img/sharp-libvips-darwin-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-darwin-arm64@npm:1.2.4" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@img/sharp-libvips-darwin-x64@npm:1.2.0": - version: 1.2.0 - resolution: "@img/sharp-libvips-darwin-x64@npm:1.2.0" +"@img/sharp-libvips-darwin-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-darwin-x64@npm:1.2.4" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@img/sharp-libvips-linux-arm64@npm:1.2.0": - version: 1.2.0 - resolution: "@img/sharp-libvips-linux-arm64@npm:1.2.0" +"@img/sharp-libvips-linux-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-arm64@npm:1.2.4" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@img/sharp-libvips-linux-arm@npm:1.2.0": - version: 1.2.0 - resolution: "@img/sharp-libvips-linux-arm@npm:1.2.0" +"@img/sharp-libvips-linux-arm@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-arm@npm:1.2.4" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@img/sharp-libvips-linux-ppc64@npm:1.2.0": - version: 1.2.0 - resolution: "@img/sharp-libvips-linux-ppc64@npm:1.2.0" +"@img/sharp-libvips-linux-ppc64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-ppc64@npm:1.2.4" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@img/sharp-libvips-linux-s390x@npm:1.2.0": - version: 1.2.0 - resolution: "@img/sharp-libvips-linux-s390x@npm:1.2.0" +"@img/sharp-libvips-linux-riscv64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-riscv64@npm:1.2.4" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-s390x@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-s390x@npm:1.2.4" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@img/sharp-libvips-linux-x64@npm:1.2.0": - version: 1.2.0 - resolution: "@img/sharp-libvips-linux-x64@npm:1.2.0" +"@img/sharp-libvips-linux-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-x64@npm:1.2.4" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@img/sharp-libvips-linuxmusl-arm64@npm:1.2.0": - version: 1.2.0 - resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.2.0" +"@img/sharp-libvips-linuxmusl-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.2.4" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@img/sharp-libvips-linuxmusl-x64@npm:1.2.0": - version: 1.2.0 - resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.2.0" +"@img/sharp-libvips-linuxmusl-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.2.4" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@img/sharp-linux-arm64@npm:0.34.3": - version: 0.34.3 - resolution: "@img/sharp-linux-arm64@npm:0.34.3" +"@img/sharp-linux-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-arm64@npm:0.34.5" dependencies: - "@img/sharp-libvips-linux-arm64": "npm:1.2.0" + "@img/sharp-libvips-linux-arm64": "npm:1.2.4" dependenciesMeta: "@img/sharp-libvips-linux-arm64": optional: true @@ -604,11 +645,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linux-arm@npm:0.34.3": - version: 0.34.3 - resolution: "@img/sharp-linux-arm@npm:0.34.3" +"@img/sharp-linux-arm@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-arm@npm:0.34.5" dependencies: - "@img/sharp-libvips-linux-arm": "npm:1.2.0" + "@img/sharp-libvips-linux-arm": "npm:1.2.4" dependenciesMeta: "@img/sharp-libvips-linux-arm": optional: true @@ -616,11 +657,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linux-ppc64@npm:0.34.3": - version: 0.34.3 - resolution: "@img/sharp-linux-ppc64@npm:0.34.3" +"@img/sharp-linux-ppc64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-ppc64@npm:0.34.5" dependencies: - "@img/sharp-libvips-linux-ppc64": "npm:1.2.0" + "@img/sharp-libvips-linux-ppc64": "npm:1.2.4" dependenciesMeta: "@img/sharp-libvips-linux-ppc64": optional: true @@ -628,11 +669,23 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linux-s390x@npm:0.34.3": - version: 0.34.3 - resolution: "@img/sharp-linux-s390x@npm:0.34.3" +"@img/sharp-linux-riscv64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-riscv64@npm:0.34.5" dependencies: - "@img/sharp-libvips-linux-s390x": "npm:1.2.0" + "@img/sharp-libvips-linux-riscv64": "npm:1.2.4" + dependenciesMeta: + "@img/sharp-libvips-linux-riscv64": + optional: true + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-s390x@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-s390x@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-s390x": "npm:1.2.4" dependenciesMeta: "@img/sharp-libvips-linux-s390x": optional: true @@ -640,11 +693,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linux-x64@npm:0.34.3": - version: 0.34.3 - resolution: "@img/sharp-linux-x64@npm:0.34.3" +"@img/sharp-linux-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-x64@npm:0.34.5" dependencies: - "@img/sharp-libvips-linux-x64": "npm:1.2.0" + "@img/sharp-libvips-linux-x64": "npm:1.2.4" dependenciesMeta: "@img/sharp-libvips-linux-x64": optional: true @@ -652,11 +705,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linuxmusl-arm64@npm:0.34.3": - version: 0.34.3 - resolution: "@img/sharp-linuxmusl-arm64@npm:0.34.3" +"@img/sharp-linuxmusl-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linuxmusl-arm64@npm:0.34.5" dependencies: - "@img/sharp-libvips-linuxmusl-arm64": "npm:1.2.0" + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.2.4" dependenciesMeta: "@img/sharp-libvips-linuxmusl-arm64": optional: true @@ -664,11 +717,11 @@ __metadata: languageName: node linkType: hard -"@img/sharp-linuxmusl-x64@npm:0.34.3": - version: 0.34.3 - resolution: "@img/sharp-linuxmusl-x64@npm:0.34.3" +"@img/sharp-linuxmusl-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linuxmusl-x64@npm:0.34.5" dependencies: - "@img/sharp-libvips-linuxmusl-x64": "npm:1.2.0" + "@img/sharp-libvips-linuxmusl-x64": "npm:1.2.4" dependenciesMeta: "@img/sharp-libvips-linuxmusl-x64": optional: true @@ -676,32 +729,32 @@ __metadata: languageName: node linkType: hard -"@img/sharp-wasm32@npm:0.34.3": - version: 0.34.3 - resolution: "@img/sharp-wasm32@npm:0.34.3" +"@img/sharp-wasm32@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-wasm32@npm:0.34.5" dependencies: - "@emnapi/runtime": "npm:^1.4.4" + "@emnapi/runtime": "npm:^1.7.0" conditions: cpu=wasm32 languageName: node linkType: hard -"@img/sharp-win32-arm64@npm:0.34.3": - version: 0.34.3 - resolution: "@img/sharp-win32-arm64@npm:0.34.3" +"@img/sharp-win32-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-arm64@npm:0.34.5" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@img/sharp-win32-ia32@npm:0.34.3": - version: 0.34.3 - resolution: "@img/sharp-win32-ia32@npm:0.34.3" +"@img/sharp-win32-ia32@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-ia32@npm:0.34.5" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@img/sharp-win32-x64@npm:0.34.3": - version: 0.34.3 - resolution: "@img/sharp-win32-x64@npm:0.34.3" +"@img/sharp-win32-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-x64@npm:0.34.5" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -729,6 +782,50 @@ __metadata: languageName: node linkType: hard +"@jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10/902f8261dcf450b4af7b93f9656918e02eec80a2169e155000cb2059f90113dd98f3ccf6efc6072cee1dd84cac48cade51da236972d942babc40e4c23da4d62a + languageName: node + linkType: hard + +"@jridgewell/remapping@npm:^2.3.5": + version: 2.3.5 + resolution: "@jridgewell/remapping@npm:2.3.5" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10/c2bb01856e65b506d439455f28aceacf130d6c023d1d4e3b48705e88def3571753e1a887daa04b078b562316c92d26ce36408a60534bceca3f830aec88a339ad + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 10/97106439d750a409c22c8bff822d648f6a71f3aa9bc8e5129efdc36343cd3096ddc4eeb1c62d2fe48e9bdd4db37b05d4646a17114ecebd3bbcacfa2de51c3c1d + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: 10/5d9d207b462c11e322d71911e55e21a4e2772f71ffe8d6f1221b8eb5ae6774458c1d242f897fb0814e8714ca9a6b498abfa74dfe4f434493342902b1a48b33a5 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.28": + version: 0.3.31 + resolution: "@jridgewell/trace-mapping@npm:0.3.31" + dependencies: + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 10/da0283270e691bdb5543806077548532791608e52386cfbbf3b9e8fb00457859d1bd01d512851161c886eb3a2f3ce6fd9bcf25db8edf3bddedd275bd4a88d606 + languageName: node + linkType: hard + "@lezer/common@npm:^1.0.0, @lezer/common@npm:^1.0.2, @lezer/common@npm:^1.1.0, @lezer/common@npm:^1.2.0, @lezer/common@npm:^1.3.0": version: 1.3.0 resolution: "@lezer/common@npm:1.3.0" @@ -854,25 +951,25 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:15.5.9": - version: 15.5.9 - resolution: "@next/env@npm:15.5.9" - checksum: 10/962329701343c2617c85ae99ef35adfd9e8f7b58d9c0316f2f0857f82875a91ef3151ef0743c50964b0066aa3d1214c5193cf229f7757d7c9329f7fb95605a4a +"@next/env@npm:16.1.6": + version: 16.1.6 + resolution: "@next/env@npm:16.1.6" + checksum: 10/52f17ead23b3dc42e613be469b3a179c9c199f43ab42dfcba1f1bc25adba3d7818b4159ab1c797ddfa64a081c21cc1f753a997c14e164d8a88873e0774395d37 languageName: node linkType: hard -"@next/eslint-plugin-next@npm:15.5.7": - version: 15.5.7 - resolution: "@next/eslint-plugin-next@npm:15.5.7" +"@next/eslint-plugin-next@npm:16.1.6": + version: 16.1.6 + resolution: "@next/eslint-plugin-next@npm:16.1.6" dependencies: fast-glob: "npm:3.3.1" - checksum: 10/5b59860aeccc0d07a979c40e4405b410a9d7aa86a235d5dc0edbac8d2da35586f6f2fa3407cd3d80fd7e7d4f197c70291e9c6e71a64942d09b8fe82470e90ee0 + checksum: 10/74b427e005cd5f0ecf7b557fcbca1780f32b94c6e0fa3a774c20b79391ce660e6b52e2e70022c374f1473000de187188e58c812d53e4db440c3d8ee0848477be languageName: node linkType: hard -"@next/mdx@npm:15.5.7": - version: 15.5.7 - resolution: "@next/mdx@npm:15.5.7" +"@next/mdx@npm:16.1.6": + version: 16.1.6 + resolution: "@next/mdx@npm:16.1.6" dependencies: source-map: "npm:^0.7.0" peerDependencies: @@ -883,62 +980,62 @@ __metadata: optional: true "@mdx-js/react": optional: true - checksum: 10/caf2ad1e3a8b02381ad33fe32f59e2ef4c15c96a04ba2a7d713991c142214d3b69d25b879ffc12da1c333ffd34d30aec44061d740f708c8e12529b183a159146 + checksum: 10/830bc4c38f6c38c1420348e96a6f172c88bf32a2dc670f58593b3863bf8f0acd31c0880a231a59257c9f7acaf2a70a9e90e7fae6dd1a3dcf2e0ab3f643cdb1f5 languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:15.5.7": - version: 15.5.7 - resolution: "@next/swc-darwin-arm64@npm:15.5.7" +"@next/swc-darwin-arm64@npm:16.1.6": + version: 16.1.6 + resolution: "@next/swc-darwin-arm64@npm:16.1.6" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:15.5.7": - version: 15.5.7 - resolution: "@next/swc-darwin-x64@npm:15.5.7" +"@next/swc-darwin-x64@npm:16.1.6": + version: 16.1.6 + resolution: "@next/swc-darwin-x64@npm:16.1.6" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:15.5.7": - version: 15.5.7 - resolution: "@next/swc-linux-arm64-gnu@npm:15.5.7" +"@next/swc-linux-arm64-gnu@npm:16.1.6": + version: 16.1.6 + resolution: "@next/swc-linux-arm64-gnu@npm:16.1.6" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:15.5.7": - version: 15.5.7 - resolution: "@next/swc-linux-arm64-musl@npm:15.5.7" +"@next/swc-linux-arm64-musl@npm:16.1.6": + version: 16.1.6 + resolution: "@next/swc-linux-arm64-musl@npm:16.1.6" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:15.5.7": - version: 15.5.7 - resolution: "@next/swc-linux-x64-gnu@npm:15.5.7" +"@next/swc-linux-x64-gnu@npm:16.1.6": + version: 16.1.6 + resolution: "@next/swc-linux-x64-gnu@npm:16.1.6" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:15.5.7": - version: 15.5.7 - resolution: "@next/swc-linux-x64-musl@npm:15.5.7" +"@next/swc-linux-x64-musl@npm:16.1.6": + version: 16.1.6 + resolution: "@next/swc-linux-x64-musl@npm:16.1.6" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:15.5.7": - version: 15.5.7 - resolution: "@next/swc-win32-arm64-msvc@npm:15.5.7" +"@next/swc-win32-arm64-msvc@npm:16.1.6": + version: 16.1.6 + resolution: "@next/swc-win32-arm64-msvc@npm:16.1.6" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:15.5.7": - version: 15.5.7 - resolution: "@next/swc-win32-x64-msvc@npm:15.5.7" +"@next/swc-win32-x64-msvc@npm:16.1.6": + version: 16.1.6 + resolution: "@next/swc-win32-x64-msvc@npm:16.1.6" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -960,7 +1057,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": +"@nodelib/fs.walk@npm:^1.2.3": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -1131,11 +1228,11 @@ __metadata: linkType: hard "@remixicon/react@npm:^4.6.0": - version: 4.7.0 - resolution: "@remixicon/react@npm:4.7.0" + version: 4.8.0 + resolution: "@remixicon/react@npm:4.8.0" peerDependencies: react: ">=18.2.0" - checksum: 10/9ecee093dd4aec3744bcc7562eddb987bf9c7c059787dfecfbcc25a64c2f4833dc815dff715aa2a7f75011d65f877b3751a401d19cf2d725b5bcc685587d37f4 + checksum: 10/10241f2e07826ce7d595cf9687a35c96cc9cf9eb68a9431d7dfa1b9df479dbef302874d28c0502cee2a536cf34722de7c49ed12d10a2b071e4e42ba4a278c516 languageName: node linkType: hard @@ -1146,81 +1243,74 @@ __metadata: languageName: node linkType: hard -"@rushstack/eslint-patch@npm:^1.10.3": - version: 1.12.0 - resolution: "@rushstack/eslint-patch@npm:1.12.0" - checksum: 10/d03e67425e6bd6dd6521dd2e1c04a676ae439ea1ddb528775f8f9d8d87d52d535120650d06d6b3782e209e3b799ff901fa36abb4fe636f90a5c631d240b1237d - languageName: node - linkType: hard - -"@shikijs/core@npm:3.19.0": - version: 3.19.0 - resolution: "@shikijs/core@npm:3.19.0" +"@shikijs/core@npm:3.22.0": + version: 3.22.0 + resolution: "@shikijs/core@npm:3.22.0" dependencies: - "@shikijs/types": "npm:3.19.0" + "@shikijs/types": "npm:3.22.0" "@shikijs/vscode-textmate": "npm:^10.0.2" "@types/hast": "npm:^3.0.4" hast-util-to-html: "npm:^9.0.5" - checksum: 10/78fc5f849636459e267cd77f3e60b492c8260a8be9449d3b1b3a463eab22153354ca6c961e021f936cb8251695298d85913b2cb3b31aafa343fdddadebbfed1c + checksum: 10/fc716bb042accd5061d0de142ee28c20b6e6d489f6516b901ee4db9ed5d802f59c9033106d8140c111a909b761d79523fced92c1367a6f97c4f0e0dad0f29bc9 languageName: node linkType: hard -"@shikijs/engine-javascript@npm:3.19.0": - version: 3.19.0 - resolution: "@shikijs/engine-javascript@npm:3.19.0" +"@shikijs/engine-javascript@npm:3.22.0": + version: 3.22.0 + resolution: "@shikijs/engine-javascript@npm:3.22.0" dependencies: - "@shikijs/types": "npm:3.19.0" + "@shikijs/types": "npm:3.22.0" "@shikijs/vscode-textmate": "npm:^10.0.2" oniguruma-to-es: "npm:^4.3.4" - checksum: 10/7b493cfce620976efd1d7cb3df946370897cac0c16fb71b089be9e197fde43ee60a3d1317db45820c61bcae47ae8e4ac4df91555454e733cd239dc064ef6cc03 + checksum: 10/2fcadb897d0220ca70cc63d697e474ce13addc462a387249a852c882a58b9a1e7d6f9b42f694d324403c4acde8486dd54823228602f5ff4270e4298a43c10f51 languageName: node linkType: hard -"@shikijs/engine-oniguruma@npm:3.19.0": - version: 3.19.0 - resolution: "@shikijs/engine-oniguruma@npm:3.19.0" +"@shikijs/engine-oniguruma@npm:3.22.0": + version: 3.22.0 + resolution: "@shikijs/engine-oniguruma@npm:3.22.0" dependencies: - "@shikijs/types": "npm:3.19.0" + "@shikijs/types": "npm:3.22.0" "@shikijs/vscode-textmate": "npm:^10.0.2" - checksum: 10/6bf6e35aa61f62b1a532071d11e1937a67fb68469c1886ab3c06c6d384b8feee589973ee101cbebefad9ff9405040ee640ced429e83b9dddd906f07d994a1939 + checksum: 10/611654868bc2538ab4d7c3770ad2829a623fcf354ce5c09ba8fde29ecc106b5e4a6270de7d970da4524c1ad00d4f7ed3e5afef2be2ff0b94f8bb8541d0775320 languageName: node linkType: hard -"@shikijs/langs@npm:3.19.0": - version: 3.19.0 - resolution: "@shikijs/langs@npm:3.19.0" +"@shikijs/langs@npm:3.22.0": + version: 3.22.0 + resolution: "@shikijs/langs@npm:3.22.0" dependencies: - "@shikijs/types": "npm:3.19.0" - checksum: 10/679d61b89132c858bd1e96fc7a46fbae56dc8e9be176586cabb57cd9504bb7ea45bbd22879f63d822957060fe322302ad9824b9a6f18415a86b54e22347c0c2d + "@shikijs/types": "npm:3.22.0" + checksum: 10/091cdaeda7763e1170a6a289315a8371f07af541ad4d8fe17a247b45c4a3be82dc9d321a1e4589cdc8464a694692a5c8bfdd1909372b6ec52b0caa53d69e4a1f languageName: node linkType: hard -"@shikijs/themes@npm:3.19.0": - version: 3.19.0 - resolution: "@shikijs/themes@npm:3.19.0" +"@shikijs/themes@npm:3.22.0": + version: 3.22.0 + resolution: "@shikijs/themes@npm:3.22.0" dependencies: - "@shikijs/types": "npm:3.19.0" - checksum: 10/7eb53912fe8b877e6fc498c937188ae55b960c681f65cd4201f2c3a919b0f5951f9ce090819ded5dc4eb0aabe7a811ba705a19b5c003e0dbfebad08d1ba535d5 + "@shikijs/types": "npm:3.22.0" + checksum: 10/ba60849b4056ea4e243e2c2047382312e504d10f8e1ee09d73041d9de54bce30e28c79168406d8a8e3b7a7ab19d0f9c610e3469679f96145aa975460ac7e1407 languageName: node linkType: hard "@shikijs/transformers@npm:^3.13.0": - version: 3.19.0 - resolution: "@shikijs/transformers@npm:3.19.0" + version: 3.22.0 + resolution: "@shikijs/transformers@npm:3.22.0" dependencies: - "@shikijs/core": "npm:3.19.0" - "@shikijs/types": "npm:3.19.0" - checksum: 10/813c2e4053007a8516ebae8c06f4fa2e7b42c6570ea4cae88ecd8bb749695be023ca3b271f8152559dbb74ed36404a77f76c14f63632dc44f225d963a446b1d1 + "@shikijs/core": "npm:3.22.0" + "@shikijs/types": "npm:3.22.0" + checksum: 10/782569a5a8a09dae18402162ad10bba36d8c4e4b6f01c613ccc8151071b06872c9bc32f06bb31147bb58b545b034cd5340d21b1c80c2862cef3983fac6eaef3c languageName: node linkType: hard -"@shikijs/types@npm:3.19.0": - version: 3.19.0 - resolution: "@shikijs/types@npm:3.19.0" +"@shikijs/types@npm:3.22.0": + version: 3.22.0 + resolution: "@shikijs/types@npm:3.22.0" dependencies: "@shikijs/vscode-textmate": "npm:^10.0.2" "@types/hast": "npm:^3.0.4" - checksum: 10/3f0e79f2ecbb0754ad08626e14313701a15dd1dbda1a1295d1e35a172b4555339a135118fabcc3ebdbf5017ceb64dbe3e5096268c3034c0c91ba3b0848e4b162 + checksum: 10/c5abd9050d4645bbf9f6c9af1a3df31d24d823d21c232e47b171cc68bd4865adab20533503a5c97ffb9e87eae2f88e7a3835d64a0a8aa11a69dbfd45aabd58bf languageName: node linkType: hard @@ -1231,109 +1321,6 @@ __metadata: languageName: node linkType: hard -"@storybook/components@npm:8.6.14": - version: 8.6.14 - resolution: "@storybook/components@npm:8.6.14" - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 10/d3647505510313aa3c32fd1f8f202eda723ad99bd353b20aa929c5ecab4edc3c86ad06d0eac02f3c6d948e88f13f65ca5fa35ef27c079ef1b92abe8692f23699 - languageName: node - linkType: hard - -"@storybook/core@npm:8.6.14": - version: 8.6.14 - resolution: "@storybook/core@npm:8.6.14" - dependencies: - "@storybook/theming": "npm:8.6.14" - better-opn: "npm:^3.0.2" - browser-assert: "npm:^1.2.1" - esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0" - esbuild-register: "npm:^3.5.0" - jsdoc-type-pratt-parser: "npm:^4.0.0" - process: "npm:^0.11.10" - recast: "npm:^0.23.5" - semver: "npm:^7.6.2" - util: "npm:^0.12.5" - ws: "npm:^8.2.3" - peerDependencies: - prettier: ^2 || ^3 - peerDependenciesMeta: - prettier: - optional: true - checksum: 10/8f8c811edd4ea8dcedcc63a79b3168dc83aa0401e3760990cb5995ea6beaac4026c6ccc1046182f41eed7c09333005f3348d8b42f89fc5dd5b2ce011a9d2a48f - languageName: node - linkType: hard - -"@storybook/global@npm:^5.0.0": - version: 5.0.0 - resolution: "@storybook/global@npm:5.0.0" - checksum: 10/0e7b495f4fe7f36447e793926f1c0460ec07fd66f0da68e3150da5878f6043c9eeb9b41614a45c5ec0d48d5d383c59ca8f88b6dc7882a2a784ac9b20375d8edb - languageName: node - linkType: hard - -"@storybook/manager-api@npm:8.6.14": - version: 8.6.14 - resolution: "@storybook/manager-api@npm:8.6.14" - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 10/4544b317050b81574f1cd6f911dcb99ee2adbd7190555209171a7dd2233cd331165fa11c16a5977ebe58eeaf26c86bbfcb23f701cfd79a10f0d034dae65197bd - languageName: node - linkType: hard - -"@storybook/preview-api@npm:8.6.14": - version: 8.6.14 - resolution: "@storybook/preview-api@npm:8.6.14" - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 10/9b77288f2f627a7c70cfd3e88bdc4348c1425fab6b333ed77efb913e45881bcdf2ca67f1174e47fe978a7993c2a653fb8accf518ba51441cfb9450145101e9d8 - languageName: node - linkType: hard - -"@storybook/react-dom-shim@npm:8.6.14": - version: 8.6.14 - resolution: "@storybook/react-dom-shim@npm:8.6.14" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.14 - checksum: 10/d14d970b98dc8266d4df80225538fb537449c15877f0f54465dfe52242f0c3f041c975824cc2894f72a3a8023fdffa0a281d90325b95297858e3684913b3cc15 - languageName: node - linkType: hard - -"@storybook/react@npm:^8.6.12": - version: 8.6.14 - resolution: "@storybook/react@npm:8.6.14" - dependencies: - "@storybook/components": "npm:8.6.14" - "@storybook/global": "npm:^5.0.0" - "@storybook/manager-api": "npm:8.6.14" - "@storybook/preview-api": "npm:8.6.14" - "@storybook/react-dom-shim": "npm:8.6.14" - "@storybook/theming": "npm:8.6.14" - peerDependencies: - "@storybook/test": 8.6.14 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.14 - typescript: ">= 4.2.x" - peerDependenciesMeta: - "@storybook/test": - optional: true - typescript: - optional: true - checksum: 10/a8710dcb80da9df4a78cfb3560a8c0c31c6f6c04902aa95446d4e40f6a9179770ead6f9a0a06fa44d00677cd1cd92eb60fdc57f433035ec722275847139671a4 - languageName: node - linkType: hard - -"@storybook/theming@npm:8.6.14": - version: 8.6.14 - resolution: "@storybook/theming@npm:8.6.14" - peerDependencies: - storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - checksum: 10/6936ea3348968fe598ad47421c11a78c6ee2ce62336ea1ce9cb8257e9faa2553d3ac3e443f8a36d35a41b0d60eb169231516649c710582ec68fdead4f23ffc0e - languageName: node - linkType: hard - "@swc/helpers@npm:0.5.15": version: 0.5.15 resolution: "@swc/helpers@npm:0.5.15" @@ -1370,7 +1357,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.0": +"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6": version: 1.0.8 resolution: "@types/estree@npm:1.0.8" checksum: 10/25a4c16a6752538ffde2826c2cc0c6491d90e69cd6187bef4a006dd2c3c45469f049e643d7e516c515f21484dc3d48fd5c870be158a5beb72f5baf3dc43e4099 @@ -1386,6 +1373,13 @@ __metadata: languageName: node linkType: hard +"@types/json-schema@npm:^7.0.15": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 10/1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 + languageName: node + linkType: hard + "@types/json5@npm:^0.0.29": version: 0.0.29 resolution: "@types/json5@npm:0.0.29" @@ -1425,21 +1419,21 @@ __metadata: languageName: node linkType: hard -"@types/react-dom@npm:19.1.7": - version: 19.1.7 - resolution: "@types/react-dom@npm:19.1.7" +"@types/react-dom@npm:19.2.3": + version: 19.2.3 + resolution: "@types/react-dom@npm:19.2.3" peerDependencies: - "@types/react": ^19.0.0 - checksum: 10/a99465e5a17d40725dedb3708357f8998c57caab768cee0992b4bb7822ce7ed2ec697a5f426cb98d3397b020756a6e4b0986dc5f6f4254e13b3536afb38538e6 + "@types/react": ^19.2.0 + checksum: 10/616c4a8aee250ea05fb1e7b98e7e00475dd3a6c1c30d7be18b4b93caba832f4203106b3a496a6b147e5acc2da14575eca47bce234c633bca1f8430ef8ffb234a languageName: node linkType: hard -"@types/react@npm:19.1.9": - version: 19.1.9 - resolution: "@types/react@npm:19.1.9" +"@types/react@npm:19.2.10": + version: 19.2.10 + resolution: "@types/react@npm:19.2.10" dependencies: - csstype: "npm:^3.0.2" - checksum: 10/b1032eae52e3b4f2a8b9ea6aac936385a78b7eff55cad4ff4f0d7e726c6ea87c1f287a1ba0e57a76a8e4456d3fb918b4f97a01e71686fdc11a65b26b8d296be4 + csstype: "npm:^3.2.2" + checksum: 10/0e34a0e42db02f4b3f4bed446128c555446c2854b833d71d597e6c8b08800dd90519a03a226ad250cccc4a0c9e51bd3f9c54cdcb79ee1219f4d5b318fb3a3813 languageName: node linkType: hard @@ -1457,146 +1451,144 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": - version: 8.39.1 - resolution: "@typescript-eslint/eslint-plugin@npm:8.39.1" +"@typescript-eslint/eslint-plugin@npm:8.54.0": + version: 8.54.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.54.0" dependencies: - "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.39.1" - "@typescript-eslint/type-utils": "npm:8.39.1" - "@typescript-eslint/utils": "npm:8.39.1" - "@typescript-eslint/visitor-keys": "npm:8.39.1" - graphemer: "npm:^1.4.0" - ignore: "npm:^7.0.0" + "@eslint-community/regexpp": "npm:^4.12.2" + "@typescript-eslint/scope-manager": "npm:8.54.0" + "@typescript-eslint/type-utils": "npm:8.54.0" + "@typescript-eslint/utils": "npm:8.54.0" + "@typescript-eslint/visitor-keys": "npm:8.54.0" + ignore: "npm:^7.0.5" natural-compare: "npm:^1.4.0" - ts-api-utils: "npm:^2.1.0" + ts-api-utils: "npm:^2.4.0" peerDependencies: - "@typescript-eslint/parser": ^8.39.1 + "@typescript-eslint/parser": ^8.54.0 eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10/446050aa43d54c0107c7c927ae1f68a4384c2bba514d5c22edabbe355426cb37bd5bb5a3faf240a6be8ef06f68de6099c2a53d9cbb1849ed35a152fb156171e2 + checksum: 10/8f1c74ac77d7a84ae3f201bb09cb67271662befed036266af1eaa0653d09b545353441640516c1c86e0a94939887d32f0473c61a642488b14d46533742bfbd1b languageName: node linkType: hard -"@typescript-eslint/parser@npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": - version: 8.39.1 - resolution: "@typescript-eslint/parser@npm:8.39.1" +"@typescript-eslint/parser@npm:8.54.0": + version: 8.54.0 + resolution: "@typescript-eslint/parser@npm:8.54.0" dependencies: - "@typescript-eslint/scope-manager": "npm:8.39.1" - "@typescript-eslint/types": "npm:8.39.1" - "@typescript-eslint/typescript-estree": "npm:8.39.1" - "@typescript-eslint/visitor-keys": "npm:8.39.1" - debug: "npm:^4.3.4" + "@typescript-eslint/scope-manager": "npm:8.54.0" + "@typescript-eslint/types": "npm:8.54.0" + "@typescript-eslint/typescript-estree": "npm:8.54.0" + "@typescript-eslint/visitor-keys": "npm:8.54.0" + debug: "npm:^4.4.3" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10/ff45ce76353ed564e0f9db47b02b4b20895c96182b3693c610ef3dbceda373c476037a99f90d9f28633c192f301e5d554c89e1ba72da216763f960648ddf1f34 + checksum: 10/d2e09462c9966ef3deeba71d9e41d1d4876c61eea65888c93a3db6fba48b89a2165459c6519741d40e969da05ed98d3f4c87a7f56c5521ab5699743cc315f6cb languageName: node linkType: hard -"@typescript-eslint/project-service@npm:8.39.1": - version: 8.39.1 - resolution: "@typescript-eslint/project-service@npm:8.39.1" +"@typescript-eslint/project-service@npm:8.54.0": + version: 8.54.0 + resolution: "@typescript-eslint/project-service@npm:8.54.0" dependencies: - "@typescript-eslint/tsconfig-utils": "npm:^8.39.1" - "@typescript-eslint/types": "npm:^8.39.1" - debug: "npm:^4.3.4" + "@typescript-eslint/tsconfig-utils": "npm:^8.54.0" + "@typescript-eslint/types": "npm:^8.54.0" + debug: "npm:^4.4.3" peerDependencies: typescript: ">=4.8.4 <6.0.0" - checksum: 10/1970633d1a338190f0125e186beaa39b3ef912f287e4815934faf64b72f140e87fdf7d861962683635a450d270dd76faf0c865d72bfd57b471a36739f943676b + checksum: 10/93f0483f6bbcf7cf776a53a130f7606f597fba67cf111e1897873bf1531efaa96e4851cfd461da0f0cc93afbdb51e47bcce11cf7dd4fb68b7030c7f9f240b92f languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.39.1": - version: 8.39.1 - resolution: "@typescript-eslint/scope-manager@npm:8.39.1" +"@typescript-eslint/scope-manager@npm:8.54.0": + version: 8.54.0 + resolution: "@typescript-eslint/scope-manager@npm:8.54.0" dependencies: - "@typescript-eslint/types": "npm:8.39.1" - "@typescript-eslint/visitor-keys": "npm:8.39.1" - checksum: 10/8874f7479043b3fc878f2c04b2c565051deceb7e425a8e4e79a7f40f1ee696bb979bd91fff619e016fe6793f537b30609c0ee8a5c40911c4829fa264863f7a70 + "@typescript-eslint/types": "npm:8.54.0" + "@typescript-eslint/visitor-keys": "npm:8.54.0" + checksum: 10/3474f3197e8647754393dee62b3145c9de71eaa66c8a68f61c8283aa332141803885db9c96caa6a51f78128ad9ef92f774a90361655e57bd951d5b57eb76f914 languageName: node linkType: hard -"@typescript-eslint/tsconfig-utils@npm:8.39.1, @typescript-eslint/tsconfig-utils@npm:^8.39.1": - version: 8.39.1 - resolution: "@typescript-eslint/tsconfig-utils@npm:8.39.1" +"@typescript-eslint/tsconfig-utils@npm:8.54.0, @typescript-eslint/tsconfig-utils@npm:^8.54.0": + version: 8.54.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.54.0" peerDependencies: typescript: ">=4.8.4 <6.0.0" - checksum: 10/38c1e1982504e606e525ad0ce47fdb4c7acc686a28a94c2b30fe988c439977e991ce69cb88a1724a41a8096fc2d18d7ced7fe8725e42879d841515ff36a37ecf + checksum: 10/e9d6b29538716f007919bfcee94f09b7f8e7d2b684ad43d1a3c8d43afb9f0539c7707f84a34f42054e31c8c056b0ccf06575d89e860b4d34632ffefaefafe1fc languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.39.1": - version: 8.39.1 - resolution: "@typescript-eslint/type-utils@npm:8.39.1" +"@typescript-eslint/type-utils@npm:8.54.0": + version: 8.54.0 + resolution: "@typescript-eslint/type-utils@npm:8.54.0" dependencies: - "@typescript-eslint/types": "npm:8.39.1" - "@typescript-eslint/typescript-estree": "npm:8.39.1" - "@typescript-eslint/utils": "npm:8.39.1" - debug: "npm:^4.3.4" - ts-api-utils: "npm:^2.1.0" + "@typescript-eslint/types": "npm:8.54.0" + "@typescript-eslint/typescript-estree": "npm:8.54.0" + "@typescript-eslint/utils": "npm:8.54.0" + debug: "npm:^4.4.3" + ts-api-utils: "npm:^2.4.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10/1195d65970f79f820558810f7e1edf0ea360bbeee55841fdbb71b5b40c09f1a65741b67a70b85c2834ae1f9a027b82da4234d01f42ab4e85dceef3eea84bfdaa + checksum: 10/60e92fb32274abd70165ce6f4187e4cffa55416374c63731d7de8fdcfb7a558b4dd48909ff1ad38ac39d2ea1248ec54d6ce38dbc065fd34529a217fc2450d5b1 languageName: node linkType: hard -"@typescript-eslint/types@npm:8.39.1, @typescript-eslint/types@npm:^8.39.1": - version: 8.39.1 - resolution: "@typescript-eslint/types@npm:8.39.1" - checksum: 10/8013f4f48a98da0de270d5fef1ff28b35407de82fce5acf3efa212fce60bc92a81bbb15b4b358d9facf4f161e49feec856fbf1a6d96f5027d013b542f2fe1bcc +"@typescript-eslint/types@npm:8.54.0, @typescript-eslint/types@npm:^8.54.0": + version: 8.54.0 + resolution: "@typescript-eslint/types@npm:8.54.0" + checksum: 10/c25cc0bdf90fb150cf6ce498897f43fe3adf9e872562159118f34bd91a9bfab5f720cb1a41f3cdf253b2e840145d7d372089b7cef5156624ef31e98d34f91b31 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.39.1": - version: 8.39.1 - resolution: "@typescript-eslint/typescript-estree@npm:8.39.1" +"@typescript-eslint/typescript-estree@npm:8.54.0": + version: 8.54.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.54.0" dependencies: - "@typescript-eslint/project-service": "npm:8.39.1" - "@typescript-eslint/tsconfig-utils": "npm:8.39.1" - "@typescript-eslint/types": "npm:8.39.1" - "@typescript-eslint/visitor-keys": "npm:8.39.1" - debug: "npm:^4.3.4" - fast-glob: "npm:^3.3.2" - is-glob: "npm:^4.0.3" - minimatch: "npm:^9.0.4" - semver: "npm:^7.6.0" - ts-api-utils: "npm:^2.1.0" + "@typescript-eslint/project-service": "npm:8.54.0" + "@typescript-eslint/tsconfig-utils": "npm:8.54.0" + "@typescript-eslint/types": "npm:8.54.0" + "@typescript-eslint/visitor-keys": "npm:8.54.0" + debug: "npm:^4.4.3" + minimatch: "npm:^9.0.5" + semver: "npm:^7.7.3" + tinyglobby: "npm:^0.2.15" + ts-api-utils: "npm:^2.4.0" peerDependencies: typescript: ">=4.8.4 <6.0.0" - checksum: 10/07ed9d7ab4d146ee3ce6cf82ffebf947e045a9289b01522e11b3985b64f590c00cac0ca10366df828ca213bf08216a67c7b2b76e7c8be650df2511a7e6385425 + checksum: 10/3a545037c6f9319251d3ba44cf7a3216b1372422469e27f7ed3415244ebf42553da1ab4644da42d3f0ae2706a8cad12529ffebcb2e75406f74e3b30b812d010d languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.39.1": - version: 8.39.1 - resolution: "@typescript-eslint/utils@npm:8.39.1" +"@typescript-eslint/utils@npm:8.54.0": + version: 8.54.0 + resolution: "@typescript-eslint/utils@npm:8.54.0" dependencies: - "@eslint-community/eslint-utils": "npm:^4.7.0" - "@typescript-eslint/scope-manager": "npm:8.39.1" - "@typescript-eslint/types": "npm:8.39.1" - "@typescript-eslint/typescript-estree": "npm:8.39.1" + "@eslint-community/eslint-utils": "npm:^4.9.1" + "@typescript-eslint/scope-manager": "npm:8.54.0" + "@typescript-eslint/types": "npm:8.54.0" + "@typescript-eslint/typescript-estree": "npm:8.54.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10/39bb105f26aa1ba234ad7d284c277cbd66df9d51e245094892db140aac80d3656d0480f133b2db54e87af3ef9c371a12973120c9cfbff71e8e85865f9e1d0077 + checksum: 10/9f88a2a7ab3e11aa0ff7f99c0e66a0cf2cba10b640def4c64a4f4ef427fecfb22f28dbe5697535915eb01f6507515ac43e45e0ff384bf82856e3420194d9ffdd languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.39.1": - version: 8.39.1 - resolution: "@typescript-eslint/visitor-keys@npm:8.39.1" +"@typescript-eslint/visitor-keys@npm:8.54.0": + version: 8.54.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.54.0" dependencies: - "@typescript-eslint/types": "npm:8.39.1" + "@typescript-eslint/types": "npm:8.54.0" eslint-visitor-keys: "npm:^4.2.1" - checksum: 10/6d4e4d0b19ebb3f21b692bbb0dcf9961876ca28cdf502296888a78eb4cd802a2ec8d3d5721d19970411edfd1c06f3e272e4057014c859ee1f0546804d07945e3 + checksum: 10/cca5380ee30250302ee1459e5a0a38de8c16213026dbbff3d167fa7d71d012f31d60ac4483ad45ebd13f2ac963d1ca52dd5f22759a68d4ee57626e421769187a languageName: node linkType: hard -"@uiw/codemirror-extensions-basic-setup@npm:4.25.3": - version: 4.25.3 - resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.25.3" +"@uiw/codemirror-extensions-basic-setup@npm:4.25.4": + version: 4.25.4 + resolution: "@uiw/codemirror-extensions-basic-setup@npm:4.25.4" dependencies: "@codemirror/autocomplete": "npm:^6.0.0" "@codemirror/commands": "npm:^6.0.0" @@ -1613,7 +1605,7 @@ __metadata: "@codemirror/search": ">=6.0.0" "@codemirror/state": ">=6.0.0" "@codemirror/view": ">=6.0.0" - checksum: 10/6ece4ee0fd6433a81bb6b2e18623db3df097d31d13c53184fbf4355cf3aaac5201d73dfa984f58390f0f6f7cfb631bd2ee20f3613b99b7259e2e1352e954c179 + checksum: 10/8fa523af7cb4ea36db5263221e5a34ecbf18e57ee5c57fbb46f7bfd08ff08523b9fe2c5ae376117d98edaa1a904d1a2966123710e0d866a78ec2d1359955773c languageName: node linkType: hard @@ -1633,14 +1625,14 @@ __metadata: linkType: hard "@uiw/react-codemirror@npm:^4.23.7": - version: 4.25.3 - resolution: "@uiw/react-codemirror@npm:4.25.3" + version: 4.25.4 + resolution: "@uiw/react-codemirror@npm:4.25.4" 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.3" + "@uiw/codemirror-extensions-basic-setup": "npm:4.25.4" codemirror: "npm:^6.0.0" peerDependencies: "@babel/runtime": ">=7.11.0" @@ -1650,11 +1642,11 @@ __metadata: codemirror: ">=6.0.0" react: ">=17.0.0" react-dom: ">=17.0.0" - checksum: 10/a3ece671a48cce623da6c9d890f07bdbb1597b2fb2a6f8f6ef65f2b14b5d5b4fa90791476539b4fba3ac13d226fe00d283a5165d3632f34f5db3b49139a8887d + checksum: 10/679966cfa5cc2e7d5b7c8b40060018bebfc3a2d66492672c64e659e1c719cedd7a10ed7fb3aa014d77c42927581c4ebdf6760ab56568225781798b35dc13b8c6 languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.0.0, @ungap/structured-clone@npm:^1.2.0": +"@ungap/structured-clone@npm:^1.0.0": version: 1.3.0 resolution: "@ungap/structured-clone@npm:1.3.0" checksum: 10/80d6910946f2b1552a2406650051c91bbd1f24a6bf854354203d84fe2714b3e8ce4618f49cc3410494173a1c1e8e9777372fe68dce74bd45faf0a7a1a6ccf448 @@ -1812,7 +1804,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.0.0, acorn@npm:^8.9.0": +"acorn@npm:^8.0.0, acorn@npm:^8.15.0": version: 8.15.0 resolution: "acorn@npm:8.15.0" bin: @@ -2008,15 +2000,6 @@ __metadata: languageName: node linkType: hard -"ast-types@npm:^0.16.1": - version: 0.16.1 - resolution: "ast-types@npm:0.16.1" - dependencies: - tslib: "npm:^2.0.1" - checksum: 10/f569b475eb1c8cb93888cb6e7b7e36dc43fa19a77e4eb132cbff6e3eb1598ca60f850db6e60b070e5a0ee8c1559fca921dac0916e576f2f104e198793b0bdd8d - languageName: node - linkType: hard - "astring@npm:^1.8.0": version: 1.9.0 resolution: "astring@npm:1.9.0" @@ -2070,6 +2053,15 @@ __metadata: languageName: node linkType: hard +"baseline-browser-mapping@npm:^2.8.3, baseline-browser-mapping@npm:^2.9.0": + version: 2.9.19 + resolution: "baseline-browser-mapping@npm:2.9.19" + bin: + baseline-browser-mapping: dist/cli.js + checksum: 10/8d7bbb7fe3d1ad50e04b127c819ba6d059c01ed0d2a7a5fc3327e23a8c42855fa3a8b510550c1fe1e37916147e6a390243566d3ef85bf6130c8ddfe5cc3db530 + languageName: node + linkType: hard + "before-after-hook@npm:^4.0.0": version: 4.0.0 resolution: "before-after-hook@npm:4.0.0" @@ -2077,15 +2069,6 @@ __metadata: languageName: node linkType: hard -"better-opn@npm:^3.0.2": - version: 3.0.2 - resolution: "better-opn@npm:3.0.2" - dependencies: - open: "npm:^8.0.4" - checksum: 10/24668e5a837d0d2c0edf17ad5ebcfeb00a8a5578a5eb09f7a409e1a60617cdfea40b8ebfc95e5f12d9568157930d033e6805788fcf0780413ac982c95d3745d1 - languageName: node - linkType: hard - "binary-extensions@npm:^2.0.0": version: 2.3.0 resolution: "binary-extensions@npm:2.3.0" @@ -2121,10 +2104,18 @@ __metadata: languageName: node linkType: hard -"browser-assert@npm:^1.2.1": - version: 1.2.1 - resolution: "browser-assert@npm:1.2.1" - checksum: 10/8b2407cd04c1ed592cf892dec35942b7d72635829221e0788c9a16c4d2afa8b7156bc9705b1c4b32c30d88136c576fda3cbcb8f494d6f865264c706ea8798d92 +"browserslist@npm:^4.24.0": + version: 4.28.1 + resolution: "browserslist@npm:4.28.1" + dependencies: + baseline-browser-mapping: "npm:^2.9.0" + caniuse-lite: "npm:^1.0.30001759" + electron-to-chromium: "npm:^1.5.263" + node-releases: "npm:^2.0.27" + update-browserslist-db: "npm:^1.2.0" + bin: + browserslist: cli.js + checksum: 10/64f2a97de4bce8473c0e5ae0af8d76d1ead07a5b05fc6bc87b848678bb9c3a91ae787b27aa98cdd33fc00779607e6c156000bed58fefb9cf8e4c5a183b994cdb languageName: node linkType: hard @@ -2187,10 +2178,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001579": - version: 1.0.30001735 - resolution: "caniuse-lite@npm:1.0.30001735" - checksum: 10/4b404ed363a5ccf3ec07144c2360106aa47dcec1f896ea6705a2773c6977e9ffb19a2b58be9492462733170e29b4823211533b0986d5a25f0f65f7ff702470ab +"caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001759": + version: 1.0.30001766 + resolution: "caniuse-lite@npm:1.0.30001766" + checksum: 10/0edeb69bdb741c98deda609b75e35e5c31e944537e9873ea89a4cf9e9baa3e158675b224951a6f3a212d1f0c328a8494ace323c551ca1fa58ce4915562c4e4d3 languageName: node linkType: hard @@ -2310,33 +2301,13 @@ __metadata: languageName: node linkType: hard -"color-name@npm:^1.0.0, color-name@npm:~1.1.4": +"color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" checksum: 10/b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 languageName: node linkType: hard -"color-string@npm:^1.9.0": - version: 1.9.1 - resolution: "color-string@npm:1.9.1" - dependencies: - color-name: "npm:^1.0.0" - simple-swizzle: "npm:^0.2.2" - checksum: 10/72aa0b81ee71b3f4fb1ac9cd839cdbd7a011a7d318ef58e6cb13b3708dca75c7e45029697260488709f1b1c7ac4e35489a87e528156c1e365917d1c4ccb9b9cd - languageName: node - linkType: hard - -"color@npm:^4.2.3": - version: 4.2.3 - resolution: "color@npm:4.2.3" - dependencies: - color-convert: "npm:^2.0.1" - color-string: "npm:^1.9.0" - checksum: 10/b23f5e500a79ea22428db43d1a70642d983405c0dd1f95ef59dbdb9ba66afbb4773b334fa0b75bb10b0552fd7534c6b28d4db0a8b528f91975976e70973c0152 - languageName: node - linkType: hard - "comma-separated-tokens@npm:^2.0.0": version: 2.0.3 resolution: "comma-separated-tokens@npm:2.0.3" @@ -2351,6 +2322,13 @@ __metadata: languageName: node linkType: hard +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 10/c987be3ec061348cdb3c2bfb924bec86dea1eacad10550a85ca23edb0fe3556c3a61c7399114f3331ccb3499d7fd0285ab24566e5745929412983494c3926e15 + languageName: node + linkType: hard + "crelt@npm:^1.0.5, crelt@npm:^1.0.6": version: 1.0.6 resolution: "crelt@npm:1.0.6" @@ -2358,7 +2336,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.6": +"cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -2369,10 +2347,10 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.2": - version: 3.1.3 - resolution: "csstype@npm:3.1.3" - checksum: 10/f593cce41ff5ade23f44e77521e3a1bcc2c64107041e1bf6c3c32adc5187d0d60983292fda326154d20b01079e24931aa5b08e4467cc488b60bb1e7f6d478ade +"csstype@npm:^3.2.2": + version: 3.2.3 + resolution: "csstype@npm:3.2.3" + checksum: 10/ad41baf7e2ffac65ab544d79107bf7cd1a4bb9bab9ac3302f59ab4ba655d5e30942a8ae46e10ba160c6f4ecea464cc95b975ca2fefbdeeacd6ac63f12f99fe1f languageName: node linkType: hard @@ -2416,15 +2394,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0": - version: 4.4.1 - resolution: "debug@npm:4.4.1" +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.4.0, debug@npm:^4.4.3": + version: 4.4.3 + resolution: "debug@npm:4.4.3" dependencies: ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10/8e2709b2144f03c7950f8804d01ccb3786373df01e406a0f66928e47001cf2d336cbed9ee137261d4f90d68d8679468c755e3548ed83ddacdc82b194d2468afe + checksum: 10/9ada3434ea2993800bd9a1e320bd4aa7af69659fb51cca685d390949434bc0a8873c21ed7c9b852af6f2455a55c6d050aa3937d52b3c69f796dab666f762acad languageName: node linkType: hard @@ -2464,13 +2442,6 @@ __metadata: languageName: node linkType: hard -"define-lazy-prop@npm:^2.0.0": - version: 2.0.0 - resolution: "define-lazy-prop@npm:2.0.0" - checksum: 10/0115fdb065e0490918ba271d7339c42453d209d4cb619dfe635870d906731eff3e1ade8028bb461ea27ce8264ec5e22c6980612d332895977e89c1bbc80fcee2 - languageName: node - linkType: hard - "define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" @@ -2489,10 +2460,10 @@ __metadata: languageName: node linkType: hard -"detect-libc@npm:^2.0.3, detect-libc@npm:^2.0.4": - version: 2.0.4 - resolution: "detect-libc@npm:2.0.4" - checksum: 10/136e995f8c5ffbc515955b0175d441b967defd3d5f2268e89fa695e9c7170d8bed17993e31a34b04f0fad33d844a3a598e0fd519a8e9be3cad5f67662d96fee0 +"detect-libc@npm:^2.0.3, detect-libc@npm:^2.1.2": + version: 2.1.2 + resolution: "detect-libc@npm:2.1.2" + checksum: 10/b736c8d97d5d46164c0d1bed53eb4e6a3b1d8530d460211e2d52f1c552875e706c58a5376854e4e54f8b828c9cada58c855288c968522eb93ac7696d65970766 languageName: node linkType: hard @@ -2515,31 +2486,29 @@ __metadata: "@lezer/highlight": "npm:^1.2.1" "@mdx-js/loader": "npm:^3.1.0" "@mdx-js/react": "npm:^3.1.0" - "@next/mdx": "npm:15.5.7" + "@next/mdx": "npm:16.1.6" "@octokit/rest": "npm:^22.0.1" "@remixicon/react": "npm:^4.6.0" "@shikijs/transformers": "npm:^3.13.0" - "@storybook/react": "npm:^8.6.12" "@types/mdx": "npm:^2.0.13" "@types/node": "npm:^22.13.14" - "@types/react": "npm:19.1.9" - "@types/react-dom": "npm:19.1.7" + "@types/react": "npm:19.2.10" + "@types/react-dom": "npm:19.2.3" "@uiw/codemirror-themes": "npm:^4.23.7" "@uiw/react-codemirror": "npm:^4.23.7" chokidar: "npm:^3.6.0" clsx: "npm:^2.1.1" - eslint: "npm:^8" - eslint-config-next: "npm:15.5.7" + eslint: "npm:^9" + eslint-config-next: "npm:16.1.6" html-react-parser: "npm:^5.2.5" lightningcss: "npm:^1.28.2" motion: "npm:^12.4.1" - next: "npm:15.5.9" + next: "npm:16.1.6" next-mdx-remote-client: "npm:^2.1.2" prop-types: "npm:^15.8.1" - react: "npm:19.1.1" - react-dom: "npm:19.1.1" + react: "npm:19.2.4" + react-dom: "npm:19.2.4" shiki: "npm:^3.13.0" - storybook: "npm:^8.6.12" typescript: "npm:^5" unified: "npm:^11.0.4" languageName: unknown @@ -2554,15 +2523,6 @@ __metadata: languageName: node linkType: hard -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: "npm:^2.0.2" - checksum: 10/b4b28f1df5c563f7d876e7461254a4597b8cabe915abe94d7c5d1633fed263fcf9a85e8d3836591fc2d040108e822b0d32758e5ec1fe31c590dc7e08086e3e48 - languageName: node - linkType: hard - "dom-serializer@npm:^2.0.0": version: 2.0.0 resolution: "dom-serializer@npm:2.0.0" @@ -2590,7 +2550,7 @@ __metadata: languageName: node linkType: hard -"domutils@npm:^3.2.1": +"domutils@npm:^3.2.2": version: 3.2.2 resolution: "domutils@npm:3.2.2" dependencies: @@ -2619,6 +2579,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.5.263": + version: 1.5.282 + resolution: "electron-to-chromium@npm:1.5.282" + checksum: 10/5d32107084ab72199088f2b67ddd632d3c69671ee1ae958cf16f7b9bc1f664cd4c587bb8c45cbd019e15ad49fcc80711c55119040c961c2e48dcf7ddae4961dd + languageName: node + linkType: hard + "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" @@ -2649,10 +2616,10 @@ __metadata: languageName: node linkType: hard -"entities@npm:^6.0.0": - version: 6.0.1 - resolution: "entities@npm:6.0.1" - checksum: 10/62af1307202884349d2867f0aac5c60d8b57102ea0b0e768b16246099512c28e239254ad772d6834e7e14cb1b6f153fc3d0c031934e3183b086c86d3838d874a +"entities@npm:^7.0.1": + version: 7.0.1 + resolution: "entities@npm:7.0.1" + checksum: 10/3c0c58d869c45148463e96d21dee2d1b801bd3fe4cf47aa470cd26dfe81d59e9e0a9be92ae083fa02fa441283c883a471486e94538dcfb8544428aa80a55271b languageName: node linkType: hard @@ -2835,103 +2802,10 @@ __metadata: languageName: node linkType: hard -"esbuild-register@npm:^3.5.0": - version: 3.6.0 - resolution: "esbuild-register@npm:3.6.0" - dependencies: - debug: "npm:^4.3.4" - peerDependencies: - esbuild: ">=0.12 <1" - checksum: 10/4ae1a016e3dad5b53c3d68cf07e31d8c1cec1a0b584038ece726097ac80bd33ab48fb224c766c9b341c04793837e652461eaca9327a116e7564f553b61ccca71 - languageName: node - linkType: hard - -"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0": - version: 0.25.9 - resolution: "esbuild@npm:0.25.9" - dependencies: - "@esbuild/aix-ppc64": "npm:0.25.9" - "@esbuild/android-arm": "npm:0.25.9" - "@esbuild/android-arm64": "npm:0.25.9" - "@esbuild/android-x64": "npm:0.25.9" - "@esbuild/darwin-arm64": "npm:0.25.9" - "@esbuild/darwin-x64": "npm:0.25.9" - "@esbuild/freebsd-arm64": "npm:0.25.9" - "@esbuild/freebsd-x64": "npm:0.25.9" - "@esbuild/linux-arm": "npm:0.25.9" - "@esbuild/linux-arm64": "npm:0.25.9" - "@esbuild/linux-ia32": "npm:0.25.9" - "@esbuild/linux-loong64": "npm:0.25.9" - "@esbuild/linux-mips64el": "npm:0.25.9" - "@esbuild/linux-ppc64": "npm:0.25.9" - "@esbuild/linux-riscv64": "npm:0.25.9" - "@esbuild/linux-s390x": "npm:0.25.9" - "@esbuild/linux-x64": "npm:0.25.9" - "@esbuild/netbsd-arm64": "npm:0.25.9" - "@esbuild/netbsd-x64": "npm:0.25.9" - "@esbuild/openbsd-arm64": "npm:0.25.9" - "@esbuild/openbsd-x64": "npm:0.25.9" - "@esbuild/openharmony-arm64": "npm:0.25.9" - "@esbuild/sunos-x64": "npm:0.25.9" - "@esbuild/win32-arm64": "npm:0.25.9" - "@esbuild/win32-ia32": "npm:0.25.9" - "@esbuild/win32-x64": "npm:0.25.9" - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-arm64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-arm64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/openharmony-arm64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10/fc174ae7f646ad413adb641c7e46f16be575e462ed209866b55d5954d382e5da839e3f3f89a8e42e2b71d48895cc636ba43523011249fe5ff9c63d8d39d3a364 +"escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10/9d7169e3965b2f9ae46971afa392f6e5a25545ea30f2e2dd99c9b0a95a3f52b5653681a84f5b2911a413ddad2d7a93d3514165072f349b5ffc59c75a899970d6 languageName: node linkType: hard @@ -2942,27 +2816,26 @@ __metadata: languageName: node linkType: hard -"eslint-config-next@npm:15.5.7": - version: 15.5.7 - resolution: "eslint-config-next@npm:15.5.7" +"eslint-config-next@npm:16.1.6": + version: 16.1.6 + resolution: "eslint-config-next@npm:16.1.6" dependencies: - "@next/eslint-plugin-next": "npm:15.5.7" - "@rushstack/eslint-patch": "npm:^1.10.3" - "@typescript-eslint/eslint-plugin": "npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" - "@typescript-eslint/parser": "npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" + "@next/eslint-plugin-next": "npm:16.1.6" eslint-import-resolver-node: "npm:^0.3.6" eslint-import-resolver-typescript: "npm:^3.5.2" - eslint-plugin-import: "npm:^2.31.0" + eslint-plugin-import: "npm:^2.32.0" eslint-plugin-jsx-a11y: "npm:^6.10.0" eslint-plugin-react: "npm:^7.37.0" - eslint-plugin-react-hooks: "npm:^5.0.0" + eslint-plugin-react-hooks: "npm:^7.0.0" + globals: "npm:16.4.0" + typescript-eslint: "npm:^8.46.0" peerDependencies: - eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + eslint: ">=9.0.0" typescript: ">=3.3.1" peerDependenciesMeta: typescript: optional: true - checksum: 10/fd1813c7ef4e33ec297b86dd0de75879e10514b12cb04a103e7a5b8c5f27d2ea0a91dd15e6d530006c9fe3e7e18f815e900bd6ba117c3b8fbe311c38c340d899 + checksum: 10/94828d947fe88d921ca9e59931a31d111344bbf23bd8baad50de463b05b23a823c526cb60576443c6c818136d054779970369f049c5c6a6ef7e92fae12f888d7 languageName: node linkType: hard @@ -3013,7 +2886,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-import@npm:^2.31.0": +"eslint-plugin-import@npm:^2.32.0": version: 2.32.0 resolution: "eslint-plugin-import@npm:2.32.0" dependencies: @@ -3067,12 +2940,18 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react-hooks@npm:^5.0.0": - version: 5.2.0 - resolution: "eslint-plugin-react-hooks@npm:5.2.0" +"eslint-plugin-react-hooks@npm:^7.0.0": + version: 7.0.1 + resolution: "eslint-plugin-react-hooks@npm:7.0.1" + dependencies: + "@babel/core": "npm:^7.24.4" + "@babel/parser": "npm:^7.24.4" + hermes-parser: "npm:^0.25.1" + zod: "npm:^3.25.0 || ^4.0.0" + zod-validation-error: "npm:^3.5.0 || ^4.0.0" peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - checksum: 10/ebb79e9cf69ae06e3a7876536653c5e556b5fd8cd9dc49577f10a6e728360e7b6f5ce91f4339b33e93b26e3bb23805418f8b5e75db80baddd617b1dffe73bed1 + checksum: 10/12e96c68d58c6588305fd17d660524a1ef1e872650ec591d5b138f059431290831c373d4b1c9ae8991fb25f96c43935497d2149678c027e65d0417d3d99ecc85 languageName: node linkType: hard @@ -3104,17 +2983,17 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" +"eslint-scope@npm:^8.4.0": + version: 8.4.0 + resolution: "eslint-scope@npm:8.4.0" dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 10/5c660fb905d5883ad018a6fea2b49f3cb5b1cbf2cd4bd08e98646e9864f9bc2c74c0839bed2d292e90a4a328833accc197c8f0baed89cbe8d605d6f918465491 + checksum: 10/e8e611701f65375e034c62123946e628894f0b54aa8cb11abe224816389abe5cd74cf16b62b72baa36504f22d1a958b9b8b0169b82397fe2e7997674c0d09b06 languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 10/3f357c554a9ea794b094a09bd4187e5eacd1bc0d0653c3adeb87962c548e6a1ab8f982b86963ae1337f5d976004146536dcee5d0e2806665b193fbfbf1a9231b @@ -3128,81 +3007,72 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8": - version: 8.57.1 - resolution: "eslint@npm:8.57.1" +"eslint@npm:^9": + version: 9.39.2 + resolution: "eslint@npm:9.39.2" dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.57.1" - "@humanwhocodes/config-array": "npm:^0.13.0" + "@eslint-community/eslint-utils": "npm:^4.8.0" + "@eslint-community/regexpp": "npm:^4.12.1" + "@eslint/config-array": "npm:^0.21.1" + "@eslint/config-helpers": "npm:^0.4.2" + "@eslint/core": "npm:^0.17.0" + "@eslint/eslintrc": "npm:^3.3.1" + "@eslint/js": "npm:9.39.2" + "@eslint/plugin-kit": "npm:^0.4.1" + "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" - "@nodelib/fs.walk": "npm:^1.2.8" - "@ungap/structured-clone": "npm:^1.2.0" + "@humanwhocodes/retry": "npm:^0.4.2" + "@types/estree": "npm:^1.0.6" ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.2" + cross-spawn: "npm:^7.0.6" debug: "npm:^4.3.2" - doctrine: "npm:^3.0.0" escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^7.2.2" - eslint-visitor-keys: "npm:^3.4.3" - espree: "npm:^9.6.1" - esquery: "npm:^1.4.2" + eslint-scope: "npm:^8.4.0" + eslint-visitor-keys: "npm:^4.2.1" + espree: "npm:^10.4.0" + esquery: "npm:^1.5.0" esutils: "npm:^2.0.2" fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^6.0.1" + file-entry-cache: "npm:^8.0.0" find-up: "npm:^5.0.0" glob-parent: "npm:^6.0.2" - globals: "npm:^13.19.0" - graphemer: "npm:^1.4.0" ignore: "npm:^5.2.0" imurmurhash: "npm:^0.1.4" is-glob: "npm:^4.0.0" - is-path-inside: "npm:^3.0.3" - js-yaml: "npm:^4.1.0" json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" lodash.merge: "npm:^4.6.2" minimatch: "npm:^3.1.2" natural-compare: "npm:^1.4.0" optionator: "npm:^0.9.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true bin: eslint: bin/eslint.js - checksum: 10/5504fa24879afdd9f9929b2fbfc2ee9b9441a3d464efd9790fbda5f05738858530182029f13323add68d19fec749d3ab4a70320ded091ca4432b1e9cc4ed104c + checksum: 10/53ff0e9c8264e7e8d40d50fdc0c0df0b701cfc5289beedfb686c214e3e7b199702f894bbd1bb48653727bb1ecbd1147cf5f555a4ae71e1daf35020cdc9072d9f languageName: node linkType: hard -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" +"espree@npm:^10.0.1, espree@npm:^10.4.0": + version: 10.4.0 + resolution: "espree@npm:10.4.0" dependencies: - acorn: "npm:^8.9.0" + acorn: "npm:^8.15.0" acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10/255ab260f0d711a54096bdeda93adff0eadf02a6f9b92f02b323e83a2b7fc258797919437ad331efec3930475feb0142c5ecaaf3cdab4befebd336d47d3f3134 + eslint-visitor-keys: "npm:^4.2.1" + checksum: 10/9b355b32dbd1cc9f57121d5ee3be258fab87ebeb7c83fc6c02e5af1a74fc8c5ba79fe8c663e69ea112c3e84a1b95e6a2067ac4443ee7813bb85ac7581acb8bf9 languageName: node linkType: hard -"esprima@npm:~4.0.0": - version: 4.0.1 - resolution: "esprima@npm:4.0.1" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: 10/f1d3c622ad992421362294f7acf866aa9409fbad4eb2e8fa230bd33944ce371d32279667b242d8b8907ec2b6ad7353a717f3c0e60e748873a34a7905174bc0eb - languageName: node - linkType: hard - -"esquery@npm:^1.4.2": - version: 1.6.0 - resolution: "esquery@npm:1.6.0" +"esquery@npm:^1.5.0": + version: 1.7.0 + resolution: "esquery@npm:1.7.0" dependencies: estraverse: "npm:^5.1.0" - checksum: 10/c587fb8ec9ed83f2b1bc97cf2f6854cc30bf784a79d62ba08c6e358bf22280d69aee12827521cf38e69ae9761d23fb7fde593ce315610f85655c139d99b05e5a + checksum: 10/4afaf3089367e1f5885caa116ef386dffd8bfd64da21fd3d0e56e938d2667cfb2e5400ab4a825aa70e799bb3741e5b5d63c0b94d86e2d4cf3095c9e64b2f5a15 languageName: node linkType: hard @@ -3338,19 +3208,6 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.3.2": - version: 3.3.3 - resolution: "fast-glob@npm:3.3.3" - dependencies: - "@nodelib/fs.stat": "npm:^2.0.2" - "@nodelib/fs.walk": "npm:^1.2.3" - glob-parent: "npm:^5.1.2" - merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.8" - checksum: 10/dcc6432b269762dd47381d8b8358bf964d8f4f60286ac6aa41c01ade70bda459ff2001b516690b96d5365f68a49242966112b5d5cc9cd82395fa8f9d017c90ad - languageName: node - linkType: hard - "fast-json-stable-stringify@npm:^2.0.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" @@ -3374,7 +3231,7 @@ __metadata: languageName: node linkType: hard -"fdir@npm:^6.4.4": +"fdir@npm:^6.5.0": version: 6.5.0 resolution: "fdir@npm:6.5.0" peerDependencies: @@ -3386,12 +3243,12 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" dependencies: - flat-cache: "npm:^3.0.4" - checksum: 10/099bb9d4ab332cb93c48b14807a6918a1da87c45dce91d4b61fd40e6505d56d0697da060cb901c729c90487067d93c9243f5da3dc9c41f0358483bfdebca736b + flat-cache: "npm:^4.0.0" + checksum: 10/afe55c4de4e0d226a23c1eae62a7219aafb390859122608a89fa4df6addf55c7fd3f1a2da6f5b41e7cdff496e4cf28bbd215d53eab5c817afa96d2b40c81bfb0 languageName: node linkType: hard @@ -3414,14 +3271,13 @@ __metadata: languageName: node linkType: hard -"flat-cache@npm:^3.0.4": - version: 3.2.0 - resolution: "flat-cache@npm:3.2.0" +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" dependencies: flatted: "npm:^3.2.9" - keyv: "npm:^4.5.3" - rimraf: "npm:^3.0.2" - checksum: 10/02381c6ece5e9fa5b826c9bbea481d7fd77645d96e4b0b1395238124d581d10e56f17f723d897b6d133970f7a57f0fab9148cbbb67237a0a0ffe794ba60c0c70 + keyv: "npm:^4.5.4" + checksum: 10/58ce851d9045fffc7871ce2bd718bc485ad7e777bf748c054904b87c351ff1080c2c11da00788d78738bfb51b71e4d5ea12d13b98eb36e3358851ffe495b62dc languageName: node linkType: hard @@ -3451,12 +3307,12 @@ __metadata: languageName: node linkType: hard -"framer-motion@npm:^12.23.26": - version: 12.23.26 - resolution: "framer-motion@npm:12.23.26" +"framer-motion@npm:^12.33.0": + version: 12.33.0 + resolution: "framer-motion@npm:12.33.0" dependencies: - motion-dom: "npm:^12.23.23" - motion-utils: "npm:^12.23.6" + motion-dom: "npm:^12.33.0" + motion-utils: "npm:^12.29.2" tslib: "npm:^2.4.0" peerDependencies: "@emotion/is-prop-valid": "*" @@ -3469,7 +3325,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 10/29d51ac57ce8c2599664bf706d7a83c2aba4fe1dee1c0c7d75d5c45c120b1c2ca5d257c3ff608992b26bf8e9cf258cacf231b0873d7b16f01c5eeb42b9831f78 + checksum: 10/e3dd7c3167e4ea7d38d9020a672f8ab8b68fbc9994ae3c354e5d8b1c7827747db9206f6bdb024a4dab1b7ebd10ea044a14bacf50b7868271c59b1b5b2579dbb7 languageName: node linkType: hard @@ -3482,13 +3338,6 @@ __metadata: languageName: node linkType: hard -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 10/e703107c28e362d8d7b910bbcbfd371e640a3bb45ae157a362b5952c0030c0b6d4981140ec319b347bce7adc025dd7813da1ff908a945ac214d64f5402a51b96 - languageName: node - linkType: hard - "fsevents@npm:~2.3.2": version: 2.3.3 resolution: "fsevents@npm:2.3.3" @@ -3536,6 +3385,13 @@ __metadata: languageName: node linkType: hard +"gensync@npm:^1.0.0-beta.2": + version: 1.0.0-beta.2 + resolution: "gensync@npm:1.0.0-beta.2" + checksum: 10/17d8333460204fbf1f9160d067e1e77f908a5447febb49424b8ab043026049835c9ef3974445c57dbd39161f4d2b04356d7de12b2eecaa27a7a7ea7d871cbedd + languageName: node + linkType: hard + "get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": version: 1.3.0 resolution: "get-intrinsic@npm:1.3.0" @@ -3618,26 +3474,17 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.1.3": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.1.1" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 10/59452a9202c81d4508a43b8af7082ca5c76452b9fcc4a9ab17655822e6ce9b21d4f8fbadabe4fe3faef448294cec249af305e2cd824b7e9aaf689240e5e96a7b +"globals@npm:16.4.0": + version: 16.4.0 + resolution: "globals@npm:16.4.0" + checksum: 10/1627a9f42fb4c82d7af6a0c8b6cd616e00110908304d5f1ddcdf325998f3aed45a4b29d8a1e47870f328817805263e31e4f1673f00022b9c2b210552767921cf languageName: node linkType: hard -"globals@npm:^13.19.0": - version: 13.24.0 - resolution: "globals@npm:13.24.0" - dependencies: - type-fest: "npm:^0.20.2" - checksum: 10/62c5b1997d06674fc7191d3e01e324d3eda4d65ac9cc4e78329fa3b5c4fd42a0e1c8722822497a6964eee075255ce21ccf1eec2d83f92ef3f06653af4d0ee28e +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: 10/03939c8af95c6df5014b137cac83aa909090c3a3985caef06ee9a5a669790877af8698ab38007e4c0186873adc14c0b13764acc754b16a754c216cc56aa5f021 languageName: node linkType: hard @@ -3665,13 +3512,6 @@ __metadata: languageName: node linkType: hard -"graphemer@npm:^1.4.0": - version: 1.4.0 - resolution: "graphemer@npm:1.4.0" - checksum: 10/6dd60dba97007b21e3a829fab3f771803cc1292977fe610e240ea72afd67e5690ac9eeaafc4a99710e78962e5936ab5a460787c2a1180f1cb0ccfac37d29f897 - languageName: node - linkType: hard - "has-bigints@npm:^1.0.2": version: 1.1.0 resolution: "has-bigints@npm:1.1.0" @@ -3804,22 +3644,38 @@ __metadata: languageName: node linkType: hard -"html-dom-parser@npm:5.1.2": - version: 5.1.2 - resolution: "html-dom-parser@npm:5.1.2" +"hermes-estree@npm:0.25.1": + version: 0.25.1 + resolution: "hermes-estree@npm:0.25.1" + checksum: 10/7b1eca98b264a25632064cffa5771360d30cf452e77db1e191f9913ee45cf78c292b2dbca707e92fb71b0870abb97e94b506a5ab80abd96ba237fee169b601fe + languageName: node + linkType: hard + +"hermes-parser@npm:^0.25.1": + version: 0.25.1 + resolution: "hermes-parser@npm:0.25.1" + dependencies: + hermes-estree: "npm:0.25.1" + checksum: 10/805efc05691420f236654349872c70731121791fa54de521c7ee51059eae34f84dd19f22ee846741dcb60372f8fb5335719b96b4ecb010d2aed7d872f2eff9cc + languageName: node + linkType: hard + +"html-dom-parser@npm:5.1.8": + version: 5.1.8 + resolution: "html-dom-parser@npm:5.1.8" dependencies: domhandler: "npm:5.0.3" - htmlparser2: "npm:10.0.0" - checksum: 10/d54fcdafbc0b2881c441a396965ad285072d2e4df62bebe7074d7aaa2a1fffc95e9286bcb81d6f241c4cdb10a84435fa623738985b635574acb3c84e994e8bb6 + htmlparser2: "npm:10.1.0" + checksum: 10/579deb63bd0981912983121971f687c952d7b2bf5c43dada2fe8eeb85f51f388ed084ffb6452afd136cd9db3ccbd1c9a6b3200d39c522acfecd50ee7f0c8ad25 languageName: node linkType: hard "html-react-parser@npm:^5.2.5": - version: 5.2.10 - resolution: "html-react-parser@npm:5.2.10" + version: 5.2.17 + resolution: "html-react-parser@npm:5.2.17" dependencies: domhandler: "npm:5.0.3" - html-dom-parser: "npm:5.1.2" + html-dom-parser: "npm:5.1.8" react-property: "npm:2.0.2" style-to-js: "npm:1.1.21" peerDependencies: @@ -3828,7 +3684,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 10/3b0debac58e4b39d853731fd117b323a5d9582482cdc0b6dc5179d0c469acf63e64b8fdb3b678e758673633c579b09fd21d75d256c32104c65355f4434ba7f59 + checksum: 10/74ec0bc5945a90fd154c84830ff1caaa6c686c1c0c82330a1e3cda18b15c8f9b177d2c564d1d3cf566b586c34ce78e2006692aeda3300b0ba30c5234cb7b07c8 languageName: node linkType: hard @@ -3839,15 +3695,15 @@ __metadata: languageName: node linkType: hard -"htmlparser2@npm:10.0.0": - version: 10.0.0 - resolution: "htmlparser2@npm:10.0.0" +"htmlparser2@npm:10.1.0": + version: 10.1.0 + resolution: "htmlparser2@npm:10.1.0" dependencies: domelementtype: "npm:^2.3.0" domhandler: "npm:^5.0.3" - domutils: "npm:^3.2.1" - entities: "npm:^6.0.0" - checksum: 10/768870f0e020dca19dc45df206cb6ac466c5dba6566c8fca4ca880347eed409f9977028d08644ac516bca8628ac9c7ded5a3847dc3ee1c043f049abf9e817154 + domutils: "npm:^3.2.2" + entities: "npm:^7.0.1" + checksum: 10/660fb094a53fb77a3c771db969778b58af0e8a572a1bdc8e5952a4241e4b04e0a6063b16f6422e22c821441081c8de339e3f06ddda362ac2a42c8767d5e5ad53 languageName: node linkType: hard @@ -3894,7 +3750,7 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^7.0.0": +"ignore@npm:^7.0.5": version: 7.0.5 resolution: "ignore@npm:7.0.5" checksum: 10/f134b96a4de0af419196f52c529d5c6120c4456ff8a6b5a14ceaaa399f883e15d58d2ce651c9b69b9388491d4669dda47285d307e827de9304a53a1824801bc6 @@ -3918,23 +3774,6 @@ __metadata: languageName: node linkType: hard -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: "npm:^1.3.0" - wrappy: "npm:1" - checksum: 10/d2ebd65441a38c8336c223d1b80b921b9fa737e37ea466fd7e253cb000c64ae1f17fa59e68130ef5bda92cfd8d36b83d37dab0eb0a4558bcfec8e8cdfd2dcb67 - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:^2.0.3": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 10/cd45e923bee15186c07fa4c89db0aace24824c482fb887b528304694b2aa6ff8a898da8657046a5dcf3e46cd6db6c61629551f9215f208d7c3f157cf9b290521 - languageName: node - linkType: hard - "inline-style-parser@npm:0.2.7": version: 0.2.7 resolution: "inline-style-parser@npm:0.2.7" @@ -3977,16 +3816,6 @@ __metadata: languageName: node linkType: hard -"is-arguments@npm:^1.0.4": - version: 1.2.0 - resolution: "is-arguments@npm:1.2.0" - dependencies: - call-bound: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.2" - checksum: 10/471a8ef631b8ee8829c43a8ab05c081700c0e25180c73d19f3bf819c1a8448c426a9e8e601f278973eca68966384b16ceb78b8c63af795b099cd199ea5afc457 - languageName: node - linkType: hard - "is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": version: 3.0.5 resolution: "is-array-buffer@npm:3.0.5" @@ -3998,13 +3827,6 @@ __metadata: languageName: node linkType: hard -"is-arrayish@npm:^0.3.1": - version: 0.3.2 - resolution: "is-arrayish@npm:0.3.2" - checksum: 10/81a78d518ebd8b834523e25d102684ee0f7e98637136d3bdc93fd09636350fa06f1d8ca997ea28143d4d13cb1b69c0824f082db0ac13e1ab3311c10ffea60ade - languageName: node - linkType: hard - "is-async-function@npm:^2.0.0": version: 2.1.1 resolution: "is-async-function@npm:2.1.1" @@ -4099,15 +3921,6 @@ __metadata: languageName: node linkType: hard -"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": - version: 2.2.1 - resolution: "is-docker@npm:2.2.1" - bin: - is-docker: cli.js - checksum: 10/3fef7ddbf0be25958e8991ad941901bf5922ab2753c46980b60b05c1bf9c9c2402d35e6dc32e4380b980ef5e1970a5d9d5e5aa2e02d77727c3b6b5e918474c56 - languageName: node - linkType: hard - "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -4131,7 +3944,7 @@ __metadata: languageName: node linkType: hard -"is-generator-function@npm:^1.0.10, is-generator-function@npm:^1.0.7": +"is-generator-function@npm:^1.0.10": version: 1.1.0 resolution: "is-generator-function@npm:1.1.0" dependencies: @@ -4190,13 +4003,6 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: 10/abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - "is-plain-obj@npm:^4.0.0": version: 4.1.0 resolution: "is-plain-obj@npm:4.1.0" @@ -4253,7 +4059,7 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15, is-typed-array@npm:^1.1.3": +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": version: 1.1.15 resolution: "is-typed-array@npm:1.1.15" dependencies: @@ -4288,15 +4094,6 @@ __metadata: languageName: node linkType: hard -"is-wsl@npm:^2.2.0": - version: 2.2.0 - resolution: "is-wsl@npm:2.2.0" - dependencies: - is-docker: "npm:^2.0.0" - checksum: 10/20849846ae414997d290b75e16868e5261e86ff5047f104027026fd61d8b5a9b0b3ade16239f35e1a067b3c7cc02f70183cb661010ed16f4b6c7c93dad1b19d8 - languageName: node - linkType: hard - "isarray@npm:^2.0.5": version: 2.0.5 resolution: "isarray@npm:2.0.5" @@ -4352,7 +4149,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:^4.1.0": +"js-yaml@npm:^4.1.1": version: 4.1.1 resolution: "js-yaml@npm:4.1.1" dependencies: @@ -4363,10 +4160,12 @@ __metadata: languageName: node linkType: hard -"jsdoc-type-pratt-parser@npm:^4.0.0": - version: 4.8.0 - resolution: "jsdoc-type-pratt-parser@npm:4.8.0" - checksum: 10/1844ef7848f5d0c3c60af95629197f97ff8603c12b99d750aaf7511724ee0d41989c5d24ea5f8d22078a5a8034337a272c9c22f49a8f07a857946417f3c84cfb +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" + bin: + jsesc: bin/jsesc + checksum: 10/20bd37a142eca5d1794f354db8f1c9aeb54d85e1f5c247b371de05d23a9751ecd7bd3a9c4fc5298ea6fa09a100dafb4190fa5c98c6610b75952c3487f3ce7967 languageName: node linkType: hard @@ -4402,6 +4201,15 @@ __metadata: languageName: node linkType: hard +"json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 10/1db67b853ff0de3534085d630691d3247de53a2ed1390ba0ddff681ea43e9b3e30ecbdb65c5e9aab49435e44059c23dbd6fee8ee619419ba37465bb0dd7135da + languageName: node + linkType: hard + "jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": version: 3.3.5 resolution: "jsx-ast-utils@npm:3.3.5" @@ -4414,7 +4222,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.3": +"keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -4610,6 +4418,15 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^5.1.1": + version: 5.1.1 + resolution: "lru-cache@npm:5.1.1" + dependencies: + yallist: "npm:^3.0.2" + checksum: 10/951d2673dcc64a7fb888bf3d13bc2fdf923faca97d89cdb405ba3dfff77e2b26e5798d405e78fcd7094c9e7b8b4dab2ddc5a4f8a11928af24a207b7c738ca3f8 + languageName: node + linkType: hard + "make-fetch-happen@npm:^14.0.3": version: 14.0.3 resolution: "make-fetch-happen@npm:14.0.3" @@ -5128,7 +4945,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.4, micromatch@npm:^4.0.8": +"micromatch@npm:^4.0.4": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -5138,7 +4955,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -5147,7 +4964,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.4": +"minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": version: 9.0.5 resolution: "minimatch@npm:9.0.5" dependencies: @@ -5230,45 +5047,36 @@ __metadata: languageName: node linkType: hard -"minizlib@npm:^3.0.1": - version: 3.0.2 - resolution: "minizlib@npm:3.0.2" +"minizlib@npm:^3.0.1, minizlib@npm:^3.1.0": + version: 3.1.0 + resolution: "minizlib@npm:3.1.0" dependencies: minipass: "npm:^7.1.2" - checksum: 10/c075bed1594f68dcc8c35122333520112daefd4d070e5d0a228bd4cf5580e9eed3981b96c0ae1d62488e204e80fd27b2b9d0068ca9a5ef3993e9565faf63ca41 + checksum: 10/f47365cc2cb7f078cbe7e046eb52655e2e7e97f8c0a9a674f4da60d94fb0624edfcec9b5db32e8ba5a99a5f036f595680ae6fe02a262beaa73026e505cc52f99 languageName: node linkType: hard -"mkdirp@npm:^3.0.1": - version: 3.0.1 - resolution: "mkdirp@npm:3.0.1" - bin: - mkdirp: dist/cjs/src/bin.js - checksum: 10/16fd79c28645759505914561e249b9a1f5fe3362279ad95487a4501e4467abeb714fd35b95307326b8fd03f3c7719065ef11a6f97b7285d7888306d1bd2232ba - languageName: node - linkType: hard - -"motion-dom@npm:^12.23.23": - version: 12.23.23 - resolution: "motion-dom@npm:12.23.23" +"motion-dom@npm:^12.33.0": + version: 12.33.0 + resolution: "motion-dom@npm:12.33.0" dependencies: - motion-utils: "npm:^12.23.6" - checksum: 10/6bec34c28b478622bd23ce919c0d64e7f372cbc3f88e665f1e34fbf590e9bb53eebea086fb28f4e0c31941bd5274e086dc9b5360b68c4976891b94c4e92ca01a + motion-utils: "npm:^12.29.2" + checksum: 10/0993bb6380c16fc8c9a2f5a5c4638f3d31bf7680e0683292478d8101489bd86830bb59e8fca8d84ee9b7dadbcfd1f1541de2a47dc7a1294ce34abb00ca5caed5 languageName: node linkType: hard -"motion-utils@npm:^12.23.6": - version: 12.23.6 - resolution: "motion-utils@npm:12.23.6" - checksum: 10/fae741319e72389eca8f3e73e644ffe6501409d00c7febb2f9b836629ae86ef735e73d670d0591706ca5e93ce10228ddbcff0ecdeb09b4cd8df14df7007aedd9 +"motion-utils@npm:^12.29.2": + version: 12.29.2 + resolution: "motion-utils@npm:12.29.2" + checksum: 10/ae5f9be58c07939af72334894ed1a18653d724946182a718dc3d11268ef26e63804c3f16dee5a6110596d4406b539c4513822b74f86adebef9488601c34b18b7 languageName: node linkType: hard "motion@npm:^12.4.1": - version: 12.23.26 - resolution: "motion@npm:12.23.26" + version: 12.33.0 + resolution: "motion@npm:12.33.0" dependencies: - framer-motion: "npm:^12.23.26" + framer-motion: "npm:^12.33.0" tslib: "npm:^2.4.0" peerDependencies: "@emotion/is-prop-valid": "*" @@ -5281,7 +5089,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 10/c5e683d2c67e55816587cbbd451c5600dc0602aa04108ab0bf8d4472befd490e90b3177362dbc8b9f96316ec16383924cc574eb7c9e031540f1e88e64a2704ae + checksum: 10/492e5a552b3c548d88a4597e611cf5c2709b26089500bbebf155ee9ec52aeaf00c35f262b65c924a3419f05da92a97caa4617263781d8f6651cc1ac10b97f548 languageName: node linkType: hard @@ -5342,23 +5150,24 @@ __metadata: languageName: node linkType: hard -"next@npm:15.5.9": - version: 15.5.9 - resolution: "next@npm:15.5.9" +"next@npm:16.1.6": + version: 16.1.6 + resolution: "next@npm:16.1.6" dependencies: - "@next/env": "npm:15.5.9" - "@next/swc-darwin-arm64": "npm:15.5.7" - "@next/swc-darwin-x64": "npm:15.5.7" - "@next/swc-linux-arm64-gnu": "npm:15.5.7" - "@next/swc-linux-arm64-musl": "npm:15.5.7" - "@next/swc-linux-x64-gnu": "npm:15.5.7" - "@next/swc-linux-x64-musl": "npm:15.5.7" - "@next/swc-win32-arm64-msvc": "npm:15.5.7" - "@next/swc-win32-x64-msvc": "npm:15.5.7" + "@next/env": "npm:16.1.6" + "@next/swc-darwin-arm64": "npm:16.1.6" + "@next/swc-darwin-x64": "npm:16.1.6" + "@next/swc-linux-arm64-gnu": "npm:16.1.6" + "@next/swc-linux-arm64-musl": "npm:16.1.6" + "@next/swc-linux-x64-gnu": "npm:16.1.6" + "@next/swc-linux-x64-musl": "npm:16.1.6" + "@next/swc-win32-arm64-msvc": "npm:16.1.6" + "@next/swc-win32-x64-msvc": "npm:16.1.6" "@swc/helpers": "npm:0.5.15" + baseline-browser-mapping: "npm:^2.8.3" caniuse-lite: "npm:^1.0.30001579" postcss: "npm:8.4.31" - sharp: "npm:^0.34.3" + sharp: "npm:^0.34.4" styled-jsx: "npm:5.1.6" peerDependencies: "@opentelemetry/api": ^1.1.0 @@ -5397,7 +5206,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: 10/ac27b82de08c9720e8e99cd64102af5e30306a8c861630d50da347a02c288cc441273ada64875c47e7a4d5991ff69cc92b23e906ce3271f9835a7911a0f060cc + checksum: 10/00322378df865d4f00d232f8b1f42f4f0ad114e1d14f660d483b01ccd533459af6202e2f80067bf41a97aa0c99c3ae1d21a0aef2c081b0a9f456b978de4bf757 languageName: node linkType: hard @@ -5421,6 +5230,13 @@ __metadata: languageName: node linkType: hard +"node-releases@npm:^2.0.27": + version: 2.0.27 + resolution: "node-releases@npm:2.0.27" + checksum: 10/f6c78ddb392ae500719644afcbe68a9ea533242c02312eb6a34e8478506eb7482a3fb709c70235b01c32fe65625b68dfa9665113f816d87f163bc3819b62b106 + languageName: node + linkType: hard + "nopt@npm:^8.0.0": version: 8.1.0 resolution: "nopt@npm:8.1.0" @@ -5521,15 +5337,6 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: "npm:1" - checksum: 10/cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 - languageName: node - linkType: hard - "oniguruma-parser@npm:^0.12.1": version: 0.12.1 resolution: "oniguruma-parser@npm:0.12.1" @@ -5548,17 +5355,6 @@ __metadata: languageName: node linkType: hard -"open@npm:^8.0.4": - version: 8.4.2 - resolution: "open@npm:8.4.2" - dependencies: - define-lazy-prop: "npm:^2.0.0" - is-docker: "npm:^2.1.1" - is-wsl: "npm:^2.2.0" - checksum: 10/acd81a1d19879c818acb3af2d2e8e9d81d17b5367561e623248133deb7dd3aefaed527531df2677d3e6aaf0199f84df57b6b2262babff8bf46ea0029aac536c9 - languageName: node - linkType: hard - "optionator@npm:^0.9.3": version: 0.9.4 resolution: "optionator@npm:0.9.4" @@ -5647,13 +5443,6 @@ __metadata: languageName: node linkType: hard -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 10/060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 - languageName: node - linkType: hard - "path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" @@ -5692,7 +5481,7 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^4.0.2": +"picomatch@npm:^4.0.3": version: 4.0.3 resolution: "picomatch@npm:4.0.3" checksum: 10/57b99055f40b16798f2802916d9c17e9744e620a0db136554af01d19598b96e45e2f00014c91d1b8b13874b80caa8c295b3d589a3f72373ec4aaf54baa5962d5 @@ -5731,13 +5520,6 @@ __metadata: languageName: node linkType: hard -"process@npm:^0.11.10": - version: 0.11.10 - resolution: "process@npm:0.11.10" - checksum: 10/dbaa7e8d1d5cf375c36963ff43116772a989ef2bb47c9bdee20f38fd8fc061119cf38140631cf90c781aca4d3f0f0d2c834711952b728953f04fd7d238f59f5b - languageName: node - linkType: hard - "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -5780,14 +5562,14 @@ __metadata: languageName: node linkType: hard -"react-dom@npm:19.1.1": - version: 19.1.1 - resolution: "react-dom@npm:19.1.1" +"react-dom@npm:19.2.4": + version: 19.2.4 + resolution: "react-dom@npm:19.2.4" dependencies: - scheduler: "npm:^0.26.0" + scheduler: "npm:^0.27.0" peerDependencies: - react: ^19.1.1 - checksum: 10/9005415d2175b1f1eb4a544ad04afb29691bb7b6dd43bbdaa09932146b310b73bd4552bc772ad78fa481f409eada1560cf887606c83c1a53a922c1e30f1b3a34 + react: ^19.2.4 + checksum: 10/ec17721a8cb131bc33480a9f738bc5bbfe4bd11b11cf69f3f473605346578a329ad26ceef6ef0761ea67a4b455803407dd7ed4ba3d8a5abd2cee8c32d221e498 languageName: node linkType: hard @@ -5805,10 +5587,10 @@ __metadata: languageName: node linkType: hard -"react@npm:19.1.1": - version: 19.1.1 - resolution: "react@npm:19.1.1" - checksum: 10/9801530fdc939e1a7a499422e930515b2400809cb39c2872984e99f832d233f61659a693871183dac3155c2f9b2c9dcf4440a56bd18983277ae92860e38c3a61 +"react@npm:19.2.4": + version: 19.2.4 + resolution: "react@npm:19.2.4" + checksum: 10/18179fe217f67eb2d0bc61cd04e7ad3c282ea09a1dface7eacd71816f62609f4bbf566c447c704335284deb8397b00bca084e0cd60e6f437279a7498e2d0bfe0 languageName: node linkType: hard @@ -5821,19 +5603,6 @@ __metadata: languageName: node linkType: hard -"recast@npm:^0.23.5": - version: 0.23.11 - resolution: "recast@npm:0.23.11" - dependencies: - ast-types: "npm:^0.16.1" - esprima: "npm:~4.0.0" - source-map: "npm:~0.6.1" - tiny-invariant: "npm:^1.3.3" - tslib: "npm:^2.0.1" - checksum: 10/a622b7848efe13a59a40c9a1a3a8178433eae1048780e04d7392406e2d67fc29e3efa84b3aa8cfda28fd58989f4b59fa968bed295b739987a666bd11cc57a5b2 - languageName: node - linkType: hard - "recma-build-jsx@npm:^1.0.0": version: 1.0.0 resolution: "recma-build-jsx@npm:1.0.0" @@ -6085,17 +5854,6 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: "npm:^7.1.3" - bin: - rimraf: bin.js - checksum: 10/063ffaccaaaca2cfd0ef3beafb12d6a03dd7ff1260d752d62a6077b5dfff6ae81bea571f655bb6b589d366930ec1bdd285d40d560c0dae9b12f125e54eb743d5 - languageName: node - linkType: hard - "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -6146,10 +5904,10 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.26.0": - version: 0.26.0 - resolution: "scheduler@npm:0.26.0" - checksum: 10/1ecf2e5d7de1a7a132796834afe14a2d589ba7e437615bd8c06f3e0786a3ac3434655e67aac8755d9b14e05754c177e49c064261de2673aaa3c926bc98caa002 +"scheduler@npm:^0.27.0": + version: 0.27.0 + resolution: "scheduler@npm:0.27.0" + checksum: 10/eab3c3a8373195173e59c147224fc30dabe6dd453f248f5e610e8458512a5a2ee3a06465dc400ebfe6d35c9f5b7f3bb6b2e41c88c86fd177c25a73e7286a1e06 languageName: node linkType: hard @@ -6162,12 +5920,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.5, semver@npm:^7.6.0, semver@npm:^7.6.2, semver@npm:^7.7.1, semver@npm:^7.7.2": - version: 7.7.2 - resolution: "semver@npm:7.7.2" +"semver@npm:^7.3.5, semver@npm:^7.7.1, semver@npm:^7.7.3": + version: 7.7.3 + resolution: "semver@npm:7.7.3" bin: semver: bin/semver.js - checksum: 10/7a24cffcaa13f53c09ce55e05efe25cd41328730b2308678624f8b9f5fc3093fc4d189f47950f0b811ff8f3c3039c24a2c36717ba7961615c682045bf03e1dda + checksum: 10/8dbc3168e057a38fc322af909c7f5617483c50caddba135439ff09a754b20bdd6482a5123ff543dad4affa488ecf46ec5fb56d61312ad20bb140199b88dfaea9 languageName: node linkType: hard @@ -6217,35 +5975,37 @@ __metadata: languageName: node linkType: hard -"sharp@npm:^0.34.3": - version: 0.34.3 - resolution: "sharp@npm:0.34.3" +"sharp@npm:^0.34.4": + version: 0.34.5 + resolution: "sharp@npm:0.34.5" dependencies: - "@img/sharp-darwin-arm64": "npm:0.34.3" - "@img/sharp-darwin-x64": "npm:0.34.3" - "@img/sharp-libvips-darwin-arm64": "npm:1.2.0" - "@img/sharp-libvips-darwin-x64": "npm:1.2.0" - "@img/sharp-libvips-linux-arm": "npm:1.2.0" - "@img/sharp-libvips-linux-arm64": "npm:1.2.0" - "@img/sharp-libvips-linux-ppc64": "npm:1.2.0" - "@img/sharp-libvips-linux-s390x": "npm:1.2.0" - "@img/sharp-libvips-linux-x64": "npm:1.2.0" - "@img/sharp-libvips-linuxmusl-arm64": "npm:1.2.0" - "@img/sharp-libvips-linuxmusl-x64": "npm:1.2.0" - "@img/sharp-linux-arm": "npm:0.34.3" - "@img/sharp-linux-arm64": "npm:0.34.3" - "@img/sharp-linux-ppc64": "npm:0.34.3" - "@img/sharp-linux-s390x": "npm:0.34.3" - "@img/sharp-linux-x64": "npm:0.34.3" - "@img/sharp-linuxmusl-arm64": "npm:0.34.3" - "@img/sharp-linuxmusl-x64": "npm:0.34.3" - "@img/sharp-wasm32": "npm:0.34.3" - "@img/sharp-win32-arm64": "npm:0.34.3" - "@img/sharp-win32-ia32": "npm:0.34.3" - "@img/sharp-win32-x64": "npm:0.34.3" - color: "npm:^4.2.3" - detect-libc: "npm:^2.0.4" - semver: "npm:^7.7.2" + "@img/colour": "npm:^1.0.0" + "@img/sharp-darwin-arm64": "npm:0.34.5" + "@img/sharp-darwin-x64": "npm:0.34.5" + "@img/sharp-libvips-darwin-arm64": "npm:1.2.4" + "@img/sharp-libvips-darwin-x64": "npm:1.2.4" + "@img/sharp-libvips-linux-arm": "npm:1.2.4" + "@img/sharp-libvips-linux-arm64": "npm:1.2.4" + "@img/sharp-libvips-linux-ppc64": "npm:1.2.4" + "@img/sharp-libvips-linux-riscv64": "npm:1.2.4" + "@img/sharp-libvips-linux-s390x": "npm:1.2.4" + "@img/sharp-libvips-linux-x64": "npm:1.2.4" + "@img/sharp-libvips-linuxmusl-arm64": "npm:1.2.4" + "@img/sharp-libvips-linuxmusl-x64": "npm:1.2.4" + "@img/sharp-linux-arm": "npm:0.34.5" + "@img/sharp-linux-arm64": "npm:0.34.5" + "@img/sharp-linux-ppc64": "npm:0.34.5" + "@img/sharp-linux-riscv64": "npm:0.34.5" + "@img/sharp-linux-s390x": "npm:0.34.5" + "@img/sharp-linux-x64": "npm:0.34.5" + "@img/sharp-linuxmusl-arm64": "npm:0.34.5" + "@img/sharp-linuxmusl-x64": "npm:0.34.5" + "@img/sharp-wasm32": "npm:0.34.5" + "@img/sharp-win32-arm64": "npm:0.34.5" + "@img/sharp-win32-ia32": "npm:0.34.5" + "@img/sharp-win32-x64": "npm:0.34.5" + detect-libc: "npm:^2.1.2" + semver: "npm:^7.7.3" dependenciesMeta: "@img/sharp-darwin-arm64": optional: true @@ -6261,6 +6021,8 @@ __metadata: optional: true "@img/sharp-libvips-linux-ppc64": optional: true + "@img/sharp-libvips-linux-riscv64": + optional: true "@img/sharp-libvips-linux-s390x": optional: true "@img/sharp-libvips-linux-x64": @@ -6275,6 +6037,8 @@ __metadata: optional: true "@img/sharp-linux-ppc64": optional: true + "@img/sharp-linux-riscv64": + optional: true "@img/sharp-linux-s390x": optional: true "@img/sharp-linux-x64": @@ -6291,7 +6055,7 @@ __metadata: optional: true "@img/sharp-win32-x64": optional: true - checksum: 10/b8ca871c99b48601c47f5dfabf32e38e60071a93e359b3c765d398f708a7cf3735d1bd804b72a957246a3b215fd281a17f887d9c36ebfa690c90fa5fe142d2cd + checksum: 10/d62bc638c8ad382dffc266beeaffab71457d592abeb6fdf95b512e6dcbce0abf47b8d903b4ea081f012ceb40e4462f1e219184c729329146df32a5ccec2c231f languageName: node linkType: hard @@ -6312,18 +6076,18 @@ __metadata: linkType: hard "shiki@npm:^3.13.0": - version: 3.19.0 - resolution: "shiki@npm:3.19.0" + version: 3.22.0 + resolution: "shiki@npm:3.22.0" dependencies: - "@shikijs/core": "npm:3.19.0" - "@shikijs/engine-javascript": "npm:3.19.0" - "@shikijs/engine-oniguruma": "npm:3.19.0" - "@shikijs/langs": "npm:3.19.0" - "@shikijs/themes": "npm:3.19.0" - "@shikijs/types": "npm:3.19.0" + "@shikijs/core": "npm:3.22.0" + "@shikijs/engine-javascript": "npm:3.22.0" + "@shikijs/engine-oniguruma": "npm:3.22.0" + "@shikijs/langs": "npm:3.22.0" + "@shikijs/themes": "npm:3.22.0" + "@shikijs/types": "npm:3.22.0" "@shikijs/vscode-textmate": "npm:^10.0.2" "@types/hast": "npm:^3.0.4" - checksum: 10/004dabc26a9db25c69f1aa6ed0555c8a5a34153084a1aa5f42fa03edf800ca13dd468ad6d7ba4cbf8f36dc8d316a7de29cecec228ea8d2d252f4c4c95eb162e6 + checksum: 10/f9977e75f666253cc679e74b774af2afdfa48d52c631ab1448f47a90cd97f2290bcf50356f5b0d01a282da7f9e9f7e1938d585b213688e0d842fcba4a785f870 languageName: node linkType: hard @@ -6382,15 +6146,6 @@ __metadata: languageName: node linkType: hard -"simple-swizzle@npm:^0.2.2": - version: 0.2.2 - resolution: "simple-swizzle@npm:0.2.2" - dependencies: - is-arrayish: "npm:^0.3.1" - checksum: 10/c6dffff17aaa383dae7e5c056fbf10cf9855a9f79949f20ee225c04f06ddde56323600e0f3d6797e82d08d006e93761122527438ee9531620031c08c9e0d73cc - languageName: node - linkType: hard - "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -6433,13 +6188,6 @@ __metadata: languageName: node linkType: hard -"source-map@npm:~0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 10/59ef7462f1c29d502b3057e822cdbdae0b0e565302c4dd1a95e11e793d8d9d62006cdc10e0fd99163ca33ff2071360cf50ee13f90440806e7ed57d81cba2f7ff - languageName: node - linkType: hard - "space-separated-tokens@npm:^2.0.0": version: 2.0.2 resolution: "space-separated-tokens@npm:2.0.2" @@ -6473,24 +6221,6 @@ __metadata: languageName: node linkType: hard -"storybook@npm:^8.6.12": - version: 8.6.14 - resolution: "storybook@npm:8.6.14" - dependencies: - "@storybook/core": "npm:8.6.14" - peerDependencies: - prettier: ^2 || ^3 - peerDependenciesMeta: - prettier: - optional: true - bin: - getstorybook: ./bin/index.cjs - sb: ./bin/index.cjs - storybook: ./bin/index.cjs - checksum: 10/104932fe29ebf49bef24c90285741cec964d1c36b3f0b38da1dace31ac664be457f2a510e41ba69fe8aa0d90c20e3446fec27d1ced41e5eefb3a9ca713d99e79 - languageName: node - linkType: hard - "string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": version: 4.2.3 resolution: "string-width@npm:4.2.3" @@ -6700,40 +6430,25 @@ __metadata: linkType: hard "tar@npm:^7.4.3": - version: 7.4.3 - resolution: "tar@npm:7.4.3" + version: 7.5.7 + resolution: "tar@npm:7.5.7" dependencies: "@isaacs/fs-minipass": "npm:^4.0.0" chownr: "npm:^3.0.0" minipass: "npm:^7.1.2" - minizlib: "npm:^3.0.1" - mkdirp: "npm:^3.0.1" + minizlib: "npm:^3.1.0" yallist: "npm:^5.0.0" - checksum: 10/12a2a4fc6dee23e07cc47f1aeb3a14a1afd3f16397e1350036a8f4cdfee8dcac7ef5978337a4e7b2ac2c27a9a6d46388fc2088ea7c80cb6878c814b1425f8ecf + checksum: 10/0d6938dd32fe5c0f17c8098d92bd9889ee0ed9d11f12381b8146b6e8c87bb5aa49feec7abc42463f0597503d8e89e4c4c0b42bff1a5a38444e918b4878b7fd21 languageName: node linkType: hard -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: 10/4383b5baaeffa9bb4cda2ac33a4aa2e6d1f8aaf811848bf73513a9b88fd76372dc461f6fd6d2e9cb5100f48b473be32c6f95bd983509b7d92bb4d92c10747452 - languageName: node - linkType: hard - -"tiny-invariant@npm:^1.3.3": - version: 1.3.3 - resolution: "tiny-invariant@npm:1.3.3" - checksum: 10/5e185c8cc2266967984ce3b352a4e57cb89dad5a8abb0dea21468a6ecaa67cd5bb47a3b7a85d08041008644af4f667fb8b6575ba38ba5fb00b3b5068306e59fe - languageName: node - linkType: hard - -"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.13": - version: 0.2.14 - resolution: "tinyglobby@npm:0.2.14" +"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.13, tinyglobby@npm:^0.2.15": + version: 0.2.15 + resolution: "tinyglobby@npm:0.2.15" dependencies: - fdir: "npm:^6.4.4" - picomatch: "npm:^4.0.2" - checksum: 10/3d306d319718b7cc9d79fb3f29d8655237aa6a1f280860a217f93417039d0614891aee6fc47c5db315f4fcc6ac8d55eb8e23e2de73b2c51a431b42456d9e5764 + fdir: "npm:^6.5.0" + picomatch: "npm:^4.0.3" + checksum: 10/d72bd826a8b0fa5fa3929e7fe5ba48fceb2ae495df3a231b6c5408cd7d8c00b58ab5a9c2a76ba56a62ee9b5e083626f1f33599734bed1ffc4b792406408f0ca2 languageName: node linkType: hard @@ -6760,12 +6475,12 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^2.1.0": - version: 2.1.0 - resolution: "ts-api-utils@npm:2.1.0" +"ts-api-utils@npm:^2.4.0": + version: 2.4.0 + resolution: "ts-api-utils@npm:2.4.0" peerDependencies: typescript: ">=4.8.4" - checksum: 10/02e55b49d9617c6eebf8aadfa08d3ca03ca0cd2f0586ad34117fdfc7aa3cd25d95051843fde9df86665ad907f99baed179e7a117b11021417f379e4d2614eacd + checksum: 10/d6b2b3b6caad8d2f4ddc0c3785d22bb1a6041773335a1c71d73a5d67d11d993763fe8e4faefc4a4d03bb42b26c6126bbcf2e34826baed1def5369d0ebad358fa languageName: node linkType: hard @@ -6781,7 +6496,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.1, tslib@npm:^2.4.0, tslib@npm:^2.8.0": +"tslib@npm:^2.4.0, tslib@npm:^2.8.0": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 @@ -6797,13 +6512,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 10/8907e16284b2d6cfa4f4817e93520121941baba36b39219ea36acfe64c86b9dbc10c9941af450bd60832c8f43464974d51c0957f9858bc66b952b66b6914cbb9 - languageName: node - linkType: hard - "type-fest@npm:^4.31.0": version: 4.41.0 resolution: "type-fest@npm:4.41.0" @@ -6864,6 +6572,21 @@ __metadata: languageName: node linkType: hard +"typescript-eslint@npm:^8.46.0": + version: 8.54.0 + resolution: "typescript-eslint@npm:8.54.0" + dependencies: + "@typescript-eslint/eslint-plugin": "npm:8.54.0" + "@typescript-eslint/parser": "npm:8.54.0" + "@typescript-eslint/typescript-estree": "npm:8.54.0" + "@typescript-eslint/utils": "npm:8.54.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 10/21b1a27fd44716df8d2c7bac4ebd0caef196a04375fff7919dc817066017b6b8700f1e242bd065a26ac7ce0505b7a588626099e04a28142504ed4f0aae8bffb1 + languageName: node + linkType: hard + "typescript@npm:^5": version: 5.9.3 resolution: "typescript@npm:5.9.3" @@ -7078,6 +6801,20 @@ __metadata: languageName: node linkType: hard +"update-browserslist-db@npm:^1.2.0": + version: 1.2.3 + resolution: "update-browserslist-db@npm:1.2.3" + dependencies: + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.1" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 10/059f774300efb4b084a49293143c511f3ae946d40397b5c30914e900cd5691a12b8e61b41dd54ed73d3b56c8204165a0333107dd784ccf8f8c81790bcc423175 + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -7096,19 +6833,6 @@ __metadata: languageName: node linkType: hard -"util@npm:^0.12.5": - version: 0.12.5 - resolution: "util@npm:0.12.5" - dependencies: - inherits: "npm:^2.0.3" - is-arguments: "npm:^1.0.4" - is-generator-function: "npm:^1.0.7" - is-typed-array: "npm:^1.1.3" - which-typed-array: "npm:^1.1.2" - checksum: 10/61a10de7753353dd4d744c917f74cdd7d21b8b46379c1e48e1c4fd8e83f8190e6bd9978fc4e5102ab6a10ebda6019d1b36572fa4a325e175ec8b789a121f6147 - languageName: node - linkType: hard - "vfile-matter@npm:^5.0.1": version: 5.0.1 resolution: "vfile-matter@npm:5.0.1" @@ -7192,7 +6916,7 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19, which-typed-array@npm:^1.1.2": +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19": version: 1.1.19 resolution: "which-typed-array@npm:1.1.19" dependencies: @@ -7258,25 +6982,10 @@ __metadata: languageName: node linkType: hard -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 10/159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 - languageName: node - linkType: hard - -"ws@npm:^8.2.3": - version: 8.18.3 - resolution: "ws@npm:8.18.3" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 10/725964438d752f0ab0de582cd48d6eeada58d1511c3f613485b5598a83680bedac6187c765b0fe082e2d8cc4341fc57707c813ae780feee82d0c5efe6a4c61b6 +"yallist@npm:^3.0.2": + version: 3.1.1 + resolution: "yallist@npm:3.1.1" + checksum: 10/9af0a4329c3c6b779ac4736c69fae4190ac03029fa27c1aef4e6bcc92119b73dea6fe5db5fe881fb0ce2a0e9539a42cdf60c7c21eda04d1a0b8c082e38509efb languageName: node linkType: hard @@ -7310,6 +7019,22 @@ __metadata: languageName: node linkType: hard +"zod-validation-error@npm:^3.5.0 || ^4.0.0": + version: 4.0.2 + resolution: "zod-validation-error@npm:4.0.2" + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + checksum: 10/5e35ca8ebb4602dcb526e122d7e9fca695c4a479bd97535f3400a732d49160f24f7213a9ed64986fc9dc3a2e8a6c4e1241ec0c4d8a4e3e69ea91a0328ded2192 + languageName: node + linkType: hard + +"zod@npm:^3.25.0 || ^4.0.0": + version: 4.3.6 + resolution: "zod@npm:4.3.6" + checksum: 10/25fc0f62e01b557b4644bf0b393bbaf47542ab30877c37837ea8caf314a8713d220c7d7fe51f68ffa72f0e1018ddfa34d96f1973d23033f5a2a5a9b6b9d9da01 + languageName: node + linkType: hard + "zwitch@npm:^2.0.0, zwitch@npm:^2.0.4": version: 2.0.4 resolution: "zwitch@npm:2.0.4" diff --git a/docs/.release-notes-template.md b/docs/.release-notes-template.md index 4861bf0b22..7b4c4d6299 100644 --- a/docs/.release-notes-template.md +++ b/docs/.release-notes-template.md @@ -37,4 +37,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.1.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/api/utility-apis.md b/docs/api/utility-apis.md index 3e60124775..5235a14ddf 100644 --- a/docs/api/utility-apis.md +++ b/docs/api/utility-apis.md @@ -10,31 +10,31 @@ Backstage plugins strive to be self-contained, with as much functionality as pos Backstage provides two primary methods for plugins to communicate across their boundaries in client-side code. The first one being the -[`createPlugin`](../reference/core-plugin-api.createplugin.md) API along with the +[`createPlugin`](https://backstage.io/api/stable/functions/_backstage_core-plugin-api.index.createPlugin.html) API along with the extensions that it can provide, and the second one being Utility APIs. While the -[`createPlugin`](../reference/core-plugin-api.createplugin.md) API is focused on +[`createPlugin`](https://backstage.io/api/stable/functions/_backstage_core-plugin-api.index.createPlugin.html) API is focused on the initialization plugins and the app, the Utility APIs provide ways for plugins to communicate during their entire life cycle. ## Consuming APIs -Each Utility API is tied to an [`ApiRef`](../reference/frontend-plugin-api.apiref.md) +Each Utility API is tied to an [`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html) instance, which is a global singleton object without any additional state or functionality, its only purpose is to reference Utility APIs. -[`ApiRef`](../reference/frontend-plugin-api.apiref.md)s are created using -[`createApiRef`](../reference/frontend-plugin-api.createapiref.md), which is exported -by [`@backstage/core-plugin-api`](../reference/core-plugin-api.md). There are also +[`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html)s are created using +[`createApiRef`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.createApiRef.html), which is exported +by [`@backstage/core-plugin-api`](https://backstage.io/api/stable/modules/_backstage_core-plugin-api.html). There are also many predefined Utility APIs in -[`@backstage/core-plugin-api`](../reference/core-plugin-api.md), and they're all +[`@backstage/core-plugin-api`](https://backstage.io/api/stable/modules/_backstage_core-plugin-api.html), and they're all exported with a name of the pattern `*ApiRef`, for example -[`errorApiRef`](../reference/frontend-plugin-api.errorapiref.md). +[`errorApiRef`](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.errorApiRef.html). To access one of the Utility APIs inside a React component, use the -[`useApi`](../reference/frontend-plugin-api.useapi.md) hook exported by -[`@backstage/core-plugin-api`](../reference/core-plugin-api.md), or the -[`withApis`](../reference/frontend-plugin-api.withapis.md) HOC if you prefer class +[`useApi`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.useApi.html) hook exported by +[`@backstage/core-plugin-api`](https://backstage.io/api/stable/modules/_backstage_core-plugin-api.html), or the +[`withApis`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.withApis.html) HOC if you prefer class components. For example, the -[`ErrorApi`](../reference/frontend-plugin-api.errorapi.md) can be accessed like this: +[`ErrorApi`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ErrorApi.html) can be accessed like this: ```tsx import { useApi, errorApiRef } from '@backstage/core-plugin-api'; @@ -52,14 +52,14 @@ export const MyComponent = () => { ``` Note that there is no explicit type given for -[`ErrorApi`](../reference/frontend-plugin-api.errorapi.md). This is because the -[`errorApiRef`](../reference/frontend-plugin-api.errorapiref.md) has the type -embedded, and [`useApi`](../reference/frontend-plugin-api.useapi.md) is able to infer +[`ErrorApi`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ErrorApi.html). This is because the +[`errorApiRef`](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.errorApiRef.html) has the type +embedded, and [`useApi`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.useApi.html) is able to infer the type. Also note that consuming Utility APIs is not limited to plugins; it can be done from any component inside Backstage, including the ones in -[`@backstage/core-plugin-api`](../reference/core-plugin-api.md). The only +[`@backstage/core-plugin-api`](https://backstage.io/api/stable/modules/_backstage_core-plugin-api.html). The only requirement is that they are beneath the `AppProvider` in the react tree. ## Supplying APIs @@ -67,15 +67,15 @@ requirement is that they are beneath the `AppProvider` in the react tree. ### API Factories APIs are registered in the form of -[`ApiFactory`](../reference/frontend-plugin-api.apifactory.md) instances, which encapsulate +[`ApiFactory`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiFactory.html) instances, which encapsulate the process of instantiating an API. It is a collection of three things: the -[`ApiRef`](../reference/frontend-plugin-api.apiref.md) of the API to instantiate, a +[`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html) of the API to instantiate, a list of all required dependencies, and a factory function that returns a new API instance. For example, this is the default -[`ApiFactory`](../reference/frontend-plugin-api.apifactory.md) for the -[`ErrorApi`](../reference/frontend-plugin-api.errorapi.md): +[`ApiFactory`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiFactory.html) for the +[`ErrorApi`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ErrorApi.html): ```ts createApiFactory({ @@ -89,25 +89,25 @@ createApiFactory({ }); ``` -In this example, the [`errorApiRef`](../reference/frontend-plugin-api.errorapiref.md) +In this example, the [`errorApiRef`](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.errorApiRef.html) is our API, which encapsulates the -[`ErrorApi`](../reference/frontend-plugin-api.errorapi.md) type. The -[`alertApiRef`](../reference/frontend-plugin-api.alertapiref.md) is our single +[`ErrorApi`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ErrorApi.html) type. The +[`alertApiRef`](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.alertApiRef.html) is our single dependency, which we give the name `alertApi`, and is then passed on to the factory function, which returns an implementation of the -[`ErrorApi`](../reference/frontend-plugin-api.errorapi.md). +[`ErrorApi`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ErrorApi.html). -The [`createApiFactory`](../reference/frontend-plugin-api.createapifactory.md) +The [`createApiFactory`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.createApiFactory.html) function is a thin wrapper that enables TypeScript type inference. You may notice that there are no type annotations in the above example, and that is because we're able to infer all types from the -[`ApiRef`](../reference/frontend-plugin-api.apiref.md)s. TypeScript will make sure +[`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html)s. TypeScript will make sure that the return value of the `factory` function matches the type embedded in -`api`'s [`ApiRef`](../reference/frontend-plugin-api.apiref.md), in this case the -[`ErrorApi`](../reference/frontend-plugin-api.errorapi.md). It will also match the +`api`'s [`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html), in this case the +[`ErrorApi`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ErrorApi.html). It will also match the types between the `deps` and the parameters of the `factory` function, again using the type embedded within the -[`ApiRef`](../reference/frontend-plugin-api.apiref.md)s. +[`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html)s. ## Registering API Factories @@ -119,13 +119,13 @@ app, and the app itself. Starting with the Backstage core library, it provides implementations for all of the core APIs. The core APIs are the ones exported by -[`@backstage/core-plugin-api`](../reference/core-plugin-api.md), such as the -[`errorApiRef`](../reference/frontend-plugin-api.errorapiref.md) and -[`configApiRef`](../reference/frontend-plugin-api.configapiref.md). +[`@backstage/core-plugin-api`](https://backstage.io/api/stable/modules/_backstage_core-plugin-api.html), such as the +[`errorApiRef`](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.errorApiRef.html) and +[`configApiRef`](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.configApiRef.html). The core APIs are loaded for any app created with -[`createApp`](../reference/app-defaults.createapp.md) from -[`@backstage/core-plugin-api`](../reference/app-defaults.md), which means that +[`createApp`](https://backstage.io/api/stable/functions/_backstage_app-defaults.createApp.html) from +[`@backstage/core-plugin-api`](https://backstage.io/api/stable/modules/_backstage_core-plugin-api.html), which means that there is no step that needs to be taken to include these APIs in an app. ### Plugin APIs @@ -133,13 +133,13 @@ there is no step that needs to be taken to include these APIs in an app. In addition to the core APIs, plugins can define and export their own APIs. While doing so, they should usually also provide default implementations of their own APIs; for example, the `catalog` plugin exports `catalogApiRef` and also -supplies a default [`ApiFactory`](../reference/frontend-plugin-api.apifactory.md) of +supplies a default [`ApiFactory`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiFactory.html) of that API using the `CatalogClient`. There is one restriction to plugin-provided API Factories: plugins may not supply factories for core APIs; trying to do so will cause the app to refuse to start. Plugins supply their APIs through the `apis` option of -[`createPlugin`](../reference/core-plugin-api.createplugin.md), for example: +[`createPlugin`](https://backstage.io/api/stable/functions/_backstage_core-plugin-api.index.createPlugin.html), for example: ```ts export const techdocsPlugin = createPlugin({ @@ -164,7 +164,7 @@ Lastly, the app itself is the final point where APIs can be added, and what has the final say in what APIs will be loaded at runtime? The app may override the factories for any of the core or plugin APIs, with the exception of the config, app theme, and identity APIs. These are static APIs that are tied into the -[`createApp`](../reference/app-defaults.createapp.md) implementation and +[`createApp`](https://backstage.io/api/stable/functions/_backstage_app-defaults.createApp.html) implementation and therefore, not possible to override. Overriding APIs is useful for apps that want to switch out behavior to tailor it @@ -185,7 +185,7 @@ const app = createApp({ A common pattern is to export a list of all APIs from `apis.ts`, next to `App.tsx`. See the -[example app in this repo](https://github.com/backstage/backstage/blob/master/packages/app/src/apis.ts) +[example app in this repo](https://github.com/backstage/backstage/blob/master/packages/app-legacy/src/apis.ts) for an example. ## Custom implementations of Utility APIs @@ -227,33 +227,33 @@ const app = createApp({ ``` Note that the above line will cause an error if `IgnoreErrorApi` does not fully -implement the [`ErrorApi`](../reference/frontend-plugin-api.errorapi.md), as it is +implement the [`ErrorApi`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ErrorApi.html), as it is checked by the type embedded in the -[`errorApiRef`](../reference/frontend-plugin-api.errorapiref.md) at compile time. +[`errorApiRef`](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.errorApiRef.html) at compile time. ## Defining custom Utility APIs Plugins are free to define their own Utility APIs. Simply define the TypeScript interface for the API and create an -[`ApiRef`](../reference/frontend-plugin-api.apiref.md) using -[`createApiRef`](../reference/frontend-plugin-api.createapiref.md) exported from -[`@backstage/core-plugin-api`](../reference/core-plugin-api.md). Also, be sure to +[`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html) using +[`createApiRef`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.createApiRef.html) exported from +[`@backstage/core-plugin-api`](https://backstage.io/api/stable/modules/_backstage_core-plugin-api.html). Also, be sure to provide at least one implementation of the API and to declare a default factory -for the API in [`createPlugin`](../reference/core-plugin-api.createplugin.md). +for the API in [`createPlugin`](https://backstage.io/api/stable/functions/_backstage_core-plugin-api.index.createPlugin.html). Custom Utility APIs can be either public or private, which is up to the plugin to choose. Private APIs do not expose an external API surface, and it's therefore possible to make breaking changes to the API without affecting other users of the plugin. If an API is made public, however, it opens up for other plugins to make use of the API, and it also makes it possible for users for your plugin to override the API in the app. It is, however, important to maintain backward compatibility of public APIs, as you may otherwise break apps that are using your plugin. To make an API public, simply export the -[`ApiRef`](../reference/frontend-plugin-api.apiref.md) of the API, and any associated +[`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html) of the API, and any associated types. To make an API private, just avoid exporting the -[`ApiRef`](../reference/frontend-plugin-api.apiref.md), but still be sure to supply a -default factory to [`createPlugin`](../reference/core-plugin-api.createplugin.md). +[`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html), but still be sure to supply a +default factory to [`createPlugin`](https://backstage.io/api/stable/functions/_backstage_core-plugin-api.index.createPlugin.html). Private APIs are useful for plugins that want to depend on other APIs outside of React components, but not have to expose an entire API surface to maintain. When using private APIs, it is fine to use the `typeof` of an implementing class as the type parameter passed to -[`createApiRef`](../reference/frontend-plugin-api.createapiref.md), while public APIs +[`createApiRef`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.createApiRef.html), while public APIs should always define a separate TypeScript interface type. Plugins may depend on APIs from other plugins, both in React components and as @@ -262,13 +262,13 @@ dependencies between plugins. ## Architecture -The [`ApiRef`](../reference/frontend-plugin-api.apiref.md) instances mentioned above +The [`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html) instances mentioned above provide a point of indirection between consumers and producers of Utility APIs. It allows for plugins and components to depend on APIs in a type-safe way, without having a direct reference to a concrete implementation of the APIs. The Apps are also given a lot of flexibility in what implementations to provide. As long as they adhere to the contract established by an -[`ApiRef`](../reference/frontend-plugin-api.apiref.md), they are free to choose any +[`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html), they are free to choose any implementation they want. The figure below shows the relationship between @@ -291,16 +291,16 @@ The indirection provided by Utility APIs also makes it straightforward to test components that depend on APIs, and to provide a standard common development environment for plugins. A proper test wrapper with mocked API implementations is not yet ready, but it will be provided as a part of -[`@backstage/test-utils`](../reference/test-utils.md). It will provide mocked +[`@backstage/test-utils`](https://backstage.io/api/stable/modules/_backstage_test-utils.html). It will provide mocked variants of APIs, with additional methods for asserting a component's interaction with the API. The common development environment for plugins is included in -[`@backstage/dev-utils`](../reference/dev-utils.md), where the exported -[`createDevApp`](../reference/dev-utils.createdevapp.md) function creates an +[`@backstage/dev-utils`](https://backstage.io/api/stable/modules/_backstage_dev-utils.html), where the exported +[`createDevApp`](https://backstage.io/api/stable/functions/_backstage_dev-utils.createDevApp.html) function creates an application with implementations for all core APIs already present. Contrary to the method for wiring up Utility API implementations in an app created with -[`createApp`](../reference/app-defaults.createapp.md), -[`createDevApp`](../reference/dev-utils.createdevapp.md) uses automatic dependency +[`createApp`](https://backstage.io/api/stable/functions/_backstage_app-defaults.createApp.html), +[`createDevApp`](https://backstage.io/api/stable/functions/_backstage_dev-utils.createDevApp.html) uses automatic dependency injection. This is to make it possible to replace any API implementation, and having that be reflected in dependents of that API. diff --git a/docs/architecture-decisions/adr003-avoid-default-exports.md b/docs/architecture-decisions/adr003-avoid-default-exports.md index 8ba37914df..3a4aa47435 100644 --- a/docs/architecture-decisions/adr003-avoid-default-exports.md +++ b/docs/architecture-decisions/adr003-avoid-default-exports.md @@ -48,7 +48,7 @@ benefits. A few are: ## Decision We will stop using default exports except when absolutely necessary (such as -[`React.lazy`](https://reactjs.org/docs/code-splitting.html#reactlazy) modules). +[`React.lazy`](https://18.react.dev/reference/react/lazy) modules). A workaround exists for those that would prefer to never use `default`: ```ts diff --git a/docs/architecture-decisions/adr013-use-node-fetch.md b/docs/architecture-decisions/adr013-use-node-fetch.md index 664faed1db..2172754ac7 100644 --- a/docs/architecture-decisions/adr013-use-node-fetch.md +++ b/docs/architecture-decisions/adr013-use-node-fetch.md @@ -32,7 +32,7 @@ const users = await response.json(); ``` Frontend plugins and packages should prefer to use the -[`fetchApiRef`](https://backstage.io/docs/reference/core-plugin-api.fetchapiref). +[`fetchApiRef`](https://backstage.io/api/stable/variables/_backstage_core-plugin-api.index.fetchApiRef.html). It uses `cross-fetch` internally. Example: ```ts diff --git a/docs/architecture-decisions/adr014-use-fetch.md b/docs/architecture-decisions/adr014-use-fetch.md index 9faa6c9ead..363154fd8d 100644 --- a/docs/architecture-decisions/adr014-use-fetch.md +++ b/docs/architecture-decisions/adr014-use-fetch.md @@ -33,7 +33,7 @@ const users = await response.json(); ``` Frontend plugins and packages should prefer to use the -[`fetchApiRef`](https://backstage.io/docs/reference/core-plugin-api.fetchapiref). +[`fetchApiRef`](https://backstage.io/api/stable/variables/_backstage_core-plugin-api.index.fetchApiRef.html). ```ts import { useApi } from '@backstage/core-plugin-api'; diff --git a/docs/assets/getting-started/create-app-output.png b/docs/assets/getting-started/create-app-output.png index 1987ea41e1..305f2e001a 100644 Binary files a/docs/assets/getting-started/create-app-output.png and b/docs/assets/getting-started/create-app-output.png differ diff --git a/docs/assets/getting-started/login-to-app-as-guest-user.png b/docs/assets/getting-started/login-to-app-as-guest-user.png new file mode 100644 index 0000000000..79c897dcb6 Binary files /dev/null and b/docs/assets/getting-started/login-to-app-as-guest-user.png differ diff --git a/docs/assets/getting-started/portal.png b/docs/assets/getting-started/portal.png index b3133f2278..fd7d52d193 100644 Binary files a/docs/assets/getting-started/portal.png and b/docs/assets/getting-started/portal.png differ diff --git a/docs/auth/auth0/provider.md b/docs/auth/auth0/provider.md index 90ac36f07d..b836bf01f6 100644 --- a/docs/auth/auth0/provider.md +++ b/docs/auth/auth0/provider.md @@ -44,6 +44,7 @@ auth: audience: ${AUTH_AUTH0_AUDIENCE} connection: ${AUTH_AUTH0_CONNECTION} connectionScope: ${AUTH_AUTH0_CONNECTION_SCOPE} + organization: ${AUTH_AUTH0_ORGANIZATION_ID} ## uncomment to set lifespan of user session # sessionDuration: { hours: 24 } # supports `ms` library format (e.g. '24h', '2 days'), ISO duration, "human duration" as used in code session: @@ -69,6 +70,7 @@ Auth0 requires a session, so you need to give the session a secret key. - `connection`: Social identity provider name. To check the available social connections, please visit [Auth0 Social Connections](https://marketplace.auth0.com/features/social-connections). - `connectionScope`: Additional scopes in the interactive token request. It should always be used in combination with the `connection` parameter. - `sessionDuration`: Lifespan of the user session. +- `organization`: Specify a specific organization ID to be targeted as part of the login flow. ### Resolvers diff --git a/docs/auth/github/provider.md b/docs/auth/github/provider.md index fa44ae9405..e20ecb2ef7 100644 --- a/docs/auth/github/provider.md +++ b/docs/auth/github/provider.md @@ -80,6 +80,7 @@ This provider includes several resolvers out of the box that you can use: - `emailMatchingUserEntityProfileEmail`: Matches the email address from the auth provider with the User entity that has a matching `spec.profile.email`. If no match is found, it will throw a `NotFoundError`. - `emailLocalPartMatchingUserEntityName`: Matches the [local part](https://en.wikipedia.org/wiki/Email_address#Local-part) of the email address from the auth provider with the User entity that has a matching `name`. If no match is found, it will throw a `NotFoundError`. - `usernameMatchingUserEntityName`: Matches the username from the auth provider with the User entity that has a matching `name`. If no match is found, it will throw a `NotFoundError`. +- `userIdMatchingUserEntityAnnotation`: Matches the GitHub user ID with the User entity that has a matching `github.com/user-id`. If no match is found, it will throw a `NotFoundError`. :::note Note diff --git a/docs/auth/gitlab/provider.md b/docs/auth/gitlab/provider.md index a76c03d10f..d6751f20ff 100644 --- a/docs/auth/gitlab/provider.md +++ b/docs/auth/gitlab/provider.md @@ -72,6 +72,7 @@ This provider includes several resolvers out of the box that you can use: - `emailMatchingUserEntityProfileEmail`: Matches the email address from the auth provider with the User entity that has a matching `spec.profile.email`. If no match is found, it will throw a `NotFoundError`. - `emailLocalPartMatchingUserEntityName`: Matches the [local part](https://en.wikipedia.org/wiki/Email_address#Local-part) of the email address from the auth provider with the User entity that has a matching `name`. If no match is found, it will throw a `NotFoundError`. - `usernameMatchingUserEntityName`: Matches the username from the auth provider with the User entity that has a matching `name`. If no match is found, it will throw a `NotFoundError`. +- `userIdMatchingUserEntityAnnotation`: Matches the GitLab user ID with the User entity that has a matching `gitlab.com/user-id` annotation (or `{integration-host}/user-id` for self-hosted GitLab instances). If no match is found, it will throw a `NotFoundError`. :::note Note diff --git a/docs/auth/identity-resolver.md b/docs/auth/identity-resolver.md index 5fb69c7955..0d4b50dcbe 100644 --- a/docs/auth/identity-resolver.md +++ b/docs/auth/identity-resolver.md @@ -287,7 +287,7 @@ async signInResolver(info, ctx) { If you throw an error in the sign in resolver function, the sign in attempt is immediately rejected, and the error details are presented in the user interface. -The `ctx` context [has several useful functions](https://backstage.io/docs/reference/plugin-auth-node.authresolvercontext/) +The `ctx` context [has several useful functions](https://backstage.io/api/stable/types/_backstage_plugin-auth-node.AuthResolverContext.html) for issuing tokens in various ways. ### Custom Ownership Resolution diff --git a/docs/auth/index.md b/docs/auth/index.md index a3141d0434..fb85eb999b 100644 --- a/docs/auth/index.md +++ b/docs/auth/index.md @@ -211,6 +211,8 @@ to get the existing session, which is exactly what the `ProxiedSignInPage` does. thing you need to do to configure the `ProxiedSignInPage` is to pass the ID of the provider like this: ```tsx title="packages/app/src/App.tsx" +import { ProxiedSignInPage } from '@backstage/core-components'; + const app = createApp({ components: { SignInPage: props => , @@ -285,7 +287,7 @@ sign-in resolvers so that they resolve to the same identity regardless of the me ## Scaffolder Configuration (Software Templates) -If you want to use the authentication capabilities of the [Repository Picker](../features/software-templates/writing-templates.md#the-repository-picker) inside your software templates, you will need to configure the [`ScmAuthApi`](https://backstage.io/docs/reference/integration-react.scmauthapi) alongside your authentication provider. It is an API used to authenticate towards different SCM systems in a generic way, based on what resource is being accessed. +If you want to use the authentication capabilities of the [Repository Picker](../features/software-templates/writing-templates.md#the-repository-picker) inside your software templates, you will need to configure the [`ScmAuthApi`](https://backstage.io/api/stable/interfaces/_backstage_integration-react.ScmAuthApi.html) alongside your authentication provider. It is an API used to authenticate towards different SCM systems in a generic way, based on what resource is being accessed. To set it up, you'll need to add an API factory entry to `packages/app/src/apis.ts`. The example below sets up the `ScmAuthApi` for an already configured GitLab authentication provider: @@ -340,7 +342,7 @@ The method with which frontend plugins request access to third-party services is through [Utility APIs](../api/utility-apis.md) for each service provider. These are all suffixed with `*AuthApiRef`, for example `githubAuthApiRef`. For a full list of providers, see the -[@backstage/core-plugin-api](../reference/core-plugin-api.md#variables) reference. +[@backstage/core-plugin-api](https://backstage.io/api/stable/modules/_backstage_core-plugin-api.index.html#alertapiref) reference. ## Custom Authentication Provider @@ -361,7 +363,7 @@ The default `ScmAuthApi` provides integrations for `github`, `gitlab`, `azure` a ScmAuth.createDefaultApiFactory(); ``` -If you require only a subset of these integrations, then you will need a custom implementation of the [`ScmAuthApi`](https://backstage.io/docs/reference/integration-react.scmauthapi). It is an API used to authenticate different SCM systems generically, based on what resource is being accessed, and is used for example, by the Scaffolder (Software Templates) and Catalog Import plugins. +If you require only a subset of these integrations, then you will need a custom implementation of the [`ScmAuthApi`](https://backstage.io/api/stable/interfaces/_backstage_integration-react.ScmAuthApi.html). It is an API used to authenticate different SCM systems generically, based on what resource is being accessed, and is used for example, by the Scaffolder (Software Templates) and Catalog Import plugins. The first step is to remove the code that creates the default providers. diff --git a/docs/auth/oidc.md b/docs/auth/oidc.md index 7c4b09d9bf..a55719e564 100644 --- a/docs/auth/oidc.md +++ b/docs/auth/oidc.md @@ -136,7 +136,15 @@ auth: - resolver: emailMatchingUserEntityProfileEmail ``` -If none of the built-in resolvers are suitable, you can alternatively write a custom resolver. See an example below: +If none of the built-in resolvers are suitable, you can alternatively write a custom resolver. + +First, install the OIDC provider module: + +```bash +yarn --cwd packages/backend add @backstage/plugin-auth-backend-module-oidc-provider +``` + +Then create a custom resolver as shown below: ```ts title="in packages/backend/src/index.ts" /* highlight-add-start */ @@ -146,6 +154,10 @@ import { createOAuthProviderFactory, } from '@backstage/plugin-auth-node'; import { oidcAuthenticator } from '@backstage/plugin-auth-backend-module-oidc-provider'; +import { + stringifyEntityRef, + DEFAULT_NAMESPACE, +} from '@backstage/catalog-model'; const myAuthProviderModule = createBackendModule({ // This ID must be exactly "auth" because that's the plugin it targets @@ -168,7 +180,7 @@ const myAuthProviderModule = createBackendModule({ async signInResolver(info, ctx) { const userRef = stringifyEntityRef({ kind: 'User', - name: info.result.userinfo.sub, + name: info.result.fullProfile.userinfo.sub, namespace: DEFAULT_NAMESPACE, }); return ctx.issueToken({ @@ -241,6 +253,12 @@ These parameters have implicit default values. Don't override them unless you kn - `prompt`: Recommended to use `auto` so the browser will request sign-in to the IDP if the user has no active session. - `sessionDuration`: Lifespan of the user session. +- `startUrlSearchParams`: This is a dictionary of search (query) parameters for the OIDC + authorization start URL. Don't define it unless you want to change the identity + provider's behavior. (For example, you could set the `organization` parameter to guide + users towards a particular sign-in option that your organization prefers.) **Note:** the + start URL is controlled by the browser, so this feature is only for improving the + Backstage user experience. :::note Config Reloading Backstage does not yet support hot reloading of auth provider configuration. Any changes to this YAML file require a restart of Backstage. diff --git a/docs/backend-system/architecture/05-extension-points.md b/docs/backend-system/architecture/05-extension-points.md index 2e11d2763f..611807020e 100644 --- a/docs/backend-system/architecture/05-extension-points.md +++ b/docs/backend-system/architecture/05-extension-points.md @@ -65,6 +65,64 @@ export const scaffolderPlugin = createBackendPlugin( Note that we create a closure that adds to a shared `actions` structure when `addAction` is called by users of your extension point. It is safe for us to then access our `actions` in the `init` method of our plugin, since all modules that extend our plugin will be completely initialized before our plugin gets initialized. That means that at the point where our `init` method is called, all actions have been added and can be accessed. +## Factory-Based Extension Points + +In some cases, you may want to be able to attribute startup failures to modules that provided an extension, rather than failing the plugin startup entirely. To do this, you can use a variant of `registerExtensionPoint` that instead of providing a direct implementation, registers a factory function that produces the implementation. This factory receives an `ExtensionPointFactoryContext` with a `reportModuleStartupFailure` method that lets you report startup failures and attribute them to the module. + +Here's an example of registering an extension point using a factory: + +```ts +import { + createBackendPlugin, + ExtensionPointFactoryContext, +} from '@backstage/backend-plugin-api'; +import { assertError, ForwardedError } from '@backstage/errors'; +import { createProviderConnection, Provider } from './internal'; + +type ProviderEntry = { + provider: Provider; + context: ExtensionPointFactoryContext; +}; + +export const examplePlugin = createBackendPlugin({ + pluginId: 'example', + register(env) { + const providers: ProviderEntry[] = []; + + // Using the variant of registerExtensionPoint that takes an options object. + env.registerExtensionPoint({ + extensionPoint: exampleProvidersExtensionPoint, + // The factory function produces a separate instance for each module. + factory: context => ({ + addProvider(provider) { + // Store the context together with the provider so we can report failures later + providers.push({ provider, context }); + }, + }), + }); + + env.registerInit({ + deps: { database: coreServices.database }, + async init({ database }) { + for (const { provider, context } of providers) { + const connection = await createProviderConnection(provider, database); + try { + // This connects each provider that was installed by a module + await provider.connect(connection); + } catch (error: unknown) { + // If the connection fails, we can report this as a failure of the module rather than the plugin + assertError(error); + context.reportModuleStartupFailure({ + error: new ForwardedError('Failed to connect provider', error), + }); + } + } + }, + }); + }, +}); +``` + ## Module Extension Points Just like plugins, modules can also provide their own extension points. The API for registering and using extension points is the same as for plugins. However, modules should typically only use extension points to allow for complex internal customizations by users of the plugin module. It is therefore preferred to export the extension point directly from the module package, rather than creating a separate node library for that purpose. Extension points exported by a module are used the same way as extension points exported by a plugin, you create your own separate module and declare a dependency on the extension point that you want to interact with. diff --git a/docs/backend-system/architecture/08-naming-patterns.md b/docs/backend-system/architecture/08-naming-patterns.md index 585a9fe87c..d073f3382c 100644 --- a/docs/backend-system/architecture/08-naming-patterns.md +++ b/docs/backend-system/architecture/08-naming-patterns.md @@ -11,10 +11,10 @@ As a rule, all names should be camel case, with the exceptions of plugin and mod ### Plugins -| Description | Pattern | Examples | -| ----------- | ----------------- | ------------------------------------- | -| export | `Plugin` | `catalogPlugin`, `userSettingsPlugin` | -| ID | `''` | `'catalog'`, `'user-settings'` | +| Description | Pattern | Examples | Notes | +| ----------- | ----------------- | ------------------------------------- | --------------------------------------------------- | +| export | `Plugin` | `catalogPlugin`, `userSettingsPlugin` | | +| ID | `''` | `'catalog'`, `'user-settings'` | letters, digits, and dashes, starting with a letter | Example: @@ -27,10 +27,10 @@ export const userSettingsPlugin = createBackendPlugin({ ### Modules -| Description | Pattern | Examples | -| ----------- | ---------------------------- | ----------------------------------- | -| export | `Module` | `catalogModuleGithubEntityProvider` | -| ID | `''` | `'github-entity-provider'` | +| Description | Pattern | Examples | Notes | +| ----------- | ---------------------------- | ----------------------------------- | --------------------------------------------------- | +| export | `Module` | `catalogModuleGithubEntityProvider` | | +| ID | `''` | `'github-entity-provider'` | letters, digits, and dashes, starting with a letter | Example: diff --git a/docs/backend-system/building-backends/01-index.md b/docs/backend-system/building-backends/01-index.md index 0f0a8e01ea..a38c1d44e5 100644 --- a/docs/backend-system/building-backends/01-index.md +++ b/docs/backend-system/building-backends/01-index.md @@ -14,7 +14,7 @@ system, see [migrating](./08-migrating.md). This section covers how to set up and customize your own Backstage backend. It covers some aspects of how backend instances fit into the larger system, but for a more in-depth explanation of the role of backends in the backend system, see [the architecture section](../architecture/02-backends.md). -# Overview +## Overview A minimal Backstage backend is very lightweight. It is a single package with a `package.json` file and a `src/index.ts` file, not counting surrounding tooling and documentation. The package is typically placed within the `packages/backend` folder of a Backstage monorepo, but that is up to you. The backend package is part of any project created with `@backstage/create-app`, so you typically do not need to create it yourself. diff --git a/docs/backend-system/building-backends/08-migrating.md b/docs/backend-system/building-backends/08-migrating.md index a638516165..3aa06216b4 100644 --- a/docs/backend-system/building-backends/08-migrating.md +++ b/docs/backend-system/building-backends/08-migrating.md @@ -220,7 +220,7 @@ These are the deprecation messages for the most common replacements: - `getRootLogger` - This function will be removed in the future. If you need to get the root logger in the new system, please check out this documentation: https://backstage.io/docs/backend-system/core-services/logger - `getVoidLogger` - This function will be removed in the future. If you need to mock the root logger in the new system, please use `mockServices.logger.mock()` from `@backstage/backend-test-utils` instead. - `legacyPlugin` - Fully use the new backend system instead. -- `loadBackendConfig` - Please migrate to the new backend system and use `coreServices.rootConfig` instead, or the [@backstage/config-loader#ConfigSources](https://backstage.io/docs/reference/config-loader.configsources) facilities if required. +- `loadBackendConfig` - Please migrate to the new backend system and use `coreServices.rootConfig` instead, or the [@backstage/config-loader#ConfigSources](https://backstage.io/api/stable/classes/_backstage_config-loader.ConfigSources.html) facilities if required. - `loggerToWinstonLogger` - Migrate to use the new `LoggerService` instead. - `resolveSafeChildPath` - This function is deprecated and will be removed in a future release, see [#24493](https://github.com/backstage/backstage/issues/24493). Please use the `resolveSafeChildPath` function from the `@backstage/backend-plugin-api` package instead. - `ServerTokenManager` - Please [migrate](https://backstage.io/docs/tutorials/auth-service-migration) to the new `coreServices.auth`, `coreServices.httpAuth`, and `coreServices.userInfo` services as needed instead. @@ -660,7 +660,7 @@ depends on the appropriate extension point and interacts with it. ```ts title="packages/backend/src/index.ts" /* highlight-add-start */ -import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; +import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node'; import { createBackendModule } from '@backstage/backend-plugin-api'; /* highlight-add-end */ diff --git a/docs/backend-system/building-plugins-and-modules/02-testing.md b/docs/backend-system/building-plugins-and-modules/02-testing.md index 67fb3d4f22..8aaead97af 100644 --- a/docs/backend-system/building-plugins-and-modules/02-testing.md +++ b/docs/backend-system/building-plugins-and-modules/02-testing.md @@ -57,7 +57,7 @@ interactions with the running test service. ### mock services -The [`mockServices`](https://backstage.io/docs/reference/backend-test-utils.mockservices) object from `@backstage/backend-test-utils` provides service factory functions, and mocks for all core services that you can use to verify interactions between plugin and services. +The [`mockServices`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html) object from `@backstage/backend-test-utils` provides service factory functions, and mocks for all core services that you can use to verify interactions between plugin and services. All mock services provide a factory function that is sufficient for most tests. Here's an example: @@ -106,24 +106,24 @@ describe('myPlugin', () => { Available services: -- [`auth`](https://backstage.io/docs/reference/backend-test-utils.mockservices.auth/) -- [`cache`](https://backstage.io/docs/reference/backend-test-utils.mockservices.cache/) -- [`database`](https://backstage.io/docs/reference/backend-test-utils.mockservices.database/) -- [`discovery`](https://backstage.io/docs/reference/backend-test-utils.mockservices.discovery/) -- [`events`](https://backstage.io/docs/reference/backend-test-utils.mockservices.events/) -- [`httpAuth`](https://backstage.io/docs/reference/backend-test-utils.mockservices.httpAuth/) -- [`httpRouter`](https://backstage.io/docs/reference/backend-test-utils.mockservices.httpRouter/) -- [`lifecycle`](https://backstage.io/docs/reference/backend-test-utils.mockservices.lifecycle/) -- [`logger`](https://backstage.io/docs/reference/backend-test-utils.mockservices.logger/) -- [`permissions`](https://backstage.io/docs/reference/backend-test-utils.mockservices.permissions/) -- [`rootConfig`](https://backstage.io/docs/reference/backend-test-utils.mockservices.rootConfig/) -- [`rootHealth`](https://backstage.io/docs/reference/backend-test-utils.mockservices.rootHealth/) -- [`rootHttpRouter`](https://backstage.io/docs/reference/backend-test-utils.mockservices.rootHttpRouter/) -- [`rootLifecycle`](https://backstage.io/docs/reference/backend-test-utils.mockservices.rootLifecycle/) -- [`rootLogger`](https://backstage.io/docs/reference/backend-test-utils.mockservices.rootLogger/) -- [`scheduler`](https://backstage.io/docs/reference/backend-test-utils.mockservices.scheduler/) -- [`urlReader`](https://backstage.io/docs/reference/backend-test-utils.mockservices.urlReader/) -- [`userInfo`](https://backstage.io/docs/reference/backend-test-utils.mockservices.userInfo/) +- [`auth`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html#auth) +- [`cache`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html#cache) +- [`database`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html#database) +- [`discovery`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html#discovery) +- [`events`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html#events) +- [`httpAuth`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html#httpAuth) +- [`httpRouter`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html#httpRouter) +- [`lifecycle`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html#lifecycle) +- [`logger`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html#logger) +- [`permissions`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html#permissions) +- [`rootConfig`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html#rootConfig) +- [`rootHealth`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html#rootHealth) +- [`rootHttpRouter`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html#rootHttpRouter) +- [`rootLifecycle`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html#rootLifecycle/) +- [`rootLogger`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html#rootLogger/) +- [`scheduler`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html#scheduler/) +- [`urlReader`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html#urlReader/) +- [`userInfo`](https://backstage.io/api/stable/modules/_backstage_backend-test-utils.index.mockServices.html#userInfo/) ## Testing Remote Service Interactions diff --git a/docs/backend-system/core-services/actions.md b/docs/backend-system/core-services/actions.md index ddb28b4da7..02f8b65591 100644 --- a/docs/backend-system/core-services/actions.md +++ b/docs/backend-system/core-services/actions.md @@ -30,7 +30,9 @@ This naming convention ensures that action names are globally unique across all ## Configuration -The Actions Service can be configured to control which plugins' actions are available: +### Restricting action sources by plugin + +The `pluginSources` configuration limits which plugins are allowed to register actions. ```yaml backend: @@ -39,6 +41,30 @@ backend: - catalog ``` +### Filtering actions + +In addition to plugin-level restrictions, the Actions Service supports filtering actions using include and exclude rules. This allows fine-grained control over which actions are exposed or runnable in a Backstage instance. + +#### Include specific actions + +```yaml +backend: + actions: + filter: + include: + - 'catalog.*' +``` + +#### Exclude specific actions + +```yaml +backend: + actions: + filter: + exclude: + - 'scaffolder.internal.*' +``` + ## Using the Service ### Listing Available Actions diff --git a/docs/backend-system/core-services/http-router.md b/docs/backend-system/core-services/http-router.md index 6de394f549..c6796af8aa 100644 --- a/docs/backend-system/core-services/http-router.md +++ b/docs/backend-system/core-services/http-router.md @@ -89,7 +89,7 @@ backend: window: 6s # Time window for rate limiting for single client incomingRequestLimit: 100 # Number of requests to accept from one client during time window ipAllowList: ['127.0.0.1'] # IPs to bypass rate limiting - skipSuccesfulRequests: false # Rate limit successful requests + skipSuccessfulRequests: false # Rate limit successful requests skipFailedRequests: false # Rate limit failed requests plugin: # Plugin specific rate limiting diff --git a/docs/backend-system/core-services/root-http-router.md b/docs/backend-system/core-services/root-http-router.md index 9c2c60957f..2f7f324005 100644 --- a/docs/backend-system/core-services/root-http-router.md +++ b/docs/backend-system/core-services/root-http-router.md @@ -164,7 +164,7 @@ Note that requests towards `/api/*` will never be handled by the `routes` handle The root HTTP Router service also allows for configuration of the underlying Node.js HTTP server object. This is useful for modifying settings on the HTTP server itself, such as server [`timeout`](https://nodejs.org/api/http.html#servertimeout), [`keepAliveTimeout`](https://nodejs.org/api/http.html#serverkeepalivetimeout), and [`headersTimeout`](https://nodejs.org/api/http.html#serverheaderstimeout). -A `applyDefaults` helper is also made available to use the default app/router configuration while still enabling custom server configuration +An `applyDefaults` helper is also made available to use the default app/router configuration while still enabling custom server configuration ```ts import { rootHttpRouterServiceFactory } from '@backstage/backend-defaults/rootHttpRouter'; diff --git a/docs/conf/reading.md b/docs/conf/reading.md index a565f3a8a3..905f081f1d 100644 --- a/docs/conf/reading.md +++ b/docs/conf/reading.md @@ -7,7 +7,7 @@ description: Documentation on Reading Backstage Configuration ## Config API There's a common configuration API for by both frontend and backend plugins. An -API reference can be found [here](../reference/config.config.md). +API reference can be found [here](https://backstage.io/api/stable/types/_backstage_config.Config.html). The configuration API is tailored towards failing fast in case of missing or bad config. That's because configuration errors can always be considered programming @@ -115,7 +115,7 @@ example `getString`. These will throw an error if there is no value available. ## Accessing ConfigApi in Frontend Plugins -The [ConfigApi](../reference/frontend-plugin-api.configapi.md) in the frontend is a +The [ConfigApi](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ConfigApi.html) in the frontend is a [UtilityApi](../api/utility-apis.md). It's accessible as usual via the `configApiRef` exported from `@backstage/core-plugin-api`: @@ -131,7 +131,7 @@ const MyReactComponent = (...) => { Depending on the config api in another API is slightly different though, as the `ConfigApi` implementation is supplied via the App itself and not instantiated like other APIs. See -[packages/app/src/apis.ts](https://github.com/backstage/backstage/blob/244eef851f5aa19f91c7c9b5c12d5df95cf482ca/packages/app/src/apis.ts#L66) +[packages/app-legacy/src/apis.ts](https://github.com/backstage/backstage/blob/244eef851f5aa19f91c7c9b5c12d5df95cf482ca/packages/app-legacy/src/apis.ts#L66) for an example of how this wiring is done. For standalone plugin setups in `dev/index.ts`, register a factory with a diff --git a/docs/conf/user-interface/index.md b/docs/conf/user-interface/index.md index 81acfdf720..cb53ebe81c 100644 --- a/docs/conf/user-interface/index.md +++ b/docs/conf/user-interface/index.md @@ -103,13 +103,13 @@ Backstage UI is using light by default under `:root` but you can target it more [data-theme-mode='light'] { /* Light theme specific styles */ -  --bui-bg: #f8f8f8; +  --bui-bg-app: #f8f8f8; --bui-fg-primary: #000; } [data-theme-mode='dark'] { /* Dark theme specific styles */ -  --bui-bg: #333333; +  --bui-bg-app: #333333; --bui-fg-primary: #fff; } ``` @@ -122,91 +122,107 @@ We recommend starting with a core set of CSS variables to quickly achieve a bran And if you’d like to go even further, you can target specific component class names for advanced customization. -| Token Name | Description | -| -------------------- | ----------------------------------------------------------------------------------- | -| `--bui-bg` | This is used to define the background color of your app. It will only be used once. | -| `--bui-bg-surface-1` | We ar using this color to sit on top of `--bui-bg` mostly for `Card`, `Dialog`, ... | -| `--bui-bg-surface-2` | This is for content inside elevated components. This colour is less common. | -| `--bui-bg-solid` | This is used for main actions like primary buttons. | -| `--bui-fg-solid` | This is for texts or icons on top of a solid backgrounds. | -| `--bui-fg-primary` | Your primary text or icon colours. | -| `--bui-fg-secondary` | Your secondary text or icon colours. | -| `--bui-fg-link` | Used for links. | -| `--bui-border` | Main borders around surfaces like `Card`, `Dialog`, ... | -| `--bui-font-regular` | The main font of your app. | +| Token Name | Description | +| -------------------- | ---------------------------------------------------------------------------------------- | +| `--bui-bg-app` | This is used to define the background color of your app. It will only be used once. | +| `--bui-bg-neutral-1` | We are using this color to sit on top of `--bui-bg-app` mostly for `Card`, `Dialog`, ... | +| `--bui-bg-neutral-2` | This is for content inside elevated components. This colour is less common. | +| `--bui-bg-solid` | This is used for main actions like primary buttons. | +| `--bui-fg-solid` | This is for texts or icons on top of a solid backgrounds. | +| `--bui-fg-primary` | Your primary text or icon colours. | +| `--bui-fg-secondary` | Your secondary text or icon colours. | +| `--bui-fg-danger` | Used for error states and destructive actions. | +| `--bui-fg-warning` | Used for warning states and cautionary information. | +| `--bui-fg-success` | Used for success states and positive feedback. | +| `--bui-fg-info` | Used for informational content and neutral status. | +| `--bui-border-1` | Subtle borders for low-contrast separators. | +| `--bui-border-2` | Main borders around surfaces like `Card`, `Dialog`, ... | +| `--bui-font-regular` | The main font of your app. |
    All available CSS variables #### Base colors -These colors are used for special purposes like ring, scrollbar, ... +| Token Name | Description | +| ------------- | ----------------------------------------------------------------------- | +| `--bui-black` | Pure black color. This one should be the same in light and dark themes. | +| `--bui-white` | Pure white color. This one should be the same in light and dark themes. | -| Token Name | Description | -| -------------- | ----------------------------------------------------------------------- | -| `--bui-black` | Pure black color. This one should be the same in light and dark themes. | -| `--bui-white` | Pure white color. This one should be the same in light and dark themes. | -| `--bui-gray-1` | You can use these mostly for backgrounds colors. | -| `--bui-gray-2` | You can use these mostly for backgrounds colors. | -| `--bui-gray-3` | You can use these mostly for backgrounds colors. | -| `--bui-gray-4` | You can use these mostly for backgrounds colors. | -| `--bui-gray-5` | You can use these mostly for backgrounds colors. | -| `--bui-gray-6` | You can use these mostly for backgrounds colors. | -| `--bui-gray-7` | You can use these mostly for backgrounds colors. | -| `--bui-gray-8` | You can use these mostly for backgrounds colors. | +#### Neutral background colors -#### Core background colors +These colors form a layered neutral scale for your application backgrounds. `--bui-bg-app` is the base background color. Each subsequent level (1 through 4) represents an elevated layer, with hover, pressed, and disabled variants for interactive states. -These colors are used for the background of your application. We are mostly using for now a single elevated background for panels. `--bui-bg` should mostly use as the main background color of your app. +| Token Name | Description | +| ----------------------------- | ------------------------------------------------------------ | +| `--bui-bg-app` | The base background color of your Backstage instance. | +| `--bui-bg-popover` | The background color used for popovers, tooltips, and menus. | +| `--bui-bg-neutral-1` | First elevated layer. Use for cards, dialogs, and panels. | +| `--bui-bg-neutral-1-hover` | Hover state for elements on neutral-1. | +| `--bui-bg-neutral-1-pressed` | Pressed state for elements on neutral-1. | +| `--bui-bg-neutral-1-disabled` | Disabled state for elements on neutral-1. | +| `--bui-bg-neutral-2` | Second elevated layer. Use for elements on top of neutral-1. | +| `--bui-bg-neutral-2-hover` | Hover state for elements on neutral-2. | +| `--bui-bg-neutral-2-pressed` | Pressed state for elements on neutral-2. | +| `--bui-bg-neutral-2-disabled` | Disabled state for elements on neutral-2. | +| `--bui-bg-neutral-3` | Third elevated layer. Use for elements on top of neutral-2. | +| `--bui-bg-neutral-3-hover` | Hover state for elements on neutral-3. | +| `--bui-bg-neutral-3-pressed` | Pressed state for elements on neutral-3. | +| `--bui-bg-neutral-3-disabled` | Disabled state for elements on neutral-3. | +| `--bui-bg-neutral-4` | Fourth elevated layer. Use for elements on top of neutral-3. | +| `--bui-bg-neutral-4-hover` | Hover state for elements on neutral-4. | +| `--bui-bg-neutral-4-pressed` | Pressed state for elements on neutral-4. | +| `--bui-bg-neutral-4-disabled` | Disabled state for elements on neutral-4. | -| Token Name | Description | -| ------------------------- | ------------------------------------------------ | -| `--bui-bg` | The background color of your Backstage instance. | -| `--bui-bg-surface-1` | Use for any panels or elevated surfaces. | -| `--bui-bg-surface-2` | Use for any panels or elevated surfaces. | -| `--bui-bg-solid` | Used for solid background colors. | -| `--bui-bg-solid-hover` | Used for solid background colors when hovered. | -| `--bui-bg-solid-pressed` | Used for solid background colors when pressed. | -| `--bui-bg-solid-disabled` | Used for solid background colors when disabled. | -| `--bui-bg-tint` | Used for tint background colors. | -| `--bui-bg-tint-hover` | Used for tint background colors when hovered. | -| `--bui-bg-tint-focus` | Used for tint background colors when active. | -| `--bui-bg-tint-disabled` | Used for tint background colors when disabled. | -| `--bui-bg-danger` | Used to show errors information. | -| `--bui-bg-warning` | Used to show warnings information. | -| `--bui-bg-success` | Used to show success information. | +#### Solid background colors + +| Token Name | Description | +| ------------------------- | ----------------------------------------------- | +| `--bui-bg-solid` | Used for solid background colors. | +| `--bui-bg-solid-hover` | Used for solid background colors when hovered. | +| `--bui-bg-solid-pressed` | Used for solid background colors when pressed. | +| `--bui-bg-solid-disabled` | Used for solid background colors when disabled. | + +#### Status background colors + +| Token Name | Description | +| ------------------ | ----------------------------------- | +| `--bui-bg-danger` | Used to show errors information. | +| `--bui-bg-warning` | Used to show warnings information. | +| `--bui-bg-success` | Used to show success information. | +| `--bui-bg-info` | Used to show informational content. | #### Foreground colors Foreground colours are meant to work in pair with a background colours. Typically this would work for icons, texts, shapes, ... Use a matching name to know what foreground color to use. These colors are prefixed with `fg` to make it easier to identify. -| Token Name | Description | -| ------------------------ | ----------------------------------------------------------------- | -| `--bui-fg-primary` | It should be used on top of main background surfaces. | -| `--bui-fg-secondary` | It should be used on top of main background surfaces. | -| `--bui-fg-link` | It should be used on top of main background surfaces. | -| `--bui-fg-link-hover` | It should be used on top of main background surfaces. | -| `--bui-fg-disabled` | It should be used on top of main background surfaces. | -| `--bui-fg-solid` | It should be used on top of solid background colors. | -| `--bui-fg-tint` | It should be used on top of tint background colors. | -| `--bui-fg-tint-disabled` | It should be used on top of tint background colors when disabled. | -| `--bui-fg-danger` | It should be used on top of danger background colors. | -| `--bui-fg-warning` | It should be used on top of warning background colors. | -| `--bui-fg-success` | It should be used on top of success background colors. | +| Token Name | Description | +| ------------------------ | ------------------------------------------------------ | +| `--bui-fg-primary` | It should be used on top of main background surfaces. | +| `--bui-fg-secondary` | It should be used on top of main background surfaces. | +| `--bui-fg-disabled` | It should be used on top of main background surfaces. | +| `--bui-fg-solid` | It should be used on top of solid background colors. | +| `--bui-fg-danger` | Used for error states and destructive actions. | +| `--bui-fg-warning` | Used for warning states and cautionary information. | +| `--bui-fg-success` | Used for success states and positive feedback. | +| `--bui-fg-info` | Used for informational content and neutral status. | +| `--bui-fg-danger-on-bg` | It should be used on top of danger background colors. | +| `--bui-fg-warning-on-bg` | It should be used on top of warning background colors. | +| `--bui-fg-success-on-bg` | It should be used on top of success background colors. | +| `--bui-fg-info-on-bg` | It should be used on top of info background colors. | #### Border colors These border colors are mostly meant to be used as borders on top of any components with low contrast to help as a separator with the different background colors. -| Token Name | Description | -| ----------------------- | --------------------------------------------------- | -| `--bui-border` | It should be used on top of `--bui-bg-surface-1`. | -| `--bui-border-hover` | Used when the component is interactive and hovered. | -| `--bui-border-pressed` | Used when the component is interactive and hovered. | -| `--bui-border-disabled` | Used when the component is disabled. | -| `--bui-border-danger` | It should be used on top of `--bui-bg-danger`. | -| `--bui-border-warning` | It should be used on top of `--bui-bg-warning`. | -| `--bui-border-success` | It should be used on top of `--bui-bg-success`. | +| Token Name | Description | +| ---------------------- | ------------------------------------------------- | +| `--bui-border-1` | Subtle border for low-contrast separators. | +| `--bui-border-2` | It should be used on top of `--bui-bg-neutral-1`. | +| `--bui-border-danger` | It should be used on top of `--bui-bg-danger`. | +| `--bui-border-warning` | It should be used on top of `--bui-bg-warning`. | +| `--bui-border-success` | It should be used on top of `--bui-bg-success`. | +| `--bui-border-info` | It should be used on top of `--bui-bg-info`. | #### Special colors diff --git a/docs/contribute/getting-involved.md b/docs/contribute/getting-involved.md index 696b73b7d4..9d5454579f 100644 --- a/docs/contribute/getting-involved.md +++ b/docs/contribute/getting-involved.md @@ -40,7 +40,7 @@ Docs are published to [backstage.io/docs](https://backstage.io/docs). If you contribute to the documentation, you might want to preview your changes before submitting them. You'll find the website sources under [/microsite](https://github.com/backstage/backstage/tree/master/microsite) with instructions for building and locally serving the website in the -[README](/microsite#readme). +[README](https://github.com/backstage/backstage/blob/master/microsite/README.md). For additional information and helpful guidelines on how to contribute to the documentation, check out these [Documentation Guidelines](https://github.com/backstage/backstage/blob/master/CONTRIBUTING.md#documentation-guidelines)! diff --git a/docs/deployment/docker.md b/docs/deployment/docker.md index 04b72da445..852248d543 100644 --- a/docs/deployment/docker.md +++ b/docs/deployment/docker.md @@ -53,7 +53,7 @@ Once the host build is complete, we are ready to build our image. The following `Dockerfile` is included when creating a new app with `@backstage/create-app`: ```dockerfile -FROM node:22-bookworm-slim +FROM node:24-trixie-slim # Set Python interpreter for `node-gyp` to use ENV PYTHON=/usr/bin/python3 @@ -178,7 +178,7 @@ the repo root: ```dockerfile # Stage 1 - Create yarn install skeleton layer -FROM node:22-bookworm-slim AS packages +FROM node:24-trixie-slim AS packages WORKDIR /app COPY backstage.json package.json yarn.lock ./ @@ -193,7 +193,7 @@ COPY plugins plugins RUN find packages \! -name "package.json" -mindepth 2 -maxdepth 2 -exec rm -rf {} \+ # Stage 2 - Install dependencies and build packages -FROM node:22-bookworm-slim AS build +FROM node:24-trixie-slim AS build # Set Python interpreter for `node-gyp` to use ENV PYTHON=/usr/bin/python3 @@ -231,7 +231,7 @@ RUN mkdir packages/backend/dist/skeleton packages/backend/dist/bundle \ && tar xzf packages/backend/dist/bundle.tar.gz -C packages/backend/dist/bundle # Stage 3 - Build the actual backend image and install production dependencies -FROM node:22-bookworm-slim +FROM node:24-trixie-slim # Set Python interpreter for `node-gyp` to use ENV PYTHON=/usr/bin/python3 diff --git a/docs/deployment/scaling.md b/docs/deployment/scaling.md index 2c3b687f67..dd765d3c1a 100644 --- a/docs/deployment/scaling.md +++ b/docs/deployment/scaling.md @@ -17,7 +17,7 @@ into multiple different services, each running a different set of plugins. This is a more advanced approach and requires you to be able to route requests to the appropriate backends based on the plugin ID. Both for ingress, but also internal traffic between Backstage backends, which is done by creating a custom -implementation of the [DiscoveryService](../reference/backend-plugin-api.discoveryservice.md) interface. See the [backend system docs](../backend-system/building-backends/01-index.md#split-into-multiple-backends) for more details on how to separate your deployment into multiple backend instances. +implementation of the [DiscoveryService](https://backstage.io/api/stable/interfaces/_backstage_backend-plugin-api.index.DiscoveryService.html) interface. See the [backend system docs](../backend-system/building-backends/01-index.md#split-into-multiple-backends) for more details on how to separate your deployment into multiple backend instances. Lastly, you can also replicate the Backstage deployments across multiple regions. This is not a pattern that there is built-in support for and typically only makes diff --git a/docs/dls/contributing-to-storybook.md b/docs/dls/contributing-to-storybook.md index fad8d0e8b0..7b5aaffd5d 100644 --- a/docs/dls/contributing-to-storybook.md +++ b/docs/dls/contributing-to-storybook.md @@ -55,8 +55,11 @@ core └── Progress.stories.tsx ``` -> _Note: make sure your component story file has the following format -> componentName.stories.tsx_ +:::note Note + +Make sure your component story file has the following format +componentName.stories.tsx +::: ## Running locally diff --git a/docs/faq/technical.md b/docs/faq/technical.md index 32511351f0..5e01da00d2 100644 --- a/docs/faq/technical.md +++ b/docs/faq/technical.md @@ -7,7 +7,7 @@ description: General technical questions about Backstage. ### What technology does Backstage use? Backstage is a large scale [TypeScript](https://www.typescriptlang.org/) -application whose frontend parts use [React](https://react.dev/) and +framework whose frontend parts use [React](https://react.dev/) and [Material UI](https://material-ui.com/), while the backend parts use [Node.js](https://nodejs.org/) and the [Express](https://expressjs.com/) framework. diff --git a/docs/features/kubernetes/configuration.md b/docs/features/kubernetes/configuration.md index 6a3f3760bf..922bfb6018 100644 --- a/docs/features/kubernetes/configuration.md +++ b/docs/features/kubernetes/configuration.md @@ -195,11 +195,11 @@ strategy. This method can be quite helpful when used in combination with an ingestion procedure like the -[`GkeEntityProvider`](https://backstage.io/docs/reference/plugin-catalog-backend-module-gcp.gkeentityprovider/) +[`GkeEntityProvider`](https://backstage.io/api/stable/classes/_backstage_plugin-catalog-backend-module-gcp.index.GkeEntityProvider.html) (installation documented [here](https://github.com/backstage/backstage/tree/master/plugins/catalog-backend-module-gcp#installation)) or the -[`AwsEKSClusterProcessor`](https://backstage.io/docs/reference/plugin-catalog-backend-module-aws.awseksclusterprocessor/) +[`AwsEKSClusterProcessor`](https://backstage.io/api/stable/classes/_backstage_plugin-catalog-backend-module-aws.index.AwsEKSClusterProcessor.html) to automatically update the set of clusters tracked by Backstage. For this method to work any entity that would be using this `Resource` to help drive the Kubernetes details in the Catalog's Entity pages needs to have a `dependsOn` relationship setup. Here's a quick example: diff --git a/docs/features/kubernetes/installation.md b/docs/features/kubernetes/installation.md index fa37253cd6..40b2dc0bcc 100644 --- a/docs/features/kubernetes/installation.md +++ b/docs/features/kubernetes/installation.md @@ -75,7 +75,7 @@ Backstage app. If either existing [cluster locators](https://backstage.io/docs/features/kubernetes/configuration#clusterlocatormethods) don't work for your use-case, it is possible to implement a custom -[KubernetesClustersSupplier](https://backstage.io/docs/reference/plugin-kubernetes-backend.kubernetesclusterssupplier). +[KubernetesClustersSupplier](https://backstage.io/api/stable/interfaces/_backstage_plugin-kubernetes-node.KubernetesClustersSupplier.html). Here's a very simplified example: @@ -130,7 +130,7 @@ export const kubernetesModuleCustomClusterDiscovery = createBackendModule({ ); // there's also the ability to get access to some of the default implementations of the extension points where - // neccessary: + // necessary: serviceLocator.addServiceLocator( async ({ getDefault, clusterSupplier }) => { // get access to the default service locator: diff --git a/docs/features/search/collators.md b/docs/features/search/collators.md index f2ad982812..37cb59559a 100644 --- a/docs/features/search/collators.md +++ b/docs/features/search/collators.md @@ -86,7 +86,7 @@ Now with this example it will collate all entities that are `kind` equal to `api :::tip -The filter configuration is implemented using the `EntityFilterQuery` syntax. The [reference documentation on `EntityFilterQuery`](https://backstage.io/docs/reference/catalog-client.entityfilterquery/) provides more details. +The filter configuration is implemented using the `EntityFilterQuery` syntax. The [reference documentation on `EntityFilterQuery`](https://backstage.io/api/stable/types/_backstage_catalog-client.index.EntityFilterQuery.html) provides more details. ::: diff --git a/docs/features/search/declarative-integration.md b/docs/features/search/declarative-integration.md index 74d16d7c57..3ad7492114 100644 --- a/docs/features/search/declarative-integration.md +++ b/docs/features/search/declarative-integration.md @@ -25,7 +25,7 @@ The search plugin is a collection of extensions that implement the search featur ### Installation -Only one step is required to start using the `Search` plugin within declarative integration, so all you have to do is to install the `@backstage/plugin-catalog` and `@backstage/plugin-search` packages, (e.g., [app-next](https://github.com/backstage/backstage/tree/master/packages/app-next)): +Only one step is required to start using the `Search` plugin within declarative integration, so all you have to do is to install the `@backstage/plugin-catalog` and `@backstage/plugin-search` packages, (e.g., [app](https://github.com/backstage/backstage/tree/master/packages/app)): ```sh yarn add @backstage/plugin-catalog @backstage/plugin-search diff --git a/docs/features/search/how-to-guides.md b/docs/features/search/how-to-guides.md index f0823ac47e..018c70479d 100644 --- a/docs/features/search/how-to-guides.md +++ b/docs/features/search/how-to-guides.md @@ -232,7 +232,7 @@ Remember to export your new extension via your plugin's `index.ts` so that it is export { YourSearchResultListItem } from './plugin.ts'; ``` -For more details, see the [createSearchResultListItemExtension](https://backstage.io/docs/reference/plugin-search-react.createsearchresultlistitemextension) API reference. +For more details, see the [createSearchResultListItemExtension](https://backstage.io/api/stable/functions/_backstage_plugin-search-react.index.createSearchResultListItemExtension.html) API reference. ### 2. Custom search result extension in the SearchPage diff --git a/docs/features/search/search-engines.md b/docs/features/search/search-engines.md index 07cf11aae5..5b8f546b40 100644 --- a/docs/features/search/search-engines.md +++ b/docs/features/search/search-engines.md @@ -291,3 +291,65 @@ search: fuzziness: AUTO prefixLength: 3; ``` + +### Custom Authentication Extension Point + +For enterprise environments that require dynamic authentication mechanisms such as bearer tokens with automatic rotation, the Elasticsearch module provides an authentication extension point. This is useful when: + +- Using OAuth2/OIDC identity providers for service authentication +- Tokens need to be refreshed automatically (e.g., tokens that expire hourly) +- Integrating with internal identity services +- Running Elasticsearch/OpenSearch clusters secured by token-based authentication + +To use custom authentication, create a backend module that provides an auth provider: + +```ts title="packages/backend/src/modules/elasticsearchAuth.ts" +import { createBackendModule } from '@backstage/backend-plugin-api'; +import { elasticsearchAuthExtensionPoint } from '@backstage/plugin-search-backend-module-elasticsearch'; + +export default createBackendModule({ + pluginId: 'search', + moduleId: 'elasticsearch-custom-auth', + register(env) { + env.registerInit({ + deps: { + elasticsearchAuth: elasticsearchAuthExtensionPoint, + }, + async init({ elasticsearchAuth }) { + elasticsearchAuth.setAuthProvider({ + async getAuthHeaders() { + // Fetch token from your identity service + const token = await myTokenService.getToken(); + return { Authorization: `Bearer ${token}` }; + }, + }); + }, + }); + }, +}); +``` + +Then register this module in your backend: + +```ts title="packages/backend/src/index.ts" +const backend = createBackend(); + +// Other plugins... + +backend.add(import('@backstage/plugin-search-backend')); +backend.add(import('@backstage/plugin-search-backend-module-elasticsearch')); + +/* highlight-add-start */ +backend.add(import('./modules/elasticsearchAuth')); +/* highlight-add-end */ + +backend.start(); +``` + +The `getAuthHeaders` method is called before each request, allowing for just-in-time token retrieval and automatic rotation. When an auth provider is configured, it takes precedence over any static authentication in `app-config.yaml`. + +:::note Note + +Custom authentication is supported for the `elastic`, `opensearch`, and default providers. The `aws` provider uses AWS SigV4 request signing and does not support custom auth providers. + +::: diff --git a/docs/features/software-catalog/api.md b/docs/features/software-catalog/api.md index 96420cd37e..ca8b8f638d 100644 --- a/docs/features/software-catalog/api.md +++ b/docs/features/software-catalog/api.md @@ -27,7 +27,7 @@ one organization to the other, especially in production, but is commonly your Some or all of the endpoints may accept or require an `Authorization` header with a `Bearer` token, which should then be the Backstage token returned by the -[`identity API`](https://backstage.io/docs/reference/core-plugin-api.identityapiref). +[`identity API`](https://backstage.io/api/stable/variables/_backstage_core-plugin-api.index.identityApiRef.html). ## Entities diff --git a/docs/features/software-catalog/audit-events.md b/docs/features/software-catalog/audit-events.md new file mode 100644 index 0000000000..9fc003f595 --- /dev/null +++ b/docs/features/software-catalog/audit-events.md @@ -0,0 +1,49 @@ +--- +id: audit-events +title: Audit Events +description: Tracking access to your Software Catalog. +--- + +The Catalog backend emits audit events for various operations. Events are grouped logically by `eventId`, with `subEventId` providing further distinction within an operation group. + +## Entity Events + +- **`entity-fetch`**: Retrieves entities. +- **Note:** By default, "low" severity audit events like `entity-fetch` aren't logged because they map to the "debug" level, while Backstage defaults to "info" level logging. To see `entity-fetch` events, update your `app-config.yaml` by setting `backend.auditor.severityLogLevelMappings.low: info`. See the [Auditor Service documentation](https://backstage.io/docs/backend-system/core-services/auditor/#severity-levels-and-default-mappings) for details on severity mappings. + + Filter on `queryType`. + + - **`all`**: Fetching all entities. (GET `/entities`) + - **`by-id`**: Fetching a single entity using its UID. (GET `/entities/by-uid/:uid`) + - **`by-name`**: Fetching a single entity using its kind, namespace, and name. (GET `/entities/by-name/:kind/:namespace/:name`) + - **`by-query`**: Fetching multiple entities using a filter query. (GET `/entities/by-query`) + - **`by-refs`**: Fetching a batch of entities by their entity refs. (POST `/entities/by-refs`) + - **`ancestry`**: Fetching the ancestry of an entity. (GET `/entities/by-name/:kind/:namespace/:name/ancestry`) + +- **`entity-mutate`**: Modifies entities. + + Filter on `actionType`. + + - **`delete`**: Deleting a single entity. Note: this will not be a permanent deletion and the entity will be restored if the parent location is still present in the catalog. (DELETE `/entities/by-uid/:uid`) + - **`refresh`**: Scheduling an entity refresh. (POST `/entities/refresh`) + +- **`entity-validate`**: Validates an entity. (POST `/entities/validate`) + +- **`entity-facets`**: Retrieves entity facets. (GET `/entity-facets`) + +## Location Events + +- **`location-fetch`**: Retrieves locations. + + Filter on `actionType`. + + - **`all`**: Fetching all locations. (GET `/locations`) + - **`by-id`**: Fetching a single location by ID. (GET `/locations/:id`) + - **`by-entity`**: Fetching locations associated with an entity ref. (GET `/locations/by-entity`) + +- **`location-mutate`**: Modifies locations. + + - **`create`**: Creating a new location. (POST `/locations`) + - **`delete`**: Deleting a location and its associated entities. (DELETE `/locations/:id`) + +- **`location-analyze`**: Analyzes a location. (POST `/locations/analyze`) diff --git a/docs/features/software-catalog/catalog-customization.md b/docs/features/software-catalog/catalog-customization.md index a828e6591a..d62bb34505 100644 --- a/docs/features/software-catalog/catalog-customization.md +++ b/docs/features/software-catalog/catalog-customization.md @@ -696,3 +696,63 @@ filter: targetRef: $in: [group:default/admins, group:default/viewers] ``` + +### Configure groups, titles, and icons + +You can define and customize the tab groups that appear on the entity page, as well as enable icons for both groups and individual tabs. + +```yaml +app: + extensions: + # Entity page (new frontend system) + - page:catalog/entity: + config: + # Show icons next to group and tab titles + showNavItemIcons: true + + # Optionally override default groups and their icons + groups: + - overview: + title: Overview + icon: dashboard + - quality: + title: Quality + icon: verified + - documentation: + title: Docs + icon: description +``` + +Notes: + +- Icons for groups and tabs are resolved via the app's IconsApi. When using a string icon id (for example `"dashboard"`), ensure that the corresponding icon bundles are enabled/installed in your app (see the [IconBundleBlueprint documentation](https://backstage.io/api/stable/variables/_backstage_plugin-app-react.IconBundleBlueprint.html)). +- Group icons are only rendered if `showNavItemIcons` is set to `true`. + +### Overriding or disabling a tab's group (per extension) + +Each entity content extension (tabs on the entity page) can declare a default `group` in code. You can override or disable this per installation in `app-config.yaml` using the extension's config: + +```yaml +app: + extensions: + # ... + # Example entity content extension instance id + - entity-content:example/my-content: + config: + # Move this tab to a custom group you defined above + group: custom + # Show an icon for this entity content page but only if `showNavItemIcons` is enabled for the `page:catalog/entity` extension + icon: my-icon + + # Disassociate from any group and show as a standalone tab + - entity-content:example/another-content: + config: + group: false +``` + +### Tab icons for entity content + +Entity content extensions can also declare an `icon` parameter. When provided as a string, the icon id is looked up via the IconsApi. For the icon to render: + +- The entity page must have `showNavItemIcons: true` (see configuration above). +- The icon id must be available in the app's enabled icon bundles. diff --git a/docs/features/software-catalog/configuration.md b/docs/features/software-catalog/configuration.md index 5b293cce1c..3ed027a0a4 100644 --- a/docs/features/software-catalog/configuration.md +++ b/docs/features/software-catalog/configuration.md @@ -181,28 +181,30 @@ this remote source, users cannot also register new entities with e.g. the [catalog-import](https://github.com/backstage/backstage/tree/master/plugins/catalog-import) plugin. -## Clean up orphaned entities +## Automatic removal of orphaned entities -In short, entities can become orphaned through multiple means, such as when a catalog-info YAML file is moved from one place to another in the version control system without updating the registration in the catalog. For safety reasons, the default behavior is to just tag the orphaned entities, and keep them around. You can read more about orphaned entities [here](life-of-an-entity.md#orphaning). +Entities can become orphaned through multiple means, such as when a catalog-info YAML file is moved from one place to another in the version control system without updating the registration in the catalog. The default behavior is to automatically remove orphaned entities. You can read more about orphaned entities [here](life-of-an-entity.md#orphaning). -However, if you do wish to automatically remove the orphaned entities, you can use the following configuration, and everything with an orphaned entity tag will be eventually deleted. +However, if you wish to keep orphaned entities, you can use the following configuration, and automatic cleanup will be disabled. ```yaml catalog: - orphanStrategy: delete + orphanStrategy: keep ``` -## Clean up entities from orphaned entity providers +## Automatic removal of entities from orphaned entity providers -By default, if an entity provider which has provided entities to the catalog, is no longer configured, then the entities remain in the catalog until they are manually unregistered. +By default, if an entity provider which has provided entities to the catalog is no longer configured, then the entities it provided will be automatically removed. -To remove these entities automatically, you can use the following configuration. +To keep these entities instead, you can use the following configuration. ```yaml catalog: - orphanProviderStrategy: delete + orphanProviderStrategy: keep ``` +If you have had providers installed in the past that ingested entities into the catalog that you want to keep, the recommendation is to add the provider back to the catalog. If you don’t want the provider to run, you can schedule it with a very large interval. + ## Processing Interval The [processing loop](./life-of-an-entity.md#processing) is diff --git a/docs/features/software-catalog/creating-the-catalog-graph.md b/docs/features/software-catalog/creating-the-catalog-graph.md index 4dc5b461b2..14cffee0c6 100644 --- a/docs/features/software-catalog/creating-the-catalog-graph.md +++ b/docs/features/software-catalog/creating-the-catalog-graph.md @@ -3,7 +3,7 @@ ## Overview The Software Catalog in Backstage is intended to capture human mental models using entities and their relationships rather than an exhaustive inventory of all possible things. The focus is on attaching functionality and views centered around these entities. Determining the "edge" where the catalog ends and the external world begins is crucial to ensure that the catalog's scope is appropriate. -The Backstage software catalog serves as a centralized hub for organizing and discovering software components and services. While it excels at providing a high-level overview of these concepts, it may not be the ideal solution for tracking dynamic relationships between components and services in real-time. You can achieve real time views by attaching appropriate tooling to the nodes in the graph through [annotations](https://backstage.io/docs/features/software-catalog/well-known-annotations) and developing custom front-end [plugins](http://localhost:3000/docs/plugins/) that display deployment information and other real-time data. +The Backstage software catalog serves as a centralized hub for organizing and discovering software components and services. While it excels at providing a high-level overview of these concepts, it may not be the ideal solution for tracking dynamic relationships between components and services in real-time. You can achieve real time views by attaching appropriate tooling to the nodes in the graph through [annotations](https://backstage.io/docs/features/software-catalog/well-known-annotations) and developing custom front-end [plugins](https://backstage.io/docs/plugins/create-a-plugin) that display deployment information and other real-time data. It is worth noting that the Backstage Software Catalog should not be considered the ultimate source of truth, instead, it is advisable to use the Backstage Catalog as a caching mechanism that utilizes a REST API to convey information to the catalog UI and other Backstage plugins. Adopting a GitOps approach is recommended to modify YAML files in Backstage, treating YAML files in repositories as the primary source of truth and using Scaffolder to make changes via the UI and generate a pull request in the repository with the updated changes. ### Descriptor Components used to build the Catalog Graph diff --git a/docs/features/software-catalog/extending-the-model.md b/docs/features/software-catalog/extending-the-model.md index 7300f4f969..b0161c97ff 100644 --- a/docs/features/software-catalog/extending-the-model.md +++ b/docs/features/software-catalog/extending-the-model.md @@ -596,7 +596,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; +import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node'; /* highlight-add-next-line */ import { FoobarEntitiesProcessor } from './providers'; diff --git a/docs/features/software-catalog/external-integrations.md b/docs/features/software-catalog/external-integrations.md index 298c686bea..a042c4fc4d 100644 --- a/docs/features/software-catalog/external-integrations.md +++ b/docs/features/software-catalog/external-integrations.md @@ -294,7 +294,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; +import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node'; import { FrobsProvider } from './path/to/class'; export const catalogModuleFrobsProvider = createBackendModule({ @@ -737,7 +737,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; +import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node'; import { SystemXReaderProcessor } from '../path/to/class'; export const catalogModuleSystemXReaderProcessor = createBackendModule({ diff --git a/docs/features/software-catalog/index.md b/docs/features/software-catalog/index.md index 53afb5205e..a221ed9157 100644 --- a/docs/features/software-catalog/index.md +++ b/docs/features/software-catalog/index.md @@ -136,6 +136,12 @@ Your Backstage developer portal can be customized by incorporating [existing open source plugins](https://github.com/backstage/backstage/tree/master/plugins), or by [building your own](../../plugins/index.md). +## Unprocessed Entities + +Sometimes entities fail to process correctly. The **Unprocessed Entities** feature helps Backstage admins find and diagnose these entities to understand the state of the catalog. + +To use this feature, check out the documentation for the [catalog-unprocessed-entities plugin](https://github.com/backstage/backstage/tree/master/plugins/catalog-unprocessed-entities) and its [backend module](https://github.com/backstage/backstage/tree/master/plugins/catalog-backend-module-unprocessed). + ## Links - [[Blog post] Backstage Service Catalog released in alpha](https://backstage.io/blog/2020/06/22/backstage-service-catalog-alpha) diff --git a/docs/features/software-catalog/life-of-an-entity.md b/docs/features/software-catalog/life-of-an-entity.md index c16fb8d523..ca4de99734 100644 --- a/docs/features/software-catalog/life-of-an-entity.md +++ b/docs/features/software-catalog/life-of-an-entity.md @@ -254,8 +254,8 @@ either, it becomes _orphaned_. The end result is as follows: the child entity. - The child entity is _not_ removed from the catalog, but stays around until explicitly deleted via the catalog API, implicitly if `orphanStrategy: delete` - configuration is set, or until it is "reclaimed" by the original parent - or another parent starting to reference it. + configuration is set (the default), or until it is "reclaimed" by the original + parent or another parent starting to reference it. - The catalog page in Backstage for the child entity detects the new annotation and informs users about the orphan status. @@ -282,21 +282,13 @@ Orphaning can occur in several different scenarios. > to inform the owner that something is wrong. But processing and other > behaviors continue as usual. -The reason that the orphaning mechanism exists instead of having an eager -deletion triggered, is safety. Scenarios like these can happen purely by -accident, due to the asynchronous nature of the system and the fallible nature -of humans. In particular when external systems start consuming and relying on -the catalog, there could be substantial consequences to suddenly dropping -entities without explicit owner consent. The catalog therefore takes the stance -that entities that often were added by direct user action should also be deleted -only by direct user action. - -However, if you want to delete orphaned entities automatically anyway, you can -enable the automated clean up with the following app-config option. +The default behavior of the catalog is to automatically remove orphaned +entities. However, if you want to keep them instead, you can disable the +automated cleanup with the following app-config option. ``` catalog: - orphanStrategy: delete + orphanStrategy: keep ``` ## Implicit Deletion diff --git a/docs/features/software-catalog/references.md b/docs/features/software-catalog/references.md index 9a5a037d6d..16ab90b6e0 100644 --- a/docs/features/software-catalog/references.md +++ b/docs/features/software-catalog/references.md @@ -40,7 +40,7 @@ used, and the relevant documentation should specify which rule applies where. Entity ref strings are frequently passed between systems as identifiers of entities. In those cases the refs should always be complete (have all three parts). The sender should ensure that the refs are always lowercased in an -`en-US` locale, preferably by using [the `stringifyEntityRef` function](https://backstage.io/docs/reference/catalog-model.stringifyentityref/) +`en-US` locale, preferably by using [the `stringifyEntityRef` function](https://backstage.io/api/stable/functions/_backstage_catalog-model.index.stringifyEntityRef.html) which does this automatically. The receiver should treat incoming refs case insensitively to avoid problems with senders who do not obey this rule. diff --git a/docs/features/software-catalog/well-known-annotations.md b/docs/features/software-catalog/well-known-annotations.md index d8a2e1d232..0736a586bf 100644 --- a/docs/features/software-catalog/well-known-annotations.md +++ b/docs/features/software-catalog/well-known-annotations.md @@ -251,6 +251,46 @@ browser when viewing that user. This annotation can be used on a [User entity](descriptor-format.md#kind-user) to note that it originated from that user on GitHub. +### github.com/user-id + +```yaml +# Example: +metadata: + annotations: + github.com/user-id: '123456' +``` + +The value of this annotation is the numeric user ID that identifies a user on +[GitHub](https://github.com) (either the public one, or a private GitHub +Enterprise installation) that is related to this entity. Unlike the username, +which can be changed by the user, the user ID is immutable. + +This annotation can be used on a [User entity](descriptor-format.md#kind-user) +to note that it originated from that user on GitHub. It enables the +`userIdMatchingUserEntityAnnotation` sign-in resolver to match users by their +GitHub user ID during authentication. + +### gitlab.com/user-id + +```yaml +# Example: +metadata: + annotations: + gitlab.com/user-id: '123456' +``` + +The value of this annotation is the numeric user ID that identifies a user on +[GitLab](https://gitlab.com) (either the public one, or a private GitLab +installation) that is related to this entity. For self-hosted GitLab instances, +the annotation key will be `{integration-host}/user-id` where +`{integration-host}` is the hostname of your GitLab instance. Unlike the +username, which can be changed, the user ID is immutable. + +This annotation can be used on a [User entity](descriptor-format.md#kind-user) +to note that it originated from that user on GitLab. It enables the +`userIdMatchingUserEntityAnnotation` sign-in resolver to match users by their +GitLab user ID during authentication. + ### gocd.org/pipelines ```yaml @@ -422,7 +462,7 @@ migrating away from them. ### backstage.io/github-actions-id This annotation was used for a while to enable the GitHub Actions feature. This -is now instead using the [github.com/project-slug](#github-com-project-slug) +is now instead using the [github.com/project-slug](#githubcomproject-slug) annotation, with the same value format. ### backstage.io/definition-at-location diff --git a/docs/features/software-templates/audit-events.md b/docs/features/software-templates/audit-events.md new file mode 100644 index 0000000000..cf50d98317 --- /dev/null +++ b/docs/features/software-templates/audit-events.md @@ -0,0 +1,32 @@ +--- +id: audit-events +title: Audit Events +description: Tracking access to your Scaffolder. +--- + +The Scaffolder backend emits audit events for various operations. Events are grouped logically by `eventId`, with `subEventId` providing further distinction when needed. + +## Template Events + +- **`template-parameter-schema`**: Retrieves template parameter schemas. (GET `/v2/templates/:namespace/:kind/:name/parameter-schema`) + +## Action Events + +- **`action-fetch`**: Retrieves installed actions. (GET `/v2/actions`) + +## Task Events + +- **`task`**: Operations related to Scaffolder tasks. + + Filter on `actionType`. + + - **`create`**: Creates a new task. (POST `/v2/tasks`) + - **`list`**: Fetches details of all tasks. (GET `/v2/tasks`) + - **`get`**: Fetches details of a specific task. (GET `/v2/tasks/:taskId`) + - **`cancel`**: Cancels a running task. (POST `/v2/tasks/:taskId/cancel`) + - **`retry`**: Retries a failed task. (POST `/v2/tasks/:taskId/retry`) + - **`stream`**: Retrieves a stream of task logs. (GET `/v2/tasks/:taskId/eventstream`) + - **`events`**: Retrieves a snapshot of task logs. (GET `/v2/tasks/:taskId/events`) + - **`dry-run`**: Creates a dry-run task. (POST `/v2/dry-run`) All audit logs for events associated with dry runs have the `meta.isDryLog` flag set to `true`. + - **`stale-cancel`**: Automated cancellation of stale tasks. + - **`execute`**: Tracks the initiation and completion of a real scaffolder task execution. This event will not occur during dry runs. diff --git a/docs/features/software-templates/templating-extensions.md b/docs/features/software-templates/templating-extensions.md index 242966ae5f..b131f51bc9 100644 --- a/docs/features/software-templates/templating-extensions.md +++ b/docs/features/software-templates/templating-extensions.md @@ -517,8 +517,8 @@ specifying options to the scaffolder backend plugin's `createRouter` function [nunjucks]: https://mozilla.github.io/nunjucks [filter]: https://mozilla.github.io/nunjucks/templating.html#filters [global-fn]: https://mozilla.github.io/nunjucks/templating.html#global-functions -[parseRepoUrl]: https://backstage.io/docs/reference/plugin-scaffolder-node.parserepourl -[CompoundEntityRef]: https://backstage.io/docs/reference/catalog-model.compoundentityref +[parseRepoUrl]: https://backstage.io/api/stable/functions/_backstage_plugin-scaffolder-node.index.parseRepoUrl.html +[CompoundEntityRef]: https://backstage.io/api/stable/types/_backstage_catalog-model.index.CompoundEntityRef.html [Zod]: https://zod.dev/ [zod-fn]: https://zod.dev/?id=functions [piped]: https://en.wikipedia.org/wiki/Pipeline_(Unix)#Pipelines_in_command_line_interfaces diff --git a/docs/features/software-templates/writing-custom-actions.md b/docs/features/software-templates/writing-custom-actions.md index 1a64406b04..f5ed9e4854 100644 --- a/docs/features/software-templates/writing-custom-actions.md +++ b/docs/features/software-templates/writing-custom-actions.md @@ -28,13 +28,17 @@ boilerplate code, providing a smooth start: ```sh $ yarn backstage-cli new ? What do you want to create? - plugin-common - A new isomorphic common plugin package - plugin-node - A new Node.js library plugin package - plugin-react - A new web library plugin package -> scaffolder-module - An module exporting custom actions for @backstage/plugin-scaffolder-backend + web-library - A library package, exporting shared functionality for web environments + node-library - A library package, exporting shared functionality for Node.js environments + catalog-provider-module - An Entity Provider module for the Software Catalog +> scaffolder-backend-module - A module exporting custom actions for @backstage/plugin-scaffolder-backend + frontend-plugin - A new frontend plugin + backend-plugin - A new backend plugin + backend-plugin-module - A new backend module that extends an existing backend plugin +(Move up and down to reveal more choices) ``` -When prompted, select the option to generate a scaffolder module. This creates a solid foundation for your custom +When prompted, select the option to generate a `scaffolder-backend-module` using the down arrow key. This creates a solid foundation for your custom action. Enter the name of the module you wish to create, and the CLI will generate the required files and directory structure. @@ -91,8 +95,8 @@ The `createTemplateAction` takes an object which specifies the following: may ship with the `scaffolder-backend` plugin. - `description` - An optional field to describe the purpose of the action. This will populate in the `/create/actions` endpoint. -- `schema.input` - A `zod` or JSON schema object for input values to your function -- `schema.output` - A `zod` or JSON schema object for values which are output from the +- `schema.input` - A `zod` schema object for input values to your function +- `schema.output` - A `zod` schema object for values which are output from the function using `ctx.output` - `handler` - the actual code which is run as part of the action, with a context @@ -195,7 +199,7 @@ argument. It looks like the following: executed successfully on the previous run. - `ctx.logger` - a [LoggerService](../../backend-system/core-services/logger.md) instance for additional logging inside your action - `ctx.workspacePath` - a string of the working directory of the template run -- `ctx.input` - an object which should match the `zod` or JSON schema provided in the +- `ctx.input` - an object which should match the `zod` schema provided in the `schema.input` part of the action definition - `ctx.output` - a function which you can call to set outputs that match the `zod` schema in `schema.output` for ex. `ctx.output('downloadUrl', myDownloadUrl)` @@ -205,47 +209,12 @@ argument. It looks like the following: - `ctx.metadata` - an object containing a `name` field, indicating the template name. More metadata fields may be added later. -## Registering Custom Actions - -To register your new custom action in the Backend System, you will need to create a backend module. Here is a very -simplified example of how to do that: - -```ts title="packages/backend/src/index.ts" -/* highlight-add-start */ -import { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha'; -import { createBackendModule } from '@backstage/backend-plugin-api'; -/* highlight-add-end */ - -/* highlight-add-start */ -const scaffolderModuleCustomExtensions = createBackendModule({ - pluginId: 'scaffolder', // name of the plugin that the module is targeting - moduleId: 'custom-extensions', - register(env) { - env.registerInit({ - deps: { - scaffolder: scaffolderActionsExtensionPoint, - // ... and other dependencies as needed - }, - async init({ scaffolder /* ..., other dependencies */ }) { - // Here you have the opportunity to interact with the extension - // point before the plugin itself gets instantiated - scaffolder.addActions(createNewFileAction()); // just an example - }, - }); - }, -}); -/* highlight-add-end */ - -const backend = createBackend(); -backend.add(import('@backstage/plugin-scaffolder-backend')); -/* highlight-add-next-line */ -backend.add(scaffolderModuleCustomExtensions); -``` +### Using Core Services in Custom Actions If your custom action requires core services such as `config` or `cache` they can be imported in the dependencies and passed to the custom action function. -```ts title="packages/backend/src/index.ts" +```ts title="module.ts" import { coreServices, createBackendModule, diff --git a/docs/features/software-templates/writing-custom-field-extensions.md b/docs/features/software-templates/writing-custom-field-extensions.md index 477fa66e5b..3fe4d82a1f 100644 --- a/docs/features/software-templates/writing-custom-field-extensions.md +++ b/docs/features/software-templates/writing-custom-field-extensions.md @@ -22,7 +22,7 @@ Field extensions are a way to combine an ID, a `React` Component and a the `Scaffolder` frontend plugin in your own `App.tsx`. You can create your own Field Extension by using the -[`createScaffolderFieldExtension`](https://backstage.io/docs/reference/plugin-scaffolder.createscaffolderfieldextension) +[`createScaffolderFieldExtension`](https://backstage.io/api/stable/variables/_backstage_plugin-scaffolder.index.createScaffolderFieldExtension.html) `API` like below. As an example, we will create a component that validates whether a string is in the `Kebab-case` pattern: @@ -151,7 +151,7 @@ const routes = ( ### Async Validation Function -A validation function can be asynchronous and use [Utility APIs](https://backstage.io/docs/api/utility-apis/) via the `ApiHolder` in the [field validation context](https://backstage.io/docs/reference/plugin-scaffolder-react.customfieldvalidator). The example below uses the `catalogApiRef` to check if the submitted value (in this scenario an entity ref) exists in the catalog. +A validation function can be asynchronous and use [Utility APIs](https://backstage.io/docs/api/utility-apis/) via the `ApiHolder` in the [field validation context](https://backstage.io/api/stable/types/_backstage_plugin-scaffolder-react.index.CustomFieldValidator.html). The example below uses the `catalogApiRef` to check if the submitted value (in this scenario an entity ref) exists in the catalog. ```tsx import { FieldValidation } from '@rjsf/utils'; diff --git a/docs/features/software-templates/writing-custom-step-layouts.md b/docs/features/software-templates/writing-custom-step-layouts.md index f2ed5eb96d..ad766270f2 100644 --- a/docs/features/software-templates/writing-custom-step-layouts.md +++ b/docs/features/software-templates/writing-custom-step-layouts.md @@ -16,7 +16,7 @@ This is the same [field](https://rjsf-team.github.io/react-jsonschema-form/docs/ ## Registering a React component as a custom step layout -The [createScaffolderLayout](https://backstage.io/docs/reference/plugin-scaffolder-react.createscaffolderlayout) function is used to mark a component as a custom step layout: +The [createScaffolderLayout](https://backstage.io/api/stable/functions/_backstage_plugin-scaffolder-react.index.createScaffolderLayout.html) function is used to mark a component as a custom step layout: ```tsx import { scaffolderPlugin } from '@backstage/plugin-scaffolder'; diff --git a/docs/features/techdocs/addons--new.md b/docs/features/techdocs/addons--new.md index 8c58eb892c..cbafcbe127 100644 --- a/docs/features/techdocs/addons--new.md +++ b/docs/features/techdocs/addons--new.md @@ -89,12 +89,12 @@ page header, TechDocs Addons whose location is `Header` will not be rendered. Addons can, in principle, be provided by any plugin! To make it easier to discover available Addons, we've compiled a list of them here: -| Addon | Package/Plugin | Description | -| ------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [`techDocsExpandableNavigationAddonModule`](https://backstage.io/docs/reference/plugin-techdocs-module-addons-contrib.expandablenavigation) | `@backstage/plugin-techdocs-module-addons-contrib/alpha` | Allows TechDocs users to expand or collapse the entire TechDocs main navigation, and keeps the user's preferred state between documentation sites. | -| [`techDocsReportIssueAddonModule`](https://backstage.io/docs/reference/plugin-techdocs-module-addons-contrib.reportissue) | `@backstage/plugin-techdocs-module-addons-contrib/alpha` | Allows TechDocs users to select a portion of text on a TechDocs page and open an issue against the repository that contains the documentation, populating the issue description with the selected text according to a configurable template. | -| [`techDocsTextSizeAddonModule`](https://backstage.io/docs/reference/plugin-techdocs-module-addons-contrib.textsize) | `@backstage/plugin-techdocs-module-addons-contrib/alpha` | This TechDocs addon allows users to customize text size on documentation pages, they can select how much they want to increase or decrease the font size via slider or buttons. The default value for font size is 100% and this setting is kept in the browser's local storage whenever it is changed. | -| [`techDocsLightBoxAddonModule`](https://backstage.io/docs/reference/plugin-techdocs-module-addons-contrib.lightbox) | `@backstage/plugin-techdocs-module-addons-contrib/alpha` | This TechDocs addon allows users to open images in a light-box on documentation pages, they can navigate between images if there are several on one page. The image size of the light-box image is the same as the image size on the document page. When clicking on the zoom icon it zooms the image to fit in the screen (similar to `background-size: contain`). | +| Addon | Package/Plugin | Description | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [`techDocsExpandableNavigationAddonModule`](https://backstage.io/api/stable/variables/_backstage_plugin-techdocs-module-addons-contrib.plugins_techdocs-module-addons-contrib_src_alpha.techDocsExpandableNavigationAddonModule.html) | `@backstage/plugin-techdocs-module-addons-contrib/alpha` | Allows TechDocs users to expand or collapse the entire TechDocs main navigation, and keeps the user's preferred state between documentation sites. | +| [`techDocsReportIssueAddonModule`](https://backstage.io/api/stable/variables/_backstage_plugin-techdocs-module-addons-contrib.plugins_techdocs-module-addons-contrib_src_alpha.techDocsReportIssueAddonModule.html) | `@backstage/plugin-techdocs-module-addons-contrib/alpha` | Allows TechDocs users to select a portion of text on a TechDocs page and open an issue against the repository that contains the documentation, populating the issue description with the selected text according to a configurable template. | +| [`techDocsTextSizeAddonModule`](https://backstage.io/api/stable/variables/_backstage_plugin-techdocs-module-addons-contrib.plugins_techdocs-module-addons-contrib_src_alpha.techDocsReportIssueAddonModule.html) | `@backstage/plugin-techdocs-module-addons-contrib/alpha` | This TechDocs addon allows users to customize text size on documentation pages, they can select how much they want to increase or decrease the font size via slider or buttons. The default value for font size is 100% and this setting is kept in the browser's local storage whenever it is changed. | +| [`techDocsLightBoxAddonModule`](https://backstage.io/api/stable/variables/_backstage_plugin-techdocs-module-addons-contrib.plugins_techdocs-module-addons-contrib_src_alpha.techDocsLightBoxAddonModule.html) | `@backstage/plugin-techdocs-module-addons-contrib/alpha` | This TechDocs addon allows users to open images in a light-box on documentation pages, they can navigate between images if there are several on one page. The image size of the light-box image is the same as the image size on the document page. When clicking on the zoom icon it zooms the image to fit in the screen (similar to `background-size: contain`). | Got an Addon to contribute? Feel free to add a row above! diff --git a/docs/features/techdocs/addons.md b/docs/features/techdocs/addons.md index 435239794b..78b472edf2 100644 --- a/docs/features/techdocs/addons.md +++ b/docs/features/techdocs/addons.md @@ -126,12 +126,12 @@ page header, TechDocs Addons whose location is `Header` will not be rendered. Addons can, in principle, be provided by any plugin! To make it easier to discover available Addons, we've compiled a list of them here: -| Addon | Package/Plugin | Description | -| ---------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [``](https://backstage.io/docs/reference/plugin-techdocs-module-addons-contrib.expandablenavigation) | `@backstage/plugin-techdocs-module-addons-contrib` | Allows TechDocs users to expand or collapse the entire TechDocs main navigation, and keeps the user's preferred state between documentation sites. | -| [``](https://backstage.io/docs/reference/plugin-techdocs-module-addons-contrib.reportissue) | `@backstage/plugin-techdocs-module-addons-contrib` | Allows TechDocs users to select a portion of text on a TechDocs page and open an issue against the repository that contains the documentation, populating the issue description with the selected text according to a configurable template. | -| [``](https://backstage.io/docs/reference/plugin-techdocs-module-addons-contrib.textsize) | `@backstage/plugin-techdocs-module-addons-contrib` | This TechDocs addon allows users to customize text size on documentation pages, they can select how much they want to increase or decrease the font size via slider or buttons. The default value for font size is 100% and this setting is kept in the browser's local storage whenever it is changed. | -| [``](https://backstage.io/docs/reference/plugin-techdocs-module-addons-contrib.lightbox) | `@backstage/plugin-techdocs-module-addons-contrib` | This TechDocs addon allows users to open images in a light-box on documentation pages, they can navigate between images if there are several on one page. The image size of the light-box image is the same as the image size on the document page. When clicking on the zoom icon it zooms the image to fit in the screen (similar to `background-size: contain`). | +| Addon | Package/Plugin | Description | +| -------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [``](https://backstage.io/api/stable/variables/_backstage_plugin-techdocs-module-addons-contrib.index.ExpandableNavigation.html) | `@backstage/plugin-techdocs-module-addons-contrib` | Allows TechDocs users to expand or collapse the entire TechDocs main navigation, and keeps the user's preferred state between documentation sites. | +| [``](https://backstage.io/api/stable/variables/_backstage_plugin-techdocs-module-addons-contrib.index.ReportIssue.html) | `@backstage/plugin-techdocs-module-addons-contrib` | Allows TechDocs users to select a portion of text on a TechDocs page and open an issue against the repository that contains the documentation, populating the issue description with the selected text according to a configurable template. | +| [``](https://backstage.io/api/stable/variables/_backstage_plugin-techdocs-module-addons-contrib.index.TextSize.html) | `@backstage/plugin-techdocs-module-addons-contrib` | This TechDocs addon allows users to customize text size on documentation pages, they can select how much they want to increase or decrease the font size via slider or buttons. The default value for font size is 100% and this setting is kept in the browser's local storage whenever it is changed. | +| [``](https://backstage.io/api/stable/variables/_backstage_plugin-techdocs-module-addons-contrib.index.LightBox.html) | `@backstage/plugin-techdocs-module-addons-contrib` | This TechDocs addon allows users to open images in a light-box on documentation pages, they can navigate between images if there are several on one page. The image size of the light-box image is the same as the image size on the document page. When clicking on the zoom icon it zooms the image to fit in the screen (similar to `background-size: contain`). | Got an Addon to contribute? Feel free to add a row above! diff --git a/docs/features/techdocs/cli.md b/docs/features/techdocs/cli.md index a52730d335..67d29c4ebb 100644 --- a/docs/features/techdocs/cli.md +++ b/docs/features/techdocs/cli.md @@ -271,5 +271,5 @@ upon your cloud storage provider - You are welcome to contribute to TechDocs CLI to improve it and support new features! See the project -[README](https://github.com/backstage/backstage/blob/main/src/packages/techdocs-cli/README.md) +[README](https://github.com/backstage/backstage/blob/master/packages/techdocs-cli/README.md) for more information. diff --git a/docs/features/techdocs/configuration.md b/docs/features/techdocs/configuration.md index e21e452b7c..cf9215ebc3 100644 --- a/docs/features/techdocs/configuration.md +++ b/docs/features/techdocs/configuration.md @@ -4,205 +4,540 @@ title: TechDocs Configuration Options description: Reference documentation for configuring TechDocs using app-config.yaml --- -Using the `app-config.yaml` in the Backstage app, you can configure TechDocs -using several options. This page serves as a reference to all the available -configuration options for TechDocs. +Using the `app-config.yaml` in the Backstage app, you can configure TechDocs using several options. This page serves as a reference to all the available configuration options for TechDocs. + +## Generator Configuration + +`techdocs.generator` is used to configure how documentation sites are generated using MkDocs. + +### Run In + +`techdocs.generator.runIn` + +**Options:** `'docker'` or `'local'` + +This determines how to run the generator - whether to spin up the techdocs-container docker image or to run mkdocs locally (assuming all the dependencies are taken care of). + +You want to change this to `'local'` if you are running Backstage using your own custom Docker setup and want to avoid running into Docker in Docker situation. [Read more here](https://backstage.io/docs/features/techdocs/getting-started/#disabling-docker-in-docker-situation-optional). + +**Example:** ```yaml -# File: app-config.yaml - techdocs: - # techdocs.generator is used to configure how documentation sites are generated using MkDocs. - generator: - # techdocs.generator.runIn can be either 'docker' or 'local'. This is to determine how to run the generator - whether to - # spin up the techdocs-container docker image or to run mkdocs locally (assuming all the dependencies are taken care of). - # You want to change this to 'local' if you are running Backstage using your own custom Docker setup and want to avoid running - # into Docker in Docker situation. Read more here - # https://backstage.io/docs/features/techdocs/getting-started/#disabling-docker-in-docker-situation-optional - runIn: 'docker' +``` - # (Optional) techdocs.generator.dockerImage can be used to control the docker image used during documentation generation. This can be useful - # if you want to use MkDocs plugins or other packages that are not included in the default techdocs-container (spotify/techdocs). - # NOTE: This setting is only used when techdocs.generator.runIn is set to 'docker'. +### Docker Image +`techdocs.generator.dockerImage` + +(Optional) This can be used to control the docker image used during documentation generation. This can be useful if you want to use MkDocs plugins or other packages that are not included in the default techdocs-container (spotify/techdocs). + +**Note:** This setting is only used when `techdocs.generator.runIn` is set to `'docker'`. + +**Example:** + +```yaml +techdocs: + generator: + runIn: 'docker' dockerImage: 'spotify/techdocs' +``` - # (Optional) techdocs.generator.pullImage can be used to disable pulling the latest docker image by default. This can be useful when you are - # using a custom techdocs.generator.dockerImage and you have a custom docker login requirement. For example, you need to login to - # AWS ECR to pull the docker image. - # NOTE: Disabling this requires the docker image was pulled by other means before running the techdocs generator. +### Pull Image - pullImage: true +`techdocs.generator.pullImage` +(Optional) This can be used to disable pulling the latest docker image by default. This can be useful when you are using a custom `techdocs.generator.dockerImage` and you have a custom docker login requirement. For example, you need to login to AWS ECR to pull the docker image. + +**Note:** Disabling this requires the docker image was pulled by other means before running the techdocs generator. + +**Example:** + +```yaml +techdocs: + generator: + runIn: 'docker' + dockerImage: 'custom-registry/techdocs' + pullImage: false +``` + +### MkDocs Configuration + +#### Omit TechDocs Core Plugin + +`techdocs.generator.mkdocs.omitTechdocsCorePlugin` + +(Optional) This can be used to disable automatic addition of techdocs-core plugin to the mkdocs.yaml files. Defaults to `false`, which means that the techdocs-core plugin is always added to the mkdocs file. + +**Example:** + +```yaml +techdocs: + generator: mkdocs: - # (Optional) techdocs.generator.omitTechdocsCoreMkdocsPlugin can be used to disable automatic addition of techdocs-core plugin to the mkdocs.yaml files. - # Defaults to false, which means that the techdocs-core plugin is always added to the mkdocs file. omitTechdocsCorePlugin: false +``` - # (Optional and not recommended) Configures the techdocs generator to - # 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. - # Note that https://www.mkdocs.org/user-guide/configuration/#edit_uri behavior - # will be broken in these scenarios. +#### Legacy Copy README to Index + +`techdocs.generator.mkdocs.legacyCopyReadmeMdToIndexMd` + +(Optional and not recommended) Configures the techdocs generator to 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. + +**Note:** https://www.mkdocs.org/user-guide/configuration/#edit_uri behavior will be broken in these scenarios. + +**Example:** + +```yaml +techdocs: + generator: + mkdocs: legacyCopyReadmeMdToIndexMd: false +``` - # (Optional) Configures the default plugins which should be added - # automatically to every mkdocs.yaml file. This simplifies the usage as - # e.g. styling plugins can be added once for all. - # Make sure that the defined plugins are installed locally / in the Docker - # image. - # By default, only the techdocs-core plugin will be added (except if - # omitTechdocsCorePlugin: true). +#### Default Plugins + +`techdocs.generator.mkdocs.defaultPlugins` + +(Optional) Configures the default plugins which should be added automatically to every mkdocs.yaml file. This simplifies the usage as e.g. styling plugins can be added once for all. + +Make sure that the defined plugins are installed locally / in the Docker image. By default, only the techdocs-core plugin will be added (except if `omitTechdocsCorePlugin: true`). + +**Example:** + +```yaml +techdocs: + generator: + mkdocs: defaultPlugins: ['techdocs-core'] +``` - # techdocs.builder can be either 'local' or 'external'. - # Using the default build strategy, if builder is set to 'local' and you open a TechDocs page, - # techdocs-backend will try to generate the docs, publish to storage and show the generated docs afterwards. - # This is the "Basic" setup of the TechDocs Architecture. - # Using the default build strategy, if builder is set to 'external' (or anything other than 'local'), techdocs-backend - # will only fetch the docs and will NOT try to generate and publish. - # In this case, we assume that docs are being built by an external process (e.g. in the CI/CD pipeline of the repository). - # This is the "Recommended" setup of the architecture. - # Note that custom build strategies may alter this behaviour. - # Read more about the "Basic" and "Recommended" setups here https://backstage.io/docs/features/techdocs/architecture - # Read more about build strategies here: https://backstage.io/docs/features/techdocs/concepts#techdocs-build-strategy +## Builder Configuration +`techdocs.builder` + +**Options:** `'local'` or `'external'` + +Using the default build strategy: + +- If builder is set to `'local'` and you open a TechDocs page, techdocs-backend will try to generate the docs, publish to storage and show the generated docs afterwards. This is the **"Basic"** setup of the TechDocs Architecture. +- If builder is set to `'external'` (or anything other than `'local'`), techdocs-backend will only fetch the docs and will NOT try to generate and publish. In this case, we assume that docs are being built by an external process (e.g. in the CI/CD pipeline of the repository). This is the **"Recommended"** setup of the architecture. + +**Note:** Custom build strategies may alter this behaviour. + +[Read more about the "Basic" and "Recommended" setups](https://backstage.io/docs/features/techdocs/architecture) +[Read more about build strategies](https://backstage.io/docs/features/techdocs/concepts#techdocs-build-strategy) + +**Example:** + +```yaml +techdocs: builder: 'local' +``` - # techdocs.publisher is used to configure the Storage option, whether you want to use the local filesystem to store generated docs - # or you want to use External storage providers like Google Cloud Storage, AWS S3, etc. +## Publisher Configuration +`techdocs.publisher` + +This is used to configure the storage option, whether you want to use the local filesystem to store generated docs or you want to use external storage providers like Google Cloud Storage, AWS S3, etc. + +### Publisher Type + +`techdocs.publisher.type` + +This determines where generated documentation files are stored. + +**Options:** + +- `'local'` - techdocs-backend will create a 'static' directory at its root to store generated documentation files +- `'googleGcs'` - techdocs-backend will use a Google Cloud Storage Bucket +- `'awsS3'` - techdocs-backend will use an Amazon Web Service (AWS) S3 bucket +- `'azureBlobStorage'` - techdocs-backend will use Azure Blob Storage + +**Example:** + +```yaml +techdocs: publisher: - # techdocs.publisher.type can be - 'local' or 'googleGcs' or 'awsS3' or 'azureBlobStorage'. - # When set to 'local', techdocs-backend will create a 'static' directory at its root to store generated documentation files. - # When set to 'googleGcs', techdocs-backend will use a Google Cloud Storage Bucket to store generated documentation files. - # When set to 'awsS3', techdocs-backend will use an Amazon Web Service (AWS) S3 bucket to store generated documentation files. - type: 'local' +``` - # Optional when techdocs.publisher.type is set to 'local'. +### Local Storage +`techdocs.publisher.local` + +This is used to configure the local storage option. + +Optional when `techdocs.publisher.type` is set to `'local'`. + +#### Publish Directory + +`techdocs.publisher.local.publishDirectory` + +(Optional) This specifies where the generated documentation is stored. + +**Example:** + +```yaml +techdocs: + publisher: + type: 'local' local: - # (Optional). Set this to specify where the generated documentation is stored. publishDirectory: '/path/to/local/directory' +``` - # Required when techdocs.publisher.type is set to 'googleGcs'. Skip otherwise. +### Google Cloud Storage +`techdocs.publisher.googleGcs` + +This is used to configure the Google Cloud Storage option. + +Required when `techdocs.publisher.type` is set to `'googleGcs'`. Skip otherwise. + +#### Bucket Name + +`techdocs.publisher.googleGcs.bucketName` + +(Required) The Cloud Storage Bucket Name + +**Example:** + +```yaml +techdocs: + publisher: + type: 'googleGcs' googleGcs: - # (Required) Cloud Storage Bucket Name bucketName: 'techdocs-storage' +``` - # (Optional) Location in storage bucket to save files - # If not set, the default location will be the root of the storage bucket - bucketRootPath: '/' +#### Bucket Root Path - # (Optional) An API key is required to write to a storage bucket. - # If missing, GOOGLE_APPLICATION_CREDENTIALS environment variable will be used. - # https://cloud.google.com/docs/authentication/production +`techdocs.publisher.googleGcs.bucketRootPath` + +(Optional) The Location in storage bucket to save files. If not set, the default location will be the root of the storage bucket. + +**Example:** + +```yaml +techdocs: + publisher: + type: 'googleGcs' + googleGcs: + bucketName: 'techdocs-storage' + bucketRootPath: '/docs' +``` + +#### Credentials + +`techdocs.publisher.googleGcs.credentials` + +(Optional) An API key required to write to a storage bucket. +If missing `GOOGLE_APPLICATION_CREDENTIALS` environment variable will be used. https://cloud.google.com/docs/authentication/production + +**Example:** + +```yaml +techdocs: + publisher: + type: 'googleGcs' + googleGcs: + bucketName: 'techdocs-storage' credentials: $file: '/path/to/google_application_credentials.json' +``` - # Required when techdocs.publisher.type is set to 'awsS3'. Skip otherwise. +### AWS S3 +`techdocs.publisher.awsS3` + +This is used to configure the AWS S3 option. + +Required when `techdocs.publisher.type` is set to `'awsS3'`. Skip otherwise. + +#### Bucket Name + +`techdocs.publisher.awsS3.bucketName` + +(Required) The AWS S3 Bucket Name + +**Example:** + +```yaml +techdocs: + publisher: + type: 'awsS3' awsS3: - # (Required) AWS S3 Bucket Name bucketName: 'techdocs-storage' +``` - # (Optional) Location in storage bucket to save files - # If not set, the default location will be the root of the storage bucket - bucketRootPath: '/' +#### Bucket Root Path - # (Optional) The AWS account ID where the storage bucket is located. - # Credentials for the account ID must be configured in the 'aws' app config section. - # See the integration-aws-node package for details on how to configure credentials in - # the 'aws' app config section. - # https://www.npmjs.com/package/@backstage/integration-aws-node - # If account ID is not set and no credentials are set, environment variables or aws config file will be used to authenticate. - # https://www.npmjs.com/package/@aws-sdk/credential-provider-node - # https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html +`techdocs.publisher.awsS3.bucketRootPath` + +(Optional) The Location in storage bucket to save files. If not set, the default location will be the root of the storage bucket. + +**Example:** + +```yaml +techdocs: + publisher: + type: 'awsS3' + awsS3: + bucketName: 'techdocs-storage' + bucketRootPath: '/documentation' +``` + +#### Account ID + +`techdocs.publisher.awsS3.accountId` + +The AWS account ID where the storage bucket is located. Credentials for the account ID must be configured in the `aws` app config section. See the [integration-aws-node package](https://www.npmjs.com/package/@backstage/integration-aws-node) for details on how to configure credentials in the `aws` app config section. + +If account ID is not set and no credentials are set, environment variables or AWS config file will be used to authenticate. + +https://www.npmjs.com/package/@aws-sdk/credential-provider-node +https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html + +**Example:** + +```yaml +techdocs: + publisher: + type: 'awsS3' + awsS3: + bucketName: 'techdocs-storage' accountId: ${TECHDOCS_AWSS3_ACCOUNT_ID} +``` - # (Optional) AWS credentials to use to write to the storage bucket. - # This configuration section is now deprecated. - # Configuring the account ID is now preferred, with credentials in the 'aws' app config section. - # If credentials are not set and no account ID is set, environment variables or aws config file will be used to authenticate. - # https://www.npmjs.com/package/@aws-sdk/credential-provider-node - # https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html +#### Credentials + +`techdocs.publisher.awsS3.credentials` + +(Optional) AWS credentials to use to write to the storage bucket. This configuration section is now **deprecated**. Configuring the account ID is now preferred, with credentials in the `aws` app config section. + +If credentials are not set and no account ID is set, environment variables or AWS config file will be used to authenticate. + +https://www.npmjs.com/package/@aws-sdk/credential-provider-node +https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html + +**Example:** + +```yaml +techdocs: + publisher: + type: 'awsS3' + awsS3: + bucketName: 'techdocs-storage' credentials: accessKeyId: ${TECHDOCS_AWSS3_ACCESS_KEY_ID_CREDENTIAL} secretAccessKey: ${TECHDOCS_AWSS3_SECRET_ACCESS_KEY_CREDENTIAL} +``` - # (Optional) AWS Region of the bucket. - # If not set, AWS_REGION environment variable or aws config file will be used. - # https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-region.html +#### Region + +`techdocs.publisher.awsS3.region` + +(Optional) The AWS Region of the bucket. +If not set, `AWS_REGION` environment variable or AWS config file will be used. + +https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-region.html + +**Example:** + +```yaml +techdocs: + publisher: + type: 'awsS3' + awsS3: + bucketName: 'techdocs-storage' region: ${AWS_REGION} +``` - # (Optional) Endpoint URI to send requests to. - # If not set, the default endpoint is built from the configured region. - # https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/interfaces/s3clientconfig.html#endpoint +#### Endpoint + +`techdocs.publisher.awsS3.endpoint` + +(Optional) The Endpoint URI to send requests to. +If not set, the default endpoint is built from the configured region. + +https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-s3/interfaces/s3clientconfig.html#endpoint + +**Example:** + +```yaml +techdocs: + publisher: + type: 'awsS3' + awsS3: + bucketName: 'techdocs-storage' endpoint: ${AWS_ENDPOINT} +``` - # (Optional) HTTPS proxy to use for S3 Requests - # Defaults to using no proxy - # This allows docs to be published and read from behind a proxy +#### HTTPS Proxy + +`techdocs.publisher.awsS3.httpsProxy` + +(Optional) The HTTPS proxy to use for S3 Requests. Defaults to using no proxy. This allows docs to be published and read from behind a proxy. + +**Example:** + +```yaml +techdocs: + publisher: + type: 'awsS3' + awsS3: + bucketName: 'techdocs-storage' httpsProxy: ${HTTPS_PROXY} +``` - # (Optional) Whether to use path style URLs when communicating with S3. - # Defaults to false. - # This allows providers like LocalStack, Minio and Wasabi (and possibly others) to be used to host tech docs. - s3ForcePathStyle: false +#### S3 Force Path Style - # (Optional) AWS Server Side Encryption - # Defaults to undefined. - # If not set, encrypted buckets will fail to publish. - # https://docs.aws.amazon.com/AmazonS3/latest/userguide/specifying-s3-encryption.html - sse: 'aws:kms' # or AES256 +`techdocs.publisher.awsS3.s3ForcePathStyle` - # Required when techdocs.publisher.type is set to 'azureBlobStorage'. Skip otherwise. +(Optional) Whether to use path style URLs when communicating with S3. Defaults to `false`. This allows providers like LocalStack, Minio and Wasabi (and possibly others) to be used to host tech docs. +**Example:** + +```yaml +techdocs: + publisher: + type: 'awsS3' + awsS3: + bucketName: 'techdocs-storage' + s3ForcePathStyle: true +``` + +#### Server Side Encryption + +`techdocs.publisher.awsS3.sse` + +(Optional) AWS Server Side Encryption. Defaults to undefined. If not set, encrypted buckets will fail to publish. + +https://docs.aws.amazon.com/AmazonS3/latest/userguide/specifying-s3-encryption.html + +**Options:** `'aws:kms'` or `'AES256'` + +**Example:** + +```yaml +techdocs: + publisher: + type: 'awsS3' + awsS3: + bucketName: 'techdocs-storage' + sse: 'aws:kms' +``` + +### Azure Blob Storage + +`techdocs.publisher.azureBlobStorage` + +Required when `techdocs.publisher.type` is set to `'azureBlobStorage'`. Skip otherwise. + +#### Container Name + +`techdocs.publisher.azureBlobStorage.containerName` + +(Required) Azure Blob Storage Container Name + +**Example:** + +```yaml +techdocs: + publisher: + type: 'azureBlobStorage' azureBlobStorage: - # (Required) Azure Blob Storage Container Name containerName: 'techdocs-storage' +``` - # (Optional) Azure blob storage connection string. - # Can be useful for local testing through azurite - # Defaults to undefined - # if provided, takes higher priority, 'techdocs.publisher.azureBlobStorage.credentials' will become irrelevant - connectionString: '' +#### Connection String - # (Required) An account name is required to write to a storage blob container. - # https://docs.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key +`techdocs.publisher.azureBlobStorage.connectionString` + +(Optional) Azure blob storage connection string. Can be useful for local testing through azurite. Defaults to undefined. If provided, takes higher priority, and `techdocs.publisher.azureBlobStorage.credentials` will become irrelevant. + +**Example:** + +```yaml +techdocs: + publisher: + type: 'azureBlobStorage' + azureBlobStorage: + containerName: 'techdocs-storage' + connectionString: 'DefaultEndpointsProtocol=https;AccountName=...' +``` + +#### Credentials + +`techdocs.publisher.azureBlobStorage.credentials` + +(Required) An account name to write to a storage blob container. + +https://docs.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key + +(Optional) An account key is required to write to a storage container. If missing, `AZURE_TENANT_ID`, `AZURE_CLIENT_ID`, `AZURE_CLIENT_SECRET` environment variables will be used. + +https://docs.microsoft.com/en-us/azure/storage/common/storage-auth?toc=/azure/storage/blobs/toc.json + +**Example:** + +```yaml +techdocs: + publisher: + type: 'azureBlobStorage' + azureBlobStorage: + containerName: 'techdocs-storage' credentials: accountName: ${TECHDOCS_AZURE_BLOB_STORAGE_ACCOUNT_NAME} - # (Optional) An account key is required to write to a storage container. - # If missing,AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET environment variable will be used. - # https://docs.microsoft.com/en-us/azure/storage/common/storage-auth?toc=/azure/storage/blobs/toc.json accountKey: ${TECHDOCS_AZURE_BLOB_STORAGE_ACCOUNT_KEY} +``` - # (Optional and not recommended) Prior to version [0.x.y] of TechDocs, docs - # sites could only be accessed over paths with case-sensitive entity triplets - # e.g. (namespace/Kind/name). If you are upgrading from an older version of - # TechDocs and are unable to perform the necessary migration of files in your - # external storage, you can set this value to `true` to temporarily revert to - # the old, case-sensitive entity triplet behavior. +## Legacy Case Sensitive Triplet Paths + +`techdocs.legacyUseCaseSensitiveTripletPaths` + +(Optional and not recommended) Prior to version [0.x.y] of TechDocs, docs sites could only be accessed over paths with case-sensitive entity triplets e.g. (namespace/Kind/name). If you are upgrading from an older version of TechDocs and are unable to perform the necessary migration of files in your external storage, you can set this value to `true` to temporarily revert to the old, case-sensitive entity triplet behavior. + +**Example:** + +```yaml +techdocs: legacyUseCaseSensitiveTripletPaths: false +``` - # techdocs.cache is optional, and is only recommended when you've configured - # an external techdocs.publisher.type above. Also requires backend.cache to - # be configured with a valid cache store. Configure techdocs.cache.ttl to - # enable caching of techdocs assets. +## Cache Configuration + +`techdocs.cache` + +(Optional) `techdocs.cache` is only recommended when you've configured an external `techdocs.publisher.type` above. Also requires `backend.cache` to be configured with a valid cache store. Configure `techdocs.cache.ttl` to enable caching of techdocs assets. + +### TTL + +`techdocs.cache.ttl` + +Represents the number of milliseconds a statically built asset should stay cached. Cache invalidation is handled automatically by the frontend, which compares the build times in cached metadata vs. canonical storage, allowing long TTLs (e.g. 1 month/year). + +**Example:** + +```yaml +techdocs: cache: - # Represents the number of milliseconds a statically built asset should - # stay cached. Cache invalidation is handled automatically by the frontend, - # which compares the build times in cached metadata vs. canonical storage, - # allowing long TTLs (e.g. 1 month/year) ttl: 3600000 +``` - # (Optional) The time (in milliseconds) that the TechDocs backend will wait - # for a cache service to respond before continuing on as though the cached - # object was not found (e.g. when the cache service is unavailable). The - # default value is 1000 +### Read Timeout + +`techdocs.cache.readTimeout` + +(Optional) The time (in milliseconds) that the TechDocs backend will wait for a cache service to respond before continuing on as though the cached object was not found (e.g. when the cache service is unavailable). The default value is 1000. + +**Example:** + +```yaml +techdocs: + cache: + ttl: 3600000 readTimeout: 500 ``` diff --git a/docs/features/techdocs/extensions.md b/docs/features/techdocs/extensions.md index 6c69d076a4..76cc571a0f 100644 --- a/docs/features/techdocs/extensions.md +++ b/docs/features/techdocs/extensions.md @@ -10,15 +10,15 @@ description: How to use the built-in TechDocs extension points The TechDocs backend plugin provides the following extension points: - `techdocsPreparerExtensionPoint` - - Register a custom docs [PreparerBase extension](https://backstage.io/docs/reference/plugin-techdocs-node.preparerbase/) + - Register a custom docs [PreparerBase extension](https://backstage.io/api/stable/types/_backstage_plugin-techdocs-node.PreparerBase.html) - Ideal for when you want a custom type of docs created for a specific entity type - `techdocsBuildsExtensionPoint` - Allows overriding the build phase Winston log transport (by default does not log to console) - - Allows overriding the [DocsBuildStrategy](https://backstage.io/docs/reference/plugin-techdocs-node.docsbuildstrategy/) + - Allows overriding the [DocsBuildStrategy](https://backstage.io/api/stable/interfaces/_backstage_plugin-techdocs-node.DocsBuildStrategy.html) - `techdocsPublisherExtensionPoint` - Register a custom docs publisher - `techdocsGeneratorExtensionPoint` - - Register a custom [TechdocsGenerator](https://backstage.io/docs/reference/plugin-techdocs-node.techdocsgenerator/) + - Register a custom [TechdocsGenerator](https://backstage.io/api/stable/classes/_backstage_plugin-techdocs-node.TechdocsGenerator.html) Extension points are exported from `@backstage/plugin-techdocs-backend`. diff --git a/docs/features/techdocs/using-cloud-storage.md b/docs/features/techdocs/using-cloud-storage.md index 42024ffbb2..2d372dc48f 100644 --- a/docs/features/techdocs/using-cloud-storage.md +++ b/docs/features/techdocs/using-cloud-storage.md @@ -172,15 +172,17 @@ TechDocs will publish documentation to this bucket and will fetch files from here to serve documentation in Backstage. Note that the bucket names are globally unique. -Set the config `techdocs.publisher.awsS3.bucketName` in your `app-config.yaml` -to the name of the bucket you just created. +Set the bucket name and region in your `app-config.yaml` to the name of the bucket you just created: ```yaml techdocs: publisher: type: 'awsS3' +/* highlight-add-start */ awsS3: bucketName: 'name-of-techdocs-storage-bucket' + region: 'us-east-1' +/* highlight-add-end */ ``` **3. Create minimal AWS IAM policies to manage TechDocs** @@ -266,7 +268,7 @@ environment automatically by defining appropriate IAM role with access to the bucket. Read more in the [official AWS documentation for using IAM roles](https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html#use-roles). -**4b. Authentication using app-config.yaml** +**4b. Authentication using app-config.yaml via aws.accounts** AWS credentials and region can be provided to the AWS SDK via `app-config.yaml`. If the configs below are present, they will be used over existing `AWS_*` @@ -290,7 +292,45 @@ aws: Refer to the [official AWS documentation for obtaining the credentials](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/setting-credentials-node.html). -**4c. Authentication using an assumed role** Users with multiple AWS accounts +**4c. Authentication using app-config.yaml via integrations.awsS3** + +If you already have an [AWS S3 integration](../../integrations/aws-s3/locations.md), you can use it to authenticate with AWS S3: + +```yaml +techdocs: + publisher: + type: 'awsS3' + awsS3: + bucketName: 'name-of-techdocs-storage-bucket' + region: 'eu-west-1' +integrations: + awsS3: + - accessKeyId: ${AWS_ACCESS_KEY_ID} + secretAccessKey: ${AWS_SECRET_ACCESS_KEY} +``` + +This will use the credentials from the integration to authenticate with AWS S3 and it does not require any additional configuration in the `app-config.yaml`. However, **if you have multiple S3 integrations**, you **must** specify the target integration by setting the `accessKeyId` in the `techdocs.publisher.awsS3.credentials` config: + +```yaml +techdocs: + publisher: + type: 'awsS3' + awsS3: + bucketName: 'name-of-techdocs-storage-bucket' + region: 'eu-west-1' +/* highlight-add-start */ + credentials: + accessKeyId: ${AWS_ACCESS_KEY_ID_1} +/* highlight-add-end */ +integrations: + awsS3: + - accessKeyId: ${AWS_ACCESS_KEY_ID_1} + secretAccessKey: ${AWS_SECRET_ACCESS_KEY_1} + - accessKeyId: ${AWS_ACCESS_KEY_ID_2} + secretAccessKey: ${AWS_SECRET_ACCESS_KEY_2} +``` + +**4d. Authentication using an assumed role** Users with multiple AWS accounts may want to use a role for S3 storage that is in a different AWS account. Using the `roleArn` parameter as seen below, you can instruct the TechDocs publisher to assume a role before accessing S3. diff --git a/docs/frontend-system/architecture/20-extensions.md b/docs/frontend-system/architecture/20-extensions.md index a6d00a3131..106ab5340a 100644 --- a/docs/frontend-system/architecture/20-extensions.md +++ b/docs/frontend-system/architecture/20-extensions.md @@ -174,6 +174,8 @@ const navigationExtension = createExtension({ The input (see [1] above) is an object that we create using `createExtensionInput`. The first argument is the set of extension data that we accept via this input, and works just like the `output` option. The second argument is optional, and it allows us to put constraints on the extensions that are attached to our input. If the `singleton: true` option is set, only a single extension can be attached at a time, and unless the `optional: true` option is set it will also be required that there is exactly one attached extension. +Another option that can be used when creating an extension input is the `internal: true` option, which restricts the input to only accept extensions from the same plugin as the extension defining the input. Extensions from other plugins that attempt to attach to an internal input will be ignored, and a warning will be reported. This is useful when you want to limit extensibility to overrides and modules of your plugin, rather than letting it be open to any plugin. + So how can we now attach the output to the parent extension's input? If we think about a navigation component, like the Sidebar in Backstage, there might be plugins that want to attach a link to their plugin to this navigation component. In this case the plugin only needs to know the extension `id` and the name of the extension `input` to attach the extension `output` returned by the `factory` to the specified extension: ```tsx @@ -335,23 +337,11 @@ const routableExtension = createExtension({ }); ``` -## Multiple attachment points +## Sharing extensions across multiple locations -For some cases it can be useful to attach extensions to multiple parents. An example of this are Scaffolder field extensions or TechDocs addons that are consumed by multiple extensions. Specifying multiple attachments is done by providing an array of attachment points to the `attachTo` property of the extension. Keep in mind that this increases the complexity of your extension tree and should only be done when necessary. The following example shows how to attach our example extension to multiple parents: +If you need to make extensions available in multiple locations throughout your app, use a Utility API that collects the extensions and allows multiple parent extensions to consume them. This pattern provides better separation of concerns and makes data flow more explicit. -```tsx -const extension = createExtension({ - name: 'my-extension', - attachTo: [ - { id: 'my-first-parent', input: 'content' }, - { id: 'my-second-parent', input: 'children' }, // The input names do not need to match - ], - output: [coreExtensionData.reactElement], - factory() { - return [coreExtensionData.reactElement(
    Hello World
    )]; - }, -}); -``` +See the [Sharing Extensions Across Multiple Locations](./27-sharing-extensions.md) guide for a complete explanation of this pattern with detailed examples. ## Relative attachment points @@ -361,7 +351,7 @@ When creating an extension or an [extension blueprint](./23-extension-blueprints // Parent extension with a fixed attachment point const parentExtension = createExtension({ kind: 'section', - attachTo: [{ id: 'app/some-fixed-extension', input: 'children' }], + attachTo: { id: 'app/some-fixed-extension', input: 'children' }, inputs: { content: createExtensionInput([coreExtensionData.reactElement], { singleton: true, @@ -383,7 +373,7 @@ const parentExtension = createExtension({ // Child extension with a relative attachment point const childExtension = createExtension({ kind: 'section-content', - attachTo: [{ relative: { kind: 'section' }, input: 'content' }], + attachTo: { relative: { kind: 'section' }, input: 'content' }, output: [coreExtensionData.reactElement], factory() { return [coreExtensionData.reactElement(

    Section Content

    )]; @@ -409,7 +399,7 @@ const parent = createExtension({ // Create a child extension that attaches to the parent's input const child = createExtension({ - attachTo: page.inputs.children, // Direct reference to the input + attachTo: parent.inputs.children, // Direct reference to the input output: [coreExtensionData.reactElement], // Outputs are verified against the parent input // other options... }); diff --git a/docs/frontend-system/architecture/27-sharing-extensions.md b/docs/frontend-system/architecture/27-sharing-extensions.md new file mode 100644 index 0000000000..a08fd7d1db --- /dev/null +++ b/docs/frontend-system/architecture/27-sharing-extensions.md @@ -0,0 +1,173 @@ +--- +id: sharing-extensions +title: Sharing Extensions Across Multiple Locations +sidebar_label: Sharing Extensions +description: Using Utility APIs to share extensions across multiple locations in your app +--- + +Some plugins may need to provide extensibility that can be reused in multiple locations throughout the app. For example, in the pattern demonstrated on this page, a plugin can be made extensible by allowing widgets to be contributed that are then rendered on multiple pages. To achieve this, the recommended pattern is to use a Utility API that collects the extensions and makes them available throughout the plugin or the app. + +## Overview + +This pattern combines a Utility API with an extension blueprint to: + +1. Define the extension data types and API interface +2. Provide a blueprint for creating extensions +3. Create a Utility API extension that collects extensions as input +4. Consume the extensions via the API + +This approach provides a native integration with the frontend system, allowing to further rely on features like making the extensions configurable or have further extension points. + +## Basic Pattern + +The following example demonstrates this pattern using widgets that can be displayed on multiple pages. However, this pattern is flexible and can be adapted for many different scenarios where you need to: + +- Share the same type of extension across different pages or views +- Allow third-party plugins to contribute extensions in a decoupled way +- Aggregate similar functionality from multiple sources in a consistent way + +The core concepts remain the same regardless of what type of functionality you're sharing. + +### 1. Define the Extension Data Types and API Interface + +First, in your plugin's `-react` package (e.g., `backstage-plugin-foo-react`), define the widget types and API interface: + +```tsx title="in backstage-plugin-foo-react" +import { createApiRef } from '@backstage/frontend-plugin-api'; +import { ComponentType } from 'react'; + +export interface FooWidgetProps { + title: string; +} + +// Define what data each widget provides, prefer using lazy loading for large pieces of functionality like components +export interface FooWidget { + title: string; + size: 'small' | 'medium' | 'large'; + loader: () => Promise>; +} + +// Define the API interface +export interface FooWidgetsApi { + getWidgets(): FooWidget[]; +} + +// Create the API reference +export const fooWidgetsApiRef = createApiRef({ + id: 'plugin.foo.widgets', +}); +``` + +### 2. Provide a Blueprint for Creating Extensions + +Next, also in your `-react` package (e.g., `backstage-plugin-foo-react`), create a blueprint that creates extensions. The blueprint creates an internal data reference and exposes it via the `dataRefs` property. This blueprint will be exported for other plugins to use: + +```tsx title="in backstage-plugin-foo-react" +import { + createExtensionBlueprint, + createExtensionDataRef, + ExtensionBoundary, +} from '@backstage/frontend-plugin-api'; + +const fooWidgetDataRef = createExtensionDataRef().with({ + id: 'foo.widget', +}); + +export const FooWidgetBlueprint = createExtensionBlueprint({ + kind: 'foo-widget', + // Attach extensions created with this blueprint to the API extension that will be created in the next step + attachTo: { id: 'api:foo/widgets', input: 'widgets' }, + output: [fooWidgetDataRef], + *factory(params: FooWidget, { node }) { + yield fooWidgetDataRef({ + title: params.title, + size: params.size, + loader: ExtensionBoundary.lazyComponent(node, params.loader), + }); + }, + dataRefs: { + widget: fooWidgetDataRef, + }, +}); +``` + +### 3. Create a Utility API Extension that Collects Extensions + +In your main plugin package (e.g., `backstage-plugin-foo`), create a Utility API extension that collects widgets as input. Note that this imports the blueprint's data reference via `FooWidgetBlueprint.dataRefs.widget`: + +```tsx title="in backstage-plugin-foo" +import { + ApiBlueprint, + createExtensionInput, +} from '@backstage/frontend-plugin-api'; +import { + FooWidgetBlueprint, + fooWidgetsApiRef, +} from 'backstage-plugin-foo-react'; + +export const FooWidgetsApiExtension = ApiBlueprint.makeWithOverrides({ + name: 'widgets', + inputs: { + widgets: createExtensionInput([FooWidgetBlueprint.dataRefs.widget]), + }, + factory(originalFactory, { inputs }) { + // Collect all widgets from the inputs and forward them to the API implementation + const widgets = inputs.widgets.map(w => + w.get(FooWidgetBlueprint.dataRefs.widget), + ); + + return originalFactory(defineParams => + defineParams({ + api: fooWidgetsApiRef, + deps: {}, + factory: () => ({ + getWidgets: () => widgets, + }), + }), + ); + }, +}); +``` + +Other plugins can now import the blueprint from your `-react` package and create widget extensions that will be collected by the API: + +```tsx title="in a consuming plugin" +import { FooWidgetBlueprint } from 'backstage-plugin-foo-react'; + +const barWidgetExtension = FooWidgetBlueprint.make({ + name: 'bar', + params: { + title: 'Bar Widget', + size: 'small', + loader: () => import('./components/BarWidget').then(m => m.BarWidget), + }, +}); + +const bazWidgetExtension = FooWidgetBlueprint.make({ + name: 'baz', + params: { + title: 'Baz Widget', + size: 'medium', + loader: () => import('./components/BazWidget').then(m => m.BazWidget), + }, +}); +``` + +### 4. Consume the Extensions via the API + +You can now consume the widgets using any of the available methods for consuming Utility APIs. For example, this is how you would access the widgets in a component: + +```tsx title="in backstage-plugin-foo" +import { useApi } from '@backstage/frontend-plugin-api'; +import { fooWidgetsApiRef } from 'backstage-plugin-foo-react'; +import { Suspense, lazy } from 'react'; + +export function FooPageContent() { + const widgetsApi = useApi(fooWidgetsApiRef); + const widgets = widgetsApi.getWidgets(); + + return; // load and render widgets ... +} +``` + +For more information on consuming Utility APIs, see the [Consuming Utility APIs](../utility-apis/03-consuming.md) page. diff --git a/docs/frontend-system/building-apps/01-index.md b/docs/frontend-system/building-apps/01-index.md index ed84aeafb2..8610dfb7b5 100644 --- a/docs/frontend-system/building-apps/01-index.md +++ b/docs/frontend-system/building-apps/01-index.md @@ -103,7 +103,7 @@ You can also pass overrides to the features array, for more details, please read ### Using an async features loader -In case you need to perform asynchronous operations before passing features to the `createApp` function, define a [feature loader](https://backstage.io/docs/reference/frontend-defaults.createappfeatureloader/) object and pass it to the `features` option: +In case you need to perform asynchronous operations before passing features to the `createApp` function, define a [feature loader](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.index.createFrontendFeatureLoader.html) object and pass it to the `features` option: ```tsx title="packages/app/src/App.tsx" import { createApp } from '@backstage/frontend-defaults'; diff --git a/docs/frontend-system/building-apps/03-built-in-extensions.md b/docs/frontend-system/building-apps/03-built-in-extensions.md index 44316bd898..e1d0b0282d 100644 --- a/docs/frontend-system/building-apps/03-built-in-extensions.md +++ b/docs/frontend-system/building-apps/03-built-in-extensions.md @@ -18,7 +18,7 @@ extensions: ``` :::warning -Be careful when disabling built-in extensions, as there may be other extensions depending on their existence. For example, the built-in "alert display" extension displays messages retrieved via [AlertApi](https://backstage.io/docs/reference/core-plugin-api.alertapi) and disabling this extension will cause the application to no longer display these messages unless you install another extension that displays messages from `AlertApi`. +Be careful when disabling built-in extensions, as there may be other extensions depending on their existence. For example, the built-in "alert display" extension displays messages retrieved via [AlertApi](https://backstage.io/api/stable/types/_backstage_core-plugin-api.index.AlertApi.html) and disabling this extension will cause the application to no longer display these messages unless you install another extension that displays messages from `AlertApi`. ::: ## Override built-in extensions @@ -107,7 +107,7 @@ This is the extension that creates the app root element, so it renders root leve ##### Alert Display -An app root element extension that displays messages posted via the [`AlertApi`](https://backstage.io/docs/reference/core-plugin-api.alertapi). +An app root element extension that displays messages posted via the [`AlertApi`](https://backstage.io/api/stable/types/_backstage_core-plugin-api.index.AlertApi.html). | kind | namespace | name | id | | :--------------: | :-------: | :-----------: | :----------------------------------: | @@ -125,12 +125,12 @@ An app root element extension that displays messages posted via the [`AlertApi`] If you do not want to display alerts, disable this extension or if the available settings do not meet your needs, override this extension. :::warning -The built-in "alert display" extension displays messages retrieved via [AlertApi](https://backstage.io/docs/reference/core-plugin-api.alertapi) and disabling this extension will cause the application to no longer display these messages unless you install another extension that displays messages from `AlertApi`. +The built-in "alert display" extension displays messages retrieved via [AlertApi](https://backstage.io/api/stable/types/_backstage_core-plugin-api.index.AlertApi.html) and disabling this extension will cause the application to no longer display these messages unless you install another extension that displays messages from `AlertApi`. ::: ##### OAuth Request Dialog -An app root element extension that renders the oauth request dialog, it is based on the [oauthRequestApi](https://backstage.io/docs/reference/core-plugin-api.oauthrequestapi/). +An app root element extension that renders the oauth request dialog, it is based on the [oauthRequestApi](https://backstage.io/api/stable/types/_backstage_core-plugin-api.index.OAuthRequestApi.html). | kind | namespace | name | id | | :--------------: | :-------: | :------------------: | :-----------------------------------------: | @@ -146,10 +146,10 @@ Renders the app's sidebar and content in a specific layout. #### Inputs -| Name | Description | Type | Optional | Default | Extension creator | -| ------- | --------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | -------- | ------- | ------------------------------------ | -| nav | A React element that renders the app sidebar. | [coreExtensionData.reactElement](https://backstage.io/docs/reference/frontend-plugin-api.coreextensiondata) | false | - | Override the `App/Nav` extension. | -| content | A React element that renders the app content. | [coreExtensionData.reactElement](https://backstage.io/docs/reference/frontend-plugin-api.coreextensiondata) | false | - | Override the `App/Routes` extension. | +| Name | Description | Type | Optional | Default | Extension creator | +| ------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------- | ------------------------------------ | +| nav | A React element that renders the app sidebar. | [coreExtensionData.reactElement](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.index.coreExtensionData.html) | false | - | Override the `App/Nav` extension. | +| content | A React element that renders the app content. | [coreExtensionData.reactElement](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.index.coreExtensionData.html) | false | - | Override the `App/Routes` extension. | ### App nav @@ -161,10 +161,10 @@ Extension responsible for rendering the logo and items in the app's sidebar. #### Inputs -| Name | Description | Type | Optional | Default | Extension creator | -| ------- | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | -------- | ------- | -------------------------------------------------------------------------------------------------------- | -| content | Overrides the default content of the navbar. | [NavContentBlueprint.dataRefs.component](https://backstage.io/docs/reference/frontend-plugin-api.navcontentblueprint) | true | - | [NavContentBlueprint](https://backstage.io/docs/reference/frontend-plugin-api.navcontentblueprint) | -| items | Nav items target objects. | [createNavItemExtension.targetDataRef](https://backstage.io/docs/reference/frontend-plugin-api.createnavitemextension.targetdataref) | true | - | [createNavItemExtension](https://backstage.io/docs/reference/frontend-plugin-api.createnavitemextension) | +| Name | Description | Type | Optional | Default | Extension creator | +| ------- | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------- | --------------------------------------------------------------------------------------------------------------------- | +| content | Overrides the default content of the navbar. | [NavContentBlueprint.dataRefs.component](https://backstage.io/api/stable/variables/_backstage_plugin-app-react.NavContentBlueprint.html) | true | - | [NavContentBlueprint](https://backstage.io/api/stable/variables/_backstage_plugin-app-react.NavContentBlueprint.html) | +| items | Nav items target objects. | [createNavItemExtension.targetDataRef](https://backstage.io/docs/reference/frontend-plugin-api.createnavitemextension.targetdataref) | true | - | [createNavItemExtension](https://backstage.io/docs/reference/frontend-plugin-api.createnavitemextension) | ### App routes diff --git a/docs/frontend-system/building-apps/07-module-federation.md b/docs/frontend-system/building-apps/07-module-federation.md new file mode 100644 index 0000000000..5e83a86343 --- /dev/null +++ b/docs/frontend-system/building-apps/07-module-federation.md @@ -0,0 +1,166 @@ +--- +id: module-federation +title: Module Federation +sidebar_label: Module Federation +description: Using Module Federation in Backstage +--- + +## Introduction + +Module Federation is a feature that enables sharing code and dependencies between separately built JavaScript applications at runtime. In Backstage, module federation support allows you to: + +- Build your frontend application as a **module federation host** that can load remote modules at runtime +- Package individual plugins or bundles of several plugins as **module federation remotes** that can be loaded dynamically +- Share dependencies efficiently between the host and remotes to avoid code duplication + +This guide explains how to configure and build both module federation hosts and remotes in Backstage, and how to initialize module federation at runtime using the standard Module Federation Runtime API. + +## Overview + +### Module Federation Host vs Remotes + +In module federation terminology: + +- **Host**: The main frontend application that loads and consumes remote modules. In Backstage, this is your app package (typically `packages/app`). +- **Remote**: A separately built module that can be loaded by the host at runtime. In Backstage, these are typically plugin packages built as module federation remotes. + +### Shared Dependencies + +A critical aspect of module federation is **shared dependencies**. When a host loads remote modules, both need to share common dependencies (like React, React Router, Material-UI) in order to ensure singleton dependencies only have one instance. + +Backstage provides a list of default shared dependencies for common packages like React, React Router, and Material-UI. At build-time the `version` field is automatically resolved from your `package.json` files. + +## Building the Module Federation Host + +The module federation host is your main frontend application. By default, Backstage frontend applications include a default list of module federation shared dependencies. + +When building and bundling the frontend application, the CLI automatically: + +1. Resolves versions of the shared dependencies based on the monorepo dependencies +2. Adds an additional entrypoint to the frontend application bundle with the list of resolved runtime shared dependencies + +## Building Module Federation Remotes + +Plugin packages can be built as module federation remotes, allowing them to be loaded dynamically by a host application. + +### Using the CLI + +To build a plugin as a module federation remote, use the `--module-federation` option with the `package build` command: + +```bash +cd plugins/my-plugin +yarn build --module-federation +``` + +### Build Output + +When building a plugin as a module federation remote, the CLI: + +1. Resolves versions of the shared dependencies based on the monorepo dependencies (done automatically by the Rspack/Webpack module federation plugin) +2. Produces the bundle assets in the `dist` folder, including: + - a `mf-manifest.json` file which contains the module federation manifest + - a `remoteEntry.js` file which is the main entrypoint for the remote module + +## Runtime Usage + +To use module federation in your Backstage app, you need to initialize the Module Federation Runtime with the shared dependencies configuration. + +### Basic Usage + +Here's how to initialize module federation in your app, and load remote modules: + +```typescript title="packages/app/src/moduleFederation.ts" +import { + createInstance, + ModuleFederation, +} from '@module-federation/enhanced/runtime'; +import { loadModuleFederationHostShared } from '@backstage/module-federation-common'; + +export async function initializeModuleFederation(): Promise { + return createInstance({ + name: 'app', + remotes: [ + { + name: 'my_plugin', + entry: 'http://localhost:3001/mf-manifest.json', + }, + ], + shared: await loadModuleFederationHostShared(), + }); +} + +export async function loadRemote( + instance: ModuleFederation, + name: string, +): Promise { + return await instance.loadRemote(name); +} +``` + +The `loadModuleFederationHostShared` function loads all shared dependencies in parallel and returns them in the format expected by the Module Federation Runtime. By default it will throw if any shared dependency fails to load. You can pass an `onError` callback to handle errors gracefully instead: + +```typescript +const shared = await loadModuleFederationHostShared({ + onError: error => console.error(error.message, error.cause), +}); +``` + +### Integration with Feature Loaders + +Standard Module Federation runtime API integrates very well with frontend feature loaders, +as shown in the example below: + +```typescript title="packages/app/src/loader.tsx" +import { createInstance } from '@module-federation/enhanced/runtime'; +import { loadModuleFederationHostShared } from '@backstage/module-federation-common'; +import { createFrontendFeatureLoader } from '@backstage/frontend-plugin-api'; + +export const moduleFederationLoader = createFrontendFeatureLoader({ + async loader() { + const moduleFederationInstance = createInstance({ + name: 'app', + remotes: [], + shared: await loadModuleFederationHostShared(), + }); + moduleFederationInstance.registerRemotes([ + { + name: 'myFirstRemoteWith2ExposedModules', + entry: + 'https://someCDN.org/myFirstRemoteWith2ExposedModules/mf-manifest.json', + }, + { + name: 'mySecondRemote', + entry: 'https://someCDN.org/mySecondRemote/mf-manifest.json', + }, + ]); + const myFirstRemoteModule1 = await moduleFederationInstance.loadRemote( + 'myFirstRemoteWith2ExposedModules/module1', + ); + const myFirstRemoteModule2 = await moduleFederationInstance.loadRemote( + 'myFirstRemoteWith2ExposedModules/module2', + ); + const mySecondRemoteModule = await moduleFederationInstance.loadRemote( + 'mySecondRemote', + ); + return [ + myFirstRemoteModule1.default, + myFirstRemoteModule2.default, + mySecondRemoteModule.default, + ]; + }, +}); + +const app = createApp({ + features: [moduleFederationLoader], +}); + +export default app.createRoot(); +``` + +Note that, on top of the standard API, we plan to provide a more simplified way to configure module federation remotes. + +Additionally, the [`dynamicFrontendFeaturesLoader`](https://github.com/backstage/backstage/blob/master/packages/frontend-dynamic-feature-loader/src/loader.ts) provided in the [`@backstage/frontend-dynamic-feature-loader`](https://github.com/backstage/backstage/blob/master/packages/frontend-dynamic-feature-loader/README.md) package, which provides an integrated solution to load module federation remotes as dynamic frontend plugins, is a more complete example of a feature loader based on the module federation support. + +## Default Shared Dependencies + +Default shared dependencies are the same for both the host and remotes, and the list can be found in the [`@backstage/module-federation-common`](https://github.com/backstage/backstage/blob/master/packages/module-federation-common/src/defaults.ts) package. diff --git a/docs/frontend-system/building-apps/08-migrating.md b/docs/frontend-system/building-apps/08-migrating.md index 1fd74becfc..3ac5109fc7 100644 --- a/docs/frontend-system/building-apps/08-migrating.md +++ b/docs/frontend-system/building-apps/08-migrating.md @@ -444,7 +444,7 @@ const app = createApp({ Can be converted to the following extension: ```tsx -import { SignInPageBlueprint } from '@backstage/frontend-plugin-api'; +import { SignInPageBlueprint } from '@backstage/plugin-app-react'; const signInPage = SignInPageBlueprint.make({ params: { @@ -492,7 +492,7 @@ const app = createApp({ Can be converted to the following extension: ```tsx -import { ThemeBlueprint } from '@backstage/frontend-plugin-api'; +import { ThemeBlueprint } from '@backstage/plugin-app-react'; const customLightThemeExtension = ThemeBlueprint.make({ name: 'custom-light', @@ -535,7 +535,7 @@ const app = createApp({ Icons are now installed as extensions, using the `IconBundleBlueprint` to make new instances which can be added to the app. ```ts -import { IconBundleBlueprint } from '@backstage/frontend-plugin-api'; +import { IconBundleBlueprint } from '@backstage/plugin-app-react'; const exampleIconBundle = IconBundleBlueprint.make({ name: 'example-bundle', @@ -586,10 +586,8 @@ Can be converted to the following extension: ```tsx import { catalogTranslationRef } from '@backstage/plugin-catalog/alpha'; -import { - createTranslationMessages, - TranslationBlueprint, -} from '@backstage/frontend-plugin-api'; +import { createTranslationMessages } from '@backstage/frontend-plugin-api'; +import { TranslationBlueprint } from '@backstage/plugin-app-react'; const catalogTranslations = TranslationBlueprint.make({ name: 'catalog-overrides', @@ -662,7 +660,7 @@ const convertedRootFeatures = convertLegacyAppRoot( ); ``` -Any app root wrapper needs to be migrated to be an extension, created using `AppRootWrapperBlueprint`. Note that if you have multiple wrappers they must be completely independent of each other, i.e. the order in which they the appear in the React tree should not matter. If that is not the case then you should group them into a single wrapper. +Any app root wrapper needs to be migrated to be an extension, created using `AppRootWrapperBlueprint` from `@backstage/plugin-app-react`. Note that if you have multiple wrappers they must be completely independent of each other, i.e. the order in which they the appear in the React tree should not matter. If that is not the case then you should group them into a single wrapper. Here is an example converting the `CustomAppBarrier` into extension: @@ -698,16 +696,16 @@ import { SidebarContent } from './Sidebar'; export const navModule = createFrontendModule({ pluginId: 'app', - extensions: [sidebarContent], + extensions: [SidebarContent], }); ``` -Then in the actual implementation for the `sidebarContent` extension, you can provide something like the following, where you implement the entire `Sidebar` component. +Then in the actual implementation for the `SidebarContent` extension, you can provide something like the following, where you implement the entire `Sidebar` component. ```tsx title="in packages/app/src/modules/nav/Sidebar.tsx" -import { NavContentBlueprint } from '@backstage/frontend-plugin-api'; +import { NavContentBlueprint } from '@backstage/plugin-app-react'; -export const sidebarContent = NavContentBlueprint.make({ +export const SidebarContent = NavContentBlueprint.make({ params: { component: ({ items }) => ( diff --git a/docs/frontend-system/building-plugins/01-index.md b/docs/frontend-system/building-plugins/01-index.md index 283c162fa7..d9acf76e15 100644 --- a/docs/frontend-system/building-plugins/01-index.md +++ b/docs/frontend-system/building-plugins/01-index.md @@ -124,7 +124,7 @@ export interface ExampleApi { } export const exampleApiRef = createApiRef({ - id: 'plugin.example', + id: 'plugin.example.api', }); export class DefaultExampleApi implements ExampleApi { @@ -220,6 +220,6 @@ export const examplePlugin = createFrontendPlugin({ }); ``` -The `ExampleEntityContent` itself is again a regular React component where you can implement any functionality you want. To access the entity that the content is being rendered for, you can use the `useEntity` hook from `@backstage/plugin-catalog-react`. You can see a full list of APIs provided by the catalog React library in [the API reference](../../reference/plugin-catalog-react.md). +The `ExampleEntityContent` itself is again a regular React component where you can implement any functionality you want. To access the entity that the content is being rendered for, you can use the `useEntity` hook from `@backstage/plugin-catalog-react`. You can see a full list of APIs provided by the catalog React library in [the API reference](https://backstage.io/api/stable/modules/_backstage_plugin-catalog-react.index.html). For a more complete list of the different kinds of extensions that you can create for your plugin, see the [extension blueprints](./03-common-extension-blueprints.md) section. diff --git a/docs/frontend-system/building-plugins/02-testing.md b/docs/frontend-system/building-plugins/02-testing.md index ac90185b40..82f44df2eb 100644 --- a/docs/frontend-system/building-plugins/02-testing.md +++ b/docs/frontend-system/building-plugins/02-testing.md @@ -31,50 +31,50 @@ describe('Entity details component', () => { }); ``` -To mock [Utility APIs](../architecture/33-utility-apis.md) that are used by your component you can use the `TestApiProvider` to override individual API implementations. In the snippet below, we wrap the component within a `TestApiProvider` in order to mock the catalog client API: +To mock [Utility APIs](../architecture/33-utility-apis.md) that are used by your component, pass API overrides to `renderInTestApp` using the `apis` option. Mock helpers are available from `@backstage/frontend-test-utils` and plugin-specific test utilities. For a deeper look at the available mock APIs and how to create your own, see [Testing with Utility APIs](../utility-apis/05-testing.md). ```tsx import { screen } from '@testing-library/react'; -import { - renderInTestApp, - TestApiProvider, -} from '@backstage/frontend-test-utils'; -import { stringifyEntityRef } from '@backstage/catalog-model'; -import { CatalogApi, catalogApiRef } from '@backstage/plugin-catalog-react'; -import { EntityDetails } from './plugin'; +import { renderInTestApp, mockApis } from '@backstage/frontend-test-utils'; +import { identityApiRef } from '@backstage/frontend-plugin-api'; +import { catalogApiRef } from '@backstage/plugin-catalog-react'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; +import { MyEntitiesList } from './plugin'; -describe('Entity details component', () => { - it('should render the entity name and owner', async () => { - const catalogApiMock = { - async getEntityFacets() { - return { - facets: { - 'relations.ownedBy': [{ count: 1, value: 'group:default/tools' }], - }, - }, - } - } satisfies Partial; - - const entityRef = stringifyEntityRef({ - kind: 'Component', - namespace: 'default', - name: 'test', +describe('MyEntitiesList', () => { + it('should render entities owned by the current user', async () => { + await renderInTestApp(, { + apis: [ + [ + identityApiRef, + mockApis.identity({ userEntityRef: 'user:default/guest' }), + ], + [ + catalogApiRef, + catalogApiMock({ + entities: [ + { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { name: 'my-component' }, + spec: { type: 'service', owner: 'user:default/guest' }, + }, + ], + }), + ], + ], }); - await renderInTestApp( - - - , - ); - await expect( - screen.findByText('The entity "test" is owned by "tools"'), + screen.findByText('my-component'), ).resolves.toBeInTheDocument(); }); }); ``` -This pattern also works for many other context providers. An important example is the `EntityProvider` from the `@backstage/plugin-catalog-react` package, which you can use to provide a mocked entity context to the component. +This approach provides the API overrides at the app level, which is useful when testing components that depend on APIs deep in the component tree. + +The `TestApiProvider` component is also available for standalone rendering scenarios where you're not using `renderInTestApp` or other test utilities. Context providers like `EntityProvider` from `@backstage/plugin-catalog-react` can also be used to provide a mocked entity context to the component. ## Testing extensions @@ -102,7 +102,35 @@ describe('Index page', () => { }); ``` -This pattern also allows you to wrap the extension with context providers, such as the `TestApiProvider` that was introduced [above](#testing-react-components). +You can also provide API overrides directly to `createExtensionTester` using the `apis` option: + +```tsx +import { screen } from '@testing-library/react'; +import { + createExtensionTester, + mockApis, + renderInTestApp, +} from '@backstage/frontend-test-utils'; +import { identityApiRef } from '@backstage/frontend-plugin-api'; +import { indexPageExtension } from './plugin'; + +describe('Index page', () => { + it('should render with a custom identity', async () => { + await renderInTestApp( + createExtensionTester(indexPageExtension, { + apis: [ + [ + identityApiRef, + mockApis.identity({ userEntityRef: 'user:default/guest' }), + ], + ], + }).reactElement(), + ); + + expect(screen.getByText('Index Page')).toBeInTheDocument(); + }); +}); +``` Note that the `.reactElement()` method will look for the `coreExtensionData.reactElement` data in the extension outputs. If that doesn't exist and the extension outputs something else that you want to test, you can access the output data using the `.get(dataRef)` method instead. @@ -172,7 +200,82 @@ describe('Index page', () => { }); ``` -That's all for testing features! +## Testing entity extensions + +The `createTestEntityPage` utility from `@backstage/plugin-catalog-react/testUtils` simplifies testing entity cards and content extensions. It creates a test page that mounts at `/`, provides an `EntityProvider` context, and picks up entity extensions through input redirects. + +```tsx +import { screen } from '@testing-library/react'; +import { renderTestApp } from '@backstage/frontend-test-utils'; +import { createTestEntityPage } from '@backstage/plugin-catalog-react/testUtils'; +import { myEntityCard } from './plugin'; + +describe('MyEntityCard', () => { + it('should render for Component entities', async () => { + const entity = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Component', + metadata: { name: 'my-service' }, + spec: { type: 'service', owner: 'team-a' }, + }; + + renderTestApp({ + extensions: [createTestEntityPage({ entity }), myEntityCard], + }); + + expect(await screen.findByText('My Card Title')).toBeInTheDocument(); + }); +}); +``` + +Entity content extensions can be tested the exact same way, just pass your content extension instead of a card. The test page also supports entity filters defined on the extensions, so you can test filter behavior by providing different entity kinds. If your extension depends on APIs you can pass mock implementation using the `apis` option `renderTestApp`, or you can pass the API extension directly alongside your content extension. + +Extensions that use `EntityRefLinks` or `useRelatedEntities` may require additional API mocking using the `apis` option on `renderTestApp`. + +## Mounting routes + +If your component or extension uses `useRouteRef` to generate links to other routes, you need to mount those routes in the test environment. Both `renderInTestApp` and `renderTestApp` support the `mountedRoutes` option for this purpose. + +For example, given a component that uses `useRouteRef` to create a link: + +```tsx +import { useRouteRef } from '@backstage/frontend-plugin-api'; +import { detailsRouteRef } from './routes'; + +export const MyComponent = () => { + const detailsLink = useRouteRef(detailsRouteRef); + + return View details; +}; +``` + +You can test it by mounting the route ref to a path using the `mountedRoutes` option: + +```tsx +import { screen } from '@testing-library/react'; +import { renderInTestApp } from '@backstage/frontend-test-utils'; +import { detailsRouteRef } from './routes'; +import { MyComponent } from './MyComponent'; + +describe('MyComponent', () => { + it('should render a link to the plugin page', async () => { + await renderInTestApp(, { + mountedRoutes: { + '/my-plugin/details': detailsRouteRef, + }, + }); + + expect(await screen.findByText('View details')).toHaveAttribute( + 'href', + '/my-plugin/details', + ); + }); +}); +``` + +## Extension tree snapshots + +The `snapshot()` method on `ExtensionTester` returns a tree-shaped representation of the resolved extension hierarchy, which is convenient to use with Jest's `toMatchInlineSnapshot()` for verifying extension structure in tests. ## Missing something? diff --git a/docs/frontend-system/building-plugins/03-common-extension-blueprints.md b/docs/frontend-system/building-plugins/03-common-extension-blueprints.md index 71989e898f..3bb613848f 100644 --- a/docs/frontend-system/building-plugins/03-common-extension-blueprints.md +++ b/docs/frontend-system/building-plugins/03-common-extension-blueprints.md @@ -11,38 +11,54 @@ This section covers many of the [extension blueprints](../architecture/23-extens These are the [extension blueprints](../architecture/23-extension-blueprints.md) provided by the Backstage frontend framework itself. -### Api - [Reference](../../reference/frontend-plugin-api.apiblueprint.md) +### Api - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.ApiBlueprint.html) An API extension is used to add or override [Utility API factories](../utility-apis/01-index.md) in the app. They are commonly used by plugins for both internal and shared APIs. There are also many built-in Api extensions provided by the framework that you are able to override. -### NavItem - [Reference](../../reference/frontend-plugin-api.navitemblueprint.md) +### NavItem - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.NavItemBlueprint.html) Navigation item extensions are used to provide menu items that link to different parts of the app. By default nav items are attached to the app nav extension, which by default is rendered as the left sidebar in the app. -### Page - [Reference](../../reference/frontend-plugin-api.pageblueprint.md) +### Page - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.PageBlueprint.html) Page extensions provide content for a particular route in the app. By default pages are attached to the app routes extensions, which renders the root routes. -### SignInPage - [Reference](../../reference/frontend-plugin-api.signinpageblueprint.md) +## Extension blueprints in `@backstage/frontend-plugin-api/alpha` + +### Plugin Wrapper - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.packages-frontend-plugin-api_src_alpha.PluginWrapperBlueprint.html) + +Plugin wrappers allow you to install components that will wrap all elements rendered as part of a plugin. This can be useful if you need to add a global provider, for example for a query client. The provided wrapper will be rendered as separate elements for each wrapped plugin element, so be sure to use a central store like a [Utility API](../utility-apis/01-index.md) if you want to share state between wrapper instances. + +## Extension blueprints in `@backstage/plugin-app-react` + +### SignInPage - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.SignInPageBlueprint.html) Sign-in page extension have a single purpose - to implement a custom sign-in page. They are always attached to the app root extension and are rendered before the rest of the app until the user is signed in. -### SwappableComponent - [Reference](../../reference/frontend-plugin-api.swappablecomponentblueprint.md) +### SwappableComponent - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.SwappableComponentBlueprint.html) Swappable Components are extensions that are used to replace the implementations of components in the app and plugins. -### Theme - [Reference](../../reference/frontend-plugin-api.themeblueprint.md) +### Theme - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.ThemeBlueprint.html) Theme extensions provide custom themes for the app. They are always attached to the app extension and you can have any number of themes extensions installed in an app at once, letting the user choose which theme to use. -### Icons - [Reference](../../reference/frontend-plugin-api.iconbundleblueprint.md) +### Icons - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.IconBundleBlueprint.html) Icon bundle extensions provide the ability to replace or provide new icons to the app. You can use the above blueprint to make new extension instances which can be installed into the app. -### Translation - [Reference](../../reference/frontend-plugin-api.translationblueprint.md) +### Translation - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.TranslationBlueprint.html) Translation extension provide custom translation messages for the app. They can be used both to override the default english messages to custom ones, as well as provide translations for additional languages. +### NavContent - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.NavContentBlueprint.html) + +Nav content extensions allow you to replace the entire navbar with your own component. They are always attached to the app nav extension. + +### Router - [Reference](https://backstage.io/api/stable/variables/_backstage_frontend-plugin-api.RouterBlueprint.html) + +Router extensions allow you to replace the router component used by the app. They are always attached to the app root extension. + ## Extension blueprints in `@backstage/plugin-catalog-react/alpha` These are the [extension blueprints](../architecture/23-extension-blueprints.md) provided by the Catalog plugin. @@ -57,6 +73,31 @@ Avoid using `convertLegacyEntityCardExtension` from `@backstage/core-compat-api` Creates entity content to be displayed on the entity pages of the catalog plugin. Exported as `EntityContentBlueprint`. +Supports optional params such as `group` and `icon` to: + +- group: string | false — associates the content with a tab group on the entity page (for example "overview", "quality", "deployment", or any custom id). You can override or disable this per-installation via app-config using `app.extensions[...].config.group`, where `false` removes the grouping. +- icon: string — sets the tab icon. Note: when providing a string, the icon is looked up via the app's IconsApi; make sure icon bundles are enabled/installed in your app (see the Icons blueprint reference above) so that the icon id you use is available. + +To render icons in the entity page tabs, the page must also have icons enabled via app configuration. Set `showNavItemIcons: true` on the catalog entity page config (created via `page:catalog/entity`). Example: + +```yaml +app: + extensions: + # Entity page + - page:catalog/entity: + config: + # Enable tab- and group-icons + showNavItemIcons: true + # Optionally override default groups and their icons + groups: + - overview: + title: Overview + icon: dashboard + - documentation: + title: Docs + icon: description +``` + Avoid using `convertLegacyEntityContentExtension` from `@backstage/core-compat-api` to convert legacy entity content extensions to the new system. Instead, use the `EntityContentBlueprint` directly. The legacy converter is only intended to help adapt 3rd party plugins that you don't control, and doesn't produce as good results as using the blueprint directly. ## Extension blueprints in `@backstage/plugin-search-react/alpha` diff --git a/docs/frontend-system/building-plugins/06-swappable-components.md b/docs/frontend-system/building-plugins/06-swappable-components.md index a26396bbff..786388b3c8 100644 --- a/docs/frontend-system/building-plugins/06-swappable-components.md +++ b/docs/frontend-system/building-plugins/06-swappable-components.md @@ -52,11 +52,8 @@ In order to override a Swappable Component, you need to create a `SwappableCompo There are two different ways to add extensions to the `app` plugin, both are documented below in an example of overriding the `Progress` Swappable Component. ```tsx title="in packages/app/src/App.tsx" -import { - Progress, - SwappableComponentBlueprint, - createFrontendModule, -} from '@backstage/frontend-plugin-api'; +import { Progress, createFrontendModule } from '@backstage/frontend-plugin-api'; +import { SwappableComponentBlueprint } from '@backstage/plugin-app-react'; import { MyCustomProgress } from './CustomProgress'; import { createApp } from '@backstage/frontend-defaults'; import appPlugin from '@backstage/plugin-app'; diff --git a/docs/frontend-system/index.md b/docs/frontend-system/index.md index 9633df1dab..1d53b5e7e9 100644 --- a/docs/frontend-system/index.md +++ b/docs/frontend-system/index.md @@ -9,4 +9,4 @@ description: The Frontend System We recommend migrating your frontend plugins to the new frontend system. If you do please do so under an `/alpha` sub-path export. -You can find an example app setup in the [`app-next` package](https://github.com/backstage/backstage/tree/master/packages/app-next). +You can find an example app setup in the [`app` package](https://github.com/backstage/backstage/tree/master/packages/app). diff --git a/docs/frontend-system/utility-apis/01-index.md b/docs/frontend-system/utility-apis/01-index.md index 57e895ca36..86d317ddb2 100644 --- a/docs/frontend-system/utility-apis/01-index.md +++ b/docs/frontend-system/utility-apis/01-index.md @@ -35,6 +35,14 @@ Most utility APIs are usable directly without any configuration. But they are pr These cases are all described in [the main article](./04-configuring.md). +## Testing with utility APIs + +> For details, [see the main article](./05-testing.md). + +When testing frontend components and extensions, you often need to provide mock implementations of the utility APIs they depend on. The `@backstage/frontend-test-utils` package provides the `mockApis` namespace with ready-made mocks for all core utility APIs, which can be passed to test utilities like `renderInTestApp` and `TestApiProvider`. + +These are described in detail in [the main article](./05-testing.md). + ## Migrating from the old frontend system If you want to learn how to migrate your own utility APIs from the old frontend system to the new one, that's described in the [Migrating APIs guide](../building-plugins/05-migrating.md#migrating-apis). diff --git a/docs/frontend-system/utility-apis/02-creating.md b/docs/frontend-system/utility-apis/02-creating.md index c632d9a909..2f6959e0ce 100644 --- a/docs/frontend-system/utility-apis/02-creating.md +++ b/docs/frontend-system/utility-apis/02-creating.md @@ -36,6 +36,9 @@ export const workApiRef = createApiRef({ Both of these are properly exported publicly from the package, so that consumers can reach them. +The frontend system infers the owning plugin for an API from the `ApiRef` id, so +use the pattern `plugin..*` to make ownership explicit. This ensures that other plugins can't mistakenly override your API. + ## Providing an extension through your plugin The plugin itself now wants to provide this API and its default implementation, in the form of an API extension. Doing so means that when users install the Example plugin, an instance of the Work utility API will also be automatically available in their apps - both to the Example plugin itself, and to others. We do this in the main plugin package, not the `-react` package. diff --git a/docs/frontend-system/utility-apis/04-configuring.md b/docs/frontend-system/utility-apis/04-configuring.md index 1f21d9b1ba..53527301ef 100644 --- a/docs/frontend-system/utility-apis/04-configuring.md +++ b/docs/frontend-system/utility-apis/04-configuring.md @@ -36,6 +36,8 @@ Well written input-enabled extension often have extension creator functions that Like with other extension types, you replace Utility APIs with your own custom implementation using [extension overrides](../architecture/25-extension-overrides.md). +Note that it is only possible to override a Utility API using a module for the plugin that originally provided the API. Attempting to override an API using a different plugin or module for a different plugin will result in a conflict error. + ```tsx title="in your app" /* highlight-add-start */ import { createFrontendModule } from '@backstage/frontend-plugin-api'; diff --git a/docs/frontend-system/utility-apis/05-testing.md b/docs/frontend-system/utility-apis/05-testing.md new file mode 100644 index 0000000000..ba1e93e505 --- /dev/null +++ b/docs/frontend-system/utility-apis/05-testing.md @@ -0,0 +1,194 @@ +--- +id: testing +title: Testing with Utility APIs +sidebar_label: Testing +description: Mocking and testing Utility APIs +--- + +When testing frontend components and extensions, you often need to provide mock implementations of the utility APIs they depend on. The `@backstage/frontend-test-utils` package provides the `mockApis` namespace with ready-made mocks for all core utility APIs. + +## The `mockApis` namespace + +The `mockApis` namespace is the main entry point for creating mock utility API instances in tests. It provides two usage patterns for each API: + +### Fake instances + +Call the API function directly to create a fake instance with simplified but functional behavior. These are useful when your test needs the API to actually work, not just be stubbed. + +```ts +import { mockApis } from '@backstage/frontend-test-utils'; + +const configApi = mockApis.config({ data: { app: { title: 'Test' } } }); +configApi.getString('app.title'); // 'Test' + +const alertApi = mockApis.alert(); +alertApi.post({ message: 'hello' }); +expect(alertApi.getAlerts()).toHaveLength(1); +``` + +### Jest mocks + +Call `.mock()` to get an instance where every method is a `jest.fn()`. You can optionally provide partial implementations. This is useful when you want to assert that specific methods were called. + +```ts +import { mockApis } from '@backstage/frontend-test-utils'; +import { AuthorizeResult } from '@backstage/plugin-permission-common'; + +const permissionApi = mockApis.permission.mock({ + authorize: async () => ({ result: AuthorizeResult.ALLOW }), +}); + +// ... exercise the component ... + +expect(permissionApi.authorize).toHaveBeenCalledTimes(1); +``` + +## Providing mock APIs in tests + +### With `renderInTestApp` + +```tsx +import { screen } from '@testing-library/react'; +import { renderInTestApp, mockApis } from '@backstage/frontend-test-utils'; + +await renderInTestApp(, { + apis: [ + mockApis.identity({ userEntityRef: 'user:default/guest' }), + mockApis.config({ data: { app: { title: 'Test App' } } }), + ], +}); +``` + +You can also use the `[apiRef, implementation]` tuple syntax to provide any API implementation, including ones that aren't from `mockApis`: + +```tsx +import { myCustomApiRef } from '../apis'; + +const myCustomApiInstance = { + // ... +}; + +await renderInTestApp(, { + apis: [ + mockApis.identity({ userEntityRef: 'user:default/guest' }), + [myCustomApiRef, myCustomApiInstance], + ], +}); +``` + +### With `renderTestApp` + +The same `apis` option is available on `renderTestApp`, which is commonly used when testing extensions or entity pages: + +```tsx +import { renderTestApp, mockApis } from '@backstage/frontend-test-utils'; +import { createTestEntityPage } from '@backstage/plugin-catalog-react/testUtils'; + +renderTestApp({ + extensions: [createTestEntityPage({ entity }), myEntityCard], + apis: [mockApis.permission()], +}); +``` + +### With `TestApiProvider` + +For standalone rendering scenarios where you're not using `renderInTestApp`, the `TestApiProvider` component accepts the same `apis` format: + +```tsx +import { render } from '@testing-library/react'; +import { TestApiProvider, mockApis } from '@backstage/frontend-test-utils'; + +render( + + + , +); +``` + +## Plugin-specific test mocks + +Plugins can provide their own mock APIs that follow the same pattern. For example, `@backstage/plugin-catalog-react` provides `catalogApiMock` in its `/testUtils` entry point: + +```tsx +import { renderTestApp } from '@backstage/frontend-test-utils'; +import { catalogApiMock } from '@backstage/plugin-catalog-react/testUtils'; + +renderTestApp({ + extensions: [myExtension], + apis: [catalogApiMock({ entities: [entity] })], +}); +``` + +### Creating your own mock APIs + +If you maintain a plugin that exposes a utility API, you can provide mock utilities that follow the same function + `.mock()` pattern as the built-in `mockApis`. + +Use `attachMockApiFactory` for fake instances with real behavior, and `createApiMock` for the jest-mocked `.mock()` variant where all methods are `jest.fn()`. The full pattern looks like this: + +```ts +import { + attachMockApiFactory, + createApiMock, + type ApiMock, +} from '@backstage/frontend-test-utils'; +import { myApiRef, type MyApi } from '@internal/plugin-example-react'; + +// Fake instance with real behavior +export function myApiMock(options?: { greeting?: string }) { + return attachMockApiFactory(myApiRef, { + greet: async () => options?.greeting ?? 'Hello!', + }); +} + +// Jest mock variant where all methods are jest.fn() +export namespace myApiMock { + export const mock = createApiMock(myApiRef, () => ({ + greet: jest.fn(), + })); +} +``` + +Consumers can then use it just like the core mocks: + +```tsx +// Fake with real behavior +await renderInTestApp(, { + apis: [myApiMock({ greeting: 'Hi there!' })], +}); + +// Jest mock for assertions +const api = myApiMock.mock({ + greet: async () => 'mocked', +}); + +await renderInTestApp(, { + apis: [api], +}); + +expect(api.greet).toHaveBeenCalledTimes(1); +``` + +## Available mock APIs + +The table below lists all core APIs available through the `mockApis` namespace. + +| API | Fake instance | Notes | +| --------------------------------- | --------------------- | ---------------------------------------------------------------------- | +| `mockApis.alert()` | `MockAlertApi` | Collects alerts; has `getAlerts()`, `clearAlerts()`, `waitForAlert()` | +| `mockApis.analytics()` | `MockAnalyticsApi` | Collects events; has `getEvents()` | +| `mockApis.config({ data })` | `MockConfigApi` | Reads from a plain JSON object | +| `mockApis.discovery({ baseUrl })` | Inline | Returns `${baseUrl}/api/${pluginId}`, defaults to `http://example.com` | +| `mockApis.error(options?)` | `MockErrorApi` | Collects errors; has `getErrors()`, `waitForError()` | +| `mockApis.featureFlags(options?)` | `MockFeatureFlagsApi` | In-memory flag state; has `getState()`, `setState()`, `clearState()` | +| `mockApis.fetch(options?)` | `MockFetchApi` | Wraps native `fetch`; supports identity injection and plugin protocol | +| `mockApis.identity(options?)` | Inline | Configurable user ref, ownership, token, profile | +| `mockApis.permission(options?)` | `MockPermissionApi` | Defaults to `ALLOW`; accepts a handler function | +| `mockApis.storage({ data })` | `MockStorageApi` | In-memory storage with bucket support | +| `mockApis.translation()` | `MockTranslationApi` | Passthrough returning default messages from translation refs | + +Each of these also has a `.mock()` variant that returns jest mocks, as described above. diff --git a/docs/getting-started/config/database.md b/docs/getting-started/config/database.md index eed1586dc8..a6ef95ae73 100644 --- a/docs/getting-started/config/database.md +++ b/docs/getting-started/config/database.md @@ -106,6 +106,88 @@ When filling these out, you have 2 choices, If you opt for the second option of replacing the entire string, take care to not commit your `app-config.yaml` to source control. It may contain passwords that you don't want leaked. +## Passwordless PostgreSQL in the Cloud + +If you want to host your PostgreSQL server in the cloud with passwordless authentication, you can use Azure Database for PostgreSQL with Microsoft Entra authentication or Google Cloud SQL for PostgreSQL with Cloud IAM. + +### Azure with Entra authentication + +Remove `password` from the connection configuration and set `type` to `azure`. + +Optionally set `tokenCredential` with the following properties. If no credential information is provided, it will default to using Default Azure Credential and a tokenRenewalOffsetTime of 5 minutes. + +#### Credential Selection + +The credential type is automatically inferred based on the fields you provide: + +- Client Secret Credential is used when all three are provided: + - `tenantId` + - `clientId` + - `clientSecret` +- Managed Identity Credential is used when only `clientId` is provided. This enables user-assigned managed identity. +- Default Azure Credential is used when no credential fields are provided. Default Azure Credential supports [many credential types](https://learn.microsoft.com/azure/developer/javascript/sdk/authentication/credential-chains#use-defaultazurecredential-for-flexibility), choosing one based on the runtime environment. + +#### Token Renewal + +Set `tokenRenewalOffsetTime` to control how early OAuth tokens should be refreshed. + +The value may be: + +- A human-readable string such as '1d', '2 hours', '30 seconds' +- A duration object, e.g. { minutes: 3, seconds: 30 } + +Azure PostgreSQL uses short-lived Entra ID access tokens. +By default, the database connector refreshes tokens 5 minutes before they expire. + +#### User Configuration + +Set `user` to the display name of your Entra ID group, service principal, or managed identity. Set it to the user principal name if you're authenticating with a user's credentials. + +#### Example + +```yaml title="app-config.yaml" +backend: + database: + client: pg + connection: + # highlight-add-start + type: azure + tokenCredential: + tokenRenewalOffsetTime: 5 minutes + # highlight-add-end + host: ${POSTGRES_HOST} + port: ${POSTGRES_PORT} + user: ${POSTGRES_USER} + # highlight-remove-start + password: ${POSTGRES_PASSWORD} + # highlight-remove-end +``` + +### Google with Cloud IAM + +Remove `password` from the connection configuration and set `type` to `cloudsql`. + +Under the hood, this implements [Automatic IAM Database Authentication](https://github.com/GoogleCloudPlatform/cloud-sql-nodejs-connector?tab=readme-ov-file#automatic-iam-database-authentication). + +For an IAM user account, set `user` to the user's email address. For a service account, set `user` to the service account's email without the .gserviceaccount.com domain suffix. + +```yaml title="app-config.yaml" +backend: + database: + client: pg + connection: + # highlight-add-start + type: cloudsql + instance: my-project:region:my-instance + # highlight-add-end + host: ${POSTGRES_HOST} + port: ${POSTGRES_PORT} + user: ${POSTGRES_USER} + # highlight-remove-start + password: ${POSTGRES_PASSWORD} + # highlight-remove-end +``` + ::: [Start the Backstage app](../index.md#2-run-the-backstage-app): @@ -126,16 +208,16 @@ You may not want to install Postgres locally, the following sections outline alt You can run Postgres in a Docker container, this is great for local development or getting a Backstage POC up and running quickly, here's how: -First we need to pull down the container image, we'll use Postgres 17, check out the [Postgres Version Policy](../../overview/versioning-policy.md#postgresql-releases) to learn which versions are supported. +First we need to pull down the container image, we'll use Postgres 18, check out the [Postgres Version Policy](../../overview/versioning-policy.md#postgresql-releases) to learn which versions are supported. ```shell -docker pull postgres:17.0-bookworm +docker pull postgres:18-trixie ``` Then we just need to start up the container. ```shell -docker run -d --name postgres --restart=always -p 5432:5432 -e POSTGRES_PASSWORD= postgres:17.0-bookworm +docker run -d --name postgres --restart=always -p 5432:5432 -e POSTGRES_PASSWORD= postgres:18-trixie ``` This will run Postgres in the background for you, but remember to start it up again when you reboot your system. @@ -145,11 +227,9 @@ This will run Postgres in the background for you, but remember to start it up ag Another way to run Postgres is to use Docker Compose, here's what that would look like: ```yaml title="docker-compose.local.yaml" -version: '4' - services: postgres: - image: postgres:17.0-bookworm + image: postgres:18-trixie environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: diff --git a/docs/getting-started/homepage.md b/docs/getting-started/homepage.md index 7fac59f728..05e422610a 100644 --- a/docs/getting-started/homepage.md +++ b/docs/getting-started/homepage.md @@ -24,7 +24,83 @@ Before we begin, make sure Now, let's get started by installing the home plugin and creating a simple homepage for your Backstage app. -### Setup homepage +## Setup Methods + +There are two ways to set up the home plugin, depending on which frontend system your Backstage app uses: + +1. **New Frontend System (Recommended)** - For apps using the new plugin system with extensions and blueprints +2. **Legacy Frontend System** - For existing apps using the legacy plugin architecture + +### New Frontend System Setup + +If your Backstage app uses the [new frontend system](../frontend-system/index.md), follow these steps: + +#### 1. Install the plugin + +```bash title="From your Backstage root directory" +yarn --cwd packages/app add @backstage/plugin-home +``` + +#### 2. Add the plugin to your app configuration + +Update your `packages/app/src/app.tsx` to include the home plugin: + +```tsx title="packages/app/src/app.tsx" +import homePlugin from '@backstage/plugin-home/alpha'; + +const app = createApp({ + features: [ + // ... other plugins + homePlugin, + ], +}); +``` + +#### 3. Configure the homepage as your root route + +By default, the homepage will be available at `/home`. To make it your app's landing page at `/`, add this configuration to your `app-config.yaml`: + +```yaml title="app-config.yaml" +app: + extensions: + - page:home: + config: + path: / +``` + +The plugin will automatically add a "Home" navigation item to your sidebar and provide a basic homepage layout. + +#### 4. Optional: Enable visit tracking + +Visit tracking is an optional feature that allows users to see their recently visited and most visited pages on the homepage. This feature is **disabled by default** to give you control over what data is collected and stored. + +Visit tracking requires a storage implementation to persist user data: + +- **With UserSettings storage** (recommended): If you have the [UserSettings plugin](https://backstage.io/docs/features/software-catalog/external-integrations/#user-settings) configured with persistent storage, visit data will be stored there and synchronized across devices. +- **Fallback to local storage**: If no persistent storage is available, the plugin will automatically fall back to browser local storage, which stores data locally per device. + +To enable visit tracking, add this configuration to your `app-config.yaml`: + +```yaml title="app-config.yaml" +app: + extensions: + - api:home/visits: true + - app-root-element:home/visit-listener: true +``` + +#### 5. Customizing your homepage + +The New Frontend System provides powerful customization options: + +**Custom Homepage Layouts**: Use the `HomePageLayoutBlueprint` from `@backstage/plugin-home-react/alpha` to create custom homepage layouts with your own design and widget arrangements. A layout receives the installed widgets and is responsible for rendering them. If no custom layout is installed, the plugin provides a built-in default. + +**Adding Homepage Widgets**: Register custom widgets using the `HomePageWidgetBlueprint` from the `@backstage/plugin-home-react/alpha` package. + +For detailed instructions on creating custom layouts, registering widgets, and advanced configuration options, see the [Home plugin documentation](https://github.com/backstage/backstage/tree/master/plugins/home#readme). + +### Legacy Frontend System Setup + +If your Backstage app uses the legacy frontend system, follow these steps: #### 1. Install the plugin @@ -88,7 +164,7 @@ Let's update the route for "Home" in the Backstage sidebar to point to the new h | --------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | | ![Sidebar without Catalog](../assets/getting-started/sidebar-without-catalog.png) | ![Sidebar with Catalog](../assets/getting-started/sidebar-with-catalog.png) | -The code for the Backstage sidebar is most likely inside your [`packages/app/src/components/Root/Root.tsx`](https://github.com/backstage/backstage/blob/master/packages/app/src/components/Root/Root.tsx). +The code for the Backstage sidebar is most likely inside your [`packages/app-legacy/src/components/Root/Root.tsx`](https://github.com/backstage/backstage/blob/master/packages/app-legacy/src/components/Root/Root.tsx). Let's make the following changes diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md index 876af4f0a5..d7c4ee96c8 100644 --- a/docs/getting-started/index.md +++ b/docs/getting-started/index.md @@ -1,8 +1,8 @@ --- id: index -title: Creating your Backstage App -sidebar_label: Introduction -description: How to install Backstage for your own use. +title: Standalone Installation +sidebar_label: Standalone Installation +description: How to create and run a Standalone Backstage. --- Audience: Developers and Admins @@ -11,11 +11,11 @@ Audience: Developers and Admins It is not required, although recommended to have a basic understanding of [Yarn](https://www.pluralsight.com/guides/yarn-a-package-manager-for-node-js) and [npm](https://docs.npmjs.com/about-npm) before starting this guide. ::: -## Summary +## Overview -This guide walks through how to get started creating your very own Backstage customizable app. This is the first step in evaluating, developing on, or demoing Backstage. +This guide walks through how to create your own Backstage customizable app. This is the first step in evaluating, developing on, or demoing Backstage. -By the end of this guide, you will have a standalone Backstage installation running locally with a `SQLite` database and demo content. To be clear, this is not a production-ready installation, and it does not contain information specific to your organization. +By the end of this guide, you will have a standalone Backstage installation running locally with an in-memory `SQLite` database and demo content. To be clear, this is not a production-ready installation, and it does not contain information specific to your organization until you set up integrations with your specific data sources! :::note Contributors @@ -23,46 +23,9 @@ If you are planning to contribute a new feature or bug fix to the Backstage proj ::: -## Prerequisites +The instructions make use of `npx`. `npx` is a tool that comes preinstalled with Node.js and lets you run commands straight from `npm` or other registries. -This guide also assumes a basic understanding of working on a Linux based operating system and have some experience with the terminal, specifically, these commands: `npm`, `yarn`. - -- Access to a Unix-based operating system, such as Linux, macOS or - [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/) -- A GNU-like build environment available at the command line. - For example, on Debian/Ubuntu you will want to have the `make` and `build-essential` packages installed. - On macOS, you will want to run `xcode-select --install` to get the XCode command line build tooling in place. -- An account with elevated rights to install the dependencies -- `curl` or `wget` installed -- Node.js [Active LTS Release](../overview/versioning-policy.md#nodejs-releases) installed using one of these - methods: - - Using `nvm` (recommended) - - [Installing nvm](https://github.com/nvm-sh/nvm#install--update-script) - - [Install and change Node version with nvm](https://nodejs.org/en/download/package-manager/#nvm) - - Node 20 is a good starting point, this can be installed using `nvm install lts/iron` - - [Binary Download](https://nodejs.org/en/download/) - - [Package manager](https://nodejs.org/en/download/package-manager/) - - [Using NodeSource packages](https://github.com/nodesource/distributions/blob/master/README.md) -- `yarn` [Installation](https://yarnpkg.com/getting-started/install) - - Backstage currently uses Yarn 4.4.1, once you've ran `corepack enable` you'll want to then run `yarn set version 4.4.1` -- `docker` [installation](https://docs.docker.com/engine/install/) -- `git` [installation](https://github.com/git-guides/install-git) -- If the system is not directly accessible over your network the following ports - need to be opened: 3000, 7007. This is quite uncommon, unless you're installing in a container, VM or remote system. - -## 1. Create your Backstage App - -:::caution - -The Backstage app we'll be creating will only have demo data until we set up integrations with your specific data sources! - -::: - -To install the Backstage Standalone app, we will make use of `npx`. `npx` is a tool that comes preinstalled with Node.js and lets you run commands straight from `npm` or other registries. Before we run the command, let's discuss what it does. - -This command will create a new directory with a Backstage app inside. The wizard will ask you for the name of the app. This name will be created as subdirectory in your current working directory. - -![create app](../assets/getting-started/create-app-output.png) +This command creates a new directory with a Backstage app inside. The wizard will ask you for the name of the app. This name will be created as a subdirectory in your current working directory. Inside that directory, it will generate all the files and folder structure needed for you to run your app. @@ -100,65 +63,122 @@ app and [TechDocs](https://backstage.io/docs/features/techdocs/) amongst other things. -Now, that we know what it does, let's run it! +## Prerequisites -```bash -npx @backstage/create-app@latest -``` +This guide also assumes a basic understanding of working on a Linux based operating system and have some experience with the terminal, specifically, these commands: `npm`, `yarn`. + +- A minimum of 20 GB disk space to run the standalone Backstage application with demo data. NOTE: As you add more modules and plugins to an installation, the disk space requirements will increase, accordingly. +- A minimum of 6 GB memory. +- Access to a Unix-based operating system, such as Linux, macOS or + [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/). The Linux version must support the required Node.js version. +- A GNU-like build environment available at the command line. + For example, on Debian/Ubuntu you will want to have the `make` and `build-essential` packages installed. + On macOS, you will want to run `xcode-select --install` to get the XCode command line build tooling in place. +- An account with elevated rights to install the dependencies +- `curl` or `wget` installed +- Node.js [Active LTS Release](../overview/versioning-policy.md#nodejs-releases) installed using one of these + methods: + - Using `nvm` (recommended) + - [Installing nvm](https://github.com/nvm-sh/nvm#install--update-script) + - [Install and change Node version with nvm](https://nodejs.org/en/download/package-manager/#nvm) + - Node 22 or 24 are recommended, these can be installed using `nvm install 22` or `nvm install 24` + - [Binary Download](https://nodejs.org/en/download/) + - [Package manager](https://nodejs.org/en/download/package-manager/) + - [Using NodeSource packages](https://github.com/nodesource/distributions/blob/master/README.md) +- Install the `isolated-vm` module, following their [requirements section](https://github.com/laverdet/isolated-vm#requirements). +- `yarn` [Installation](https://yarnpkg.com/getting-started/install) + - Backstage currently uses Yarn 4.4.1, once you've ran `corepack enable` you'll want to then run `yarn set version 4.4.1` +- `docker` [installation](https://docs.docker.com/engine/install/) +- `git` [installation](https://github.com/git-guides/install-git) +- If the system is not directly accessible over your network the following ports + need to be opened: 3000, 7007. This is quite uncommon, unless you're installing in a container, VM or remote system. + +## Creating and running a Backstage application This may take a few minutes to fully install everything. Don't stress if the loading seems to be spinning nonstop, there's a lot going on in the background. -:::note +To create the application: -If this fails on the `yarn install` step, it's likely that you will need to install some additional dependencies which are used to configure `isolated-vm`. You can find out more in their [requirements section](https://github.com/laverdet/isolated-vm#requirements), and then run `yarn install` manually again after you've completed those steps. +1. Type the following command to install the Backstage application. -::: +```bash + npx @backstage/create-app@latest +``` -## 2. Run the Backstage app +2. If this is the first time that you are installing a Backstage application on this device, the following question is displayed. Enter `y` and select `Enter` to proceed with the installation. + +``` + Need to install the following packages: + @backstage/create-app@0.7.4 + ok to proceed? (y) +``` + +3. Enter the name for your application and select `Enter`. This is the root directory of your application. In this example, the name is set to `my-backstage-app`. + + ![create app](../assets/getting-started/create-app-output.png) Your Backstage app is fully installed and ready to be run! Now that the installation is complete, you can go to the application directory and start the app using the `yarn start` command. The `yarn start` command will run both the frontend and backend as separate processes (named `[0]` and `[1]`) in the same window. -```bash -cd my-backstage-app # your app name -yarn start +To run the application: + +1. Change to the root directory of your Backstage app. This is the same as the name of your application that you provided during the installation. In this example, it is `my-backstage-app`. + + ```bash + cd my-backstage-app + ``` + +2. Start the Backstage application. + + ```bash + yarn start + ``` + +As the frontend and backend are starting, you will see output similar to the following. The output shows that the app and backend are starting up with the configuration coming from `app-config.yaml`. You will see the plugins being initialized, and authorization and permissions being setup. In addition you will see a series of REST API calls for those plugins that use a service backend, such as the service catalog. + +``` +Starting app, backend +Loaded config from app-config.yaml +. +. +2025-10-15T12:26:41.564Z backstage info Plugin initialization started: 'app', 'proxy', 'scaffolder', 'techdocs', 'auth', 'catalog', 'permission', 'search', 'kubernetes', 'notifications', 'signals' type="initialization" +Rspack compiled successfully +. +. +2025-10-15T15:17:21.130Z auth info Created new signing key eec1a9e4-4395-4698-9a9f-f1b5cbcf152b component="token-factory" +2025-10-15T15:17:21.139Z auth info Issuing token for user:development/guest, with entities user:development/guest component="token-factory" +2025-10-15T15:17:21.223Z rootHttpRouter info [2025-10-15T15:17:21.223Z] "GET /api/auth/guest/refresh HTTP/1.1" 200 802 "http://localhost:3000/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:143.0) Gecko/20100101 Firefox/143.0" type="incomingRequest" date="2025-10-15T15:17:21.223Z" method="GET" url="/api/auth/guest/refresh" status=200 httpVersion="1.1" userAgent="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:143.0) Gecko/20100101 Firefox/143.0" contentLength=802 referrer="http://localhost:3000/" +. +. +2025-10-15T15:17:24.051Z rootHttpRouter info [2025-10-15T15:17:24.051Z] "GET /api/catalog/entities?fields=metadata,kind,spec.profile&filter=kind%3Dgroup%2Crelations.hasMember%3Duser%3Adevelopment%2Fguest HTTP/1.1" 304 0 "http://localhost:3000/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:143.0) Gecko/20100101 Firefox/143.0" type="incomingRequest" date="2025-10-15T15:17:24.051Z" method="GET" url="/api/catalog/entities?fields=metadata,kind,spec.profile&filter=kind%3Dgroup%2Crelations.hasMember%3Duser%3Adevelopment%2Fguest" status=304 httpVersion="1.1" userAgent="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:143.0) Gecko/20100101 Firefox/143.0" referrer="http://localhost:3000/" +. +. ``` -![Screenshot of the command output, with the message web pack compiled successfully](../assets/getting-started/startup.png) +Once the Backstage UI is displayed, you can start exploring the demo immediately. -Here again, there's a small wait for the frontend to start up. Once the frontend is built, your browser window should automatically open. +:::tip Browser window didn't open with yarn start -:::tip Browser window didn't open - -When you see the message `[0] webpack compiled successfully`, you can navigate directly to `http://localhost:3000` to see your Backstage app. +When you see the message `Rspack compiled successfully`, you can navigate directly to `http://localhost:3000` to see your Backstage app. ::: -You can start exploring the demo immediately. - ![Screenshot of the Backstage portal.](../assets/getting-started/portal.png) -## Recap - -This tutorial walked through how to deploy Backstage using the `npx @backstage/create-app@latest` command. That command created a new directory that holds your new Backstage app. That app is currently only configured for development purposes, as it is using an in-memory database and contains demo data. - ## Next steps Choose the correct next steps for your user role, if you're likely to be deploying and managing a Backstage instance for your organization, look through the [Admin](#admin) section. If you're likely to be developing on/for Backstage, take a look through the [Developer](#developer) section. ### Admin -- Deploying to production - +- Configuring Backstage - [Setting up authentication](./config/authentication.md) - [Configuring a database](./config/database.md) - - [Deploying with Docker](../deployment/docker.md) - - [Deploying with Kubernetes](../deployment/k8s.md) - -- Configuring Backstage - - [Adding plugins](./configure-app-with-plugins.md) - [Customizing Your App's UI](../conf/user-interface/index.md) - [Populating the homepage](./homepage.md) +- Deploying to production + - [Deploying with Docker](../deployment/docker.md) + - [Deploying with Kubernetes](../deployment/k8s.md) ### Developer @@ -171,8 +191,4 @@ Share your experiences, comments, or suggestions with us: [on discord](https://discord.gg/backstage-687207715902193673), file issues for any [feature](https://github.com/backstage/backstage/issues/new?labels=help+wanted&template=feature_template.md) or -[plugin suggestions](https://github.com/backstage/community-plugins/issues/new/choose), -or -[bugs](https://github.com/backstage/backstage/issues/new?labels=bug&template=bug_template.md) -you have, and feel free to -[contribute](https://github.com/backstage/backstage/blob/master/CONTRIBUTING.md)! +[plugin suggestions](https://github.com/backstage/community-plugins/issues/new/choose) diff --git a/docs/getting-started/keeping-backstage-updated.md b/docs/getting-started/keeping-backstage-updated.md index dea0cc2939..c93c5200f6 100644 --- a/docs/getting-started/keeping-backstage-updated.md +++ b/docs/getting-started/keeping-backstage-updated.md @@ -43,6 +43,16 @@ By default the bump command will upgrade `@backstage` packages to the latest `ma yarn backstage-cli versions:bump --release next ``` +You can also use the `--release` option to target a specific version. This is useful if you need to pin your app to a specific release or if you need to downgrade to a previous version (e.g. moving from `1.45.0` back to `1.43.0`). + +:::warning +Note that downgrading across significant version gaps (e.g. 2-3 releases) may result in package mismatches or errors due to the way Backstage manages dependencies. This method is best suited for small adjustments. +::: + +```bash +yarn backstage-cli versions:bump --release 1.43.0 +``` + If you are using other plugins you can pass in the `--pattern` option to update more than just the `@backstage/*` dependencies. diff --git a/docs/golden-path/adoption/001-getting-started.md b/docs/golden-path/adoption/001-getting-started.md new file mode 100644 index 0000000000..574380f263 --- /dev/null +++ b/docs/golden-path/adoption/001-getting-started.md @@ -0,0 +1,72 @@ +--- +id: getting-started +sidebar_label: 001 - Getting started +title: Getting started with Backstage +--- + +The adoption journey is a bit different than the other Golden Paths. The goal of this guide is to prepare you for a successful implementation of Backstage in your organization. A technical understanding of Backstage is not needed for this Golden Path, just a desire to help the technical team that will be owning your Backstage instance. + +:::info + +I'd highly recommend poking around https://demo.backstage.io/ before continuing with this guide. It's a test instance of Backstage that provides a good foundation for what to expect from the tool as a user. + +::: + +## What is Backstage? + +At a high level, Backstage is a framework for building developer portals. When implemented successfully, it can reduce toil for your developers by centralizing information like docs and ownership, reducing cognitive overhead due to tool fragmentation and simplify setting up new codebases or integrating with existing ones. + +A few examples, + +> My company tracks everything with spreadsheets. We have a list of all Github repos and who owns them, but it's becoming more and more of an issue to keep up to date. Teams aren't proactively updating it when new projects are created and it quickly falls out of date with reorgs and team charter changes. + +Backstage can help! We provide a core plugin called Software Catalog that automates this process. Teams are asked to maintain a file in their repo with this ownership information and it gets automatically ingested into Backstage where you can view all projects in a single location. + +> My developers have been complaining recently about having to use a growing number of different websites and tools in their day to day. It's getting hard to keep track of all of the tools and for those that we don't use frequently, we lose X minutes trying to remember how to access them. + +Tool fragmentation is a real issue and Backstage can also help here! You can create plugins tailored for your company that talk to these external services. These plugins can be standalone or integrated with the Software Catalog for better context. Imagine all of your [CI/CD workflows visible directly](https://backstage.io/plugins/) on the page for your team's projects. + +It's important to note that Backstage shouldn't be fully replacing these tools, we don't want to reinvent the wheel. The goal is to have all of the really important information in one place. The tool should still be where teams go to do more advanced or in depth work. + +> We have been struggling recently with getting teams to use a standard template for new services. There's no standard set of libraries these services are using or standard infra management. It's increasingly difficult as a platform team to manage everything. + +Backstage can help here too! The Scaffolder provides a templating framework that you can plug a Golden Path implementation to. Similar to Github template repos, this can provide a standard base for teams to create based off of. + +> Our platform teams have been getting more and more support requests to help debug onboarding steps. We've documented these areas really well and there are plenty of examples in Git, but teams keep running into the same issues. It's always either a bad copy paste or they forget to update a template variable. We've started looking into a custom templating solution for this. + +Backstage can help! With the Scaffolder, you can create a template that lets users fill in data through a form and uses that data to create a customized template output. This output is usually in the form of PRs to your various source control systems. Imagine you have a repo for traffic configuration, another for infrastructure management and a third for k8s manifests - with the Scaffolder, you can hide all of this complexity. You may still need to get reviews on the output PRs, but no more copy paste issues! + +## What does adopting Backstage look like? + +a.k.a "what am I signing myself up for?" + +Successfully adopting Backstage usually looks something like this, + +1. Setting up a PoC. +2. Getting leadership buy-in. +3. Identify a group of key stakeholders for the project and iterate with them aggressively. +4. Launch to the larger organization. +5. Drive Catalog adoption to 100%. +6. Your Backstage implementation starts to receive plugins from developers outside of your team. + +A truly successful Backstage implementation bridges delivering value to customers (developers), demonstrating returns to leadership, and fostering an inner source model. It's a long process but has huge dividends for those that achieve it! + +## Getting started + +Now that you know what to expect, let's walk through how to get started. + +:::note + +If you're non-technical, it is highly recommended to find a technical partner for help setting up a proof-of-concept for feedback. + +::: + +### Software Catalog + +Let's go to https://demo.backstage.io/ together. When you first navigate to the page, you will be brought to the Software Catalog page. This is a view of all projects currently registered with the (Demo) Backstage instance. There are a series of filters that you can play around with. If you're _really_ interested, we recommend reading through [the software catalog system model](../../features/software-catalog/system-model.md). + +Let's click into a Component, say "artist-lookup". This will bring you to a specialized view for that Component. Across the top, you can see tabs for "CI/CD", "API", "Dependencies", "Docs" and "TODOs". For your company, you can change this as you see fit. The important takeaway is that all of these tabs are automatically filtered for this Component which makes it easy to see how this could start to replace many navigation to other tools. + +### Scaffolder + +Let's go to https://demo.backstage.io/create now. This is the Scaffolder, a place to store reusable templates. Click the "Choose" button in the "Demo template". This will bring you to a form with some information to input. You don't need to fill this out. The main takeaway here is that this form is generated from YAML and doesn't require a frontend team to implement a custom form for each template you want to create. diff --git a/docs/golden-path/adoption/002-leadership-buy-in.md b/docs/golden-path/adoption/002-leadership-buy-in.md new file mode 100644 index 0000000000..502970d3dc --- /dev/null +++ b/docs/golden-path/adoption/002-leadership-buy-in.md @@ -0,0 +1,30 @@ +--- +id: leadership-buy-in +sidebar_label: 002 - Leadership buy-in +title: Getting leadership buy-in +--- + +## Summary + +In this section, we'll be going over what leadership needs to hear to buy in to your pitch for a developer portal. We expect that you have a good idea of the problem that you want Backstage to solve at your company. If not, we recommend you start small. Look for something that is consistently frustrating developers you work with (this can include you). User interviews are a great way to better understand what needs to improve. It may be IT blocking the creation of new Github repos or databases. It might be 5 hours per week of manual toil that your whole organization has to do. It might be a slow time to production for new services or slow provisioning of test environments. Every company will be different. There is no one size fits all answer we can give you - and if we could, it wouldn't be well-tailored for _your_ leadership team. + +## Milestones + +Every Backstage adoption journey has well-known milestones. + +1. You set up a PoC. +2. You get some users. +3. A group of users _really_ gets the value in the portal and jumps on it. They may even create their own plugins - great! +4. You start to plateau with catalog adoption or daily active users. +5. Leadership starts to get nosy about continued value. +6. You hit a crossroads. Your team either starts to think about building something themselves or going for another off the shelf option or they sit down and do the work to get out of the plateau. +7. If your organization made it this far, you likely now have blocking checks for catalog entries and Backstage is a weekly if not daily portal for your developers - congrats! + +Step 4 and 5 are painful moments. Successful Backstage adoptions can lose steam quickly. That's the nature of these things, the excitement will eventually run out and people will go back to their day jobs. Another YAML file or cataloging tool is just overhead and extra toil, regardless of the problem you're solving. Getting leadership on the same page about the value of Backstage is the first step to a very successful adoption story. + +### Recommendations + +1. Bring something real to your leadership team. This can either be a true proof of concept or [the demo site](https://demo.backstage.io). +2. Define metrics around what you're looking to drive up/down. That may be time to onboarding a new engineer, time to production for a new service, time to mitigate incidents, etc. As we say above, this is the meaty problem that is unique to your company that solving will really move the needle. +3. Lower the barrier to adoption. Many people see yet another YAML file as overhead. If you have an existing cataloging solution, use that to simplify the onboarding process. If you don't, this might be a good opportunity to do that work. +4. Knowledge silos. Every team has preferences on how to do things. Centralizing that data into a single interface while letting teams continue to do things how they want to is a powerful goal and something that Backstage can make happen. diff --git a/docs/golden-path/adoption/003-setting-up-a-poc.md b/docs/golden-path/adoption/003-setting-up-a-poc.md new file mode 100644 index 0000000000..155098c357 --- /dev/null +++ b/docs/golden-path/adoption/003-setting-up-a-poc.md @@ -0,0 +1,13 @@ +--- +id: setting-up-a-poc +sidebar_label: 003 - Setting up a PoC +title: Setting up a PoC +--- + +If you're non-technical, this section should be completed by your technical partner. + +Follow [our golden path for creating an app](../create-app/index.md). Once you have that set up, we recommend adding a few `catalog-info.yaml` files to a few repos/projects you own and setting up [the GitHub catalog provider](../../integrations/github/discovery.md). + +At this stage, you likely want to just get the instance running on your local machine. We'll go over preparing your instance for production at the end of chapter 2. + +You may be tempted to update the theme or add that one plugin your organization _needs_, but hold strong. We'll get there in chapter 3. diff --git a/docs/golden-path/adoption/004-first-stakeholder-feedback.md b/docs/golden-path/adoption/004-first-stakeholder-feedback.md new file mode 100644 index 0000000000..6207a49d10 --- /dev/null +++ b/docs/golden-path/adoption/004-first-stakeholder-feedback.md @@ -0,0 +1,17 @@ +--- +id: first-stakeholder-feedback +sidebar_label: 004 - Stakeholder Feedback +title: First round of stakeholder feedback +--- + +Now that you have a PoC running, let's walk through how to get good feedback. You likely aren't the first person to hear about Backstage or maybe not even the first person to set up a PoC. There may be common pitfalls unique to your company that are worth knowing about - political, organizational or otherwise. + +## Who to look for? + +This depends pretty significantly on your organizational structure. If you have a dedicated platform organization or platform team, start with them. They will either be the technical owners of this application from the go, or will eventually take over ownership. Be kind to them. If you aren't from that organization, we recommend finding your technical partner from somewhere in that organization. + +## What to listen for + +1. IT slowness. Does your organization run on tickets? Are there specific tasks that feel like they should be automated but aren't? +2. User toil. Your developers are super aware of what's slowing them down, they'll tell you the annoying manual parts of their job that they're hoping you can fix. +3. Data sprawl. What services are your users struggling to remember? What vendors are critical but most users only touch once a month? diff --git a/docs/golden-path/adoption/005-customizing-your-instance.md b/docs/golden-path/adoption/005-customizing-your-instance.md new file mode 100644 index 0000000000..9cc9a98d7a --- /dev/null +++ b/docs/golden-path/adoption/005-customizing-your-instance.md @@ -0,0 +1,15 @@ +--- +id: customize-your-instance +sidebar_label: 005 - Customizing your instance +title: Customizing your instance +--- + +You now have the knowledge of what your users want and the go from leadership to continue investing in Backstage. Your job now is to customize your instance for your users to really get the value from. Let's dive in! + +## Open Source or Build it yourself? + +There's a huge community of plugins available for easy installation at https://backstage.io/plugins. We would recommend that you start here for any needs you may be trying to solve. Building a plugin yourself requires significant effort and can be hard to justify early on in your adoption story. If there is a clear gap in the existing offerings for your company, you should build something yourself - otherwise, save yourself the maintenance overhead. + +## Customizing the theme + +Many organizations are tempted to spend a long time making sure the portal resembles their other offerings. This is important but shouldn't be a months long ordeal. Get it looking close enough and iterate. diff --git a/docs/golden-path/adoption/006-preparing-for-ga.md b/docs/golden-path/adoption/006-preparing-for-ga.md new file mode 100644 index 0000000000..0b62f0fa25 --- /dev/null +++ b/docs/golden-path/adoption/006-preparing-for-ga.md @@ -0,0 +1,19 @@ +--- +id: preparing-for-ga +sidebar_label: 006 - Preparing for GA +title: Preparing for GA +--- + +We hope at this point that the developers you're working with have read the [golden path on deploying Backstage](../deployment/index.md). Your Backstage instance should be ready for the scale that comes with a full company launch. + +## Launch Announcements + + + +## What to expect in the coming months + + + +## How to keep iterating + + diff --git a/docs/golden-path/adoption/007-plugin-ownership.md b/docs/golden-path/adoption/007-plugin-ownership.md new file mode 100644 index 0000000000..17455f19e7 --- /dev/null +++ b/docs/golden-path/adoption/007-plugin-ownership.md @@ -0,0 +1,17 @@ +--- +id: plugin-ownership +sidebar_label: 007 - Plugin Ownership +title: Plugin Ownership +--- + +You're now well on your way to a healthy Backstage instance! It's been launched to the whole company and you're loving the feedback developers are giving you. Some developers have even started broaching writing their own plugins. + +## Inner source + +Accepting internal contributions from other teams is a good sign that you are on the road to a developer portal tailored for your developers. This is a well paved path with many upsides, but a few downsides as well. As your Backstage instance grows in size and age, those same developers may be difficult to find. Your team may start to experience more and more struggle updating Backstage. + + + +## Registering Plugins in Your Catalog + + diff --git a/docs/golden-path/adoption/008-full-catalog.md b/docs/golden-path/adoption/008-full-catalog.md new file mode 100644 index 0000000000..1725bf6dd2 --- /dev/null +++ b/docs/golden-path/adoption/008-full-catalog.md @@ -0,0 +1,15 @@ +--- +id: full-catalog +sidebar_label: 008 - A Full Catalog +title: Ensuring your catalog stays complete +--- + +Along your Backstage journey (and any workflow migration journey), you will hit a point where incremental adoption is no longer easy. The new developers are no longer flowing into your tool like they once did. More and more projects are not being listed in your catalog. Something has to change. + +## Enforcing Catalog Files in CI + + + +## Leadership Initiatives + + diff --git a/docs/golden-path/adoption/meta.md b/docs/golden-path/adoption/__meta__.md similarity index 98% rename from docs/golden-path/adoption/meta.md rename to docs/golden-path/adoption/__meta__.md index 1c4756d8ee..05fd50a2f6 100644 --- a/docs/golden-path/adoption/meta.md +++ b/docs/golden-path/adoption/__meta__.md @@ -19,6 +19,8 @@ Users should already have read through the summary section of the docs, "What is We recommend you poke around the demo site to get a feel for what Backstage can provide. If you're technical, or working with someone technical, you can run through the steps in `golden-path/create-app` and `golden-path/deploying-backstage` to get something running for just your company. +## Getting leadership buy-in + ## First round of stakeholder feedback If you think Backstage is a good fit for your company, it's likely there are others that do or will think the same. You may have already identified them. For this initial round of feedback, share recommendations for what that group should look like, is there any required number of technical or non-technical members, do you need leadership involved at this point, etc. @@ -29,9 +31,7 @@ For non-technical users, it's recommended to find a technical partner to help st At this point, we're assuming you already have an instance created through `golden-path/create-app` and `golden-path/deploying-backstage`. You should now start customizing it to your company's needs. We recommend you start small, write some catalog-info YAML files and start to build a personalized catalog. -## Second round of stakeholder feedback - -## Getting leadership buy-in +## Preparing for GA ## Plugin ownership and inner source mentality diff --git a/docs/golden-path/deployment/meta.md b/docs/golden-path/deployment/__meta__.md similarity index 100% rename from docs/golden-path/deployment/meta.md rename to docs/golden-path/deployment/__meta__.md diff --git a/docs/golden-path/deployment/index.md b/docs/golden-path/deployment/index.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/golden-path/plugins/__meta__.md b/docs/golden-path/plugins/__meta__.md new file mode 100644 index 0000000000..ab19c569d9 --- /dev/null +++ b/docs/golden-path/plugins/__meta__.md @@ -0,0 +1,15 @@ + + +## Why build plugins? + +This section should clearly explain why you should build a new plugin. The Backstage framework is deeply empowered by plugins and plugins are core to the project's success. Users should walk away from reading this section with a conviction that plugins are the right path for new functionality. + +## Sustainable plugin development + +Plugins are not developed in a vacuum. Users should reach for them to solve specific business problems facing their developers, for example, you may be tasked to create + +- a new vendor integration like PagerDuty, +- a new plugin backend that talks to an internal service, +- etc. + +This section should contain learnings from successful Backstage deployments about how to engage with stakeholders, how/when to iterate on your plugin, and setting yourself up for future success. diff --git a/docs/golden-path/plugins/backend/001-first-steps.md b/docs/golden-path/plugins/backend/001-first-steps.md index 1850ba52c1..8a0defe183 100644 --- a/docs/golden-path/plugins/backend/001-first-steps.md +++ b/docs/golden-path/plugins/backend/001-first-steps.md @@ -1,5 +1,5 @@ --- -id: 001-first-steps +id: first-steps sidebar_label: 001 - Scaffolding the plugin title: How to scaffold a new plugin? --- diff --git a/docs/golden-path/plugins/backend/002-poking-around.md b/docs/golden-path/plugins/backend/002-poking-around.md index 35de3c4d47..596de01b4b 100644 --- a/docs/golden-path/plugins/backend/002-poking-around.md +++ b/docs/golden-path/plugins/backend/002-poking-around.md @@ -1,5 +1,5 @@ --- -id: 002-poking-around +id: poking-around sidebar_label: 002 - Poking around title: 002 - Poking around --- @@ -16,7 +16,7 @@ To make this plugin production ready, we'll need to adjust a few things, ## Testing locally -Before we jump in to making this plugin ready to ship, let's walk through how to run it locally. If you open your backend plugin's manifest (`plugins/todo-backend/package.json`), and look at the `scripts` section, you'll notice a few important commands. The ones relevant to use right now are +Before we jump in to making this plugin ready to ship, let's walk through how to run it locally. If you open your backend plugin's manifest (`plugins/todo-backend/package.json`), and look at the `scripts` section, you'll notice a few important commands. The ones relevant to us right now are 1. `yarn start` - Starts a local development server using the content in `dev/index.ts` as the backend. 2. `yarn test` - Runs all of the tests for your backend plugin. @@ -27,8 +27,43 @@ If you run `yarn start`, you should see a custom backend for just your plugin st 2025-06-08T16:14:53.229Z rootHttpRouter info Listening on :7007 ``` -This indicates that your HTTP server is up and running and we can start sending test HTTP requests. Grab your favorite HTTP client and let's get testing! If you aren't sure what to use, I'd recommend the `humao.rest-client` VSCode extension which can easily be run in VSCode itself with very little extra set up. +This indicates that your HTTP server is up and running and we can start sending test HTTP requests. Grab your favorite HTTP client and let's get testing! +To start, let's make sure we're starting from a clean slate. You can list all existing TODOs by running the command below. You should get back an empty list: + +```sh +curl http://localhost:7007/api/todo/todos ``` +To create a new TODO, you can send a POST request to the same endpoint. However, you will get a 401 error right now. + +```sh +curl -X POST http://localhost:7007/api/todo/todos \ +-H 'Content-Type: application/json; charset=utf-8' \ +--data-binary @- << EOF +{ + "title": "My Todo" +} +EOF ``` + +The 401 error is because we track the ID of the user that created each TODO. If you send a request to create a TODO but don't provide an `Authorization` header, you will see this failure. For plugins that have a frontend as well, this credential management should happen automatically. Let's try this: + +```sh +curl -v -X POST http://localhost:7007/api/todo/todos \ +-H 'Content-Type: application/json; charset=utf-8' \ +-H "Authorization: Bearer $(curl -s http://localhost:7007/api/auth/guest/refresh | jq -r '.backstageIdentity.token')" \ +--data-binary @- << EOF +{ + "title": "My Todo" +} +EOF +``` + +We can then list all TODOs to see our new TODO! + +```sh +curl http://localhost:7007/api/todo/todos +``` + +You'll notice that `createdBy` is `user:development/guest` which is the token we used to create the TODO. That's the `-H "Authorization: Bearer $(curl -s http://localhost:7007/api/auth/guest/refresh | jq -r '.backstageIdentity.token')"` part of the request. diff --git a/docs/golden-path/plugins/backend/003-persistence.md b/docs/golden-path/plugins/backend/003-persistence.md new file mode 100644 index 0000000000..ba00b2f417 --- /dev/null +++ b/docs/golden-path/plugins/backend/003-persistence.md @@ -0,0 +1,19 @@ +--- +id: persistence +sidebar_label: 003 - Persisting your TODOs +title: 003 - Persisting your TODOs +--- + +## Saving Plugin State Indefinitely + +You may have noticed that your list of TODOs disappears after you restart your Backstage backend. The general flow to restart your backend without having to rerun `yarn start` is to press ENTER on the terminal running `yarn start`. This will force the Backstage backend to restart completely, wiping out any in memory data and starting everything from scratch -- everything except your database. + +### Quick intro to SQLite + +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. + +## Adding the `databaseService` to your plugin + + + +## Testing your changes diff --git a/docs/golden-path/plugins/backend/004-source-tracked.md b/docs/golden-path/plugins/backend/004-source-tracked.md new file mode 100644 index 0000000000..074cc85cf1 --- /dev/null +++ b/docs/golden-path/plugins/backend/004-source-tracked.md @@ -0,0 +1,19 @@ +--- +id: source-tracked +sidebar_label: 004 - Integrating with SCMs +title: 004 - Git-tracked TODOs +--- + +Problem: You have TODOs in your source code that you want to ingest with your plugin. + +## Authenticating + + + +## Querying + + + +## Fetching + + diff --git a/docs/golden-path/plugins/backend/005-testing.md b/docs/golden-path/plugins/backend/005-testing.md new file mode 100644 index 0000000000..9643e8a487 --- /dev/null +++ b/docs/golden-path/plugins/backend/005-testing.md @@ -0,0 +1,29 @@ +--- +id: testing +sidebar_label: 005 - Unit testing your plugin +title: 005 - Testing +--- + +## Testing is important + +We've done a lot of manual testing up to this point of functionality. Let's start putting those assumptions into code that we can run on every change to ensure things are working correctly. + +## Router-level testing + + + +## Plugin-level testing + + + +## OpenAPI testing + + + +### Integration with Jest tests + + + +### Fuzzing + + diff --git a/docs/golden-path/plugins/backend/__meta__.md b/docs/golden-path/plugins/backend/__meta__.md index e261a8f970..d78e6a7573 100644 --- a/docs/golden-path/plugins/backend/__meta__.md +++ b/docs/golden-path/plugins/backend/__meta__.md @@ -1,36 +1,7 @@ -# Glossary - -- Page: A single `md` file. -- Guide: A number of pages grouped under the same folder. - -# Overall Writing Guidelines - -The goal of these docs is to provide a comprehensive set of guides that developers + admins can use to quickly get up to speed with plugin development, and then refer to as they're developing their own plugins. - -A user that finishes all of these guides will feel comfortable implementing plugins on their own. If additional assistance is required, they should be referred to other sources of information such as Discord, GitHub, source code, or documentation for further support. The user will also understand why/when to build their own plugins, inner-sourcing their developer portal and contributing internal plugins back to the open-source project. - -At the same time, not all users will finish the docs or they may come back to them as required. Individual guides should have strong "abstracts" (what will I learn by reading this guide), table of contents, and "next steps" (what do I need to do next) to guide users to read the most important pieces for their work. - -When writing guide pages, keep it light! These should be instructional docs, and at the same time conversational and a joy to read. Guides should build on each other, when reading through a progression, the reader should feel more comfortable and confident with concepts as they pop up across progression levels. Guides should be standalone, when finishing one level (for example 101), you should be able to immediately jump into the next (201) without additional research or background. Referencing previous progression levels is ok. - # Sections -## Why build plugins? - -This section should answer definitely why you should build a new plugin. The Backstage framework is deeply empowered by plugins and plugins are core to the project's success. Users should walk away from reading this section with a conviction that plugins are the right path for new functionality. - -## Sustainable plugin development - -Plugins are not developed in a vacuum. Users should reach for them to solve specific business problems facing their developers, for example, you may be tasked to create - -- a new vendor integration like PagerDuty, -- a new plugin backend that talks to an internal service, -- etc. - -This section should contain learnings from successful Backstage deployments about how to engage with stakeholders, how/when to iterate on your plugin, and setting yourself up for future success. - ## Creating your first plugin This section should be extremely deliberate in showing readers every step of the way to create a plugin using Backstage's best practices. A reader that finishes this section should feel extremely comfortable creating new plugins and how to install and use plugins regardless of their experience with JS/TS and Backstage. @@ -78,12 +49,6 @@ app.get('/list', async (req, res) => { }); ``` -### Testing - -Let's write a unit test using `supertest` to make sure that everything is working as expected. - -After verifying everything, introduce the problem of persistence - the todos aren't saved across reloads. - ### Persistence Saving values to the database. Writing a migrations file. Plumbing through the database service. @@ -91,3 +56,7 @@ Saving values to the database. Writing a migrations file. Plumbing through the d ## SCM Integrations Our users love the new plugin, and now they want it to automatically fetch todos from their source code. + +### Testing + +Let's write a unit test using `supertest` to make sure that everything is working as expected. diff --git a/docs/golden-path/plugins/backend/todo.http b/docs/golden-path/plugins/backend/todo.http deleted file mode 100644 index 932dcb76e4..0000000000 --- a/docs/golden-path/plugins/backend/todo.http +++ /dev/null @@ -1,12 +0,0 @@ -POST http://localhost:7007/api/todo/todos -Content-Type: application/json - -{ - "title": "My First TODO" -} - -### - -GET http://localhost:7007/api/todo/todos - -### \ No newline at end of file diff --git a/docs/golden-path/plugins/frontend/001-first-steps.md b/docs/golden-path/plugins/frontend/001-first-steps.md new file mode 100644 index 0000000000..d6c21ed053 --- /dev/null +++ b/docs/golden-path/plugins/frontend/001-first-steps.md @@ -0,0 +1,15 @@ +--- +id: first-steps +sidebar_label: 001 - Scaffolding the plugin +title: How to scaffold a new plugin? +--- + +Running `yarn new` -> `frontend-plugin`. + +## What did we create? + + + +## Common issues + + diff --git a/docs/golden-path/plugins/frontend/002-poking-around.md b/docs/golden-path/plugins/frontend/002-poking-around.md new file mode 100644 index 0000000000..e85ea235f3 --- /dev/null +++ b/docs/golden-path/plugins/frontend/002-poking-around.md @@ -0,0 +1,17 @@ +--- +id: poking-around +sidebar_label: 002 - Poking around +title: 002 - Poking around +--- + +Our frontend TODO plugin is a bit more simplistic than the backend one. We need to implement a new UI to replace the example components we have. + +Let's use this React component to start. Copy this to `plugins/todo/src/components/TodoList.tsx`. + +```tsx +// todo +``` + +### Data Mocking + +You already have a backend with dynamic data. Let's start a little smaller. Using hard coded data can be a great way to iterate quickly. diff --git a/docs/golden-path/plugins/frontend/003-dynamic-config.md b/docs/golden-path/plugins/frontend/003-dynamic-config.md new file mode 100644 index 0000000000..8eecd72c2f --- /dev/null +++ b/docs/golden-path/plugins/frontend/003-dynamic-config.md @@ -0,0 +1,29 @@ +--- +id: dynamic-config +sidebar_label: 003 - Dynamic Config +title: 003 - Dynamic Config +--- + +Your plugin should have been generated by default for the New Frontend System which is config-first. That means you can easily control your frontend components through your `app-config.yaml`. + +Let's try this quickly by disabling our entire TODO page, + +```yaml +# TODO +``` + +We can also do really cool things like provide React props directly through config. Let's try moving our hard coded list of TODOs to config instead, + +```tsx +// todo +``` + +and the config, + +```yaml +# TODO +``` + +### Why does this work? + + diff --git a/docs/golden-path/plugins/frontend/004-http-client.md b/docs/golden-path/plugins/frontend/004-http-client.md new file mode 100644 index 0000000000..b6190f0f5f --- /dev/null +++ b/docs/golden-path/plugins/frontend/004-http-client.md @@ -0,0 +1,17 @@ +--- +id: http-client +sidebar_label: 004 - HTTP Client +title: 004 - HTTP Client +--- + +Now, let's really make our page dynamic. We'll start by writing an HTTP client by hand. + +```tsx +class TodoClient { + // TODO +} +``` + +## OpenAPI Generated Clients + +You can also skip a step and ensure your frontend and backend stay in sync by generating the client from an OpenAPI schema. diff --git a/docs/golden-path/plugins/frontend/005-testing.md b/docs/golden-path/plugins/frontend/005-testing.md new file mode 100644 index 0000000000..fe385d7169 --- /dev/null +++ b/docs/golden-path/plugins/frontend/005-testing.md @@ -0,0 +1,15 @@ +--- +id: testing +sidebar_label: 005 - Testing +title: 005 - Testing +--- + +Everyone's favorite part! Let's make sure our components continue to work even when we're not able to validate the changes. + +## Unit Tests + +Use Jest + RTL + MSW v2. + +## Integration Tests + +Use Playwright. diff --git a/docs/golden-path/plugins/frontend/__meta__.md b/docs/golden-path/plugins/frontend/__meta__.md new file mode 100644 index 0000000000..088d72ce90 --- /dev/null +++ b/docs/golden-path/plugins/frontend/__meta__.md @@ -0,0 +1,34 @@ + + +# Sections + +## Creating your first plugin + +### Scaffolding a new plugin + +Talk through how to run the `backstage-cli create` command as well as what the output it creates is. This should touch on why we install this into `packages/app`. + +### Debugging + +How to handle common errors. + +## First steps with the new plugin + +### Creating a todo plugin + +We're going to be creating the frontend for a todo list plugin. We want the user to be able to create todos for themselves and show the user their current list of todos. + +To start, we'll use a list of mocked data. + +### Controlling your component dynamically + +Update the mocked data to be controlled by config. + +### HTTP API + +We want our todo plugin to reach the backend that we implemented in [the backend plugin Golden Path](../backend/001-first-steps.md). Let's write a client to do this (or use OpenAPI to generate a client for us). + +### Testing + +Unit tests - Let's write a unit test using React Testing Library to make sure that everything is working as expected. +Integration tests - Let's write an integration test using Playwright to _really_ make sure everything is working. diff --git a/docs/golden-path/plugins/integrations/001-catalog.md b/docs/golden-path/plugins/integrations/001-catalog.md new file mode 100644 index 0000000000..f5ed04116e --- /dev/null +++ b/docs/golden-path/plugins/integrations/001-catalog.md @@ -0,0 +1,23 @@ +--- +id: catalog +sidebar_label: 001 - Catalog +title: Integrating with Catalog +--- + +## Software Catalog + +### What is the Software Catalog? + + + +### Integration Points + + + +## Adding a new `backstage.io/todo` annotation + + + +## Custom TODO Entity Kind + + diff --git a/docs/golden-path/plugins/integrations/002-search.md b/docs/golden-path/plugins/integrations/002-search.md new file mode 100644 index 0000000000..b0ef762f27 --- /dev/null +++ b/docs/golden-path/plugins/integrations/002-search.md @@ -0,0 +1,19 @@ +--- +id: search +sidebar_label: 002 - Search +title: Integrating with Search +--- + +## Search + +### What is Backstage Search? + + + +### Common integration points + + + +## Creating a custom TODO collator + + diff --git a/docs/golden-path/plugins/integrations/003-permissions.md b/docs/golden-path/plugins/integrations/003-permissions.md new file mode 100644 index 0000000000..167d40d47f --- /dev/null +++ b/docs/golden-path/plugins/integrations/003-permissions.md @@ -0,0 +1,23 @@ +--- +id: permissions +sidebar_label: 003 - Permissions +title: Integrating with the Permission framework +--- + +## Permissions + +### What is the Permissions framework? + + + +### Common integration points + + + +## Creating private TODOs + + + +## Restricting who can create TODOs + + diff --git a/docs/golden-path/plugins/integrations/004-notifications.md b/docs/golden-path/plugins/integrations/004-notifications.md new file mode 100644 index 0000000000..23c44b4721 --- /dev/null +++ b/docs/golden-path/plugins/integrations/004-notifications.md @@ -0,0 +1,23 @@ +--- +id: notifications +sidebar_label: 004 - Notifications +title: Integrating with Notifications +--- + +## Notifications + +### What are Backstage Notifications? + + + +### Common integration points + + + +## TODO with an alarm + + + +## Create TODOs for other people and notify them + + diff --git a/docs/integrations/azure/discovery.md b/docs/integrations/azure/discovery.md index a4584ef338..7e4d376a7d 100644 --- a/docs/integrations/azure/discovery.md +++ b/docs/integrations/azure/discovery.md @@ -9,11 +9,7 @@ description: Automatically discovering catalog entities from repositories in an This documentation is written for [the new backend system](../../backend-system/index.md) which is the default since Backstage [version 1.24](../../releases/v1.24.0.md). If you are still on the old backend system, you may want to read [its own article](https://github.com/backstage/backstage/blob/v1.37.0/docs/integrations/azure/discovery--old.md) instead, and [consider migrating](../../backend-system/building-backends/08-migrating.md)! ::: -The Azure DevOps integration has a special entity provider for discovering -catalog entities within an Azure DevOps. The provider will crawl your Azure -DevOps organization and register entities matching the configured path. This can -be useful as an alternative to static locations or manually adding things to the -catalog. +The Azure DevOps integration has a special entity provider for discovering catalog entities within an Azure DevOps. The provider will crawl your Azure DevOps organization and register entities matching the configured path. This can be useful as an alternative to static locations or manually adding things to the catalog. This guide explains how to install and configure the Azure DevOps Entity Provider (recommended) or the Azure DevOps Processor. @@ -21,9 +17,7 @@ This guide explains how to install and configure the Azure DevOps Entity Provide ### Code Search Feature -Azure discovery is driven by the Code Search feature in Azure DevOps, this may not be enabled by default. For Azure -DevOps Services you can confirm this by looking at the installed extensions in your Organization Settings. For Azure -DevOps Server you'll find this information in your Collection Settings. +Azure discovery is driven by the Code Search feature in Azure DevOps, this may not be enabled by default. For Azure DevOps Services you can confirm this by looking at the installed extensions in your Organization Settings. For Azure DevOps Server you'll find this information in your Collection Settings. If the Code Search extension is not listed then you can install it from the [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search&targetId=f9352dac-ba6e-434e-9241-a848a510ce3f&utm_source=vstsproduct&utm_medium=SearchExtStatus). @@ -68,7 +62,7 @@ catalog: The parameters available are: -- **`host:`** _(optional)_ Leave empty for Cloud hosted, otherwise set to your self-hosted instance host. +- **`host:`** _(optional)_ The default value is `dev.azure.com`, it is required for legacy `{org}.visualstudio.com` domains or for on-premise installations. - **`organization:`** Your Organization slug (or Collection for on-premise users). Required. - **`project:`** _(required)_ Your project slug. Wildcards are supported as shown on the examples above. Using '\*' will search all projects. For a project name containing spaces, use both single and double quotes as in `project: '"My Project Name"'`. - **`repository:`** _(optional)_ The repository name. Wildcards are supported as show on the examples above. If not set, all repositories will be searched. diff --git a/docs/integrations/azure/locations.md b/docs/integrations/azure/locations.md index 3ea180f5bd..8dd115662e 100644 --- a/docs/integrations/azure/locations.md +++ b/docs/integrations/azure/locations.md @@ -200,6 +200,47 @@ However a system-assigned managed identity is the most secure option because: ::: +### Legacy `{org}.visualstudio.com` Domains + +Backstage supports the legacy `{org}.visualstudio.com` domains along with all the previously mentioned authentication options, the caveat is that each Azure DevOps Organization will need to be defined in your configuration along with a single credential. + +For example, this will work: + +```yaml +integrations: + azure: + - host: my-org.visualstudio.com + credentials: + - clientId: ${AZURE_CLIENT_ID} + clientSecret: ${AZURE_CLIENT_SECRET} + tenantId: ${AZURE_TENANT_ID} +``` + +As will this: + +```yaml +integrations: + azure: + - host: my-other-org.visualstudio.com + credentials: + - personalAccessToken: ${PERSONAL_ACCESS_TOKEN} +``` + +But this will NOT work: + +```yaml +integrations: + azure: + - host: my-org.visualstudio.com + credentials: + - organizations: + - my-org + - my-other-org + clientId: ${AZURE_CLIENT_ID} + clientSecret: ${AZURE_CLIENT_SECRET} + tenantId: ${AZURE_TENANT_ID} +``` + ## Configuration schema The configuration is a structure with these elements: diff --git a/docs/integrations/github/discovery.md b/docs/integrations/github/discovery.md index e17f514058..66fdaa503b 100644 --- a/docs/integrations/github/discovery.md +++ b/docs/integrations/github/discovery.md @@ -375,7 +375,7 @@ schedule: timeout: { minutes: 3 } ``` -More information about scheduling can be found on the [SchedulerServiceTaskScheduleDefinition](https://backstage.io/docs/reference/backend-plugin-api.schedulerservicetaskscheduledefinition) page. +More information about scheduling can be found on the [SchedulerServiceTaskScheduleDefinition](https://backstage.io/api/stable/interfaces/_backstage_backend-plugin-api.index.SchedulerServiceTaskScheduleDefinition.html) page. Alternatively, or additionally, you can configure [github-apps](github-apps.md) authentication which carries a much higher rate limit at GitHub. diff --git a/docs/integrations/github/org.md b/docs/integrations/github/org.md index 2dac8b8866..5321423432 100644 --- a/docs/integrations/github/org.md +++ b/docs/integrations/github/org.md @@ -98,7 +98,7 @@ Directly under the `githubOrg` is a list of configurations, each entry is a stru - `id`: A stable id for this provider. Entities from this provider will be associated with this ID, so you should take care not to change it over time since that may lead to orphaned entities and/or conflicts. - `githubUrl`: The target that this provider should consume - `orgs` (optional): The list of the GitHub orgs to consume. If you only list a single org the generated group entities will use the `default` namespace, otherwise they will use the org name as the namespace. By default the provider will consume all accessible orgs on the given GitHub instance (support for GitHub App integration only). -- `schedule`: The refresh schedule to use, matches the structure of [`SchedulerServiceTaskScheduleDefinitionConfig`](https://backstage.io/docs/reference/backend-plugin-api.schedulerservicetaskscheduledefinitionconfig/) +- `schedule`: The refresh schedule to use, matches the structure of [`SchedulerServiceTaskScheduleDefinitionConfig`](https://backstage.io/api/stable/interfaces/_backstage_backend-plugin-api.index.SchedulerServiceTaskScheduleDefinition.html) - `pageSizes` (optional): Configure page sizes for GitHub GraphQL API queries to prevent `RESOURCE_LIMITS_EXCEEDED` errors. You can configure the following page sizes: - `teams`: Number of teams to fetch per page when querying organization teams (default: 25) diff --git a/docs/integrations/gitlab/discovery.md b/docs/integrations/gitlab/discovery.md index 3d47edba6d..4d801bdd77 100644 --- a/docs/integrations/gitlab/discovery.md +++ b/docs/integrations/gitlab/discovery.md @@ -154,11 +154,12 @@ catalog: fallbackBranch: master # Optional. Fallback to be used if there is no default branch configured at the Gitlab repository. It is only used, if `branch` is undefined. Uses `master` as default skipForkedRepos: false # Optional. If the project is a fork, skip repository includeArchivedRepos: false # Optional. If project is archived, include repository - group: example-group # Optional. Group and subgroup (if needed) to look for repositories. If not present the whole instance will be scanned + group: example-group # Optional (unless useSearch is true). Group and subgroup (if needed) to look for repositories. If not present the whole instance will be scanned groupPattern: # Optional. Filters for groups based on a list of RegEx. Default, no filters. - '^somegroup$' - 'anothergroup' entityFilename: catalog-info.yaml # Optional. Defaults to `catalog-info.yaml` + useSearch: false # Optional. Whether to use the GitLab group search API to find files. Requires Gitlab 'Premium' or 'Ultimate' licenses. Defaults to `false` projectPattern: '[\s\S]*' # Optional. Filters found projects based on provided pattern. Defaults to `[\s\S]*`, which means to not filter anything excludeRepos: [] # Optional. A list of project paths that should be excluded from discovery, e.g. group/subgroup/repo. Should not start or end with a slash. schedule: # Same options as in SchedulerServiceTaskScheduleDefinition. Optional for the Legacy Backend System diff --git a/docs/integrations/gitlab/org.md b/docs/integrations/gitlab/org.md index 2908bb7c09..bddd1c13a1 100644 --- a/docs/integrations/gitlab/org.md +++ b/docs/integrations/gitlab/org.md @@ -285,7 +285,7 @@ import { coreServices, createBackendModule, } from '@backstage/backend-plugin-api'; -import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; +import { catalogProcessingExtensionPoint } from '@backstage/plugin-catalog-node'; import { eventsServiceRef } from '@backstage/plugin-events-node'; import { GitlabOrgDiscoveryEntityProvider, diff --git a/docs/landing-page/doc-landing-page.md b/docs/landing-page/doc-landing-page.md index cb1b889851..8697144bd8 100644 --- a/docs/landing-page/doc-landing-page.md +++ b/docs/landing-page/doc-landing-page.md @@ -94,7 +94,7 @@ description: Documentation landing page.
  • Architecture Decision Records (ADRs)
  • Deprecations
  • Utility APIs
  • -
  • Package Index
  • +
  • API References
  • FAQ
  • diff --git a/docs/notifications/index.md b/docs/notifications/index.md index dce58d3214..3d7dc0eaac 100644 --- a/docs/notifications/index.md +++ b/docs/notifications/index.md @@ -147,9 +147,6 @@ add the `UserNotificationSettingsCard` to your frontend. ```tsx title="packages/app/src/App.tsx" }> - - - ` per specific needs. +In the `packages/app/src/components/Root/Root.tsx`, tweak the [properties](https://backstage.io/api/stable/functions/_backstage_plugin-notifications.index.NotificationsSidebarItem.html) of the `` per specific needs. ## Usage diff --git a/docs/overview/support.md b/docs/overview/support.md index 0433683406..9ff2e302b8 100644 --- a/docs/overview/support.md +++ b/docs/overview/support.md @@ -15,7 +15,7 @@ description: Support and Community Details and Links - [Code of Conduct](https://github.com/backstage/backstage/blob/master/CODE_OF_CONDUCT.md) - This is how we roll. - [Blog](https://backstage.io/blog/) - Announcements and updates. -- [Newsletter](https://info.backstage.spotify.com/newsletter_subscribe) - Subscribe to +- [Newsletter](https://spoti.fi/backstagenewsletter) - Subscribe to our email newsletter. - Give us a star ⭐️ - If you are using Backstage or think it is an interesting project, we would love a star! ❤️ diff --git a/docs/overview/technical-overview.md b/docs/overview/technical-overview.md index 63c20dbf2f..1fbc22cfc7 100644 --- a/docs/overview/technical-overview.md +++ b/docs/overview/technical-overview.md @@ -10,7 +10,7 @@ Backstage is an open source framework for building developer portals that was cr Backstage is powered by a centralized [software catalog](#software-catalog-system-model) and utilizes an abstraction layer that sits on top of all of your infrastructure and developer tooling, allowing you to manage all of your software, services, tooling, and testing in one place. -Backstage uses a [plugin-architecture](#plugin-architecture-overview) which allows you customize the functionality of your Backstage application using a wide variety of available plugins or you can write your own. It also includes automated templates that your teams can use to create new microservices, helping to ensure consistency and adherence to your best practices. Backstage also provides the ability to create, maintain, and find the documentation for all of your software. +Backstage uses a [plugin-architecture](#plugin-architecture-overview) which allows you to customize the functionality of your Backstage application using a wide variety of available plugins or you can write your own. It also includes automated templates that your teams can use to create new microservices, helping to ensure consistency and adherence to your best practices. Backstage also provides the ability to create, maintain, and find the documentation for all of your software. Backstage is now a [CNCF incubation project](https://backstage.io/blog/2022/03/16/backstage-turns-two#out-of-the-sandbox-and-into-incubation). diff --git a/docs/overview/threat-model.md b/docs/overview/threat-model.md index 129bd85930..6acba915d5 100644 --- a/docs/overview/threat-model.md +++ b/docs/overview/threat-model.md @@ -19,7 +19,7 @@ An **operator** is a user responsible for configuring and maintaining an instanc A **builder** is an internal or external code contributor and end up having a similar level of access as operators. When installing Backstage plugins you should vet them just like any other package from an external source. While it’s possible to limit the impact of for example a supply chain attack by splitting the deployment into separate services with different plugins, the Backstage project itself does not aim to prevent these kinds of attacks or in any other way sandbox or limit the access of plugins. -An **external user** is a user that does not belong to the other two groups, for example a malicious actor outside of the organization. The security model of Backstage currently assumes that this group does not have any direct access to Backstage, and it is the responsibility of each adopter of Backstage to make sure this is the case. +An **external user** is a user that does not belong to the other three groups, for example a malicious actor outside of the organization. The security model of Backstage currently assumes that this group does not have any direct access to Backstage, and it is the responsibility of each adopter of Backstage to make sure this is the case. ## Operator Responsibilities diff --git a/docs/overview/versioning-policy.md b/docs/overview/versioning-policy.md index 420b6489ae..8247889c1c 100644 --- a/docs/overview/versioning-policy.md +++ b/docs/overview/versioning-policy.md @@ -195,4 +195,4 @@ The Backstage project recommends and supports using PostgreSQL for persistent st The PostgreSQL [versioning policy](https://www.postgresql.org/support/versioning/) is to release a new major version every year with new features which is then supported for 5 years after its initial release. -Our policy mirrors the PostgreSQL versioning policy - we will support the last 5 major versions. We will also test the newest and oldest versions in that range. For example, if the range we support is currently 13 to 17, then we would only test 13 and 17 explicitly. +Our policy mirrors the PostgreSQL versioning policy - we will support the last 5 major versions. We will also test the newest and oldest versions in that range. For example, if the range we support is currently 14 to 18, then we would only test 14 and 18 explicitly. diff --git a/docs/permissions/custom-rules.md b/docs/permissions/custom-rules.md index d90f36e59d..b4ca86adf5 100644 --- a/docs/permissions/custom-rules.md +++ b/docs/permissions/custom-rules.md @@ -12,20 +12,21 @@ For some use cases, you may want to define custom [rules](../references/glossary ## Define a custom rule -Plugins should export a rule factory that provides type-safety that ensures compatibility with the plugin's backend. The catalog plugin exports `createCatalogPermissionRule` from `@backstage/plugin-catalog-backend/alpha` for this purpose. Note: the `/alpha` path segment is temporary until this API is marked as stable. For this example, we'll define the rule and create a condition in `packages/backend/src/extensions/permissionsPolicyExtension.ts`. +Plugins should export a rule factory that provides type-safety that ensures compatibility with the plugin's backend. The catalog plugin exports `createCatalogPermissionRule` from `@backstage/plugin-catalog-backend/alpha` for this purpose. Note: the `/alpha` path segment is temporary until this API is marked as stable. For this example, we'll define the rule and create a condition in `packages/backend/src/permissionRules.ts`. We use `zod` and `@backstage/catalog-model` in our example below. To install them run: ```bash title="from your Backstage root directory" -yarn --cwd packages/backend add zod @backstage/catalog-model +yarn --cwd packages/backend add zod@3 @backstage/catalog-model ``` -```ts title="packages/backend/src/extensions/permissionsPolicyExtension.ts" -... - +```ts title="packages/backend/src/permissionRules.ts" import type { Entity } from '@backstage/catalog-model'; -import { catalogEntityPermissionResourceRef } from '@backstage/plugin-catalog-backend/alpha'; -import { createConditionFactory, createPermissionRule } from '@backstage/plugin-permission-node'; +import { catalogEntityPermissionResourceRef } from '@backstage/plugin-catalog-node/alpha'; +import { + createConditionFactory, + createPermissionRule, +} from '@backstage/plugin-permission-node'; import { z } from 'zod'; export const isInSystemRule = createPermissionRule({ @@ -59,48 +60,13 @@ const isInSystem = createConditionFactory(isInSystemRule); For a more detailed explanation on defining rules, refer to the [documentation for plugin authors](./plugin-authors/03-adding-a-resource-permission-check.md#adding-support-for-conditional-decisions). -Still in the `packages/backend/src/extensions/permissionsPolicyExtension.ts` file, let's use the condition we just created in our `CustomPermissionPolicy`. +In the `packages/backend/src/extensions/permissionsPolicyExtension.ts` file created in the [Writing a Policy](./writing-a-policy.md) section, let's use the condition we just created: ```ts title="packages/backend/src/extensions/permissionsPolicyExtension.ts" ... -/* highlight-remove-next-line */ -import { catalogEntityPermissionResourceRef } from '@backstage/plugin-catalog-backend/alpha'; +import { policyExtensionPoint } from '@backstage/plugin-permission-node/alpha'; /* highlight-add-next-line */ -import { catalogEntityPermissionResourceRef, createCatalogConditionalDecision, catalogConditions } from '@backstage/plugin-catalog-backend/alpha'; -/* highlight-remove-next-line */ -import { createConditionFactory, createPermissionRule } from '@backstage/plugin-permission-node'; -/* highlight-add-next-line */ -import { createConditionFactory, createPermissionRule, PermissionPolicy, PolicyQuery, PolicyQueryUser } from '@backstage/plugin-permission-node'; -/* highlight-add-start */ -import { AuthorizeResult, PolicyDecision, isResourcePermission } from '@backstage/plugin-permission-common'; -/* highlight-add-end */ -... - -export const isInSystemRule = createPermissionRule({ - name: 'IS_IN_SYSTEM', - description: 'Checks if an entity is part of the system provided', - resourceRef: catalogEntityPermissionResourceRef, - paramsSchema: z.object({ - systemRef: z - .string() - .describe('SystemRef to check the resource is part of'), - }), - apply: (resource: Entity, { systemRef }) => { - if (!resource.relations) { - return false; - } - - return resource.relations - .filter(relation => relation.type === 'partOf') - .some(relation => relation.targetRef === systemRef); - }, - toQuery: ({ systemRef }) => ({ - key: 'relations.partOf', - values: [systemRef], - }), -}); - -const isInSystem = createConditionFactory(isInSystemRule); +import { isInSystem } from '../permissionRules'; class CustomPermissionPolicy implements PermissionPolicy { async handle( @@ -131,8 +97,6 @@ class CustomPermissionPolicy implements PermissionPolicy { return { result: AuthorizeResult.ALLOW }; } } - -... ``` ## Provide the rule during plugin setup @@ -147,19 +111,14 @@ The `PermissionsRegistryService` is a fairly new addition and not yet supported To install custom rules in a plugin, we need to use the [`PermissionsRegistryService`](../backend-system/core-services/permissionsRegistry.md). Here's the steps you'll need to take to add the `isInSystemRule` we created above to the catalog: -1. We will be using the `@backstage/plugin-catalog-node` package as it contains the extension point we need. Run this to add it: +1. Create a `catalogPermissionRules.ts` file in the `packages/backend/src/extensions` folder with the following content: - ```bash title="from your Backstage root directory" - yarn --cwd packages/backend add @backstage/plugin-catalog-node - ``` - -2. Next create a `catalogPermissionRules.ts` file in the `packages/backend/src/modules` folder. -3. Then add this as the contents of the new `catalogPermissionRules.ts` file: - - ```typescript title="packages/backend/src/modules/catalogPermissionRules.ts" - import { createBackendModule } from '@backstage/backend-plugin-api'; - import { catalogPermissionExtensionPoint } from '@backstage/plugin-catalog-node/alpha'; - import { isInSystemRule } from './permissionsPolicyExtension'; + ```typescript title="packages/backend/src/extensions/catalogPermissionRules.ts" + import { + coreServices, + createBackendModule, + } from '@backstage/backend-plugin-api'; + import { isInSystemRule } from '../permissionRules'; export default createBackendModule({ pluginId: 'catalog', @@ -175,7 +134,7 @@ To install custom rules in a plugin, we need to use the [`PermissionsRegistrySer }); ``` -4. Next we need to add this to the backend by adding the following line: +2. Next we need to add this to the backend by adding the following line: ```ts title="packages/backend/src/index.ts" // catalog plugin @@ -184,10 +143,10 @@ To install custom rules in a plugin, we need to use the [`PermissionsRegistrySer import('@backstage/plugin-catalog-backend-module-scaffolder-entity-model'), ); /* highlight-add-next-line */ - backend.add(import('./modules/catalogPermissionRules')); + backend.add(import('./extensions/catalogPermissionRules')); ``` -5. Now when you run you Backstage instance - `yarn start` - the rule will be added to the catalog plugin. +3. Now when you run your Backstage instance - `yarn start` - the rule will be added to the catalog plugin. The updated policy will allow catalog entity resource permissions if any of the following are true: diff --git a/docs/permissions/plugin-authors/04-authorizing-access-to-paginated-data.md b/docs/permissions/plugin-authors/04-authorizing-access-to-paginated-data.md index b81382ee16..9b79cec042 100644 --- a/docs/permissions/plugin-authors/04-authorizing-access-to-paginated-data.md +++ b/docs/permissions/plugin-authors/04-authorizing-access-to-paginated-data.md @@ -43,7 +43,7 @@ To avoid this situation, the permissions framework has support for filtering ite :::note Note -In order to perform authorization filtering in this way, the data source must allow filters to be logically combined with AND, OR, and NOT operators. The conditional decisions returned by the permissions framework use a [nested object](https://backstage.io/docs/reference/plugin-permission-common.permissioncriteria) to combine conditions. If you're implementing a filter API from scratch, we recommend using the same shape for ease of interoperability. If not, you'll need to implement a function which transforms the nested object into your own format. +In order to perform authorization filtering in this way, the data source must allow filters to be logically combined with AND, OR, and NOT operators. The conditional decisions returned by the permissions framework use a [nested object](https://backstage.io/api/stable/types/_backstage_plugin-permission-common.PermissionCriteria.html) to combine conditions. If you're implementing a filter API from scratch, we recommend using the same shape for ease of interoperability. If not, you'll need to implement a function which transforms the nested object into your own format. ::: diff --git a/docs/permissions/plugin-authors/05-frontend-authorization.md b/docs/permissions/plugin-authors/05-frontend-authorization.md index 4d673e3b4f..5aadae1d23 100644 --- a/docs/permissions/plugin-authors/05-frontend-authorization.md +++ b/docs/permissions/plugin-authors/05-frontend-authorization.md @@ -79,7 +79,7 @@ function AddTodo({ onAdd }: { onAdd: (title: string) => any }) { } ``` -Here we are using the [`usePermission` hook](https://backstage.io/docs/reference/plugin-permission-react.usepermission) to communicate with the permission policy and receive a decision on whether this user is authorized to create a todo list item. +Here we are using the [`usePermission` hook](https://backstage.io/api/stable/functions/_backstage_plugin-permission-react.usePermission.html) to communicate with the permission policy and receive a decision on whether this user is authorized to create a todo list item. It's really that simple! Let's change our policy to test the disabled button: @@ -98,7 +98,7 @@ And now you should see that you are not able to create a todo item from the fron ## Using `RequirePermission` -Providing a disabled state can be a helpful signal to users, but there may be cases where hiding the element is preferred. For such cases, you can use the provided [`RequirePermission` component](https://backstage.io/docs/reference/plugin-permission-react.requirepermission): +Providing a disabled state can be a helpful signal to users, but there may be cases where hiding the element is preferred. For such cases, you can use the provided [`RequirePermission` component](https://backstage.io/api/stable/functions/_backstage_plugin-permission-react.RequirePermission.html): ```tsx title="plugins/todo-list/src/components/TodoListPage/TodoListPage.tsx" import { diff --git a/docs/permissions/writing-a-policy.md b/docs/permissions/writing-a-policy.md index 576afcac21..2bf2bcade9 100644 --- a/docs/permissions/writing-a-policy.md +++ b/docs/permissions/writing-a-policy.md @@ -66,9 +66,9 @@ Now with this policy in place the ability to delete entities in the Catalog is n ## What's in a policy? -Let's break this down a bit further. The request object of type [PolicyQuery](https://backstage.io/docs/reference/plugin-permission-node.policyquery) is a simple wrapper around [the Permission object](https://backstage.io/docs/reference/plugin-permission-common.permission). This permission object encapsulates information about the action that the user is attempting to perform (See [the Concepts page](./concepts.md) for more details). +Let's break this down a bit further. The request object of type [PolicyQuery](https://backstage.io/api/stable/types/_backstage_plugin-permission-node.index.PolicyQuery.html) is a simple wrapper around [the Permission object](https://backstage.io/api/stable/types/_backstage_plugin-permission-common.Permission.html). This permission object encapsulates information about the action that the user is attempting to perform (See [the Concepts page](./concepts.md) for more details). -In the policy above, we are checking to see if the provided action is a catalog entity delete action, which is the permission that the catalog plugin authors have created to represent the action of unregistering a catalog entity. If this is the case, we return a [Definitive Policy Decision](https://backstage.io/docs/reference/plugin-permission-common.definitivepolicydecision) of DENY. In all other cases, we return ALLOW (resulting in an allow-by-default behavior). +In the policy above, we are checking to see if the provided action is a catalog entity delete action, which is the permission that the catalog plugin authors have created to represent the action of unregistering a catalog entity. If this is the case, we return a [Definitive Policy Decision](https://backstage.io/api/stable/types/_backstage_plugin-permission-common.DefinitivePolicyDecision.html) of DENY. In all other cases, we return ALLOW (resulting in an allow-by-default behavior). As we confirmed in the previous section, we know that this now prevents us from unregistering catalog components. Hooray! But you may notice that this prevents _anyone_ from unregistering a component, which is not a very realistic policy. Let's improve this policy by disabling the unregister action _unless you are the owner of this component_. @@ -115,7 +115,7 @@ class CustomPermissionPolicy implements PermissionPolicy { if (isPermission(request.permission, catalogEntityDeletePermission)) { /* highlight-remove-start */ return { - result: AuthorizeResult.DENY, + result: AuthorizeResult.DENY, }; /* highlight-remove-end */ /* highlight-add-start */ @@ -134,9 +134,9 @@ class CustomPermissionPolicy implements PermissionPolicy { Let's walk through the new code that we just added. -Instead of returning an Definitive Policy Decision, we use factory methods to construct a [Conditional Policy Decision](https://backstage.io/docs/reference/plugin-permission-common.conditionalpolicydecision) (See the [Concepts page](./concepts.md) for more details). Since the policy doesn't have enough information to determine if `user` is the entity owner, this criteria is encapsulated within the conditional decision. However, `createCatalogConditionalDecision` will not compile unless `request.permission` is a catalog entity [`ResourcePermission`](https://backstage.io/docs/reference/plugin-permission-common.resourcepermission). This type constraint ensures that policies return conditional decisions that are compatible with the requested permission. To address this, we use [`isPermission`](https://backstage.io/docs/reference/plugin-permission-common.ispermission) to ["narrow"](https://www.typescriptlang.org/docs/handbook/2/narrowing.html) the type of `request.permission` to `ResourcePermission<'catalog-entity'>`. This matches the runtime behavior that was in place before, but you'll notice that the type of `request.permission` has changed within the scope of that `if` statement. +Instead of returning an Definitive Policy Decision, we use factory methods to construct a [Conditional Policy Decision](https://backstage.io/api/stable/types/_backstage_plugin-permission-common.ConditionalPolicyDecision.html) (See the [Concepts page](./concepts.md) for more details). Since the policy doesn't have enough information to determine if `user` is the entity owner, this criteria is encapsulated within the conditional decision. However, `createCatalogConditionalDecision` will not compile unless `request.permission` is a catalog entity [`ResourcePermission`](https://backstage.io/api/stable/types/_backstage_plugin-permission-common.ResourcePermission.html). This type constraint ensures that policies return conditional decisions that are compatible with the requested permission. To address this, we use [`isPermission`](https://backstage.io/api/stable/functions/_backstage_plugin-permission-common.isPermission.html) to ["narrow"](https://www.typescriptlang.org/docs/handbook/2/narrowing.html) the type of `request.permission` to `ResourcePermission<'catalog-entity'>`. This matches the runtime behavior that was in place before, but you'll notice that the type of `request.permission` has changed within the scope of that `if` statement. -The `catalogConditions` object contains all of the rules defined by the catalog plugin. These rules can be combined to form a [`PermissionCriteria`](https://backstage.io/docs/reference/plugin-permission-common.permissioncriteria) object, but for this case we only need to use the `isEntityOwner` rule. This rule accepts a list of entity refs that represent User identity and Group membership used to determine ownership. The second argument to `PermissionPolicy#handle` provides us with a `PolicyQueryUser` object, from which we can grab the user's `ownershipEntityRefs`. We provide an empty array as a fallback since the user may be anonymous. +The `catalogConditions` object contains all of the rules defined by the catalog plugin. These rules can be combined to form a [`PermissionCriteria`](https://backstage.io/api/stable/types/_backstage_plugin-permission-common.PermissionCriteria.html) object, but for this case we only need to use the `isEntityOwner` rule. This rule accepts a list of entity refs that represent User identity and Group membership used to determine ownership. The second argument to `PermissionPolicy#handle` provides us with a `PolicyQueryUser` object, from which we can grab the user's `ownershipEntityRefs`. We provide an empty array as a fallback since the user may be anonymous. You should now be able to see in your Backstage app that the unregister entity button is enabled for entities that you own, but disabled for all other entities! @@ -190,7 +190,7 @@ class CustomPermissionPolicy implements PermissionPolicy { } ``` -In this example, we use [`isResourcePermission`](https://backstage.io/docs/reference/plugin-permission-common.isresourcepermission) to match all permissions with a resource type of `catalog-entity`. Just like `isPermission`, this helper will "narrow" the type of `request.permission` and enable the use of `createCatalogConditionalDecision`. In addition to the behavior you observed before, you should also see that catalog entities are no longer visible unless you are the owner - success! +In this example, we use [`isResourcePermission`](https://backstage.io/api/stable/functions/_backstage_plugin-permission-common.isResourcePermission.html) to match all permissions with a resource type of `catalog-entity`. Just like `isPermission`, this helper will "narrow" the type of `request.permission` and enable the use of `createCatalogConditionalDecision`. In addition to the behavior you observed before, you should also see that catalog entities are no longer visible unless you are the owner - success! :::note Note diff --git a/docs/plugins/add-to-directory.md b/docs/plugins/add-to-directory.md index 8be0d764dd..48affef489 100644 --- a/docs/plugins/add-to-directory.md +++ b/docs/plugins/add-to-directory.md @@ -6,10 +6,7 @@ description: Documentation on Adding Plugin to Plugin Directory ## Adding a Plugin to the Directory -To add a new plugin to the [plugin directory](https://backstage.io/plugins) -create a file in -[`microsite/data/plugins`](https://github.com/backstage/backstage/tree/master/microsite/data/plugins) -with your plugin's information. Example: +To add a new plugin to the [plugin directory](https://backstage.io/plugins) create a file with the following pattern `.yaml` where `` is the name of your plugin. This file will go in [`microsite/data/plugins`](https://github.com/backstage/backstage/tree/master/microsite/data/plugins) with your plugin's information. Example: ```yaml --- @@ -26,13 +23,24 @@ npmPackageName: # Your npm package name E.g. '@backstage/plugin-' quotes ar addedDate: # The date plugin added to directory E.g. '2022-10-01' quotes are required ``` +:::tip + +You can validate your YAML file is correct by running the following from the root of the repo: + +1. First run `yarn install` +2. Then run `node ./scripts/verify-plugin-directory.js` + +If there are any errors they will be listed and you will need to correct them. We run this same check as part of the CI. + +::: + ## Submission Tips Here are a few tips to help speed up the review process when you submit your plugin: -- For any icon that you use make sure you have the proper rights to use it. +- For any icon that you use make sure you have the proper rights to use it. If you don't have an icon then it will default to `iconUrl: '/img/logo-gradient-on-dark.svg'`. - Make sure that your package had been published on the NPM registry and that it's public. - Make sure your package on NPM has a link back to your code repo, this helps provide confidence that it's the right package. -- Where possible, please use an [NPM scope](https://docs.npmjs.com/about-scopes) that matches either your Organization name or user name, this provides trust in the plugin +- Where possible, please use an [NPM scope](https://docs.npmjs.com/about-scopes) that matches either your Organization name or user name, this provides trust in the plugin. - If your plugin has both a frontend and backend link the documentation to the frontend package but make sure it mentioned needing to install the backend package. - Where possible include a screenshot of the features in you plugin documentation, it really does help when deciding to use a plugin. diff --git a/docs/plugins/analytics.md b/docs/plugins/analytics.md index f383e8881c..3e8d5b4111 100644 --- a/docs/plugins/analytics.md +++ b/docs/plugins/analytics.md @@ -54,7 +54,7 @@ learn how to contribute the integration yourself! [matomo]: https://github.com/backstage/community-plugins/blob/main/workspaces/analytics/plugins/analytics-module-matomo/README.md [add-tool]: https://github.com/backstage/backstage/issues/new?assignees=&labels=plugin&template=plugin_template.md&title=%5BAnalytics+Module%5D+THE+ANALYTICS+TOOL+TO+INTEGRATE [int-howto]: #writing-integrations -[analytics-api-type]: https://backstage.io/docs/reference/core-plugin-api.analyticsapi +[analytics-api-type]: https://backstage.io/api/stable/types/_backstage_core-plugin-api.index.AnalyticsApi.html [generic-http]: https://github.com/pfeifferj/backstage-plugin-analytics-generic/blob/main/README.md ## Key Events diff --git a/docs/plugins/existing-plugins.md b/docs/plugins/existing-plugins.md deleted file mode 100644 index 181650adc1..0000000000 --- a/docs/plugins/existing-plugins.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -id: existing-plugins -title: Existing plugins -description: Lists of existing open source plugins ---- - -## The Plugin Directory - -Open source plugins that you can add to your Backstage deployment can be found -at: - -https://backstage.io/plugins - -![](https://backstage.io/blog/assets/marketplace.png) - -## Links - -- [[blog] The Plugin Directory is open](https://backstage.io/blog/2020/09/30/plugin-marketplace) diff --git a/docs/plugins/feature-flags.md b/docs/plugins/feature-flags.md index 3afb8081d5..e9e000df0d 100644 --- a/docs/plugins/feature-flags.md +++ b/docs/plugins/feature-flags.md @@ -55,7 +55,7 @@ The user's selection is saved in the user's browser local storage. Once a featur ## FeatureFlagged Component -The easiest way to control content based on the state of a feature flag is to use the [FeatureFlagged](https://backstage.io/docs/reference/core-app-api.featureflagged) component. +The easiest way to control content based on the state of a feature flag is to use the [FeatureFlagged](https://backstage.io/api/stable/functions/_backstage_core-app-api.FeatureFlagged.html) component. ```ts import { FeatureFlagged } from '@backstage/core-app-api'; @@ -73,7 +73,7 @@ import { FeatureFlagged } from '@backstage/core-app-api'; ## Evaluating Feature Flag State -It is also possible to query a feature flag using the [FeatureFlags Api](https://backstage.io/docs/reference/core-plugin-api.featureflagsapi). +It is also possible to query a feature flag using the [FeatureFlags Api](https://backstage.io/api/stable/interfaces/_backstage_core-plugin-api.index.FeatureFlagsApi.html). ```ts import { useApi, featureFlagsApiRef } from '@backstage/core-plugin-api'; diff --git a/docs/plugins/index.md b/docs/plugins/index.md index f709afa894..ef45152f55 100644 --- a/docs/plugins/index.md +++ b/docs/plugins/index.md @@ -23,3 +23,9 @@ This approach is equally beneficial if you conceive an idea for a potentially im ## Integration with the Software Catalog Should your plugin complement the Software Catalog rather than exist as a standalone feature (for instance, as an additional tab or a card within an "Overview" tab), you'll find comprehensive guidance on achieving this integration in the [Integrating Plugin into Software Catalog guide](integrating-plugin-into-software-catalog.md). + +## Existing Plugins + +There are a plethora of existing community made plugins which can be found by going to the [Backstage Plugin Directory](https://backstage.io/plugins) + +You can read more about it in this blog post: [The Plugin Directory is now open](https://backstage.io/blog/2020/09/30/plugin-marketplace/) diff --git a/docs/plugins/integrating-plugin-into-software-catalog.md b/docs/plugins/integrating-plugin-into-software-catalog.md index ed2e25c601..911d74b019 100644 --- a/docs/plugins/integrating-plugin-into-software-catalog.md +++ b/docs/plugins/integrating-plugin-into-software-catalog.md @@ -32,7 +32,7 @@ Creating the plugin... ### Reading entities from within your plugin You can access the currently selected entity using the backstage api -[`useEntity`](../reference/plugin-catalog-react.useentity.md). For example, +[`useEntity`](https://backstage.io/api/stable/functions/_backstage_plugin-catalog-react.index.useEntity.html). For example, ```tsx import { useEntity } from '@backstage/plugin-catalog-react'; @@ -45,7 +45,7 @@ export const MyPluginEntityContent = () => { ``` Internally `useEntity` makes use of -[react `Context`s](https://reactjs.org/docs/context.html). The entity context is +[react `Contexts`](https://18.react.dev/learn/passing-data-deeply-with-context). The entity context is provided by the entity page into which your plugin will be embedded. ### Import your plugin and embed in the entities page @@ -63,7 +63,7 @@ To add your component to the Entity view, you will need to modify the your plugin, you may only care about certain kinds of [entities](https://backstage.io/docs/features/software-catalog/descriptor-format), each of which has its own -[element](https://reactjs.org/docs/rendering-elements.html) for rendering. This +element for rendering. This functionality is handled by the `EntitySwitch` component: ```tsx diff --git a/docs/plugins/integrating-search-into-plugins.md b/docs/plugins/integrating-search-into-plugins.md index ec1c4e7a5a..fd80e0a1eb 100644 --- a/docs/plugins/integrating-search-into-plugins.md +++ b/docs/plugins/integrating-search-into-plugins.md @@ -237,7 +237,7 @@ backend.start(); #### 8. Testing the collator code -To verify your implementation works as expected make sure to add tests for it. For your convenience, there is the [`TestPipeline`](https://backstage.io/docs/reference/plugin-search-backend-node.testpipeline) utility that emulates a pipeline into which you can integrate your custom collator. +To verify your implementation works as expected make sure to add tests for it. For your convenience, there is the [`TestPipeline`](https://backstage.io/api/stable/classes/_backstage_plugin-search-backend-node.index.TestPipeline.html) utility that emulates a pipeline into which you can integrate your custom collator. Look at [DefaultTechDocsCollatorFactory test](https://github.com/backstage/backstage/blob/de294ce5c410c9eb56da6870a1fab795268f60e3/plugins/techdocs-backend/src/search/DefaultTechDocsCollatorFactory.test.ts), for an example. @@ -282,7 +282,7 @@ search experience. of state necessary to perform search queries and display any results. As inputs to the query are updated (e.g. a `term` or `filter` values), the updated query is executed and `results` are refreshed. Check out the - [SearchContextValue](https://backstage.io/docs/reference/plugin-search-react.searchcontextvalue) + [SearchContextValue](https://backstage.io/api/stable/types/_backstage_plugin-search-react.index.SearchContextValue.html) for details. - The aforementioned state can be modified and/or consumed via the `useSearch()` hook, also exported by `@backstage/plugin-search-react`. diff --git a/docs/plugins/proxying.md b/docs/plugins/proxying.md index 5182ee7171..bd89fc6c36 100644 --- a/docs/plugins/proxying.md +++ b/docs/plugins/proxying.md @@ -141,6 +141,9 @@ registered in this manner. Example: ```ts +import { createBackendModule } from '@backstage/backend-plugin-api'; +import { proxyEndpointsExtensionPoint } from '@backstage/plugin-proxy-node/alpha'; + backend.add( createBackendModule({ pluginId: 'proxy', diff --git a/docs/plugins/structure-of-a-plugin.md b/docs/plugins/structure-of-a-plugin.md index 8412ead179..7cfaca4561 100644 --- a/docs/plugins/structure-of-a-plugin.md +++ b/docs/plugins/structure-of-a-plugin.md @@ -82,7 +82,7 @@ export const ExamplePage = examplePlugin.provide( This is where the plugin is created and where it creates and exports extensions that can be imported and used in the app. See reference docs for -[`createPlugin`](../reference/core-plugin-api.createplugin.md) or introduction to +[`createPlugin`](https://backstage.io/api/stable/functions/_backstage_core-plugin-api.index.createPlugin.html) or introduction to the new [Composability System](./composability.md). ## Components diff --git a/docs/plugins/testing.md b/docs/plugins/testing.md index 7292ac9754..1297d516f3 100644 --- a/docs/plugins/testing.md +++ b/docs/plugins/testing.md @@ -4,6 +4,12 @@ title: Testing with Jest description: Documentation on How to do unit testing with Jest --- +:::note Note + +You may want to consider migrating to Jest 30, to do this, you can follow this guide: [Migrating to Jest 30](../tutorials/jest30-migration.md) + +::: + Backstage uses [Jest](https://facebook.github.io/jest/) for all our unit testing needs. @@ -185,6 +191,11 @@ loading is broken, not that the loading indicator is broken. ## Examples +For more specific examples of how to test your Backstage **backend plugins** and **modules** or **frontend plugins** you can check out the following guides: + +- [Testing Backend Plugins and Modules](../backend-system/building-plugins-and-modules/02-testing.md) +- [Testing Frontend Plugins](../frontend-system/building-plugins/02-testing.md) + ### Utility Functions A utility function is a function with no side effects. It takes in arguments and diff --git a/docs/references/index.md b/docs/references/index.md new file mode 100644 index 0000000000..abd5c99c0c --- /dev/null +++ b/docs/references/index.md @@ -0,0 +1,7 @@ +--- +id: 'index' +title: 'Package Index' +description: 'Index of all Backstage Packages' +--- + +Please use [the new API documentation](https://backstage.io/api/stable) for more information. diff --git a/docs/releases/v1.0.0.md b/docs/releases/v1.0.0.md index 6906ef8ae7..c13c57f57e 100644 --- a/docs/releases/v1.0.0.md +++ b/docs/releases/v1.0.0.md @@ -89,4 +89,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/releases/tag/v1.0.0) for this release - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.1.0.md b/docs/releases/v1.1.0.md index f484cc5b57..a55b9c8344 100644 --- a/docs/releases/v1.1.0.md +++ b/docs/releases/v1.1.0.md @@ -67,4 +67,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.1.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.10.0.md b/docs/releases/v1.10.0.md index b06ab63747..d636bd5de8 100644 --- a/docs/releases/v1.10.0.md +++ b/docs/releases/v1.10.0.md @@ -75,4 +75,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.10.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.11.0.md b/docs/releases/v1.11.0.md index ad2118c754..1e08b3234b 100644 --- a/docs/releases/v1.11.0.md +++ b/docs/releases/v1.11.0.md @@ -97,4 +97,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.11.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.12.0.md b/docs/releases/v1.12.0.md index 789be8beca..f8564166de 100644 --- a/docs/releases/v1.12.0.md +++ b/docs/releases/v1.12.0.md @@ -59,4 +59,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.12.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.13.0.md b/docs/releases/v1.13.0.md index b93920b7b1..e1806b8dfd 100644 --- a/docs/releases/v1.13.0.md +++ b/docs/releases/v1.13.0.md @@ -141,4 +141,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.13.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.14.0.md b/docs/releases/v1.14.0.md index 2c565e2519..d2d68f36d5 100644 --- a/docs/releases/v1.14.0.md +++ b/docs/releases/v1.14.0.md @@ -77,4 +77,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.14.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.15.0.md b/docs/releases/v1.15.0.md index c7ef6b33f9..0b6170a547 100644 --- a/docs/releases/v1.15.0.md +++ b/docs/releases/v1.15.0.md @@ -193,5 +193,5 @@ start using this new release. [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.16.0.md b/docs/releases/v1.16.0.md index 37a458cc32..b90274639a 100644 --- a/docs/releases/v1.16.0.md +++ b/docs/releases/v1.16.0.md @@ -84,4 +84,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.16.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.17.0.md b/docs/releases/v1.17.0.md index 36414e6608..6ed7ace5f5 100644 --- a/docs/releases/v1.17.0.md +++ b/docs/releases/v1.17.0.md @@ -69,4 +69,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.17.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.18.0.md b/docs/releases/v1.18.0.md index eb42a5f58a..88f3536dd4 100644 --- a/docs/releases/v1.18.0.md +++ b/docs/releases/v1.18.0.md @@ -130,4 +130,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.18.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.19.0.md b/docs/releases/v1.19.0.md index 49a31f32b6..c744905ec7 100644 --- a/docs/releases/v1.19.0.md +++ b/docs/releases/v1.19.0.md @@ -83,4 +83,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.19.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.2.0.md b/docs/releases/v1.2.0.md index 3751217ae4..f69f6369ca 100644 --- a/docs/releases/v1.2.0.md +++ b/docs/releases/v1.2.0.md @@ -38,7 +38,7 @@ Server-to-server authentication tokens issued from a TokenManager (specifically, ### Kubernetes -Added support for `oidc` as an auth provider for kubernetes authentication and added an optional `oidcTokenProvider` config value. This will allow users to authenticate to kubernetes clusters using ID tokens obtained from the configured auth provider in their Backstage instance. Contributed by @dbravovmw(https://github.com/dbravovmw). #11328(https://github.com/backstage/backstage/pull/11328) +Added support for `oidc` as an auth provider for kubernetes authentication and added an optional `oidcTokenProvider` config value. This will allow users to authenticate to kubernetes clusters using ID tokens obtained from the configured auth provider in their Backstage instance. Contributed by [@dbravovmw](https://github.com/dbravovmw) in [#11328](https://github.com/backstage/backstage/pull/11328) ### Misc @@ -64,4 +64,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.2.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.20.0.md b/docs/releases/v1.20.0.md index 0d0075aa41..e4a8b04cab 100644 --- a/docs/releases/v1.20.0.md +++ b/docs/releases/v1.20.0.md @@ -47,4 +47,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.20.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.21.0.md b/docs/releases/v1.21.0.md index 53e77f0021..852eb92de1 100644 --- a/docs/releases/v1.21.0.md +++ b/docs/releases/v1.21.0.md @@ -132,4 +132,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.21.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.22.0.md b/docs/releases/v1.22.0.md index 9f9295fb96..e351d9c86a 100644 --- a/docs/releases/v1.22.0.md +++ b/docs/releases/v1.22.0.md @@ -66,4 +66,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.22.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.23.0.md b/docs/releases/v1.23.0.md index 413db12988..bb8a35f454 100644 --- a/docs/releases/v1.23.0.md +++ b/docs/releases/v1.23.0.md @@ -79,4 +79,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.23.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.24.0.md b/docs/releases/v1.24.0.md index 7bb8b174e1..9b87b5b039 100644 --- a/docs/releases/v1.24.0.md +++ b/docs/releases/v1.24.0.md @@ -87,4 +87,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.24.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.25.0.md b/docs/releases/v1.25.0.md index afb765b447..037c698a17 100644 --- a/docs/releases/v1.25.0.md +++ b/docs/releases/v1.25.0.md @@ -44,4 +44,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.25.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.26.0.md b/docs/releases/v1.26.0.md index 38665ff7e5..a42450b4ce 100644 --- a/docs/releases/v1.26.0.md +++ b/docs/releases/v1.26.0.md @@ -79,4 +79,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.26.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.27.0.md b/docs/releases/v1.27.0.md index 123d9663ad..bf382bbd4d 100644 --- a/docs/releases/v1.27.0.md +++ b/docs/releases/v1.27.0.md @@ -80,4 +80,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.27.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.28.0.md b/docs/releases/v1.28.0.md index bc690fbeef..9509128546 100644 --- a/docs/releases/v1.28.0.md +++ b/docs/releases/v1.28.0.md @@ -197,6 +197,6 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.28.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. Big shoutout to all 64 of you amazing folks who chipped in on this release 🙏: [@acierto](https://github.com/acierto), [@adityak60](https://github.com/adityak60), [@adsk-mukul](https://github.com/adsk-mukul), [@alexef](https://github.com/alexef), [@andrei-ivanovici](https://github.com/andrei-ivanovici), [@anicke](https://github.com/anicke), [@aramissennyeydd](https://github.com/aramissennyeydd), [@awanlin](https://github.com/awanlin), [@benjdlambert](https://github.com/benjdlambert), [@benjidotsh](https://github.com/benjidotsh), [@bethgriggs](https://github.com/bethgriggs), [@brianphillips](https://github.com/brianphillips), [@brunobastosg](https://github.com/brunobastosg), [@camilaibs](https://github.com/camilaibs), [@cjlee01](https://github.com/cjlee01), [@cmoulliard](https://github.com/cmoulliard), [@davidfestal](https://github.com/davidfestal), [@debsmita1](https://github.com/debsmita1), [@drodil](https://github.com/drodil), [@dweber019](https://github.com/dweber019), [@elaine-mattos](https://github.com/elaine-mattos), [@erik-adsk](https://github.com/erik-adsk), [@fabian-m-95](https://github.com/fabian-m-95), [@freben](https://github.com/freben), [@grantila](https://github.com/grantila), [@huggingpixels](https://github.com/huggingpixels), [@ismailmmd](https://github.com/ismailmmd), [@jeevaramanathan](https://github.com/jeevaramanathan), [@johanhammar](https://github.com/johanhammar), [@jslott2sigma](https://github.com/jslott2sigma), [@julien-hery](https://github.com/julien-hery), [@kalleericson](https://github.com/kalleericson), [@kissmikijr](https://github.com/kissmikijr), [@kuangp](https://github.com/kuangp), [@maetis](https://github.com/maetis), [@marcpalm](https://github.com/marcpalm), [@marcuseide](https://github.com/marcuseide), [@mareklibra](https://github.com/mareklibra), [@mario-mui](https://github.com/mario-mui), [@matteosilv](https://github.com/matteosilv), [@mclarke47](https://github.com/mclarke47), [@npiyush97](https://github.com/npiyush97), [@nurbaysymbat](https://github.com/nurbaysymbat), [@parsifal-m](https://github.com/parsifal-m), [@piatkiewicz](https://github.com/piatkiewicz), [@raffitamizian](https://github.com/raffitamizian), [@rbillon59](https://github.com/rbillon59), [@rewixe](https://github.com/rewixe), [@rugvip](https://github.com/rugvip), [@ryan-hanchett](https://github.com/ryan-hanchett), [@sblausten](https://github.com/sblausten), [@snowblitzer](https://github.com/snowblitzer), [@stanislav-c](https://github.com/stanislav-c), [@stephenglass](https://github.com/stephenglass), [@stijnbrouwers](https://github.com/stijnbrouwers), [@suniljose25](https://github.com/suniljose25), [@tcardonne](https://github.com/tcardonne), [@vadave](https://github.com/vadave), [@veenarm](https://github.com/veenarm), [@vinisdl](https://github.com/vinisdl), [@vinzscam](https://github.com/vinzscam), [@waldirmontoya25](https://github.com/waldirmontoya25), [@ydayagi](https://github.com/ydayagi), [@zaperex](https://github.com/zaperex). diff --git a/docs/releases/v1.29.0.md b/docs/releases/v1.29.0.md index 5f7ed1db19..12553c3a1c 100644 --- a/docs/releases/v1.29.0.md +++ b/docs/releases/v1.29.0.md @@ -114,4 +114,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.29.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.3.0.md b/docs/releases/v1.3.0.md index 96aa88a05e..57004158cf 100644 --- a/docs/releases/v1.3.0.md +++ b/docs/releases/v1.3.0.md @@ -62,4 +62,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.3.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap), and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.30.0-changelog.md b/docs/releases/v1.30.0-changelog.md index 0af531f483..21c63a23d8 100644 --- a/docs/releases/v1.30.0-changelog.md +++ b/docs/releases/v1.30.0-changelog.md @@ -338,7 +338,7 @@ Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.30.0](https:// - b2d97fd: Fixing loading of additional config files with new `ConfigSources` - fbc7819: Use ES2022 in CLI bundler - 93095ee: Make sure node-fetch is version 2.7.0 or greater -- 6d898d8: Switched the `process` polyfill to use `require.resolve` for greater compatability. +- 6d898d8: Switched the `process` polyfill to use `require.resolve` for greater compatibility. - e53074f: Updated default backend plugin to use `RootConfigService` instead of `Config`. This also removes the dependency on `@backstage/config` as it's no longer used. - ee2b0e5: The experimental module federation build now has the ability to force the use of development versions of `react` and `react-dom` by setting the `FORCE_REACT_DEVELOPMENT` flag. - 239dffc: Remove usage of deprecated functionality from @backstage/config-loader diff --git a/docs/releases/v1.30.0-next.4-changelog.md b/docs/releases/v1.30.0-next.4-changelog.md index 433b5f894c..e3f2840121 100644 --- a/docs/releases/v1.30.0-next.4-changelog.md +++ b/docs/releases/v1.30.0-next.4-changelog.md @@ -212,7 +212,7 @@ Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.30.0-next.4](h ### Patch Changes -- 6d898d8: Switched the `process` polyfill to use `require.resolve` for greater compatability. +- 6d898d8: Switched the `process` polyfill to use `require.resolve` for greater compatibility. - 2ced236: Updated dependency `@module-federation/enhanced` to `0.3.1` - Updated dependencies - @backstage/catalog-model@1.6.0-next.0 diff --git a/docs/releases/v1.30.0.md b/docs/releases/v1.30.0.md index 0d3ad1dd5b..022dc23ba8 100644 --- a/docs/releases/v1.30.0.md +++ b/docs/releases/v1.30.0.md @@ -114,4 +114,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.30.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.31.0.md b/docs/releases/v1.31.0.md index 37b11c2b56..d622d19ce1 100644 --- a/docs/releases/v1.31.0.md +++ b/docs/releases/v1.31.0.md @@ -141,4 +141,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.31.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.32.0.md b/docs/releases/v1.32.0.md index 90011deb38..e811d939f9 100644 --- a/docs/releases/v1.32.0.md +++ b/docs/releases/v1.32.0.md @@ -157,4 +157,4 @@ Below you can find a list of links and references to help you learn about and st - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io /docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.33.0.md b/docs/releases/v1.33.0.md index c8798ea9e5..ce355b5b7d 100644 --- a/docs/releases/v1.33.0.md +++ b/docs/releases/v1.33.0.md @@ -70,4 +70,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.33.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.34.0.md b/docs/releases/v1.34.0.md index cb7b8af1f3..e0191e384f 100644 --- a/docs/releases/v1.34.0.md +++ b/docs/releases/v1.34.0.md @@ -98,4 +98,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.34.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.35.0.md b/docs/releases/v1.35.0.md index 04aba27da2..9ba3936a75 100644 --- a/docs/releases/v1.35.0.md +++ b/docs/releases/v1.35.0.md @@ -70,4 +70,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.35.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.36.0.md b/docs/releases/v1.36.0.md index 53fb25f011..dc05a479a7 100644 --- a/docs/releases/v1.36.0.md +++ b/docs/releases/v1.36.0.md @@ -99,4 +99,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.1.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.37.0.md b/docs/releases/v1.37.0.md index 8363731292..63ff100f36 100644 --- a/docs/releases/v1.37.0.md +++ b/docs/releases/v1.37.0.md @@ -99,7 +99,7 @@ There’s also some more information in the [changeset](https://github.com/backs ### New Frontend System improvements -There’s now [a `DialogApi`](https://backstage.io/docs/reference/frontend-plugin-api.dialogapi/), which greatly helps with placing dialogs in front of your users - in particular from code that lives outside the React tree, such as in callbacks. +There’s now [a `DialogApi`](https://backstage.io/api/stable/interfaces/_backstage_frontend-plugin-api.index.DialogApi.html), which greatly helps with placing dialogs in front of your users - in particular from code that lives outside the React tree, such as in callbacks. At the same time, an `EntityHeaderBlueprint` lets you specifically replace the entity page headers. You can now also group multiple entity page contents into a single tab. A tab that groups more than one entity content is rendered as a dropdown menu. You can use the default list of tab groups or create your own. Groups are sorted in the same order as they are defined in the `app-config.yaml` file. The association between an entity content and a tab group can be optionally done when creating the content extension or via the `app-config.yaml` file. See usage examples in the [#28701](https://github.com/backstage/backstage/pull/28701) and [#29043](https://github.com/backstage/backstage/pull/29043) pull requests. @@ -140,4 +140,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.37.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.38.0.md b/docs/releases/v1.38.0.md index 4d5fe1d75c..14331066d7 100644 --- a/docs/releases/v1.38.0.md +++ b/docs/releases/v1.38.0.md @@ -165,4 +165,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.38.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.39.0.md b/docs/releases/v1.39.0.md index de6903adb4..d6e388f7a8 100644 --- a/docs/releases/v1.39.0.md +++ b/docs/releases/v1.39.0.md @@ -122,4 +122,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.39.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.4.0-changelog.md b/docs/releases/v1.4.0-changelog.md index 484939f796..cd20ee2d7f 100644 --- a/docs/releases/v1.4.0-changelog.md +++ b/docs/releases/v1.4.0-changelog.md @@ -793,7 +793,7 @@ ### Minor Changes - 8798f8d93f: Introduces a new annotation `pagerduty.com/service-id` that can be used instead of the `pagerduty.com/integration-key` annotation. - _Note: If both annotations are specified on a given Entity, then the `pagerduty.com/integration-key` annotation will be prefered_ + _Note: If both annotations are specified on a given Entity, then the `pagerduty.com/integration-key` annotation will be preferred_ **BREAKING** The `PagerDutyClient.fromConfig` static method now expects a `FetchApi` compatible object and has been refactored to accept 2 arguments: config and ClientApiDependencies diff --git a/docs/releases/v1.4.0-next.0-changelog.md b/docs/releases/v1.4.0-next.0-changelog.md index c6b9fd7cf9..7e039c8c1a 100644 --- a/docs/releases/v1.4.0-next.0-changelog.md +++ b/docs/releases/v1.4.0-next.0-changelog.md @@ -45,7 +45,7 @@ ### Minor Changes - 8798f8d93f: Introduces a new annotation `pagerduty.com/service-id` that can be used instead of the `pagerduty.com/integration-key` annotation. - _Note: If both annotations are specified on a given Entity, then the `pagerduty.com/integration-key` annotation will be prefered_ + _Note: If both annotations are specified on a given Entity, then the `pagerduty.com/integration-key` annotation will be preferred_ **BREAKING** The `PagerDutyClient.fromConfig` static method now expects a `FetchApi` compatible object and has been refactored to accept 2 arguments: config and ClientApiDependencies diff --git a/docs/releases/v1.4.0.md b/docs/releases/v1.4.0.md index 9a178ea8ff..ee33a4ddab 100644 --- a/docs/releases/v1.4.0.md +++ b/docs/releases/v1.4.0.md @@ -67,4 +67,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.4.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.40.0.md b/docs/releases/v1.40.0.md index befaddfd66..b357ddf207 100644 --- a/docs/releases/v1.40.0.md +++ b/docs/releases/v1.40.0.md @@ -197,4 +197,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.40.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.41.0.md b/docs/releases/v1.41.0.md index 2e16e9ffba..8cb7b12de5 100644 --- a/docs/releases/v1.41.0.md +++ b/docs/releases/v1.41.0.md @@ -99,4 +99,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.41.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.42.0.md b/docs/releases/v1.42.0.md index 4fe52f7a77..14a3fe4181 100644 --- a/docs/releases/v1.42.0.md +++ b/docs/releases/v1.42.0.md @@ -65,4 +65,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.42.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.43.0.md b/docs/releases/v1.43.0.md index 449023d167..09dac1c32e 100644 --- a/docs/releases/v1.43.0.md +++ b/docs/releases/v1.43.0.md @@ -87,4 +87,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.43.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.44.0.md b/docs/releases/v1.44.0.md index c57708a8ec..3dc313fc2d 100644 --- a/docs/releases/v1.44.0.md +++ b/docs/releases/v1.44.0.md @@ -138,4 +138,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.44.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.45.0.md b/docs/releases/v1.45.0.md index 2afc9e7c35..d2d1ae948b 100644 --- a/docs/releases/v1.45.0.md +++ b/docs/releases/v1.45.0.md @@ -69,4 +69,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.45.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.46.0.md b/docs/releases/v1.46.0.md index 015d833cfc..6e42ff84ed 100644 --- a/docs/releases/v1.46.0.md +++ b/docs/releases/v1.46.0.md @@ -37,7 +37,7 @@ If you run tests using the Backstage CLI, you must therefore add Jest and its en You can choose to install either Jest 29 or Jest 30. The built-in Jest version before this change was Jest 29, however, we recommend that you switch to Jest 30. Upgrading will solve the `Could not parse CSS stylesheet` errors, allow you to use MSW v2 in web packages, and ensure that you remain compatible with future versions of the Backstage CLI. Support for Jest 29 is temporary, with the purpose of allowing you to upgrade at your own pace, but it will eventually be removed. - **Jest 29**: Install `jest@^29` and `jest-environment-jsdom@^29` in your root `package.json`. No migration needed, but you may see `Could not parse CSS stylesheet` warnings/errors when testing components from `@backstage/ui` or other packages using CSS `@layer` declarations. -- **Jest 30**: Install `jest@^30`, `@jest/environment-jsdom-abstract@^30`, and `jsdom@^27` in your root `package.json`. Fixes the stylesheet parsing warnings/errors, but requires migration steps. +- **Jest 30**: Install `jest@^30`, `@types/jest@^30`, `@jest/environment-jsdom-abstract@^30`, and `jsdom@^27` in your root `package.json`. Fixes the stylesheet parsing warnings/errors, but requires migration steps. See the [Jest 30 migration guide](https://backstage.io/docs/tutorials/jest30-migration) for detailed migration instructions. @@ -126,4 +126,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.46.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://info.backstage.spotify.com/newsletter_subscribe) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.47.0-changelog.md b/docs/releases/v1.47.0-changelog.md new file mode 100644 index 0000000000..d71078327c --- /dev/null +++ b/docs/releases/v1.47.0-changelog.md @@ -0,0 +1,1467 @@ +# Release v1.47.0 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.47.0](https://backstage.github.io/upgrade-helper/?to=1.47.0) + +## @backstage/backend-defaults@0.15.0 + +### Minor Changes + +- 6fc00e6: Added action filtering support with glob patterns and attribute constraints. + + The `ActionsService` now supports filtering actions based on configuration. This allows controlling which actions are exposed to consumers like the MCP backend. + + Configuration example: + + ```yaml + backend: + actions: + pluginSources: + - catalog + - scaffolder + filter: + include: + - id: 'catalog:*' + attributes: + destructive: false + - id: 'scaffolder:*' + exclude: + - id: '*:delete-*' + - attributes: + readOnly: false + ``` + + Filtering logic: + + - `include`: Rules for actions to include. Each rule can specify an `id` glob pattern and/or `attributes` constraints. An action must match at least one rule to be included. If no include rules are specified, all actions are included by default. + - `exclude`: Rules for actions to exclude. Takes precedence over include rules. + - Each rule combines `id` and `attributes` with AND logic (both must match if specified). + +- 27f9061: **BREAKING**: The constructor for `FetchUrlReader` is now private. If you have to construct an instance of it, please use `FetchUrlReader.fromConfig` instead. + +- 27f9061: **BREAKING**: `coreServices.urlReader` now validates that redirect chains are subject to the allow list in `reading.allow` of your app config. If you were relying on redirects that pointed to URLs that were not allowlisted, you will now have to add those to your config as well. + + Example: + + ```diff + backend: + reading: + allow: + - host: example.com + + - host: storage-api.example.com + ``` + +### Patch Changes + +- 3afeab4: Implementing `readTree` for `GoogleGcsReader` +- c641c14: Wrap some of the action logic with `resolveSafeChildPath` and improve symlink handling when fetching remote and local files +- 7126bf2: Fixed a spelling mistake in root health service shutdown response. +- 872eb91: Upgrade `zod-to-json-schema` to latest version +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/backend-app-api@1.4.1 + - @backstage/integration@1.19.2 + - @backstage/plugin-auth-node@0.6.11 + - @backstage/plugin-permission-node@0.10.8 + +## @backstage/frontend-app-api@0.14.0 + +### Minor Changes + +- 3bd2a1a: BREAKING: The ability for plugins to override APIs has been restricted to only allow overrides of APIs within the same plugin. For example, a plugin can no longer override any of the core APIs provided by the `app` plugin, this must be done with an `app` module instead. + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/frontend-defaults@0.3.5 + +## @backstage/ui@0.11.0 + +### Minor Changes + +- 243e5e7: **BREAKING**: Redesigned Table component with new `useTable` hook API. + + - The `Table` component (React Aria wrapper) is renamed to `TableRoot` + - New high-level `Table` component that handles data display, pagination, sorting, and selection + - The `useTable` hook is completely redesigned with a new API supporting three pagination modes (complete, offset, cursor) + - New types: `ColumnConfig`, `TableProps`, `TableItem`, `UseTableOptions`, `UseTableResult` + + New features include unified pagination modes, debounced query changes, stale data preservation during reloads, and row selection with toggle/replace behaviors. + + **Migration guide:** + + 1. Update imports and use the new `useTable` hook: + + ```diff + -import { Table, useTable } from '@backstage/ui'; + -const { data, paginationProps } = useTable({ data: items, pagination: {...} }); + +import { Table, useTable, type ColumnConfig } from '@backstage/ui'; + +const { tableProps } = useTable({ + + mode: 'complete', + + getData: () => items, + +}); + ``` + + 2. Define columns and render with the new Table API: + + ```diff + -
    + - ... + - ... + -
    + - + +const columns: ColumnConfig[] = [ + + { id: 'name', label: 'Name', isRowHeader: true, cell: item => }, + + { id: 'type', label: 'Type', cell: item => }, + +]; + + + + + ``` + + Affected components: Table, TableRoot, TablePagination + +- 95246eb: **Breaking** Updating color tokens to match the new neutral style on different surfaces. + + ## Migration notes + + There's no direct replacement for the old tint tokens but you can use the new neutral set of color tokens on surface 0 or 1 as a replacement. + + - `--bui-bg-tint` can be replaced by `--bui-bg-neutral-on-surface-0` + - `--bui-bg-tint-hover` can be replaced by `--bui-bg-neutral-on-surface-0-hover` + - `--bui-bg-tint-pressed` can be replaced by `--bui-bg-neutral-on-surface-0-pressed` + - `--bui-bg-tint-disabled` can be replaced by `--bui-bg-neutral-on-surface-0-disabled` + +- ea0c6d8: Introduce new `ToggleButton` & `ToggleButtonGroup` components in Backstage UI + +- 4ea1d15: **BREAKING**: Renamed CSS variable `--bui-bg` to `--bui-bg-surface-0` for consistency. + +### Patch Changes + +- 1880402: Fixes app background color on dark mode. + +- d2fdded: Added indeterminate state support to the Checkbox component for handling partial selection scenarios like table header checkboxes. + + Affected components: Checkbox + +- 4fb15d2: Added missing `aria-label` attributes to `SearchField` components in `Select`, `MenuAutocomplete`, and `MenuAutocompleteListbox` to fix accessibility warnings. + + Affected components: Select, MenuAutocomplete, MenuAutocompleteListbox + +- 21c87cc: Fixes disabled state in primary and secondary buttons in Backstage UI. + +- 9c76682: build(deps-dev): bump `storybook` from 10.1.9 to 10.1.10 + +- de80336: Fixed disabled tertiary buttons incorrectly showing hover effects on surfaces. + +- 133d5c6: Added new Popover component for Backstage UI with automatic overflow handling, and full placement support. Also introduced `--bui-shadow` token for consistent elevation styling across overlay components (Popover, Tooltip, Menu). + +- 973c839: Fixed Table sorting indicator not being visible when a column is actively sorted. + + Affected components: Table, Column + +- df40cfc: Fixed Menu component trigger button not toggling correctly. Removed custom click-outside handler that was interfering with React Aria's built-in state management, allowing the menu to properly open and close when clicking the trigger button. + +- b01ab96: Added support for column width configuration in Table component. Columns now accept `width`, `defaultWidth`, `minWidth`, and `maxWidth` props for responsive layout control. + + Affected components: Table, Column + +- b4a4911: Fixed SearchField `startCollapsed` prop not working correctly in Backstage UI. The field now properly starts in a collapsed state, expands when clicked and focused, and collapses back when unfocused with no input. Also fixed CSS logic to work correctly in all layout contexts (flex row, flex column, and regular containers). + + Affected components: SearchField + +- b3253b6: Fixed `Link` component causing hard page refreshes for internal routes. The component now properly uses React Router's navigation instead of full page reloads. + +- fe7fe69: Added support for custom pagination options in `useTable` hook and `Table` component. You can now configure `pageSizeOptions` to customize the page size dropdown, and hook into pagination events via `onPageSizeChange`, `onNextPage`, and `onPreviousPage` callbacks. When `pageSize` doesn't match any option, the first option is used and a warning is logged. + + Affected components: Table, TablePagination + +- cfac8a4: Fixed missing border styles on table selection cells in multi-select mode. + + Affected components: Table + +- 2532d2a: Added `className` and `style` props to the `Table` component. + + Affected components: Table + +## @backstage/plugin-app-react@0.1.0 + +### Minor Changes + +- 9ccf84e: Initial release of this web library for `@backstage/plugin-app`. + +### Patch Changes + +- 9ccf84e: Moved the following blueprints from `@backstage/frontend-plugin-api`: + + - `AppRootWrapperBlueprint` + - `IconBundleBlueprint` + - `NavContentBlueprint` + - `RouterBlueprint` + - `SignInPageBlueprint` + - `SwappableComponentBlueprint` + - `ThemeBlueprint` + - `TranslationBlueprint` + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + +## @backstage/plugin-auth-backend@0.26.0 + +### Minor Changes + +- 7ffc873: Fix `user_created_at` migration causing `SQLiteError` regarding use of non-constants for defaults + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-auth-node@0.6.11 + +## @backstage/plugin-devtools-react@0.1.0 + +### Minor Changes + +- be6cef5: Add support for adding `unprocessed-entities` and other tabs to `devtools` when using the New Frontend system + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + +## @backstage/plugin-events-backend-module-kafka@0.3.0 + +### Minor Changes + +- ef5bbd8: Add support for Kafka offset configuration (`fromBeginning`) and `autoCommit` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + +## @backstage/plugin-home@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 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.3.0 + +### Minor Changes + +- ab606b2: Add ability to configure the API Base URL + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-scaffolder-node@0.12.3 + +## @backstage/plugin-techdocs-node@1.14.0 + +### Minor Changes + +- 63c459c: **BREAKING:** It's now possible to use the credentials from the `integrations.awsS3` config to authenticate with AWS S3. The new priority is: + + 1. `aws.accounts` + 2. `techdocs.publisher.awsS3.credentials` + 3. `integrations.awsS3` + 4. Default credential chain + + In case of multiple `integrations.awsS3` are present, the target integration is determined by the `accessKeyId` in `techdocs.publisher.awsS3.credentials` if provided. Otherwise, the default credential chain is used. + + This means that depending on your setup, this feature may break your existing setup. + In general: + + - if you are configuring `aws.accounts`, no action is required + - if you are configuring `techdocs.publisher.awsS3.credentials`, no action is required + - if you are configuring multiple integrations under `integrations.awsS3`, no action is required + - if you are configuring a single integration under `integrations.awsS3`, make sure that the integration has access to the bucket you are using for TechDocs + +### Patch Changes + +- f0951aa: Updated the `defaultDockerImage` to reflect the latest TechDocs Container version of v1.2.8 +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/integration@1.19.2 + +## @backstage/app-defaults@1.7.4 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5 + +## @backstage/backend-app-api@1.4.1 + +### Patch Changes + +- 04db26b: Clean up process event listeners on backend stop to prevent leaks +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + +## @backstage/backend-dynamic-feature-service@0.7.8 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/backend-plugin-api@1.6.1 + - @backstage/cli-common@0.1.17 + - @backstage/plugin-app-node@0.1.41 + - @backstage/plugin-scaffolder-node@0.12.3 + - @backstage/backend-openapi-utils@0.6.5 + - @backstage/plugin-auth-node@0.6.11 + - @backstage/plugin-permission-common@0.9.4 + - @backstage/plugin-permission-node@0.10.8 + - @backstage/plugin-catalog-backend@3.3.1 + - @backstage/plugin-events-backend@0.5.10 + +## @backstage/backend-openapi-utils@0.6.5 + +### Patch Changes + +- 6678b78: Internal update to use native feature from our request validation library for handling base path determination. +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + +## @backstage/backend-plugin-api@1.6.1 + +### Patch Changes + +- ae4dd5d: Move some of the symlink resolution to `isChildPath` +- Updated dependencies + - @backstage/cli-common@0.1.17 + - @backstage/plugin-auth-node@0.6.11 + - @backstage/plugin-permission-common@0.9.4 + - @backstage/plugin-permission-node@0.10.8 + +## @backstage/backend-test-utils@1.10.3 + +### Patch Changes + +- 872eb91: Upgrade `zod-to-json-schema` to latest version +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/backend-plugin-api@1.6.1 + - @backstage/backend-app-api@1.4.1 + - @backstage/plugin-auth-node@0.6.11 + - @backstage/plugin-permission-common@0.9.4 + +## @backstage/cli@0.35.2 + +### Patch Changes + +- 320c6a9: Bump `@swc/core` to support `ES2023` and `ES2024` +- c0d7bf6: Added `--include` and `--format` options to `backstage-cli info` command for including additional packages via glob patterns and outputting as JSON or Text. +- f6a5d2f: Fixed CSS module class name collisions when running multiple versions of packages simultaneously by using content-based hashing for class name generation. +- 140cbc2: Added `@backstage/backend-test-utils` to backend package templates. +- 4eeba9e: Upgrade `zod-validation-error` to version 4 +- 9ee5996: Bump minimum required `@swc/core` to avoid transpilation bug +- Updated dependencies + - @backstage/cli-common@0.1.17 + - @backstage/integration@1.19.2 + +## @backstage/cli-common@0.1.17 + +### Patch Changes + +- ae4dd5d: Move some of the symlink resolution to `isChildPath` + +## @backstage/core-compat-api@0.5.6 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/plugin-catalog-react@1.21.5 + +## @backstage/core-components@0.18.5 + +### Patch Changes + +- a723b8a: The MarkdownContent component now handles HTML content the same way as GitHub when rendering GitHub-flavored Markdown +- c671db9: Fixed bug in Table component where the toolbar layout would break when both a title and filters were present. +- 55a9dc2: Update colour token again in ItemCardHeader to respect theme definition. + +## @backstage/create-app@0.7.8 + +### Patch Changes + +- fea3e39: Bumped create-app version. +- 9f1ee3e: Bumped create-app version. +- 880310b: Bumped create-app version. +- f1fe6fe: Updated Dockerfile to use Node 24 and Debian Trixie +- Updated dependencies + - @backstage/cli-common@0.1.17 + +## @backstage/dev-utils@1.1.19 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0 + - @backstage/core-components@0.18.5 + - @backstage/app-defaults@1.7.4 + - @backstage/integration-react@1.2.14 + - @backstage/plugin-catalog-react@1.21.5 + +## @backstage/frontend-defaults@0.3.5 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + - @backstage/plugin-app@0.3.4 + - @backstage/frontend-app-api@0.14.0 + +## @backstage/frontend-plugin-api@0.13.3 + +### Patch Changes + +- 3bd2a1a: Updated documentation for `createApiRef` to clarify the role of the ID in specifying the owning plugin of an API. + +- 9ccf84e: The following blueprints are being restricted to only be used in app plugin overrides and modules. They are being moved to the `@backstage/plugin-app-react` package and have been deprecated: + + - `AppRootWrapperBlueprint` + - `IconBundleBlueprint` + - `NavContentBlueprint` + - `RouterBlueprint` + - `SignInPageBlueprint` + - `SwappableComponentBlueprint` + - `ThemeBlueprint` + - `TranslationBlueprint` + +- 4554a4e: Added an alpha `PluginWrapperBlueprint` exported from `@backstage/frontend-plugin-api/alpha`, which can install components that will wrap all plugin elements. + +- 872eb91: Upgrade `zod-to-json-schema` to latest version + +## @backstage/frontend-test-utils@0.4.3 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/plugin-app@0.3.4 + - @backstage/frontend-app-api@0.14.0 + +## @backstage/integration@1.19.2 + +### Patch Changes + +- 3afeab4: Implementing `ScmIntegration` for `GoogleGcs` +- 9083273: Rollback the lowercase replacing in GitHub integration config + +## @backstage/integration-react@1.2.14 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2 + +## @backstage/repo-tools@0.16.2 + +### Patch Changes + +- 498f9dd: Fixed help text for `backstage-repo-tools package schema openapi generate` command. +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/cli-common@0.1.17 + +## @techdocs/cli@1.10.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/cli-common@0.1.17 + - @backstage/plugin-techdocs-node@1.14.0 + +## @backstage/plugin-api-docs@0.13.3 + +### Patch Changes + +- 0216090: Updated dependency `@types/swagger-ui-react` to `^5.0.0`. +- abeba2b: Fix types with new bumped dependency +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/plugin-catalog@1.32.2 + - @backstage/core-components@0.18.5 + - @backstage/plugin-catalog-react@1.21.5 + +## @backstage/plugin-app@0.3.4 + +### Patch Changes + +- 4554a4e: Implemented support for the new `PluginWrapperBlueprint` from `@backstage/frontend-plugin-api/alpha`. + +- 9ccf84e: The following blueprints are being restricted to only be used in app plugin overrides and modules. They will now produce a deprecation warning when used outside of the app plugin: + + - `AppRootWrapperBlueprint` + - `IconBundleBlueprint` + - `NavContentBlueprint` + - `RouterBlueprint` + - `SignInPageBlueprint` + - `SwappableComponentBlueprint` + - `ThemeBlueprint` + - `TranslationBlueprint` + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/plugin-app-react@0.1.0 + - @backstage/core-components@0.18.5 + - @backstage/integration-react@1.2.14 + +## @backstage/plugin-app-backend@0.5.10 + +### Patch Changes + +- 9ccf84e: Updated plugin metadata. +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-app-node@0.1.41 + - @backstage/plugin-auth-node@0.6.11 + +## @backstage/plugin-app-node@0.1.41 + +### Patch Changes + +- 9ccf84e: Updated plugin metadata. +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + +## @backstage/plugin-app-visualizer@0.1.27 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0 + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + +## @backstage/plugin-auth@0.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + +## @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.11 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-auth-backend@0.26.0 + - @backstage/plugin-auth-node@0.6.11 + +## @backstage/plugin-auth-backend-module-oidc-provider@0.4.11 + +### Patch Changes + +- e54fcb2: Added support for custom start URL search parameters (with the new `startUrlSearchParams` config property) +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-auth-backend@0.26.0 + - @backstage/plugin-auth-node@0.6.11 + +## @backstage/plugin-auth-node@0.6.11 + +### Patch Changes + +- 4eeba9e: Upgrade `zod-validation-error` to version 4 +- 872eb91: Upgrade `zod-to-json-schema` to latest version +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + +## @backstage/plugin-auth-react@0.1.23 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5 + +## @backstage/plugin-bitbucket-cloud-common@0.3.6 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2 + +## @backstage/plugin-catalog@1.32.2 + +### Patch Changes + +- 7ca91e8: Header in EntityLayout should always be shown. + Monitoring the loading status caused flickering when the refresh() method of the Async Entity was invoked. +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + - @backstage/core-compat-api@0.5.6 + - @backstage/plugin-search-react@1.10.2 + - @backstage/integration-react@1.2.14 + - @backstage/plugin-catalog-react@1.21.5 + - @backstage/plugin-scaffolder-common@1.7.5 + - @backstage/plugin-techdocs-react@1.3.7 + +## @backstage/plugin-catalog-backend@3.3.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/integration@1.19.2 + - @backstage/backend-openapi-utils@0.6.5 + - @backstage/plugin-permission-common@0.9.4 + - @backstage/plugin-permission-node@0.10.8 + +## @backstage/plugin-catalog-backend-module-aws@0.4.19 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/backend-plugin-api@1.6.1 + - @backstage/integration@1.19.2 + +## @backstage/plugin-catalog-backend-module-azure@0.3.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/integration@1.19.2 + +## @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.10 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/backend-openapi-utils@0.6.5 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.5.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/integration@1.19.2 + - @backstage/plugin-bitbucket-cloud-common@0.3.6 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.5.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/integration@1.19.2 + +## @backstage/plugin-catalog-backend-module-gerrit@0.3.10 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/integration@1.19.2 + +## @backstage/plugin-catalog-backend-module-gitea@0.1.8 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/integration@1.19.2 + +## @backstage/plugin-catalog-backend-module-github@0.12.1 + +### Patch Changes + +- cb4b907: Improved efficiency of `GithubOrgEntityProvider` membership event handling and edit team. The provider now fetches only the specific user's teams instead of all organization users when processing membership events, and uses `addEntitiesOperation` instead of `replaceEntitiesOperation` to avoid unnecessary entity deletions. +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/integration@1.19.2 + +## @backstage/plugin-catalog-backend-module-github-org@0.3.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-catalog-backend-module-github@0.12.1 + +## @backstage/plugin-catalog-backend-module-gitlab@0.7.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/backend-plugin-api@1.6.1 + - @backstage/integration@1.19.2 + +## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.17 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-catalog-backend-module-gitlab@0.7.7 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.7.8 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-permission-common@0.9.4 + - @backstage/plugin-catalog-backend@3.3.1 + +## @backstage/plugin-catalog-backend-module-logs@0.1.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-catalog-backend@3.3.1 + +## @backstage/plugin-catalog-backend-module-msgraph@0.8.4 + +### Patch Changes + +- 115b378: Changed the logger level from 'warning' to 'debug' when we are unable to load the user's photo. +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + +## @backstage/plugin-catalog-backend-module-openapi@0.2.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/integration@1.19.2 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.2.18 + +### Patch Changes + +- a307700: Fixed crash when `latest_report_status` is undefined +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.16 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-scaffolder-common@1.7.5 + +## @backstage/plugin-catalog-graph@0.5.6 + +### Patch Changes + +- 5c49a00: Update for the `qs` library bump: the old array limit setting has changed to be more strict; you can no longer just give a zero to mean unlimited. So we choose an arbitrary high value, to at least go higher than the default 20. +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + - @backstage/plugin-catalog-react@1.21.5 + +## @backstage/plugin-catalog-import@0.13.9 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + - @backstage/integration@1.19.2 + - @backstage/integration-react@1.2.14 + - @backstage/plugin-catalog-react@1.21.5 + +## @backstage/plugin-catalog-react@1.21.5 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + - @backstage/plugin-permission-common@0.9.4 + - @backstage/core-compat-api@0.5.6 + - @backstage/frontend-test-utils@0.4.3 + - @backstage/integration-react@1.2.14 + +## @backstage/plugin-catalog-unprocessed-entities@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 + +## @backstage/plugin-config-schema@0.1.76 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5 + +## @backstage/plugin-devtools@0.1.35 + +### 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/plugin-devtools-common@0.1.21 + - @backstage/core-compat-api@0.5.6 + +## @backstage/plugin-devtools-backend@0.5.13 + +### Patch Changes + +- be6cef5: Add support for adding `unprocessed-entities` and other tabs to `devtools` when using the New Frontend system +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/backend-plugin-api@1.6.1 + - @backstage/cli-common@0.1.17 + - @backstage/plugin-devtools-common@0.1.21 + - @backstage/plugin-permission-common@0.9.4 + - @backstage/plugin-permission-node@0.10.8 + +## @backstage/plugin-devtools-common@0.1.21 + +### Patch Changes + +- be6cef5: Add support for adding `unprocessed-entities` and other tabs to `devtools` when using the New Frontend system +- Updated dependencies + - @backstage/plugin-permission-common@0.9.4 + +## @backstage/plugin-events-backend@0.5.10 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/backend-openapi-utils@0.6.5 + +## @backstage/plugin-events-backend-module-github@0.4.8 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/integration@1.19.2 + +## @backstage/plugin-home-react@0.1.34 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + +## @backstage/plugin-kubernetes@0.12.15 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + - @backstage/plugin-catalog-react@1.21.5 + - @backstage/plugin-kubernetes-react@0.5.15 + +## @backstage/plugin-kubernetes-cluster@0.0.33 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5 + - @backstage/plugin-catalog-react@1.21.5 + - @backstage/plugin-kubernetes-react@0.5.15 + +## @backstage/plugin-kubernetes-react@0.5.15 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5 + +## @backstage/plugin-mcp-actions-backend@0.1.7 + +### Patch Changes + +- 4d82a35: build(deps): bump `@modelcontextprotocol/sdk` from 1.24.3 to 1.25.2 +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/backend-plugin-api@1.6.1 + +## @backstage/plugin-mui-to-bui@0.2.3 + +### Patch Changes + +- f157f43: Fix installation command +- e4a1180: Updated tokens from `--bui-bg` to `--bui-bg-surface-0` +- Updated dependencies + - @backstage/ui@0.11.0 + - @backstage/frontend-plugin-api@0.13.3 + +## @backstage/plugin-notifications@0.5.13 + +### Patch Changes + +- 4452d15: Added i18n support. +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + +## @backstage/plugin-org@0.6.48 + +### Patch Changes + +- db3cfd7: Adds the Resource kind to the `useGetEntities` fallback so that Resources are included by default when no specific kinds are provided in the group ownership card. +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + - @backstage/plugin-catalog-react@1.21.5 + +## @backstage/plugin-org-react@0.1.46 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5 + - @backstage/plugin-catalog-react@1.21.5 + +## @backstage/plugin-permission-common@0.9.4 + +### Patch Changes + +- 872eb91: Upgrade `zod-to-json-schema` to latest version + +## @backstage/plugin-permission-node@0.10.8 + +### Patch Changes + +- 872eb91: Upgrade `zod-to-json-schema` to latest version +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-auth-node@0.6.11 + - @backstage/plugin-permission-common@0.9.4 + +## @backstage/plugin-scaffolder@1.35.1 + +### Patch Changes + +- 9d75495: Fixed bug in RepoUrlPickerComponent component where repository names were not being autocompleted. +- 872eb91: Upgrade `zod-to-json-schema` to latest version +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + - @backstage/integration@1.19.2 + - @backstage/plugin-scaffolder-react@1.19.5 + - @backstage/integration-react@1.2.14 + - @backstage/plugin-catalog-react@1.21.5 + - @backstage/plugin-scaffolder-common@1.7.5 + - @backstage/plugin-techdocs-react@1.3.7 + +## @backstage/plugin-scaffolder-backend@3.1.1 + +### Patch Changes + +- 5012852: Remove unused abort controller in debug:wait action +- c641c14: Wrap some of the action logic with `resolveSafeChildPath` and improve symlink handling when fetching remote and local files +- 27f9061: REwrite] +- 872eb91: Upgrade `zod-to-json-schema` to latest version +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-scaffolder-node@0.12.3 + - @backstage/integration@1.19.2 + - @backstage/backend-openapi-utils@0.6.5 + - @backstage/plugin-scaffolder-backend-module-github@0.9.4 + - @backstage/plugin-auth-node@0.6.11 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.17 + - @backstage/plugin-permission-common@0.9.4 + - @backstage/plugin-permission-node@0.10.8 + - @backstage/plugin-bitbucket-cloud-common@0.3.6 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.16 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.18 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.17 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.17 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.17 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.11.1 + - @backstage/plugin-scaffolder-common@1.7.5 + +## @backstage/plugin-scaffolder-backend-module-azure@0.2.17 + +### Patch Changes + +- 88abcc6: Improved README with clearer setup and usage guidance. +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-scaffolder-node@0.12.3 + - @backstage/integration@1.19.2 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-scaffolder-node@0.12.3 + - @backstage/integration@1.19.2 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.17 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-scaffolder-node@0.12.3 + - @backstage/integration@1.19.2 + - @backstage/plugin-bitbucket-cloud-common@0.3.6 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.17 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-scaffolder-node@0.12.3 + - @backstage/integration@1.19.2 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.17 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-scaffolder-node@0.12.3 + - @backstage/integration@1.19.2 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.19 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-scaffolder-node@0.12.3 + - @backstage/integration@1.19.2 + +## @backstage/plugin-scaffolder-backend-module-gcp@0.2.17 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-scaffolder-node@0.12.3 + - @backstage/integration@1.19.2 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.17 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-scaffolder-node@0.12.3 + - @backstage/integration@1.19.2 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.2.17 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-scaffolder-node@0.12.3 + - @backstage/integration@1.19.2 + +## @backstage/plugin-scaffolder-backend-module-github@0.9.4 + +### Patch Changes + +- bb7088b: Added options to set [workflow access level][access-level] for repositories to `github:repo:create` + + This is useful when creating repositories for GitHub Actions to manage access + to the workflows during creation. + + ```diff + - action: github:repo:create + id: create-repo + input: + repoUrl: github.com?owner=owner&repo=repo + visibility: private + + workflowAccess: organization + ``` + + [access-level]: https://docs.github.com/en/rest/actions/permissions?apiVersion=2022-11-28#set-the-level-of-access-for-workflows-outside-of-the-repository + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-scaffolder-node@0.12.3 + - @backstage/integration@1.19.2 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.11.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-scaffolder-node@0.12.3 + - @backstage/integration@1.19.2 + +## @backstage/plugin-scaffolder-backend-module-notifications@0.1.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-scaffolder-node@0.12.3 + +## @backstage/plugin-scaffolder-backend-module-rails@0.5.17 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-scaffolder-node@0.12.3 + - @backstage/integration@1.19.2 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-scaffolder-node@0.12.3 + - @backstage/plugin-scaffolder-node-test-utils@0.3.7 + +## @backstage/plugin-scaffolder-common@1.7.5 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2 + - @backstage/plugin-permission-common@0.9.4 + +## @backstage/plugin-scaffolder-node@0.12.3 + +### Patch Changes + +- c641c14: Wrap some of the action logic with `resolveSafeChildPath` and improve symlink handling when fetching remote and local files +- 27f9061: REwrite] +- 872eb91: Upgrade `zod-to-json-schema` to latest version +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/integration@1.19.2 + - @backstage/plugin-permission-common@0.9.4 + - @backstage/plugin-scaffolder-common@1.7.5 + +## @backstage/plugin-scaffolder-node-test-utils@0.3.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-scaffolder-node@0.12.3 + - @backstage/backend-test-utils@1.10.3 + +## @backstage/plugin-scaffolder-react@1.19.5 + +### Patch Changes + +- 872eb91: Upgrade `zod-to-json-schema` to latest version +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + - @backstage/plugin-catalog-react@1.21.5 + - @backstage/plugin-scaffolder-common@1.7.5 + +## @backstage/plugin-search@1.5.3 + +### Patch Changes + +- 5c49a00: Update for the `qs` library bump: the old array limit setting has changed to be more strict; you can no longer just give a zero to mean unlimited. So we choose an arbitrary high value, to at least go higher than the default 20. +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + - @backstage/plugin-search-react@1.10.2 + - @backstage/plugin-catalog-react@1.21.5 + +## @backstage/plugin-search-backend@2.0.10 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/backend-plugin-api@1.6.1 + - @backstage/backend-openapi-utils@0.6.5 + - @backstage/plugin-permission-common@0.9.4 + - @backstage/plugin-permission-node@0.10.8 + +## @backstage/plugin-search-backend-module-techdocs@0.4.10 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-techdocs-node@1.14.0 + - @backstage/plugin-permission-common@0.9.4 + +## @backstage/plugin-search-react@1.10.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + +## @backstage/plugin-signals@0.0.27 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + +## @backstage/plugin-techdocs@1.16.2 + +### Patch Changes + +- 0afb8a6: Corrected color of some elements such as Grid cards and Tables. +- 94ff7ab: Code block "Copy to clipboard" button was not positioned correctly for docs built with `mkdocs-material>=9.7` +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + - @backstage/integration@1.19.2 + - @backstage/plugin-search-react@1.10.2 + - @backstage/integration-react@1.2.14 + - @backstage/plugin-auth-react@0.1.23 + - @backstage/plugin-catalog-react@1.21.5 + - @backstage/plugin-techdocs-react@1.3.7 + +## @backstage/plugin-techdocs-addons-test-utils@2.0.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.32.2 + - @backstage/plugin-techdocs@1.16.2 + - @backstage/plugin-search-react@1.10.2 + - @backstage/integration-react@1.2.14 + - @backstage/plugin-catalog-react@1.21.5 + - @backstage/plugin-techdocs-react@1.3.7 + +## @backstage/plugin-techdocs-backend@2.1.4 + +### Patch Changes + +- b6ff2a5: Some AWS `publisher` config options such as `region`, `endpoint`, `accountId` are now marked as `@visibility backend` instead of `secret`. +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/backend-plugin-api@1.6.1 + - @backstage/integration@1.19.2 + - @backstage/plugin-techdocs-node@1.14.0 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.32 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + - @backstage/integration@1.19.2 + - @backstage/integration-react@1.2.14 + - @backstage/plugin-techdocs-react@1.3.7 + +## @backstage/plugin-techdocs-react@1.3.7 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + +## @backstage/plugin-user-settings@0.8.31 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + - @backstage/plugin-catalog-react@1.21.5 + +## @backstage/plugin-user-settings-backend@0.3.10 + +### Patch Changes + +- ad01e54: Resolves an issue where user setting keys containing slashes returned 404 not found. +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-auth-node@0.6.11 + +## example-app@0.2.117 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0 + - @backstage/plugin-catalog@1.32.2 + - @backstage/plugin-home@0.9.0 + - @backstage/cli@0.35.2 + - @backstage/core-components@0.18.5 + - @backstage/plugin-org@0.6.48 + - @backstage/plugin-mui-to-bui@0.2.3 + - @backstage/plugin-notifications@0.5.13 + - @backstage/frontend-app-api@0.14.0 + - @backstage/plugin-api-docs@0.13.3 + - @backstage/plugin-techdocs@1.16.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.25 + - @backstage/plugin-devtools@0.1.35 + - @backstage/plugin-scaffolder@1.35.1 + - @backstage/plugin-catalog-graph@0.5.6 + - @backstage/plugin-search@1.5.3 + - @backstage/plugin-scaffolder-react@1.19.5 + - @backstage/plugin-search-react@1.10.2 + - @backstage/app-defaults@1.7.4 + - @backstage/integration-react@1.2.14 + - @backstage/plugin-auth-react@0.1.23 + - @backstage/plugin-catalog-import@0.13.9 + - @backstage/plugin-catalog-react@1.21.5 + - @backstage/plugin-kubernetes@0.12.15 + - @backstage/plugin-kubernetes-cluster@0.0.33 + - @backstage/plugin-signals@0.0.27 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.32 + - @backstage/plugin-techdocs-react@1.3.7 + - @backstage/plugin-user-settings@0.8.31 + +## example-app-next@0.0.31 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0 + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/plugin-catalog@1.32.2 + - @backstage/plugin-home@0.9.0 + - @backstage/cli@0.35.2 + - @backstage/core-components@0.18.5 + - @backstage/plugin-org@0.6.48 + - @backstage/plugin-app@0.3.4 + - @backstage/plugin-notifications@0.5.13 + - @backstage/frontend-app-api@0.14.0 + - @backstage/plugin-api-docs@0.13.3 + - @backstage/plugin-techdocs@1.16.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.25 + - @backstage/plugin-devtools@0.1.35 + - @backstage/plugin-scaffolder@1.35.1 + - @backstage/plugin-catalog-graph@0.5.6 + - @backstage/plugin-search@1.5.3 + - @backstage/plugin-scaffolder-react@1.19.5 + - @backstage/core-compat-api@0.5.6 + - @backstage/frontend-defaults@0.3.5 + - @backstage/plugin-search-react@1.10.2 + - @backstage/app-defaults@1.7.4 + - @backstage/integration-react@1.2.14 + - @backstage/plugin-app-visualizer@0.1.27 + - @backstage/plugin-auth@0.1.4 + - @backstage/plugin-auth-react@0.1.23 + - @backstage/plugin-catalog-import@0.13.9 + - @backstage/plugin-catalog-react@1.21.5 + - @backstage/plugin-kubernetes@0.12.15 + - @backstage/plugin-kubernetes-cluster@0.0.33 + - @backstage/plugin-signals@0.0.27 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.32 + - @backstage/plugin-techdocs-react@1.3.7 + - @backstage/plugin-user-settings@0.8.31 + +## app-next-example-plugin@0.0.31 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + +## example-backend@0.0.46 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-app-backend@0.5.10 + - @backstage/plugin-techdocs-backend@2.1.4 + - @backstage/plugin-scaffolder-backend@3.1.1 + - @backstage/plugin-mcp-actions-backend@0.1.7 + - @backstage/plugin-auth-backend@0.26.0 + - @backstage/plugin-scaffolder-backend-module-github@0.9.4 + - @backstage/plugin-devtools-backend@0.5.13 + - @backstage/plugin-auth-node@0.6.11 + - @backstage/plugin-permission-common@0.9.4 + - @backstage/plugin-permission-node@0.10.8 + - @backstage/plugin-catalog-backend@3.3.1 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.10 + - @backstage/plugin-catalog-backend-module-openapi@0.2.18 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.16 + - @backstage/plugin-events-backend@0.5.10 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.18 + - @backstage/plugin-search-backend@2.0.10 + - @backstage/plugin-search-backend-module-techdocs@0.4.10 + +## e2e-test@0.2.36 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.1.17 + - @backstage/create-app@0.7.8 + +## @internal/scaffolder@0.0.17 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/plugin-scaffolder-react@1.19.5 + +## techdocs-cli-embedded-app@0.2.116 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0 + - @backstage/plugin-catalog@1.32.2 + - @backstage/cli@0.35.2 + - @backstage/core-components@0.18.5 + - @backstage/plugin-techdocs@1.16.2 + - @backstage/app-defaults@1.7.4 + - @backstage/integration-react@1.2.14 + - @backstage/plugin-techdocs-react@1.3.7 + +## @internal/plugin-todo-list@1.0.47 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5 diff --git a/docs/releases/v1.47.0-next.0-changelog.md b/docs/releases/v1.47.0-next.0-changelog.md new file mode 100644 index 0000000000..e1fd3f9ebb --- /dev/null +++ b/docs/releases/v1.47.0-next.0-changelog.md @@ -0,0 +1,578 @@ +# Release v1.47.0-next.0 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.47.0-next.0](https://backstage.github.io/upgrade-helper/?to=1.47.0-next.0) + +## @backstage/ui@0.11.0-next.0 + +### Minor Changes + +- 4ea1d15: **BREAKING**: Renamed CSS variable `--bui-bg` to `--bui-bg-surface-0` for consistency. + +### Patch Changes + +- 1880402: Fixes app background color on dark mode. +- 9c76682: build(deps-dev): bump `storybook` from 10.1.9 to 10.1.10 +- b4a4911: Fixed SearchField `startCollapsed` prop not working correctly in Backstage UI. The field now properly starts in a collapsed state, expands when clicked and focused, and collapses back when unfocused with no input. Also fixed CSS logic to work correctly in all layout contexts (flex row, flex column, and regular containers). + + Affected components: SearchField + +## @backstage/backend-defaults@0.14.1-next.0 + +### Patch Changes + +- 7126bf2: Fixed a spelling mistake in root health service shutdown response. +- Updated dependencies + - @backstage/backend-app-api@1.4.0 + - @backstage/backend-dev-utils@0.1.6 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/cli-node@0.2.16 + - @backstage/config@1.3.6 + - @backstage/config-loader@1.10.7 + - @backstage/errors@1.2.7 + - @backstage/integration@1.19.0 + - @backstage/integration-aws-node@0.1.19 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.10 + - @backstage/plugin-events-node@0.4.18 + - @backstage/plugin-permission-node@0.10.7 + +## @backstage/backend-dynamic-feature-service@0.7.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.5-next.0 + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/cli-common@0.1.16 + - @backstage/cli-node@0.2.16 + - @backstage/config@1.3.6 + - @backstage/config-loader@1.10.7 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-app-node@0.1.40 + - @backstage/plugin-auth-node@0.6.10 + - @backstage/plugin-catalog-backend@3.3.1-next.0 + - @backstage/plugin-events-backend@0.5.10-next.0 + - @backstage/plugin-events-node@0.4.18 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-permission-node@0.10.7 + - @backstage/plugin-scaffolder-node@0.12.2 + - @backstage/plugin-search-backend-node@1.4.0 + - @backstage/plugin-search-common@1.2.21 + +## @backstage/backend-openapi-utils@0.6.5-next.0 + +### Patch Changes + +- 6678b78: Internal update to use native feature from our request validation library for handling base path determination. +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/backend-test-utils@1.10.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/backend-app-api@1.4.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.10 + - @backstage/plugin-events-node@0.4.18 + - @backstage/plugin-permission-common@0.9.3 + +## @backstage/cli@0.35.2-next.0 + +### Patch Changes + +- 320c6a9: Bump `@swc/core` to support `ES2023` and `ES2024` +- 9ee5996: Bump minimum required `@swc/core` to avoid transpilation bug +- Updated dependencies + - @backstage/catalog-model@1.7.6 + - @backstage/cli-common@0.1.16 + - @backstage/cli-node@0.2.16 + - @backstage/config@1.3.6 + - @backstage/config-loader@1.10.7 + - @backstage/errors@1.2.7 + - @backstage/eslint-plugin@0.2.0 + - @backstage/integration@1.19.0 + - @backstage/release-manifests@0.0.13 + - @backstage/types@1.2.2 + +## @backstage/create-app@0.7.8-next.0 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.16 + +## @backstage/dev-utils@1.1.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0-next.0 + - @backstage/app-defaults@1.7.3 + - @backstage/catalog-model@1.7.6 + - @backstage/core-app-api@1.19.3 + - @backstage/core-components@0.18.4 + - @backstage/core-plugin-api@1.12.1 + - @backstage/integration-react@1.2.13 + - @backstage/theme@0.7.1 + - @backstage/plugin-catalog-react@1.21.4 + +## @techdocs/cli@1.10.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/cli-common@0.1.16 + - @backstage/config@1.3.6 + - @backstage/plugin-techdocs-node@1.13.10 + +## @backstage/plugin-app-visualizer@0.1.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0-next.0 + - @backstage/core-components@0.18.4 + - @backstage/core-plugin-api@1.12.1 + - @backstage/frontend-plugin-api@0.13.2 + +## @backstage/plugin-auth-backend-module-oidc-provider@0.4.11-next.0 + +### Patch Changes + +- e54fcb2: Added support for custom start URL search parameters (with the new `startUrlSearchParams` config property) +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-backend@0.25.7 + - @backstage/plugin-auth-node@0.6.10 + +## @backstage/plugin-catalog-backend@3.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.5-next.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration@1.19.0 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1 + - @backstage/plugin-events-node@0.4.18 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-permission-node@0.10.7 + +## @backstage/plugin-catalog-backend-module-aws@0.4.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration@1.19.0 + - @backstage/integration-aws-node@0.1.19 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1 + - @backstage/plugin-kubernetes-common@0.9.9 + +## @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.5-next.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-node@1.20.1 + +## @backstage/plugin-catalog-backend-module-gitlab@0.7.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/integration@1.19.0 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-node@1.20.1 + - @backstage/plugin-events-node@0.4.18 + +## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0 + - @backstage/plugin-catalog-backend-module-gitlab@0.7.7-next.0 + - @backstage/plugin-catalog-node@1.20.1 + - @backstage/plugin-events-node@0.4.18 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.7.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-backend@3.3.1-next.0 + - @backstage/plugin-catalog-node@1.20.1 + - @backstage/plugin-events-node@0.4.18 + - @backstage/plugin-permission-common@0.9.3 + +## @backstage/plugin-catalog-backend-module-logs@0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0 + - @backstage/plugin-catalog-backend@3.3.1-next.0 + - @backstage/plugin-events-node@0.4.18 + +## @backstage/plugin-devtools-backend@0.5.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/cli-common@0.1.16 + - @backstage/config@1.3.6 + - @backstage/config-loader@1.10.7 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-devtools-common@0.1.20 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-permission-node@0.10.7 + +## @backstage/plugin-events-backend@0.5.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.5-next.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.18 + +## @backstage/plugin-mcp-actions-backend@0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/catalog-client@1.12.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1 + +## @backstage/plugin-mui-to-bui@0.2.3-next.0 + +### Patch Changes + +- e4a1180: Updated tokens from `--bui-bg` to `--bui-bg-surface-0` +- Updated dependencies + - @backstage/ui@0.11.0-next.0 + - @backstage/core-plugin-api@1.12.1 + - @backstage/frontend-plugin-api@0.13.2 + - @backstage/theme@0.7.1 + +## @backstage/plugin-scaffolder-backend@3.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.5-next.0 + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration@1.19.0 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.10 + - @backstage/plugin-bitbucket-cloud-common@0.3.5 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.15 + - @backstage/plugin-catalog-node@1.20.1 + - @backstage/plugin-events-node@0.4.18 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-permission-node@0.10.7 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.16 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.17 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.16 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.16 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.16 + - @backstage/plugin-scaffolder-backend-module-github@0.9.3 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.11.0 + - @backstage/plugin-scaffolder-common@1.7.4 + - @backstage/plugin-scaffolder-node@0.12.2 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration@1.19.0 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.2 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.2 + - @backstage/plugin-scaffolder-node-test-utils@0.3.7-next.0 + +## @backstage/plugin-scaffolder-node-test-utils@0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0 + - @backstage/backend-test-utils@1.10.3-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-node@0.12.2 + +## @backstage/plugin-search-backend@2.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.5-next.0 + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-permission-node@0.10.7 + - @backstage/plugin-search-backend-node@1.4.0 + - @backstage/plugin-search-common@1.2.21 + +## @backstage/plugin-techdocs-backend@2.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration@1.19.0 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1 + - @backstage/plugin-techdocs-node@1.13.10 + +## @backstage/plugin-user-settings-backend@0.3.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.10 + - @backstage/plugin-signals-node@0.1.27 + - @backstage/plugin-user-settings-common@0.0.1 + +## example-app@0.2.117-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0-next.0 + - @backstage/cli@0.35.2-next.0 + - @backstage/plugin-mui-to-bui@0.2.3-next.0 + - @backstage/app-defaults@1.7.3 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.3 + - @backstage/core-components@0.18.4 + - @backstage/core-plugin-api@1.12.1 + - @backstage/frontend-app-api@0.13.3 + - @backstage/integration-react@1.2.13 + - @backstage/theme@0.7.1 + - @backstage/plugin-api-docs@0.13.2 + - @backstage/plugin-auth-react@0.1.22 + - @backstage/plugin-catalog@1.32.1 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-graph@0.5.4 + - @backstage/plugin-catalog-import@0.13.8 + - @backstage/plugin-catalog-react@1.21.4 + - @backstage/plugin-catalog-unprocessed-entities@0.2.24 + - @backstage/plugin-devtools@0.1.34 + - @backstage/plugin-home@0.8.15 + - @backstage/plugin-kubernetes@0.12.14 + - @backstage/plugin-kubernetes-cluster@0.0.32 + - @backstage/plugin-notifications@0.5.12 + - @backstage/plugin-org@0.6.47 + - @backstage/plugin-permission-react@0.4.39 + - @backstage/plugin-scaffolder@1.35.0 + - @backstage/plugin-scaffolder-react@1.19.4 + - @backstage/plugin-search@1.5.1 + - @backstage/plugin-search-common@1.2.21 + - @backstage/plugin-search-react@1.10.1 + - @backstage/plugin-signals@0.0.26 + - @backstage/plugin-techdocs@1.16.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.31 + - @backstage/plugin-techdocs-react@1.3.6 + - @backstage/plugin-user-settings@0.8.30 + +## example-app-next@0.0.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0-next.0 + - @backstage/cli@0.35.2-next.0 + - @backstage/plugin-app-visualizer@0.1.27-next.0 + - @backstage/app-defaults@1.7.3 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.3 + - @backstage/core-compat-api@0.5.5 + - @backstage/core-components@0.18.4 + - @backstage/core-plugin-api@1.12.1 + - @backstage/frontend-app-api@0.13.3 + - @backstage/frontend-defaults@0.3.4 + - @backstage/frontend-plugin-api@0.13.2 + - @backstage/integration-react@1.2.13 + - @backstage/theme@0.7.1 + - @backstage/plugin-api-docs@0.13.2 + - @backstage/plugin-app@0.3.3 + - @backstage/plugin-auth@0.1.3 + - @backstage/plugin-auth-react@0.1.22 + - @backstage/plugin-catalog@1.32.1 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-graph@0.5.4 + - @backstage/plugin-catalog-import@0.13.8 + - @backstage/plugin-catalog-react@1.21.4 + - @backstage/plugin-catalog-unprocessed-entities@0.2.24 + - @backstage/plugin-home@0.8.15 + - @backstage/plugin-kubernetes@0.12.14 + - @backstage/plugin-kubernetes-cluster@0.0.32 + - @backstage/plugin-notifications@0.5.12 + - @backstage/plugin-org@0.6.47 + - @backstage/plugin-permission-react@0.4.39 + - @backstage/plugin-scaffolder@1.35.0 + - @backstage/plugin-scaffolder-react@1.19.4 + - @backstage/plugin-search@1.5.1 + - @backstage/plugin-search-common@1.2.21 + - @backstage/plugin-search-react@1.10.1 + - @backstage/plugin-signals@0.0.26 + - @backstage/plugin-techdocs@1.16.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.31 + - @backstage/plugin-techdocs-react@1.3.6 + - @backstage/plugin-user-settings@0.8.30 + +## example-backend@0.0.46-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-app-backend@0.5.9 + - @backstage/plugin-auth-backend@0.25.7 + - @backstage/plugin-auth-backend-module-github-provider@0.4.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.15 + - @backstage/plugin-auth-backend-module-openshift-provider@0.1.3 + - @backstage/plugin-auth-node@0.6.10 + - @backstage/plugin-catalog-backend@3.3.1-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.10-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.17 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.15 + - @backstage/plugin-catalog-backend-module-unprocessed@0.6.7 + - @backstage/plugin-devtools-backend@0.5.13-next.0 + - @backstage/plugin-events-backend@0.5.10-next.0 + - @backstage/plugin-events-backend-module-google-pubsub@0.1.7 + - @backstage/plugin-kubernetes-backend@0.21.0 + - @backstage/plugin-mcp-actions-backend@0.1.7-next.0 + - @backstage/plugin-notifications-backend@0.6.1 + - @backstage/plugin-permission-backend@0.7.7 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.15 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-permission-node@0.10.7 + - @backstage/plugin-proxy-backend@0.6.9 + - @backstage/plugin-scaffolder-backend@3.1.1-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.9.3 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.17 + - @backstage/plugin-search-backend@2.0.10-next.0 + - @backstage/plugin-search-backend-module-catalog@0.3.11 + - @backstage/plugin-search-backend-module-elasticsearch@1.7.9 + - @backstage/plugin-search-backend-module-explore@0.3.10 + - @backstage/plugin-search-backend-module-techdocs@0.4.9 + - @backstage/plugin-search-backend-node@1.4.0 + - @backstage/plugin-signals-backend@0.3.11 + - @backstage/plugin-techdocs-backend@2.1.4-next.0 + +## e2e-test@0.2.36-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.7.8-next.0 + - @backstage/cli-common@0.1.16 + - @backstage/errors@1.2.7 + +## techdocs-cli-embedded-app@0.2.116-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0-next.0 + - @backstage/cli@0.35.2-next.0 + - @backstage/app-defaults@1.7.3 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.3 + - @backstage/core-components@0.18.4 + - @backstage/core-plugin-api@1.12.1 + - @backstage/integration-react@1.2.13 + - @backstage/test-utils@1.7.14 + - @backstage/theme@0.7.1 + - @backstage/plugin-catalog@1.32.1 + - @backstage/plugin-techdocs@1.16.1 + - @backstage/plugin-techdocs-react@1.3.6 diff --git a/docs/releases/v1.47.0-next.1-changelog.md b/docs/releases/v1.47.0-next.1-changelog.md new file mode 100644 index 0000000000..5c93c23480 --- /dev/null +++ b/docs/releases/v1.47.0-next.1-changelog.md @@ -0,0 +1,648 @@ +# Release v1.47.0-next.1 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.47.0-next.1](https://backstage.github.io/upgrade-helper/?to=1.47.0-next.1) + +## @backstage/backend-defaults@0.14.1-next.1 + +### Patch Changes + +- 3afeab4: Implementing `readTree` for `GoogleGcsReader` +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + +## @backstage/backend-dynamic-feature-service@0.7.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.1 + - @backstage/plugin-catalog-backend@3.3.1-next.1 + - @backstage/plugin-scaffolder-node@0.12.3-next.0 + +## @backstage/cli@0.35.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + +## @backstage/core-compat-api@0.5.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.5-next.0 + - @backstage/frontend-plugin-api@0.13.2 + +## @backstage/create-app@0.7.8-next.1 + +### Patch Changes + +- Bumped create-app version. + +## @backstage/dev-utils@1.1.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.0 + +## @backstage/frontend-app-api@0.13.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-defaults@0.3.5-next.0 + - @backstage/frontend-plugin-api@0.13.2 + +## @backstage/frontend-defaults@0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-app@0.3.4-next.0 + - @backstage/frontend-app-api@0.13.4-next.0 + - @backstage/frontend-plugin-api@0.13.2 + +## @backstage/frontend-test-utils@0.4.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-app@0.3.4-next.0 + - @backstage/frontend-app-api@0.13.4-next.0 + - @backstage/frontend-plugin-api@0.13.2 + +## @backstage/integration@1.19.2-next.0 + +### Patch Changes + +- 3afeab4: Implementing `ScmIntegration` for `GoogleGcs` +- 9083273: Rollback the lowercase replacing in GitHub integration config + +## @backstage/integration-react@1.2.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + +## @techdocs/cli@1.10.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.1 + - @backstage/plugin-techdocs-node@1.13.11-next.0 + +## @backstage/plugin-api-docs@0.13.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.32.2-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.0 + - @backstage/frontend-plugin-api@0.13.2 + +## @backstage/plugin-app@0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.2.14-next.0 + - @backstage/frontend-plugin-api@0.13.2 + +## @backstage/plugin-bitbucket-cloud-common@0.3.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + +## @backstage/plugin-catalog@1.32.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-scaffolder-common@1.7.5-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.0 + - @backstage/core-compat-api@0.5.6-next.0 + - @backstage/frontend-plugin-api@0.13.2 + - @backstage/plugin-search-react@1.10.1 + +## @backstage/plugin-catalog-backend@3.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + +## @backstage/plugin-catalog-backend-module-aws@0.4.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.1 + - @backstage/integration@1.19.2-next.0 + +## @backstage/plugin-catalog-backend-module-azure@0.3.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.5.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.3.6-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.5.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + +## @backstage/plugin-catalog-backend-module-gerrit@0.3.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + +## @backstage/plugin-catalog-backend-module-gitea@0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + +## @backstage/plugin-catalog-backend-module-github@0.12.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + +## @backstage/plugin-catalog-backend-module-github-org@0.3.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.12.1-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab@0.7.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.1 + - @backstage/integration@1.19.2-next.0 + +## @backstage/plugin-catalog-backend-module-openapi@0.2.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.7.5-next.0 + +## @backstage/plugin-catalog-graph@0.5.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.5-next.0 + - @backstage/frontend-plugin-api@0.13.2 + +## @backstage/plugin-catalog-import@0.13.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.0 + - @backstage/frontend-plugin-api@0.13.2 + +## @backstage/plugin-catalog-react@1.21.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.2.14-next.0 + - @backstage/frontend-test-utils@0.4.3-next.0 + - @backstage/core-compat-api@0.5.6-next.0 + - @backstage/frontend-plugin-api@0.13.2 + +## @backstage/plugin-devtools@0.1.35-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-compat-api@0.5.6-next.0 + - @backstage/frontend-plugin-api@0.13.2 + +## @backstage/plugin-events-backend-module-github@0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + +## @backstage/plugin-home@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 + +## @backstage/plugin-kubernetes@0.12.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.5-next.0 + - @backstage/frontend-plugin-api@0.13.2 + +## @backstage/plugin-kubernetes-cluster@0.0.33-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.5-next.0 + +## @backstage/plugin-org@0.6.48-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.5-next.0 + - @backstage/frontend-plugin-api@0.13.2 + +## @backstage/plugin-org-react@0.1.46-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.5-next.0 + +## @backstage/plugin-scaffolder@1.35.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-scaffolder-common@1.7.5-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.0 + - @backstage/plugin-scaffolder-react@1.19.5-next.0 + - @backstage/frontend-plugin-api@0.13.2 + +## @backstage/plugin-scaffolder-backend@3.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.1 + - @backstage/integration@1.19.2-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.3.6-next.0 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.17-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.18-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.1-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.17-next.0 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.17-next.0 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.17-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.9.4-next.0 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.11.1-next.0 + - @backstage/plugin-scaffolder-common@1.7.5-next.0 + - @backstage/plugin-scaffolder-node@0.12.3-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.16-next.0 + +## @backstage/plugin-scaffolder-backend-module-azure@0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + - @backstage/plugin-scaffolder-node@0.12.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.1-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.17-next.0 + - @backstage/plugin-scaffolder-node@0.12.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.3.6-next.0 + - @backstage/plugin-scaffolder-node@0.12.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + - @backstage/plugin-scaffolder-node@0.12.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + - @backstage/plugin-scaffolder-node@0.12.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.1 + - @backstage/integration@1.19.2-next.0 + - @backstage/plugin-scaffolder-node@0.12.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-gcp@0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + - @backstage/plugin-scaffolder-node@0.12.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + - @backstage/plugin-scaffolder-node@0.12.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + - @backstage/plugin-scaffolder-node@0.12.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-github@0.9.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + - @backstage/plugin-scaffolder-node@0.12.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.11.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + - @backstage/plugin-scaffolder-node@0.12.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-notifications@0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.12.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-rails@0.5.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + - @backstage/plugin-scaffolder-node@0.12.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.12.3-next.0 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.12.3-next.0 + - @backstage/plugin-scaffolder-node-test-utils@0.3.7-next.1 + +## @backstage/plugin-scaffolder-common@1.7.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + +## @backstage/plugin-scaffolder-node@0.12.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + - @backstage/plugin-scaffolder-common@1.7.5-next.0 + +## @backstage/plugin-scaffolder-node-test-utils@0.3.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-node@0.12.3-next.0 + +## @backstage/plugin-scaffolder-react@1.19.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-common@1.7.5-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.0 + - @backstage/frontend-plugin-api@0.13.2 + +## @backstage/plugin-search@1.5.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.5-next.0 + - @backstage/frontend-plugin-api@0.13.2 + - @backstage/plugin-search-react@1.10.1 + +## @backstage/plugin-search-backend-module-techdocs@0.4.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-node@1.13.11-next.0 + +## @backstage/plugin-techdocs@1.16.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.0 + - @backstage/frontend-plugin-api@0.13.2 + - @backstage/plugin-search-react@1.10.1 + +## @backstage/plugin-techdocs-addons-test-utils@2.0.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-techdocs@1.16.2-next.0 + - @backstage/plugin-catalog@1.32.2-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.0 + - @backstage/plugin-search-react@1.10.1 + +## @backstage/plugin-techdocs-backend@2.1.4-next.1 + +### Patch Changes + +- b6ff2a5: Some AWS `publisher` config options such as `region`, `endpoint`, `accountId` are now marked as `@visibility backend` instead of `secret`. +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.1 + - @backstage/integration@1.19.2-next.0 + - @backstage/plugin-techdocs-node@1.13.11-next.0 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/frontend-plugin-api@0.13.2 + +## @backstage/plugin-techdocs-node@1.13.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + +## @backstage/plugin-user-settings@0.8.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.5-next.0 + - @backstage/frontend-plugin-api@0.13.2 + +## example-app@0.2.117-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.35.2-next.1 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-catalog-import@0.13.9-next.0 + - @backstage/plugin-scaffolder@1.35.1-next.0 + - @backstage/plugin-techdocs@1.16.2-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.32-next.0 + - @backstage/plugin-catalog@1.32.2-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.0 + - @backstage/plugin-scaffolder-react@1.19.5-next.0 + - @backstage/frontend-app-api@0.13.4-next.0 + - @backstage/plugin-api-docs@0.13.3-next.0 + - @backstage/plugin-catalog-graph@0.5.5-next.0 + - @backstage/plugin-org@0.6.48-next.0 + - @backstage/plugin-user-settings@0.8.31-next.0 + - @backstage/plugin-home@0.8.16-next.0 + - @backstage/plugin-kubernetes@0.12.15-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.33-next.0 + - @backstage/plugin-search@1.5.2-next.0 + - @backstage/plugin-search-react@1.10.1 + - @backstage/plugin-devtools@0.1.35-next.0 + +## example-app-next@0.0.31-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.35.2-next.1 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-catalog-import@0.13.9-next.0 + - @backstage/plugin-scaffolder@1.35.1-next.0 + - @backstage/plugin-techdocs@1.16.2-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.32-next.0 + - @backstage/plugin-app@0.3.4-next.0 + - @backstage/plugin-catalog@1.32.2-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.0 + - @backstage/plugin-scaffolder-react@1.19.5-next.0 + - @backstage/frontend-app-api@0.13.4-next.0 + - @backstage/frontend-defaults@0.3.5-next.0 + - @backstage/core-compat-api@0.5.6-next.0 + - @backstage/plugin-api-docs@0.13.3-next.0 + - @backstage/plugin-catalog-graph@0.5.5-next.0 + - @backstage/plugin-org@0.6.48-next.0 + - @backstage/plugin-user-settings@0.8.31-next.0 + - @backstage/plugin-home@0.8.16-next.0 + - @backstage/plugin-kubernetes@0.12.15-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.33-next.0 + - @backstage/plugin-search@1.5.2-next.0 + - @backstage/plugin-app-visualizer@0.1.27-next.0 + - @backstage/plugin-auth@0.1.3 + - @backstage/frontend-plugin-api@0.13.2 + - @backstage/plugin-search-react@1.10.1 + +## example-backend@0.0.46-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.1 + - @backstage/plugin-techdocs-backend@2.1.4-next.1 + - @backstage/plugin-catalog-backend@3.3.1-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.2.18-next.0 + - @backstage/plugin-scaffolder-backend@3.1.1-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.9.4-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.16-next.0 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.18-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.4.10-next.0 + +## @internal/scaffolder@0.0.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.19.5-next.0 + - @backstage/frontend-plugin-api@0.13.2 + +## techdocs-cli-embedded-app@0.2.116-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.35.2-next.1 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-techdocs@1.16.2-next.0 + - @backstage/plugin-catalog@1.32.2-next.0 diff --git a/docs/releases/v1.47.0-next.2-changelog.md b/docs/releases/v1.47.0-next.2-changelog.md new file mode 100644 index 0000000000..443a981de0 --- /dev/null +++ b/docs/releases/v1.47.0-next.2-changelog.md @@ -0,0 +1,385 @@ +# Release v1.47.0-next.2 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.47.0-next.2](https://backstage.github.io/upgrade-helper/?to=1.47.0-next.2) + +## @backstage/app-defaults@1.7.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + +## @backstage/core-components@0.18.5-next.0 + +### Patch Changes + +- a723b8a: The MarkdownContent component now handles HTML content the same way as GitHub when rendering GitHub-flavored Markdown + +## @backstage/create-app@0.7.8-next.2 + +### Patch Changes + +- f1fe6fe: Updated Dockerfile to use Node 24 and Debian Trixie + +## @backstage/dev-utils@1.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/app-defaults@1.7.4-next.0 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.1 + +## @backstage/frontend-defaults@0.3.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/plugin-app@0.3.4-next.1 + +## @backstage/plugin-api-docs@0.13.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/plugin-catalog@1.32.2-next.1 + - @backstage/plugin-catalog-react@1.21.5-next.1 + +## @backstage/plugin-app@0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/integration-react@1.2.14-next.0 + +## @backstage/plugin-app-visualizer@0.1.27-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + +## @backstage/plugin-auth@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + +## @backstage/plugin-auth-react@0.1.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + +## @backstage/plugin-catalog@1.32.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.1 + - @backstage/plugin-search-react@1.10.2-next.0 + - @backstage/plugin-techdocs-react@1.3.7-next.0 + +## @backstage/plugin-catalog-graph@0.5.5-next.1 + +### Patch Changes + +- 5c49a00: Update for the `qs` library bump: the old array limit setting has changed to be more strict; you can no longer just give a zero to mean unlimited. So we choose an arbitrary high value, to at least go higher than the default 20. +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.1 + +## @backstage/plugin-catalog-import@0.13.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.1 + +## @backstage/plugin-catalog-react@1.21.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/integration-react@1.2.14-next.0 + +## @backstage/plugin-catalog-unprocessed-entities@0.2.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + +## @backstage/plugin-config-schema@0.1.76-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + +## @backstage/plugin-devtools@0.1.35-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + +## @backstage/plugin-home@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 + +## @backstage/plugin-home-react@0.1.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + +## @backstage/plugin-kubernetes@0.12.15-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-kubernetes-react@0.5.15-next.0 + +## @backstage/plugin-kubernetes-cluster@0.0.33-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-kubernetes-react@0.5.15-next.0 + +## @backstage/plugin-kubernetes-react@0.5.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + +## @backstage/plugin-notifications@0.5.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + +## @backstage/plugin-org@0.6.48-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-org-react@0.1.46-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-scaffolder@1.35.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.1 + - @backstage/plugin-scaffolder-react@1.19.5-next.1 + - @backstage/plugin-techdocs-react@1.3.7-next.0 + +## @backstage/plugin-scaffolder-react@1.19.5-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-search@1.5.2-next.1 + +### Patch Changes + +- 5c49a00: Update for the `qs` library bump: the old array limit setting has changed to be more strict; you can no longer just give a zero to mean unlimited. So we choose an arbitrary high value, to at least go higher than the default 20. +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.1 + - @backstage/plugin-search-react@1.10.2-next.0 + +## @backstage/plugin-search-react@1.10.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + +## @backstage/plugin-signals@0.0.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + +## @backstage/plugin-techdocs@1.16.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-auth-react@0.1.23-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.1 + - @backstage/plugin-search-react@1.10.2-next.0 + - @backstage/plugin-techdocs-react@1.3.7-next.0 + +## @backstage/plugin-techdocs-addons-test-utils@2.0.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-catalog@1.32.2-next.1 + - @backstage/plugin-catalog-react@1.21.5-next.1 + - @backstage/plugin-search-react@1.10.2-next.0 + - @backstage/plugin-techdocs@1.16.2-next.1 + - @backstage/plugin-techdocs-react@1.3.7-next.0 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-techdocs-react@1.3.7-next.0 + +## @backstage/plugin-techdocs-react@1.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + +## @backstage/plugin-user-settings@0.8.31-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.1 + +## example-app@0.2.117-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/plugin-catalog-graph@0.5.5-next.1 + - @backstage/plugin-search@1.5.2-next.1 + - @backstage/app-defaults@1.7.4-next.0 + - @backstage/cli@0.35.2-next.1 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-api-docs@0.13.3-next.1 + - @backstage/plugin-auth-react@0.1.23-next.0 + - @backstage/plugin-catalog@1.32.2-next.1 + - @backstage/plugin-catalog-import@0.13.9-next.1 + - @backstage/plugin-catalog-react@1.21.5-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.25-next.0 + - @backstage/plugin-devtools@0.1.35-next.1 + - @backstage/plugin-home@0.8.16-next.1 + - @backstage/plugin-kubernetes@0.12.15-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.33-next.1 + - @backstage/plugin-notifications@0.5.13-next.0 + - @backstage/plugin-org@0.6.48-next.1 + - @backstage/plugin-scaffolder@1.35.1-next.1 + - @backstage/plugin-scaffolder-react@1.19.5-next.1 + - @backstage/plugin-search-react@1.10.2-next.0 + - @backstage/plugin-signals@0.0.27-next.0 + - @backstage/plugin-techdocs@1.16.2-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.32-next.1 + - @backstage/plugin-techdocs-react@1.3.7-next.0 + - @backstage/plugin-user-settings@0.8.31-next.1 + +## example-app-next@0.0.31-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/plugin-catalog-graph@0.5.5-next.1 + - @backstage/plugin-search@1.5.2-next.1 + - @backstage/app-defaults@1.7.4-next.0 + - @backstage/cli@0.35.2-next.1 + - @backstage/frontend-defaults@0.3.5-next.1 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-api-docs@0.13.3-next.1 + - @backstage/plugin-app@0.3.4-next.1 + - @backstage/plugin-app-visualizer@0.1.27-next.1 + - @backstage/plugin-auth@0.1.4-next.0 + - @backstage/plugin-auth-react@0.1.23-next.0 + - @backstage/plugin-catalog@1.32.2-next.1 + - @backstage/plugin-catalog-import@0.13.9-next.1 + - @backstage/plugin-catalog-react@1.21.5-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.25-next.0 + - @backstage/plugin-home@0.8.16-next.1 + - @backstage/plugin-kubernetes@0.12.15-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.33-next.1 + - @backstage/plugin-notifications@0.5.13-next.0 + - @backstage/plugin-org@0.6.48-next.1 + - @backstage/plugin-scaffolder@1.35.1-next.1 + - @backstage/plugin-scaffolder-react@1.19.5-next.1 + - @backstage/plugin-search-react@1.10.2-next.0 + - @backstage/plugin-signals@0.0.27-next.0 + - @backstage/plugin-techdocs@1.16.2-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.32-next.1 + - @backstage/plugin-techdocs-react@1.3.7-next.0 + - @backstage/plugin-user-settings@0.8.31-next.1 + +## app-next-example-plugin@0.0.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + +## techdocs-cli-embedded-app@0.2.116-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/app-defaults@1.7.4-next.0 + - @backstage/cli@0.35.2-next.1 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-catalog@1.32.2-next.1 + - @backstage/plugin-techdocs@1.16.2-next.1 + - @backstage/plugin-techdocs-react@1.3.7-next.0 + +## @internal/plugin-todo-list@1.0.47-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 diff --git a/docs/releases/v1.47.0-next.3-changelog.md b/docs/releases/v1.47.0-next.3-changelog.md new file mode 100644 index 0000000000..053fef2253 --- /dev/null +++ b/docs/releases/v1.47.0-next.3-changelog.md @@ -0,0 +1,365 @@ +# Release v1.47.0-next.3 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.47.0-next.3](https://backstage.github.io/upgrade-helper/?to=1.47.0-next.3) + +## @backstage/backend-defaults@0.15.0-next.2 + +### Minor Changes + +- 6fc00e6: Added action filtering support with glob patterns and attribute constraints. + + The `ActionsService` now supports filtering actions based on configuration. This allows controlling which actions are exposed to consumers like the MCP backend. + + Configuration example: + + ```yaml + backend: + actions: + pluginSources: + - catalog + - scaffolder + filter: + include: + - id: 'catalog:*' + attributes: + destructive: false + - id: 'scaffolder:*' + exclude: + - id: '*:delete-*' + - attributes: + readOnly: false + ``` + + Filtering logic: + + - `include`: Rules for actions to include. Each rule can specify an `id` glob pattern and/or `attributes` constraints. An action must match at least one rule to be included. If no include rules are specified, all actions are included by default. + - `exclude`: Rules for actions to exclude. Takes precedence over include rules. + - Each rule combines `id` and `attributes` with AND logic (both must match if specified). + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@1.4.0 + - @backstage/plugin-auth-node@0.6.10 + - @backstage/plugin-permission-node@0.10.7 + +## @backstage/ui@0.11.0-next.1 + +### Minor Changes + +- 243e5e7: **BREAKING**: Redesigned Table component with new `useTable` hook API. + + - The `Table` component (React Aria wrapper) is renamed to `TableRoot` + - New high-level `Table` component that handles data display, pagination, sorting, and selection + - The `useTable` hook is completely redesigned with a new API supporting three pagination modes (complete, offset, cursor) + - New types: `ColumnConfig`, `TableProps`, `TableItem`, `UseTableOptions`, `UseTableResult` + + New features include unified pagination modes, debounced query changes, stale data preservation during reloads, and row selection with toggle/replace behaviors. + + **Migration guide:** + + 1. Update imports and use the new `useTable` hook: + + ```diff + -import { Table, useTable } from '@backstage/ui'; + -const { data, paginationProps } = useTable({ data: items, pagination: {...} }); + +import { Table, useTable, type ColumnConfig } from '@backstage/ui'; + +const { tableProps } = useTable({ + + mode: 'complete', + + getData: () => items, + +}); + ``` + + 2. Define columns and render with the new Table API: + + ```diff + -
    + - ... + - ... + -
    + - + +const columns: ColumnConfig[] = [ + + { id: 'name', label: 'Name', isRowHeader: true, cell: item => }, + + { id: 'type', label: 'Type', cell: item => }, + +]; + + + + + ``` + + Affected components: Table, TableRoot, TablePagination + +- 95246eb: **Breaking** Updating color tokens to match the new neutral style on different surfaces. + + ## Migration notes + + There's no direct replacement for the old tint tokens but you can use the new neutral set of color tokens on surface 0 or 1 as a replacement. + + - `--bui-bg-tint` can be replaced by `--bui-bg-neutral-on-surface-0` + - `--bui-bg-tint-hover` can be replaced by `--bui-bg-neutral-on-surface-0-hover` + - `--bui-bg-tint-pressed` can be replaced by `--bui-bg-neutral-on-surface-0-pressed` + - `--bui-bg-tint-disabled` can be replaced by `--bui-bg-neutral-on-surface-0-disabled` + +- ea0c6d8: Introduce new `ToggleButton` & `ToggleButtonGroup` components in Backstage UI + +### Patch Changes + +- 21c87cc: Fixes disabled state in primary and secondary buttons in Backstage UI. +- b3253b6: Fixed `Link` component causing hard page refreshes for internal routes. The component now properly uses React Router's navigation instead of full page reloads. + +## @backstage/plugin-auth-backend@0.26.0-next.0 + +### Minor Changes + +- 7ffc873: Fix `user_created_at` migration causing `SQLiteError` regarding use of non-constants for defaults + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10 + +## @backstage/plugin-events-backend-module-kafka@0.3.0-next.0 + +### Minor Changes + +- ef5bbd8: Add support for Kafka offset configuration (`fromBeginning`) and `autoCommit` + +## @backstage/plugin-home@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. + +## @backstage/backend-dynamic-feature-service@0.7.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + - @backstage/plugin-auth-node@0.6.10 + - @backstage/plugin-catalog-backend@3.3.1-next.1 + - @backstage/plugin-events-backend@0.5.10-next.0 + - @backstage/plugin-permission-node@0.10.7 + - @backstage/plugin-search-backend-node@1.4.0 + +## @backstage/backend-test-utils@1.10.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + - @backstage/backend-app-api@1.4.0 + - @backstage/plugin-auth-node@0.6.10 + +## @backstage/create-app@0.7.8-next.3 + +### Patch Changes + +- Bumped create-app version. + +## @techdocs/cli@1.10.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + +## @backstage/plugin-api-docs@0.13.3-next.2 + +### Patch Changes + +- 0216090: Updated dependency `@types/swagger-ui-react` to `^5.0.0`. +- abeba2b: Fix types with new bumped dependency +- Updated dependencies + - @backstage/plugin-catalog@1.32.2-next.2 + +## @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.26.0-next.0 + - @backstage/plugin-auth-node@0.6.10 + +## @backstage/plugin-auth-backend-module-oidc-provider@0.4.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.26.0-next.0 + - @backstage/plugin-auth-node@0.6.10 + +## @backstage/plugin-catalog@1.32.2-next.2 + +### Patch Changes + +- 7ca91e8: Header in EntityLayout should always be shown. + Monitoring the loading status caused flickering when the refresh() method of the Async Entity was invoked. + +## @backstage/plugin-catalog-backend-module-aws@0.4.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + +## @backstage/plugin-catalog-backend-module-github@0.12.1-next.1 + +### Patch Changes + +- cb4b907: Improved efficiency of `GithubOrgEntityProvider` membership event handling and edit team. The provider now fetches only the specific user's teams instead of all organization users when processing membership events, and uses `addEntitiesOperation` instead of `replaceEntitiesOperation` to avoid unnecessary entity deletions. + +## @backstage/plugin-catalog-backend-module-gitlab@0.7.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.7.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + - @backstage/plugin-catalog-backend@3.3.1-next.1 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.2.18-next.0 + +### Patch Changes + +- a307700: Fixed crash when `latest_report_status` is undefined + +## @backstage/plugin-devtools-backend@0.5.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + - @backstage/plugin-permission-node@0.10.7 + +## @backstage/plugin-mcp-actions-backend@0.1.7-next.1 + +### Patch Changes + +- 4d82a35: build(deps): bump `@modelcontextprotocol/sdk` from 1.24.3 to 1.25.2 +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + +## @backstage/plugin-scaffolder@1.35.1-next.2 + +### Patch Changes + +- 9d75495: Fixed bug in RepoUrlPickerComponent component where repository names were not being autocompleted. + +## @backstage/plugin-scaffolder-backend@3.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + - @backstage/plugin-scaffolder-backend-module-github@0.9.4-next.1 + - @backstage/plugin-auth-node@0.6.10 + - @backstage/plugin-permission-node@0.10.7 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + +## @backstage/plugin-scaffolder-backend-module-github@0.9.4-next.1 + +### Patch Changes + +- bb7088b: Added options to set [workflow access level][access-level] for repositories to `github:repo:create` + + This is useful when creating repositories for GitHub Actions to manage access + to the workflows during creation. + + ```diff + - action: github:repo:create + id: create-repo + input: + repoUrl: github.com?owner=owner&repo=repo + visibility: private + + workflowAccess: organization + ``` + + [access-level]: https://docs.github.com/en/rest/actions/permissions?apiVersion=2022-11-28#set-the-level-of-access-for-workflows-outside-of-the-repository + +## @backstage/plugin-search-backend@2.0.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + - @backstage/plugin-permission-node@0.10.7 + - @backstage/plugin-search-backend-node@1.4.0 + +## @backstage/plugin-techdocs-backend@2.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + +## @backstage/plugin-user-settings-backend@0.3.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + - @backstage/plugin-auth-node@0.6.10 + +## example-app@0.2.117-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0-next.1 + - @backstage/plugin-catalog@1.32.2-next.2 + - @backstage/plugin-home@0.9.0-next.2 + - @backstage/plugin-api-docs@0.13.3-next.2 + - @backstage/plugin-scaffolder@1.35.1-next.2 + - @backstage/cli@0.35.2-next.1 + +## example-app-next@0.0.31-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0-next.1 + - @backstage/plugin-catalog@1.32.2-next.2 + - @backstage/plugin-home@0.9.0-next.2 + - @backstage/plugin-api-docs@0.13.3-next.2 + - @backstage/plugin-scaffolder@1.35.1-next.2 + - @backstage/cli@0.35.2-next.1 + +## example-backend@0.0.46-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + - @backstage/plugin-mcp-actions-backend@0.1.7-next.1 + - @backstage/plugin-auth-backend@0.26.0-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.9.4-next.1 + - @backstage/plugin-app-backend@0.5.9 + - @backstage/plugin-auth-backend-module-github-provider@0.4.0 + - @backstage/plugin-auth-backend-module-openshift-provider@0.1.3 + - @backstage/plugin-auth-node@0.6.10 + - @backstage/plugin-catalog-backend@3.3.1-next.1 + - @backstage/plugin-devtools-backend@0.5.13-next.1 + - @backstage/plugin-events-backend@0.5.10-next.0 + - @backstage/plugin-events-backend-module-google-pubsub@0.1.7 + - @backstage/plugin-kubernetes-backend@0.21.0 + - @backstage/plugin-notifications-backend@0.6.1 + - @backstage/plugin-permission-backend@0.7.7 + - @backstage/plugin-permission-node@0.10.7 + - @backstage/plugin-proxy-backend@0.6.9 + - @backstage/plugin-scaffolder-backend@3.1.1-next.2 + - @backstage/plugin-search-backend@2.0.10-next.1 + - @backstage/plugin-search-backend-node@1.4.0 + - @backstage/plugin-signals-backend@0.3.11 + - @backstage/plugin-techdocs-backend@2.1.4-next.2 diff --git a/docs/releases/v1.47.0.md b/docs/releases/v1.47.0.md new file mode 100644 index 0000000000..20ca86fff7 --- /dev/null +++ b/docs/releases/v1.47.0.md @@ -0,0 +1,128 @@ +--- +id: v1.47.0 +title: v1.47.0 +description: Backstage Release v1.47.0 +--- + +These are the release notes for the v1.47.0 release of [Backstage](https://backstage.io/). + +A huge thanks to the whole team of maintainers and contributors as well as the amazing Backstage Community for the hard work in getting this release developed and done. + +## Highlights + +### BREAKING: Redesigned `Table` and `useTable` in `@backstage/ui` + +The `Table` component and accompanying `useTable` hook have been redesigned. The low-level React Aria wrapper `Table` is now `TableRoot`, while a higher level `Table` component now handles pagination, sorting, selection, and data display. The `useTable` also has a new API, that supports 3 pagination modes: `complete`, `offset`, and `cursor`. + +More information along with a migration guide can be found in the [BUI Changelog](https://ui.backstage.io/changelog). + +### BREAKING: Updated color tokens in `@backstage/ui` + +UI color tokens have been updated to align with the new neutral surface-based design system, and the `-tint` tokens have been removed. + +More information can be found in the [BUI Changelog](https://ui.backstage.io/changelog). + +### BREAKING: Redirect validation in the URL reader + +`coreServices.urlReader` now validates that redirect chains are subject to the allow list in `backend.reading.allow` of your app config. If you were relying on redirects that pointed to URLs that were not allowlisted, you will now have to add those to your config as well. + +To support this, the `FetchUrlReader` class no longer has a public constructor, but instead has a `fromConfig` static factory method. + +### BREAKING: Better AWS S3 auth handling in techdocs + +Techdocs now knows how to properly use `integrations.awsS3` config to authenticate with AWS S3. Since this affects the priority order of which auth setting is being used, it’s technically a breaking change. + +The new priority is: + +1. `aws.accounts` +2. `techdocs.publisher.awsS3.credentials` +3. `integrations.awsS3` +4. Default credential chain + +### Deprecation and upcoming restrictions of blueprints for app customization in `@backstage/frontend-plugin-api` + +There were several blueprints in `@backstage/frontend-plugin-api` that were intended only for use in customization of the central app. For example `SignInPageBlueprint` that replaces the sign-in page, or `NavContentBlueprint` that replaces the sidebar content. The following blueprints have all been deprecated and moved to a new `@backstage/plugin-app-react` package: + +- `IconBundleBlueprint` +- `NavContentBlueprint` +- `RouterBlueprint` +- `SignInPageBlueprint` +- `SwappableComponentBlueprint` +- `ThemeBlueprint` +- `TranslationBlueprint` + +These blueprints are also being restricted from use outside of the `app` plugin. This means that you have to either use an `app` plugin override or a module with `pluginId` set to `app`. These currently trigger deprecation warnings, but will instead be rejected in a future release. + +### Deprecations and upcoming restrictions for API factories in new frontend system + +Similar to the above change, restrictions are being introduced that limit the ability for plugins to override both core Utility APIs and API factories from other plugins. Plugins will be restricted from installing factory overrides for Utility APIs that belong to other plugins. This restriction also applies to the core APIs provided by the app plugin. These overrides now instead need to be made using a plugin override or module. + +Just like the blueprint changes, this release will only trigger deprecation warnings, with the change taking effect in a future release. + +### Backend action filtering support + +`ActionsService` in `@backstage/backend-defaults` now supports action filtering based on configuration to enable control over which actions are exposed to consumers like the MCP backend. + +At the time of writing, this is primarily documented in [the relevant configuration schema](https://github.com/backstage/backstage/blob/master/packages/backend-defaults/config.d.ts). + +### `scaffolder` now supports configuration for `workflowAccess` level for creating Github repositories + +Workflow files can now configure the level of access to Github Actions for workflows outside of a repository. + +This is useful when creating repositories for GitHub Actions to manage access to the workflows for `github:repo:create`. + +```diff + - action: github:repo:create + id: create-repo + input: + repoUrl: github.com?owner=owner&repo=repo + visibility: private ++ workflowAccess: organization +``` + +Github Actions access-level documentation can be found [here](https://docs.github.com/en/rest/actions/permissions?apiVersion=2022-11-28#set-the-level-of-access-for-workflows-outside-of-the-repository). + +Contributed by [@fearphage](https://github.com/fearphage) in [#32237](https://github.com/backstage/backstage/pull/32237) + +### Additional Kafka Events streaming settings + +The Kafka event module now supports `fromBeginning` offsets and `autoCommit`. + +Contributed by [@imod](https://github.com/imod) in [#31410](https://github.com/backstage/backstage/pull/31410) + +### Improvements to the `home` plugin UI + +Widget configuration changes are now only saved when the Save button is explicitly clicked. A new Cancel button has been added to enable users to discard unsaved changes + +Contributed by [@kmikko](https://github.com/kmikko) in [#31198](https://github.com/backstage/backstage/pull/31198) + +### Improved performance for `GithubOrgEntityProvider` + +`GithubOrgEntityProvider` membership event handling and edit team has been improved. The provider now fetches only the specific user's teams instead of all organization users when processing membership events, and uses `addEntitiesOperation` instead of `replaceEntitiesOperation` to avoid unnecessary entity deletions. + +Contributed by [@angeliski](https://github.com/angeliski) in [#32184](https://github.com/backstage/backstage/pull/32184) + +### `Link` component now uses React Router’s navigation system + +Previously the `Link` component would cause hard page refreshes for internal routes. With this update, the component now properly uses React Router’s navigation instead of full page reloads. + +## Security Fixes + +This release contains security fixes for Software Templates and reading external content. + +## Upgrade path + +We recommend that you keep your Backstage project up to date with this latest release. For more guidance on how to upgrade, check out the documentation for [keeping Backstage updated](https://backstage.io/docs/getting-started/keeping-backstage-updated). + +## Links and References + +Below you can find a list of links and references to help you learn about and start using this new release. + +- [Backstage official website](https://backstage.io/), [documentation](https://backstage.io/docs/), and [getting started guide](https://backstage.io/docs/getting-started/) +- [GitHub repository](https://github.com/backstage/backstage) +- Backstage's [versioning and support policy](https://backstage.io/docs/overview/versioning-policy) +- [Community Discord](https://discord.gg/backstage-687207715902193673) for discussions and support +- [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.47.0-changelog.md) +- Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) + +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.48.0-next.0-changelog.md b/docs/releases/v1.48.0-next.0-changelog.md new file mode 100644 index 0000000000..11896befa1 --- /dev/null +++ b/docs/releases/v1.48.0-next.0-changelog.md @@ -0,0 +1,2651 @@ +# Release v1.48.0-next.0 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.48.0-next.0](https://backstage.github.io/upgrade-helper/?to=1.48.0-next.0) + +## @backstage/backend-app-api@1.5.0-next.0 + +### Minor Changes + +- f1d29b4: Added support for extension point factories, along with the ability to report module startup failures via the extension point factory context. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/backend-plugin-api@1.7.0-next.0 + +### Minor Changes + +- f1d29b4: Added support for extension point factories. This makes it possible to call `registerExtensionPoint` with a single options argument and provide a factory for the extension point rather than a direct implementation. The factory is passed a context with a `reportModuleStartupFailure` method that makes it possible for plugins to report and attribute startup errors to the module that consumed the extension point. + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/cli-common@0.1.18-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/plugin-permission-node@0.10.9-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/frontend-plugin-api@0.14.0-next.0 + +### Minor Changes + +- c38b74d: **BREAKING**: The following blueprints have been removed and are now only available from `@backstage/plugin-app-react`: + + - `IconBundleBlueprint` + - `NavContentBlueprint` + - `RouterBlueprint` + - `SignInPageBlueprint` + - `SwappableComponentBlueprint` + - `ThemeBlueprint` + - `TranslationBlueprint` + +### Patch Changes + +- 7edb810: Added a new `internal` option to `createExtensionInput` that marks the input as only allowing attachments from the same plugin. + +- 9554c36: **DEPRECATED**: Multiple attachment points for extensions have been deprecated. The functionality continues to work for backward compatibility, but will log a deprecation warning and be removed in a future release. + + Extensions using array attachment points should migrate to using Utility APIs instead. See the [Sharing Extensions Across Multiple Locations](https://backstage.io/docs/frontend-system/architecture/27-sharing-extensions) guide for the recommended pattern. + +- 53b6549: Plugins in the new frontend system now have a `pluginId` field rather than `id` to better align with naming conventions used throughout the frontend and backend systems. The old field is still present but marked as deprecated. All internal code has been updated to prefer `pluginId` while maintaining backward compatibility by falling back to `id` when needed. + +- 69d880e: Bump to latest zod to ensure it has the latest features + +- Updated dependencies + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## @backstage/ui@0.12.0-next.0 + +### Minor Changes + +- b1f723b: **BREAKING**: Changed CSS selectors for `ButtonIcon` and `ButtonLink` components. Custom styles targeting `.bui-Button` to style these components must be updated to use `.bui-ButtonIcon` or `.bui-ButtonLink` respectively. + + ```diff + -/* This no longer styles ButtonIcon or ButtonLink */ + -.bui-Button[data-variant="primary"] { ... } + +/* Use component-specific selectors */ + +.bui-ButtonIcon[data-variant="primary"] { ... } + +.bui-ButtonLink[data-variant="primary"] { ... } + ``` + + Affected components: ButtonIcon, ButtonLink + +- caeb9ad: **BREAKING**: The `cell` and `header` properties in `ColumnConfig` now return `ReactElement` instead of `ReactNode`. + + This fixes an issue where React Aria's Collection component would inject an `id` prop into Fragment wrappers, causing "Invalid prop `id` supplied to `React.Fragment`" errors on render. + + Migration: + + ```diff + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + - cell: (item) => item.name, + + cell: (item) => , + - header: () => 'Name', + + header: () => Name, + }, + ]; + ``` + +### Patch Changes + +- 350c948: Fixed Box component to forward HTML attributes to the underlying div element. + + **Affected components:** Box + +- 7455dae: Use node prefix on native imports + +- 508bd1a: Added new `Alert` component with support for status variants (info, success, warning, danger), icons, loading states, and custom actions. + + Updated status color tokens for improved contrast and consistency across light and dark themes: + + - Added new `--bui-bg-info` and `--bui-fg-info` tokens for info status + - Updated `--bui-bg-danger`, `--bui-fg-danger` tokens + - Updated `--bui-bg-warning`, `--bui-fg-warning` tokens + - Updated `--bui-bg-success`, `--bui-fg-success` tokens + + **Affected components**: Alert + +- da30862: Fixed client-side navigation for container components by wrapping the container (not individual items) in RouterProvider. Components now conditionally provide routing context only when children have internal links, removing the Router context requirement when not needed. This also removes the need to wrap these components in MemoryRouter during tests when they are not using the `href` prop. + + Additionally, when multiple tabs match the current URL via prefix matching, the tab with the most specific path (highest segment count) is now selected. For example, with URL `/catalog/users/john`, a tab with path `/catalog/users` is now selected over a tab with path `/catalog`. + + Affected components: Tabs, Tab, TagGroup, Tag, Menu, MenuItem, MenuAutocomplete + +- 092c453: Fixed an infinite render loop in Tabs when navigating to a URL that doesn't match any tab `href`. + +- 5320aa8: Fixed components to not require a Router context when rendering without internal links. + + Affected components: Link, ButtonLink, Row + +- cb090b4: Bump react-aria-components to v1.14.0 + +- c429101: Fixed React 17 compatibility by using `useId` from `react-aria` instead of the built-in React hook which is only available in React 18+. + +- Updated dependencies + - @backstage/version-bridge@1.0.11 + +## @backstage/plugin-app@0.4.0-next.0 + +### Minor Changes + +- 7edb810: **BREAKING**: Extensions created with the following blueprints must now be provided via an override or a module for the `app` plugin. Extensions from other plugins will now trigger a warning in the app and be ignored. + + - `IconBundleBlueprint` + - `NavContentBlueprint` + - `RouterBlueprint` + - `SignInPageBlueprint` + - `SwappableComponentBlueprint` + - `ThemeBlueprint` + - `TranslationBlueprint` + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @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/plugin-app-react@0.1.1-next.0 + - @backstage/integration-react@1.2.15-next.0 + - @backstage/theme@0.7.1 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-permission-react@0.4.40-next.0 + +## @backstage/plugin-auth-backend-module-auth0-provider@0.3.0-next.0 + +### Minor Changes + +- 36804fe: feat: Added organization option to authorization params of the strategy + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## @backstage/plugin-auth-backend-module-github-provider@0.5.0-next.0 + +### Minor Changes + +- ff07934: Added the `userIdMatchingUserEntityAnnotation` sign-in resolver that matches users by their GitHub user ID. + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## @backstage/plugin-auth-backend-module-gitlab-provider@0.4.0-next.0 + +### Minor Changes + +- ff07934: Added the `{gitlab-integration-host}/user-id` annotation to store GitLab's user ID (immutable) in user entities. Also includes addition of the `userIdMatchingUserEntityAnnotation` sign-in resolver that matches users by the new ID. + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## @backstage/plugin-catalog-backend@3.4.0-next.0 + +### Minor Changes + +- f1d29b4: Failures to connect catalog providers are now attributed to the module that provided the failing provider. This means that such failures will be reported as module startup failures rather than a failure to start the catalog plugin, and will therefore respect `onPluginModuleBootFailure` configuration instead. + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- 7455dae: Use node prefix on native imports +- 1e669cc: Migrate audit events reference docs to . +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-openapi-utils@0.6.6-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/plugin-permission-node@0.10.9-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab@0.8.0-next.0 + +### Minor Changes + +- ff07934: Added the `{gitlab-integration-host}/user-id` annotation to store GitLab's user ID (immutable) in user entities. Also includes addition of the `userIdMatchingUserEntityAnnotation` sign-in resolver that matches users by the new ID. + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8-next.0 + +## @backstage/plugin-catalog-node@1.21.0-next.0 + +### Minor Changes + +- cfd8103: Promoted stable catalog extension points from alpha to main export. The following extension points are now exported from `@backstage/plugin-catalog-node` instead of `@backstage/plugin-catalog-node/alpha`: + + - `catalogLocationsExtensionPoint` and `CatalogLocationsExtensionPoint` + - `catalogProcessingExtensionPoint` and `CatalogProcessingExtensionPoint` + - `catalogAnalysisExtensionPoint` and `CatalogAnalysisExtensionPoint` + + The old alpha exports for these extension points are now deprecated with `@deprecated` markers pointing to the new stable exports. Please update your imports from `@backstage/plugin-catalog-node/alpha` to `@backstage/plugin-catalog-node`. + + Note: The `catalogModelExtensionPoint`, `catalogPermissionExtensionPoint`, and related types remain in alpha. + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/plugin-permission-node@0.10.9-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8-next.0 + +## @backstage/app-defaults@1.7.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.6-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/core-app-api@1.19.4-next.0 + - @backstage/theme@0.7.1 + - @backstage/plugin-permission-react@0.4.40-next.0 + +## @backstage/backend-defaults@0.15.1-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 44f5d04: Minor internal restructure of the postgres config loading code +- 4fc7bf0: Bump to tar v7 +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/integration-aws-node@0.1.20-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/backend-dev-utils@0.1.7-next.0 + - @backstage/config-loader@1.10.8-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/cli-node@0.2.17-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/backend-app-api@1.5.0-next.0 + - @backstage/plugin-permission-node@0.10.9-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/backend-dev-utils@0.1.7-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports + +## @backstage/backend-dynamic-feature-service@0.7.9-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-catalog-backend@3.4.0-next.0 + - @backstage/backend-openapi-utils@0.6.6-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-search-backend-node@1.4.1-next.0 + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.4-next.0 + - @backstage/config-loader@1.10.8-next.0 + - @backstage/plugin-events-backend@0.5.11-next.0 + - @backstage/plugin-search-common@1.2.22-next.0 + - @backstage/cli-common@0.1.18-next.0 + - @backstage/cli-node@0.2.17-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/plugin-app-node@0.1.42-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/plugin-permission-node@0.10.9-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/backend-openapi-utils@0.6.6-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/backend-test-utils@1.10.4-next.0 + +### Patch Changes + +- f1d29b4: Updated `startTestBackend` to support factory-based extension points (v1.1 format) in addition to the existing direct implementation format. +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/backend-app-api@1.5.0-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/cli@0.35.3-next.0 + +### Patch Changes + +- cfd8103: Updated catalog provider module template to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of alpha exports. +- 7455dae: Use node prefix on native imports +- 4fc7bf0: Bump to tar v7 +- 122d39c: Completely removed support for the deprecated `app.experimental.packages` configuration. Replace existing usage directly with `app.packages`. +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/config-loader@1.10.8-next.0 + - @backstage/eslint-plugin@0.2.1-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/cli-common@0.1.18-next.0 + - @backstage/cli-node@0.2.17-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/release-manifests@0.0.13 + - @backstage/types@1.2.2 + +## @backstage/cli-common@0.1.18-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/errors@1.2.7 + +## @backstage/cli-node@0.2.17-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/cli-common@0.1.18-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/codemods@0.1.54-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/cli-common@0.1.18-next.0 + +## @backstage/config-loader@1.10.8-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/cli-common@0.1.18-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/core-app-api@1.19.4-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## @backstage/core-compat-api@0.5.7-next.0 + +### Patch Changes + +- c38b74d: Internal updates for blueprint moves to `@backstage/plugin-app-react`. +- 53b6549: Plugins in the new frontend system now have a `pluginId` field rather than `id` to better align with naming conventions used throughout the frontend and backend systems. The old field is still present but marked as deprecated. All internal code has been updated to prefer `pluginId` while maintaining backward compatibility by falling back to `id` when needed. +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.6-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/plugin-app-react@0.1.1-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## @backstage/core-components@0.18.6-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- cebfea7: Removed link styles from LinkButton to avoid styling inconsistencies related to import order. +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/theme@0.7.1 + - @backstage/version-bridge@1.0.11 + +## @backstage/core-plugin-api@1.12.2-next.0 + +### Patch Changes + +- 53b6549: Plugins in the new frontend system now have a `pluginId` field rather than `id` to better align with naming conventions used throughout the frontend and backend systems. The old field is still present but marked as deprecated. All internal code has been updated to prefer `pluginId` while maintaining backward compatibility by falling back to `id` when needed. +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## @backstage/create-app@0.7.9-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- c38b74d: Switched `next-app` template to use blueprint from `@backstage/plugin-app-react`. +- Updated dependencies + - @backstage/cli-common@0.1.18-next.0 + +## @backstage/dev-utils@1.1.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.6-next.0 + - @backstage/ui@0.12.0-next.0 + - @backstage/core-components@0.18.6-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/core-app-api@1.19.4-next.0 + - @backstage/app-defaults@1.7.5-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/integration-react@1.2.15-next.0 + - @backstage/theme@0.7.1 + +## @backstage/e2e-test-utils@0.1.2-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports + +## @backstage/eslint-plugin@0.2.1-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports + +## @backstage/frontend-app-api@0.14.1-next.0 + +### Patch Changes + +- 17e0eb3: Updated the behavior of the new API override logic to log a deprecation warning instead of rejecting the override and blocking app startup, as was originally intended. + +- 7edb810: Implemented support for the `internal` extension input option. + +- 492503a: Updated error reporting and app tree resolution logic to attribute errors to the correct extension and allow app startup to proceed more optimistically: + + - If an attachment fails to provide the required input data, the error is now attributed to the attachment rather than the parent extension. + - Singleton extension inputs will now only forward attachment errors if the input is required. + - Array extension inputs will now filter out failed attachments instead of failing the entire app tree resolution. + +- 122d39c: Completely removed support for the deprecated `app.experimental.packages` configuration. Replace existing usage directly with `app.packages`. + +- 9554c36: **DEPRECATED**: Deprecated support for multiple attachment points. + +- 53b6549: Plugins in the new frontend system now have a `pluginId` field rather than `id` to better align with naming conventions used throughout the frontend and backend systems. The old field is still present but marked as deprecated. All internal code has been updated to prefer `pluginId` while maintaining backward compatibility by falling back to `id` when needed. + +- 69d880e: Bump to latest zod to ensure it has the latest features + +- Updated dependencies + - @backstage/frontend-defaults@0.3.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/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## @backstage/frontend-defaults@0.3.6-next.0 + +### Patch Changes + +- 17e0eb3: The `API_FACTORY_CONFLICT` error is now treated as a warning and will not prevent the app from starting. +- 122d39c: Completely removed support for the deprecated `app.experimental.packages` configuration. Replace existing usage directly with `app.packages`. +- c38b74d: Dependency update for tests. +- 53b6549: Plugins in the new frontend system now have a `pluginId` field rather than `id` to better align with naming conventions used throughout the frontend and backend systems. The old field is still present but marked as deprecated. All internal code has been updated to prefer `pluginId` while maintaining backward compatibility by falling back to `id` when needed. +- Updated dependencies + - @backstage/frontend-app-api@0.14.1-next.0 + - @backstage/core-components@0.18.6-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/plugin-app@0.4.0-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/frontend-dynamic-feature-loader@0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/config@1.3.6 + +## @backstage/frontend-test-utils@0.4.5-next.0 + +### Patch Changes + +- d7dd5bd: Fixed Router deprecation warning and switched to using new `RouterBlueprint` from `@backstage/plugin-app-api`. +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/frontend-app-api@0.14.1-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/plugin-app@0.4.0-next.0 + - @backstage/plugin-app-react@0.1.1-next.0 + - @backstage/config@1.3.6 + - @backstage/test-utils@1.7.15-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## @backstage/integration@1.19.3-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/integration-aws-node@0.1.20-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/integration-react@1.2.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.3-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/config@1.3.6 + +## @backstage/repo-tools@0.16.3-next.0 + +### Patch Changes + +- cd75ed0: Add newline to OpenAPI license template files. +- 7455dae: Use node prefix on native imports +- 4fc7bf0: Bump to tar v7 +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/config-loader@1.10.8-next.0 + - @backstage/cli-common@0.1.18-next.0 + - @backstage/cli-node@0.2.17-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + +## @techdocs/cli@1.10.5-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/plugin-techdocs-node@1.14.1-next.0 + - @backstage/cli-common@0.1.18-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + +## @backstage/test-utils@1.7.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/core-app-api@1.19.4-next.0 + - @backstage/config@1.3.6 + - @backstage/theme@0.7.1 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-react@0.4.40-next.0 + +## @backstage/plugin-api-docs@0.13.4-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 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/plugin-catalog@1.32.3-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-catalog-common@1.1.8-next.0 + - @backstage/plugin-permission-react@0.4.40-next.0 + +## @backstage/plugin-app-backend@0.5.11-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/config-loader@1.10.8-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/plugin-app-node@0.1.42-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-app-node@0.1.42-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/config-loader@1.10.8-next.0 + +## @backstage/plugin-app-react@0.1.1-next.0 + +### Patch Changes + +- 409af72: Internal refactor to move implementation of blueprints from `@backstage/frontend-plugin-api` to this package. +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + +## @backstage/plugin-app-visualizer@0.1.28-next.0 + +### Patch Changes + +- cb090b4: Bump react-aria-components to v1.14.0 +- c38b74d: Internal updates for blueprint moves to `@backstage/plugin-app-react`. +- 4d50e1f: Improved rendering performance of the details page. +- Updated dependencies + - @backstage/ui@0.12.0-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/plugin-auth@0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.6-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/errors@1.2.7 + - @backstage/theme@0.7.1 + +## @backstage/plugin-auth-backend@0.26.1-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-auth-backend-module-atlassian-provider@0.4.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.12-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-backend@0.26.1-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/errors@1.2.7 + +## @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.16-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-auth-backend-module-bitbucket-provider@0.3.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.2.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.4.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-auth-backend-module-gcp-iap-provider@0.4.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-auth-backend-module-google-provider@0.3.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## @backstage/plugin-auth-backend-module-guest-provider@0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-auth-backend-module-microsoft-provider@0.3.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## @backstage/plugin-auth-backend-module-oauth2-provider@0.4.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.16-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/errors@1.2.7 + +## @backstage/plugin-auth-backend-module-oidc-provider@0.4.12-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-backend@0.26.1-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + +## @backstage/plugin-auth-backend-module-okta-provider@0.2.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## @backstage/plugin-auth-backend-module-onelogin-provider@0.3.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## @backstage/plugin-auth-backend-module-openshift-provider@0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + +## @backstage/plugin-auth-backend-module-pinniped-provider@0.3.11-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + +## @backstage/plugin-auth-backend-module-vmware-cloud-provider@0.5.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/catalog-model@1.7.6 + +## @backstage/plugin-auth-node@0.6.12-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-auth-react@0.1.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.6-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/errors@1.2.7 + +## @backstage/plugin-bitbucket-cloud-common@0.3.7-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/integration@1.19.3-next.0 + +## @backstage/plugin-catalog@1.32.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.6-next.0 + - @backstage/core-components@0.18.6-next.0 + - @backstage/plugin-search-common@1.2.22-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/plugin-techdocs-react@1.3.8-next.0 + - @backstage/plugin-search-react@1.10.3-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.15-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-catalog-common@1.1.8-next.0 + - @backstage/plugin-permission-react@0.4.40-next.0 + - @backstage/plugin-scaffolder-common@1.7.6-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-catalog-backend-module-aws@0.4.20-next.0 + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/integration-aws-node@0.1.20-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8-next.0 + - @backstage/plugin-kubernetes-common@0.9.10-next.0 + +## @backstage/plugin-catalog-backend-module-azure@0.3.14-next.0 + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8-next.0 + +## @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.11-next.0 + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-openapi-utils@0.6.6-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.5.8-next.0 + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.3.7-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.5.8-next.0 + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8-next.0 + +## @backstage/plugin-catalog-backend-module-gcp@0.3.16-next.0 + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-kubernetes-common@0.9.10-next.0 + +## @backstage/plugin-catalog-backend-module-gerrit@0.3.11-next.0 + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8-next.0 + +## @backstage/plugin-catalog-backend-module-gitea@0.1.9-next.0 + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8-next.0 + +## @backstage/plugin-catalog-backend-module-github@0.12.2-next.0 + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8-next.0 + +## @backstage/plugin-catalog-backend-module-github-org@0.3.19-next.0 + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- Updated dependencies + - @backstage/plugin-catalog-backend-module-github@0.12.2-next.0 + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/config@1.3.6 + +## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.18-next.0 + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- Updated dependencies + - @backstage/plugin-catalog-backend-module-gitlab@0.8.0-next.0 + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.7.9-next.0 + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-catalog-backend@3.4.0-next.0 + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-catalog-backend-module-ldap@0.12.2-next.0 + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8-next.0 + +## @backstage/plugin-catalog-backend-module-logs@0.1.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.4.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + +## @backstage/plugin-catalog-backend-module-msgraph@0.8.5-next.0 + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8-next.0 + +## @backstage/plugin-catalog-backend-module-openapi@0.2.19-next.0 + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8-next.0 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.2.19-next.0 + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.17-next.0 + +### Patch Changes + +- cfd8103: Updated imports to use stable catalog extension points from `@backstage/plugin-catalog-node` instead of the deprecated alpha exports. +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-catalog-common@1.1.8-next.0 + - @backstage/plugin-scaffolder-common@1.7.6-next.0 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.6.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-unprocessed-entities-common@0.0.13-next.0 + +## @backstage/plugin-catalog-common@1.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-common@1.2.22-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/catalog-model@1.7.6 + +## @backstage/plugin-catalog-graph@0.5.7-next.0 + +### Patch Changes + +- 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/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + +## @backstage/plugin-catalog-import@0.13.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.6-next.0 + - @backstage/core-components@0.18.6-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.15-next.0 + - @backstage/plugin-catalog-common@1.1.8-next.0 + - @backstage/plugin-permission-react@0.4.40-next.0 + +## @backstage/plugin-catalog-react@1.21.6-next.0 + +### Patch Changes + +- f523983: Fixes a bug where the `EntityListProvider` would not correctly hydrate query parameters if more than 20 were provided for the same key. +- 69d880e: Bump to latest zod to ensure it has the latest features +- 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/frontend-test-utils@0.4.5-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.15-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-catalog-common@1.1.8-next.0 + - @backstage/plugin-permission-react@0.4.40-next.0 + +## @backstage/plugin-catalog-unprocessed-entities@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 + +## @backstage/plugin-catalog-unprocessed-entities-common@0.0.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-config-schema@0.1.77-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.6-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-devtools@0.1.36-next.0 + +### Patch Changes + +- f2612c2: Fixes an issue where a user lacking permission to schedule tasks can now easily see the issue through a custom icon + tooltip. +- 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-devtools-common@0.1.22-next.0 + - @backstage/plugin-devtools-react@0.1.1-next.0 + - @backstage/plugin-permission-react@0.4.40-next.0 + +## @backstage/plugin-devtools-backend@0.5.14-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/config-loader@1.10.8-next.0 + - @backstage/cli-common@0.1.18-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/plugin-permission-node@0.10.9-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-devtools-common@0.1.22-next.0 + +## @backstage/plugin-devtools-common@0.1.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-devtools-react@0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + +## @backstage/plugin-events-backend@0.5.11-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.6-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-events-backend-module-aws-sqs@0.4.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + +## @backstage/plugin-events-backend-module-azure@0.2.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + +## @backstage/plugin-events-backend-module-bitbucket-cloud@0.2.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + +## @backstage/plugin-events-backend-module-bitbucket-server@0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + +## @backstage/plugin-events-backend-module-gerrit@0.2.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + +## @backstage/plugin-events-backend-module-github@0.4.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + +## @backstage/plugin-events-backend-module-gitlab@0.3.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/config@1.3.6 + +## @backstage/plugin-events-backend-module-google-pubsub@0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-events-backend-module-kafka@0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + +## @backstage/plugin-events-backend-test-utils@0.1.52-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.19-next.0 + +## @backstage/plugin-events-node@0.4.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-gateway-backend@1.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + +## @backstage/plugin-home@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 + +## @backstage/plugin-home-react@0.1.35-next.0 + +### Patch Changes + +- Updated dependencies + - @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/plugin-kubernetes@0.12.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.6-next.0 + - @backstage/core-components@0.18.6-next.0 + - @backstage/plugin-kubernetes-react@0.5.16-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-kubernetes-common@0.9.10-next.0 + - @backstage/plugin-permission-react@0.4.40-next.0 + +## @backstage/plugin-kubernetes-backend@0.21.1-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/integration-aws-node@0.1.20-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-kubernetes-node@0.4.1-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/plugin-permission-node@0.10.9-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-kubernetes-common@0.9.10-next.0 + +## @backstage/plugin-kubernetes-cluster@0.0.34-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.6-next.0 + - @backstage/core-components@0.18.6-next.0 + - @backstage/plugin-kubernetes-react@0.5.16-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-kubernetes-common@0.9.10-next.0 + - @backstage/plugin-permission-react@0.4.40-next.0 + +## @backstage/plugin-kubernetes-common@0.9.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + +## @backstage/plugin-kubernetes-node@0.4.1-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/types@1.2.2 + - @backstage/plugin-kubernetes-common@0.9.10-next.0 + +## @backstage/plugin-kubernetes-react@0.5.16-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/core-components@0.18.6-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-kubernetes-common@0.9.10-next.0 + +## @backstage/plugin-mcp-actions-backend@0.1.8-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-mui-to-bui@0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.0-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/theme@0.7.1 + +## @backstage/plugin-notifications@0.5.14-next.0 + +### Patch Changes + +- Updated dependencies + - @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/errors@1.2.7 + - @backstage/theme@0.7.1 + - @backstage/plugin-notifications-common@0.2.0 + - @backstage/plugin-signals-react@0.0.19-next.0 + +## @backstage/plugin-notifications-backend@0.6.2-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-notifications-node@0.2.23-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-notifications-common@0.2.0 + - @backstage/plugin-signals-node@0.1.28-next.0 + +## @backstage/plugin-notifications-backend-module-email@0.3.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/integration-aws-node@0.1.20-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-notifications-node@0.2.23-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-notifications-common@0.2.0 + +## @backstage/plugin-notifications-backend-module-slack@0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-notifications-node@0.2.23-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-notifications-common@0.2.0 + +## @backstage/plugin-notifications-node@0.2.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-notifications-common@0.2.0 + - @backstage/plugin-signals-node@0.1.28-next.0 + +## @backstage/plugin-org@0.6.49-next.0 + +### Patch Changes + +- 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/catalog-model@1.7.6 + - @backstage/plugin-catalog-common@1.1.8-next.0 + +## @backstage/plugin-org-react@0.1.47-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.6-next.0 + - @backstage/core-components@0.18.6-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + +## @backstage/plugin-permission-backend@0.7.8-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/plugin-permission-node@0.10.9-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-permission-backend-module-allow-all-policy@0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/plugin-permission-node@0.10.9-next.0 + +## @backstage/plugin-permission-common@0.9.5-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-permission-node@0.10.9-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-permission-react@0.4.40-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/config@1.3.6 + +## @backstage/plugin-proxy-backend@0.6.10-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-proxy-node@0.1.12-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-proxy-node@0.1.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + +## @backstage/plugin-scaffolder@1.35.2-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports + +- 2eeca03: Scaffolder form fields in the new frontend system now use a Utility API pattern instead of multiple attachment points. The `FormFieldBlueprint` now uses this new approach, and while form fields created with older versions still work, they will produce a deprecation warning and will stop working in a future release. + + As part of this change, the following alpha exports were removed: + + - `formFieldsApiRef` + - `ScaffolderFormFieldsApi` + +- 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/integration@1.19.3-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/plugin-scaffolder-react@1.19.6-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.15-next.0 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-common@1.1.8-next.0 + - @backstage/plugin-permission-react@0.4.40-next.0 + - @backstage/plugin-scaffolder-common@1.7.6-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-scaffolder-backend@3.1.2-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 4fc7bf0: Removed unused dependency +- 1e669cc: Migrate audit events reference docs to . +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.17-next.0 + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.2-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.19-next.0 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.18-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.9.5-next.0 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.11.2-next.0 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.18-next.0 + - @backstage/backend-openapi-utils@0.6.6-next.0 + - @backstage/plugin-bitbucket-cloud-common@0.3.7-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.4-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/plugin-permission-node@0.10.9-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.18-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.18-next.0 + - @backstage/plugin-scaffolder-common@1.7.6-next.0 + +## @backstage/plugin-scaffolder-backend-module-azure@0.2.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.12.4-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.19-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.2-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.12.4-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.18-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.2-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 14741e2: Fully enable API token functionality for Bitbucket-Cloud. +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/plugin-bitbucket-cloud-common@0.3.7-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.12.4-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.12.4-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.18-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.12.4-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.20-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/plugin-scaffolder-node@0.12.4-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-backend-module-gcp@0.2.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.12.4-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.18-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.12.4-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.2.18-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.12.4-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-github@0.9.5-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 82ca951: cleaned up repo creation to make the unique portions explicit +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.12.4-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.11.2-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.12.4-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-notifications@0.1.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.12.4-next.0 + - @backstage/plugin-notifications-node@0.2.23-next.0 + - @backstage/plugin-notifications-common@0.2.0 + +## @backstage/plugin-scaffolder-backend-module-rails@0.5.18-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.12.4-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-backend-module-sentry@0.3.1-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.12.4-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.19-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-scaffolder-node-test-utils@0.3.8-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.12.4-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-common@1.7.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.3-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-node@0.12.4-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 4fc7bf0: Bump to tar v7 +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-scaffolder-common@1.7.6-next.0 + +## @backstage/plugin-scaffolder-node-test-utils@0.3.8-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-test-utils@1.10.4-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-scaffolder-node@0.12.4-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-scaffolder-react@1.19.6-next.0 + +### Patch Changes + +- 2eeca03: Scaffolder form fields in the new frontend system now use a Utility API pattern instead of multiple attachment points. The `FormFieldBlueprint` now uses this new approach, and while form fields created with older versions still work, they will produce a deprecation warning and will stop working in a future release. + + As part of this change, the following alpha exports were removed: + + - `formFieldsApi` + - `formFieldsApiRef` + - `ScaffolderFormFieldsApi` + +- 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/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/theme@0.7.1 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-permission-react@0.4.40-next.0 + - @backstage/plugin-scaffolder-common@1.7.6-next.0 + +## @backstage/plugin-search@1.5.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.6-next.0 + - @backstage/core-components@0.18.6-next.0 + - @backstage/plugin-search-common@1.2.22-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/plugin-search-react@1.10.3-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## @backstage/plugin-search-backend@2.0.11-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.6-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-search-backend-node@1.4.1-next.0 + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/plugin-search-common@1.2.22-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/plugin-permission-node@0.10.9-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-search-backend-module-catalog@0.3.12-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-search-backend-node@1.4.1-next.0 + - @backstage/plugin-search-common@1.2.22-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-catalog-common@1.1.8-next.0 + +## @backstage/plugin-search-backend-module-elasticsearch@1.7.10-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/integration-aws-node@0.1.20-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-search-backend-node@1.4.1-next.0 + - @backstage/plugin-search-common@1.2.22-next.0 + - @backstage/config@1.3.6 + +## @backstage/plugin-search-backend-module-explore@0.3.11-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-search-backend-node@1.4.1-next.0 + - @backstage/plugin-search-common@1.2.22-next.0 + - @backstage/config@1.3.6 + +## @backstage/plugin-search-backend-module-pg@0.5.52-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-search-backend-node@1.4.1-next.0 + - @backstage/plugin-search-common@1.2.22-next.0 + - @backstage/config@1.3.6 + +## @backstage/plugin-search-backend-module-stack-overflow-collator@0.3.17-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-search-backend-node@1.4.1-next.0 + - @backstage/plugin-search-common@1.2.22-next.0 + - @backstage/config@1.3.6 + +## @backstage/plugin-search-backend-module-techdocs@0.4.11-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-search-backend-node@1.4.1-next.0 + - @backstage/plugin-search-common@1.2.22-next.0 + - @backstage/plugin-techdocs-node@1.14.1-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/plugin-catalog-common@1.1.8-next.0 + +## @backstage/plugin-search-backend-node@1.4.1-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-search-common@1.2.22-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## @backstage/plugin-search-common@1.2.22-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-search-react@1.10.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.6-next.0 + - @backstage/plugin-search-common@1.2.22-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/theme@0.7.1 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## @backstage/plugin-signals@0.0.28-next.0 + +### Patch Changes + +- Updated dependencies + - @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/theme@0.7.1 + - @backstage/types@1.2.2 + - @backstage/plugin-signals-react@0.0.19-next.0 + +## @backstage/plugin-signals-backend@0.3.12-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-signals-node@0.1.28-next.0 + +## @backstage/plugin-signals-node@0.1.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + +## @backstage/plugin-signals-react@0.0.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/types@1.2.2 + +## @backstage/plugin-techdocs@1.16.3-next.0 + +### Patch Changes + +- 9e29545: Improve sidebars (nav/TOC) layout and scrolling +- 22dce2b: TechDocs addons in the new frontend system now use a Utility API pattern instead of multiple attachment points. The `AddonBlueprint` now uses this new approach, and while addons created with older versions still work, they will produce a deprecation warning and will stop working in a future release. +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.6-next.0 + - @backstage/core-components@0.18.6-next.0 + - @backstage/plugin-search-common@1.2.22-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/plugin-search-react@1.10.3-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/integration-react@1.2.15-next.0 + - @backstage/theme@0.7.1 + - @backstage/plugin-auth-react@0.1.24-next.0 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-techdocs-addons-test-utils@2.0.2-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.6-next.0 + - @backstage/plugin-techdocs@1.16.3-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/core-app-api@1.19.4-next.0 + - @backstage/plugin-search-react@1.10.3-next.0 + - @backstage/plugin-catalog@1.32.3-next.0 + - @backstage/integration-react@1.2.15-next.0 + - @backstage/test-utils@1.7.15-next.0 + +## @backstage/plugin-techdocs-backend@2.1.5-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/plugin-techdocs-node@1.14.1-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.33-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.6-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/integration-react@1.2.15-next.0 + +## @backstage/plugin-techdocs-node@1.14.1-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/integration-aws-node@0.1.20-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-search-common@1.2.22-next.0 + - @backstage/integration@1.19.3-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-techdocs-react@1.3.8-next.0 + +### Patch Changes + +- 22dce2b: TechDocs addons in the new frontend system now use a Utility API pattern instead of multiple attachment points. The `AddonBlueprint` now uses this new approach, and while addons created with older versions still work, they will produce a deprecation warning and will stop working in a future release. + + As part of this change, the `techDocsAddonDataRef` alpha export was removed. + +- Updated dependencies + - @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/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/version-bridge@1.0.11 + - @backstage/plugin-techdocs-common@0.1.1 + +## @backstage/plugin-user-settings@0.8.32-next.0 + +### Patch Changes + +- 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-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/theme@0.7.1 + - @backstage/types@1.2.2 + - @backstage/plugin-signals-react@0.0.19-next.0 + - @backstage/plugin-user-settings-common@0.0.1 + +## @backstage/plugin-user-settings-backend@0.3.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-signals-node@0.1.28-next.0 + - @backstage/plugin-user-settings-common@0.0.1 + +## example-app@0.2.118-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-app-api@0.14.1-next.0 + - @backstage/plugin-catalog-react@1.21.6-next.0 + - @backstage/cli@0.35.3-next.0 + - @backstage/ui@0.12.0-next.0 + - @backstage/core-components@0.18.6-next.0 + - @backstage/plugin-search-common@1.2.22-next.0 + - @backstage/plugin-scaffolder@1.35.2-next.0 + - @backstage/plugin-api-docs@0.13.4-next.0 + - @backstage/plugin-scaffolder-react@1.19.6-next.0 + - @backstage/plugin-techdocs@1.16.3-next.0 + - @backstage/plugin-devtools@0.1.36-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/core-app-api@1.19.4-next.0 + - @backstage/plugin-home@0.9.1-next.0 + - @backstage/plugin-search-react@1.10.3-next.0 + - @backstage/plugin-catalog@1.32.3-next.0 + - @backstage/plugin-catalog-graph@0.5.7-next.0 + - @backstage/plugin-catalog-import@0.13.10-next.0 + - @backstage/plugin-kubernetes@0.12.16-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.34-next.0 + - @backstage/plugin-org@0.6.49-next.0 + - @backstage/plugin-search@1.5.4-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.33-next.0 + - @backstage/plugin-user-settings@0.8.32-next.0 + - @backstage/app-defaults@1.7.5-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/integration-react@1.2.15-next.0 + - @backstage/theme@0.7.1 + - @backstage/plugin-auth-react@0.1.24-next.0 + - @backstage/plugin-catalog-common@1.1.8-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.26-next.0 + - @backstage/plugin-mui-to-bui@0.2.4-next.0 + - @backstage/plugin-notifications@0.5.14-next.0 + - @backstage/plugin-permission-react@0.4.40-next.0 + - @backstage/plugin-signals@0.0.28-next.0 + +## example-app-next@0.0.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-defaults@0.3.6-next.0 + - @backstage/frontend-app-api@0.14.1-next.0 + - @backstage/plugin-catalog-react@1.21.6-next.0 + - @backstage/plugin-app-visualizer@0.1.28-next.0 + - @backstage/cli@0.35.3-next.0 + - @backstage/ui@0.12.0-next.0 + - @backstage/core-components@0.18.6-next.0 + - @backstage/plugin-search-common@1.2.22-next.0 + - @backstage/plugin-scaffolder@1.35.2-next.0 + - @backstage/plugin-api-docs@0.13.4-next.0 + - @backstage/core-compat-api@0.5.7-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/plugin-app@0.4.0-next.0 + - @backstage/plugin-scaffolder-react@1.19.6-next.0 + - @backstage/plugin-techdocs@1.16.3-next.0 + - @backstage/plugin-devtools@0.1.36-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/plugin-app-react@0.1.1-next.0 + - @backstage/core-app-api@1.19.4-next.0 + - @backstage/plugin-home@0.9.1-next.0 + - @backstage/plugin-auth@0.1.5-next.0 + - @backstage/plugin-search-react@1.10.3-next.0 + - @backstage/plugin-catalog@1.32.3-next.0 + - @backstage/plugin-catalog-graph@0.5.7-next.0 + - @backstage/plugin-catalog-import@0.13.10-next.0 + - @backstage/plugin-kubernetes@0.12.16-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.34-next.0 + - @backstage/plugin-org@0.6.49-next.0 + - @backstage/plugin-search@1.5.4-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.33-next.0 + - @backstage/plugin-user-settings@0.8.32-next.0 + - @backstage/app-defaults@1.7.5-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/integration-react@1.2.15-next.0 + - @backstage/theme@0.7.1 + - @backstage/plugin-auth-react@0.1.24-next.0 + - @backstage/plugin-catalog-common@1.1.8-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.26-next.0 + - @backstage/plugin-notifications@0.5.14-next.0 + - @backstage/plugin-permission-react@0.4.40-next.0 + - @backstage/plugin-signals@0.0.28-next.0 + +## app-next-example-plugin@0.0.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.6-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + +## example-backend@0.0.47-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@3.4.0-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.11-next.0 + - @backstage/plugin-catalog-backend-module-openapi@0.2.19-next.0 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.17-next.0 + - @backstage/plugin-search-backend-module-elasticsearch@1.7.10-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.9.5-next.0 + - @backstage/plugin-search-backend-module-techdocs@0.4.11-next.0 + - @backstage/plugin-search-backend-module-catalog@0.3.12-next.0 + - @backstage/plugin-search-backend-module-explore@0.3.11-next.0 + - @backstage/plugin-notifications-backend@0.6.2-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-search-backend-node@1.4.1-next.0 + - @backstage/plugin-kubernetes-backend@0.21.1-next.0 + - @backstage/plugin-permission-backend@0.7.8-next.0 + - @backstage/plugin-scaffolder-backend@3.1.2-next.0 + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/plugin-devtools-backend@0.5.14-next.0 + - @backstage/plugin-techdocs-backend@2.1.5-next.0 + - @backstage/plugin-signals-backend@0.3.12-next.0 + - @backstage/plugin-events-backend@0.5.11-next.0 + - @backstage/plugin-search-backend@2.0.11-next.0 + - @backstage/plugin-proxy-backend@0.6.10-next.0 + - @backstage/plugin-auth-backend@0.26.1-next.0 + - @backstage/plugin-app-backend@0.5.11-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.5.0-next.0 + - @backstage/plugin-mcp-actions-backend@0.1.8-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/plugin-permission-node@0.10.9-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.16-next.0 + - @backstage/plugin-auth-backend-module-openshift-provider@0.1.4-next.0 + - @backstage/plugin-events-backend-module-google-pubsub@0.1.8-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.16-next.0 + - @backstage/plugin-catalog-backend-module-unprocessed@0.6.8-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-scaffolder-backend-module-notifications@0.1.19-next.0 + +## e2e-test@0.2.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.1.18-next.0 + - @backstage/create-app@0.7.9-next.0 + - @backstage/errors@1.2.7 + +## @internal/frontend@0.0.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## @internal/scaffolder@0.0.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/plugin-scaffolder-react@1.19.6-next.0 + +## techdocs-cli-embedded-app@0.2.117-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.35.3-next.0 + - @backstage/ui@0.12.0-next.0 + - @backstage/core-components@0.18.6-next.0 + - @backstage/plugin-techdocs@1.16.3-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/core-app-api@1.19.4-next.0 + - @backstage/plugin-catalog@1.32.3-next.0 + - @backstage/app-defaults@1.7.5-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/integration-react@1.2.15-next.0 + - @backstage/test-utils@1.7.15-next.0 + - @backstage/theme@0.7.1 + +## yarn-plugin-backstage@0.0.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.1.18-next.0 + - @backstage/errors@1.2.7 + - @backstage/release-manifests@0.0.13 + +## @internal/plugin-todo-list@1.0.48-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.6-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + +## @internal/plugin-todo-list-backend@1.0.47-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/errors@1.2.7 + +## @internal/plugin-todo-list-common@1.0.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.9.5-next.0 diff --git a/docs/releases/v1.48.0-next.1-changelog.md b/docs/releases/v1.48.0-next.1-changelog.md new file mode 100644 index 0000000000..d15b1a220a --- /dev/null +++ b/docs/releases/v1.48.0-next.1-changelog.md @@ -0,0 +1,29587 @@ +# Release v1.48.0-next.1 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.48.0-next.1](https://backstage.github.io/upgrade-helper/?to=1.48.0-next.1) + +## @backstage/backend-test-utils@1.10.5-next.0 + +# @backstage/backend-test-utils + +## 1.10.4-next.0 + +### Patch Changes + +- f1d29b4: Updated `startTestBackend` to support factory-based extension points (v1.1 format) in addition to the existing direct implementation format. +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/backend-app-api@1.5.0-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## 1.10.3 + +### Patch Changes + +- 872eb91: Upgrade `zod-to-json-schema` to latest version +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/backend-plugin-api@1.6.1 + - @backstage/backend-app-api@1.4.1 + - @backstage/plugin-auth-node@0.6.11 + - @backstage/plugin-permission-common@0.9.4 + +## 1.10.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + - @backstage/backend-app-api@1.4.0 + - @backstage/plugin-auth-node@0.6.10 + +## 1.10.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/backend-app-api@1.4.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-node@0.6.10 + - @backstage/plugin-events-node@0.4.18 + - @backstage/plugin-permission-common@0.9.3 + +## 1.10.2 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- 8be23a4: Switched `textextensions` dependency for `text-extensions`. +- 5a737e1: Fix PostgreSQL 18 `TestDatabases` by pinning the data directory +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10 + - @backstage/backend-defaults@0.14.0 + - @backstage/plugin-events-node@0.4.18 + - @backstage/backend-app-api@1.4.0 + - @backstage/backend-plugin-api@1.6.0 + +## 1.10.2-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- 8be23a4: Switched `textextensions` dependency for `text-extensions`. +- 5a737e1: Fix PostgreSQL 18 `TestDatabases` by pinning the data directory +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-events-node@0.4.18-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/backend-app-api@1.4.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.3 + +## 1.10.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.0 + - @backstage/backend-app-api@1.4.0-next.0 + - @backstage/backend-defaults@0.14.0-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + - @backstage/plugin-events-node@0.4.18-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.3 + +## 1.10.0 + +### Minor Changes + +- d57b13b: Added support for Postgres 18 to the available `TestDatabases`. + + Note that the set of _default_ databases to test against for users of the `TestDatabases` class was also updated to include Postgres 14 and 18, instead of 13 and 17. If you need to override this, you can pass in an explicit `ids` argument, for example `ids: ['POSTGRES_17', 'POSTGRES_13', 'SQLITE_3']`. + +### Patch Changes + +- f3001fd: Tweak some of the mock services to have more precise types +- 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/backend-defaults@0.13.1 + - @backstage/backend-plugin-api@1.5.0 + - @backstage/backend-app-api@1.3.0 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-events-node@0.4.17 + - @backstage/plugin-auth-node@0.6.9 + - @backstage/config@1.3.6 + +## 1.10.0-next.2 + +### Patch Changes + +- f3001fd: Tweak some of the mock services to have more precise types +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0-next.2 + +## 1.10.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.1-next.1 + - @backstage/backend-plugin-api@1.5.0-next.1 + - @backstage/backend-app-api@1.3.0-next.1 + - @backstage/plugin-permission-common@0.9.3-next.1 + - @backstage/plugin-auth-node@0.6.9-next.1 + - @backstage/plugin-events-node@0.4.17-next.1 + +## 1.10.0-next.0 + +### Minor Changes + +- d57b13b: Added support for Postgres 18 to the available `TestDatabases`. + + Note that the set of _default_ databases to test against for users of the `TestDatabases` class was also updated to include Postgres 14 and 18, instead of 13 and 17. If you need to override this, you can pass in an explicit `ids` argument, for example `ids: ['POSTGRES_17', 'POSTGRES_13', 'SQLITE_3']`. + +### 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/backend-defaults@0.13.1-next.0 + - @backstage/plugin-events-node@0.4.17-next.0 + - @backstage/plugin-auth-node@0.6.9-next.0 + - @backstage/backend-app-api@1.2.9-next.0 + - @backstage/config@1.3.6-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.3-next.0 + +## 1.9.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0 + - @backstage/backend-app-api@1.2.8 + - @backstage/config@1.3.5 + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-auth-node@0.6.8 + - @backstage/plugin-events-node@0.4.16 + - @backstage/plugin-permission-common@0.9.2 + +## 1.9.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/backend-app-api@1.2.8-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-events-node@0.4.16-next.0 + +## 1.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/backend-app-api@1.2.7 + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-events-node@0.4.15 + - @backstage/plugin-permission-common@0.9.1 + +## 1.9.0 + +### Minor Changes + +- 4e2c237: The `mockServices.rootConfig()` instance now has an `update` method that can be used to test configuration subscriptions and updates. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.12.1 + - @backstage/plugin-auth-node@0.6.7 + - @backstage/plugin-events-node@0.4.15 + - @backstage/types@1.2.2 + - @backstage/backend-app-api@1.2.7 + - @backstage/backend-plugin-api@1.4.3 + +## 1.9.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7-next.0 + - @backstage/backend-defaults@0.12.1-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + - @backstage/backend-app-api@1.2.7-next.0 + - @backstage/plugin-events-node@0.4.15-next.0 + +## 1.9.0-next.0 + +### Minor Changes + +- 4e2c237: The `mockServices.rootConfig()` instance now has an `update` method that can be used to test configuration subscriptions and updates. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@1.2.6 + - @backstage/backend-defaults@0.12.0 + - @backstage/backend-plugin-api@1.4.2 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-auth-node@0.6.6 + - @backstage/plugin-events-node@0.4.14 + - @backstage/plugin-permission-common@0.9.1 + +## 1.8.0 + +### Minor Changes + +- dffaf70: Switched out `mockServices.scheduler` to use a mocked implementation instead of the default scheduler implementation. This implementation runs any scheduled tasks immediately on startup, as long as they don't have an initial delay or a manual trigger. After the initial run, the tasks are never run again unless manually triggered. + +### Patch Changes + +- 279e1f7: Updated the type definition of `mockErrorHandler` to ensure that it is used correctly. + + ```ts + // This is wrong and will now result in a type error + app.use(mockErrorHandler); + + // This is the correct usage + app.use(mockErrorHandler()); + ``` + +- 3a7dad9: Updated `better-sqlite3` to v12 + +- Updated dependencies + - @backstage/backend-defaults@0.12.0 + - @backstage/backend-app-api@1.2.6 + - @backstage/plugin-auth-node@0.6.6 + - @backstage/backend-plugin-api@1.4.2 + - @backstage/plugin-events-node@0.4.14 + +## 1.7.1-next.0 + +### Patch Changes + +- 3a7dad9: Updated `better-sqlite3` to v12 +- Updated dependencies + - @backstage/backend-defaults@0.11.2-next.0 + - @backstage/backend-app-api@1.2.6-next.0 + - @backstage/plugin-auth-node@0.6.6-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + - @backstage/plugin-events-node@0.4.14-next.0 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.9.1 + +## 1.7.0 + +### Minor Changes + +- ead925a: Add a standard `toString` on credentials objects + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.3 + - @backstage/plugin-permission-common@0.9.1 + - @backstage/backend-defaults@0.11.1 + - @backstage/backend-app-api@1.2.5 + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-auth-node@0.6.5 + - @backstage/plugin-events-node@0.4.13 + +## 1.7.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.3-next.0 + - @backstage/plugin-permission-common@0.9.1-next.0 + - @backstage/backend-defaults@0.11.1-next.1 + - @backstage/backend-app-api@1.2.5-next.0 + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-auth-node@0.6.5-next.0 + - @backstage/plugin-events-node@0.4.13-next.0 + +## 1.7.0-next.0 + +### Minor Changes + +- ead925a: Add a standard `toString` on credentials objects + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.11.1-next.0 + - @backstage/backend-app-api@1.2.4 + - @backstage/plugin-auth-node@0.6.4 + - @backstage/backend-plugin-api@1.4.0 + - @backstage/plugin-events-node@0.4.12 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.9.0 + +## 1.6.0 + +### Minor Changes + +- 6dfb7be: Added `mockServices.permissions()` that can return actual results. +- c999c25: Added an `actionsRegistryServiceMock` and `actionsServiceMock` to `/alpha` export for the experimental services. + + This allows you to write tests for your actions by doing something similar to the following: + + ```ts + import { actionsRegistryServiceMock } from '@backstage/backend-test-utils/alpha'; + + const mockActionsRegistry = actionsRegistryServiceMock(); + const mockCatalog = catalogServiceMock({ + entities: [ + ... + ], + }); + + createGetCatalogEntityAction({ + catalog: mockCatalog, + actionsRegistry: mockActionsRegistry, + }); + + await expect( + mockActionsRegistry.invoke({ + id: 'test:get-catalog-entity', + input: { name: 'test' }, + }), + ).resolves.toEqual(...) + ``` + +### Patch Changes + +- 12c1fd4: Make the `user` credentials mock behave more like production +- Updated dependencies + - @backstage/backend-defaults@0.11.0 + - @backstage/plugin-auth-node@0.6.4 + - @backstage/backend-app-api@1.2.4 + - @backstage/backend-plugin-api@1.4.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.12 + - @backstage/plugin-permission-common@0.9.0 + +## 1.6.0-next.2 + +### Patch Changes + +- 12c1fd4: Make the `user` credentials mock behave more like production +- Updated dependencies + - @backstage/backend-defaults@0.11.0-next.2 + - @backstage/backend-app-api@1.2.4-next.2 + - @backstage/backend-plugin-api@1.4.0-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-auth-node@0.6.4-next.1 + - @backstage/plugin-events-node@0.4.12-next.1 + +## 1.6.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4-next.1 + - @backstage/backend-app-api@1.2.4-next.1 + - @backstage/backend-defaults@0.10.1-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.12-next.1 + +## 1.6.0-next.0 + +### Minor Changes + +- c999c25: Added mock implementations for `ActionsService` and `ActionsRegistryService` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + - @backstage/backend-defaults@0.10.1-next.0 + - @backstage/backend-app-api@1.2.4-next.0 + - @backstage/plugin-auth-node@0.6.4-next.0 + - @backstage/plugin-events-node@0.4.12-next.0 + +## 1.5.0 + +### Minor Changes + +- b3832d1: Add a functional `mockServices.events()` +- c6bc67d: Added Valkey support alongside Redis in backend-defaults cache clients, using the new Keyv Valkey package. Also extended backend-test-utils to support Valkey in tests. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.10.0 + - @backstage/backend-app-api@1.2.3 + - @backstage/plugin-auth-node@0.6.3 + - @backstage/backend-plugin-api@1.3.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.11 + +## 1.5.0-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.10.0-next.3 + - @backstage/plugin-auth-node@0.6.3-next.2 + - @backstage/backend-app-api@1.2.3-next.2 + - @backstage/backend-plugin-api@1.3.1-next.2 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.11-next.2 + +## 1.5.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.10.0-next.2 + - @backstage/config@1.3.2 + - @backstage/backend-app-api@1.2.3-next.1 + - @backstage/plugin-auth-node@0.6.3-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.11-next.1 + +## 1.5.0-next.1 + +### Minor Changes + +- c6bc67d: Added Valkey support alongside Redis in backend-defaults cache clients, using the new Keyv Valkey package. Also extended backend-test-utils to support Valkey in tests. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.10.0-next.1 + - @backstage/backend-app-api@1.2.3-next.1 + - @backstage/plugin-auth-node@0.6.3-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.11-next.1 + +## 1.5.0-next.0 + +### Minor Changes + +- b3832d1: Add a functional `mockServices.events()` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.1-next.0 + - @backstage/backend-app-api@1.2.3-next.0 + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/plugin-auth-node@0.6.3-next.0 + - @backstage/plugin-events-node@0.4.11-next.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 1.4.0 + +### Minor Changes + +- cf4eb13: Added `actor` property to `BackstageUserPrincipal` containing the subject of the last service (if any) who performed authentication on behalf of the user. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0 + - @backstage/backend-plugin-api@1.3.0 + - @backstage/backend-app-api@1.2.2 + - @backstage/plugin-auth-node@0.6.2 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.10 + +## 1.3.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.2 + - @backstage/backend-app-api@1.2.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-events-node@0.4.9 + +## 1.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/backend-app-api@1.2.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.9 + +## 1.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/backend-app-api@1.2.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.9 + +## 1.3.1 + +### Patch Changes + +- c3a91d5: Added support for PostgreSQL version 17 +- 37c6510: Moved `@types/jest` to `devDependencies`. +- Updated dependencies + - @backstage/backend-defaults@0.8.2 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-events-node@0.4.9 + - @backstage/backend-app-api@1.2.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 1.3.1-next.2 + +### Patch Changes + +- 37c6510: Moved `@types/jest` to `devDependencies`. +- Updated dependencies + - @backstage/backend-defaults@0.8.2-next.2 + - @backstage/plugin-events-node@0.4.9-next.2 + - @backstage/backend-app-api@1.2.1-next.2 + - @backstage/backend-plugin-api@1.2.1-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-auth-node@0.6.1-next.1 + +## 1.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.1 + - @backstage/backend-app-api@1.2.1-next.1 + - @backstage/backend-defaults@0.8.2-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.9-next.1 + +## 1.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.8.2-next.0 + - @backstage/backend-app-api@1.2.1-next.0 + - @backstage/plugin-auth-node@0.6.1-next.0 + - @backstage/backend-plugin-api@1.2.1-next.0 + - @backstage/plugin-events-node@0.4.9-next.0 + +## 1.3.0 + +### Minor Changes + +- dd05a97: Added mocks for the new `PermissionsRegistryService`. +- a4aa244: This change introduces mocks for the `auditor` service. + +### Patch Changes + +- f866b86: Internal refactor to use explicit `require` for lazy-loading dependency. +- fb051f2: Sync feature installation compatibility logic with `@backstage/backend-app-api`. +- 72cddf2: Added the new `getPermissionRuleset` method to `mockServices.permissionsRegistry`. +- Updated dependencies + - @backstage/backend-defaults@0.8.0 + - @backstage/backend-plugin-api@1.2.0 + - @backstage/plugin-auth-node@0.6.0 + - @backstage/backend-app-api@1.2.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.8 + +## 1.3.0-next.3 + +### Patch Changes + +- 72cddf2: Added the new `getPermissionRuleset` method to `mockServices.permissionsRegistry`. +- Updated dependencies + - @backstage/backend-defaults@0.8.0-next.3 + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/backend-app-api@1.2.0-next.3 + - @backstage/plugin-auth-node@0.6.0-next.2 + - @backstage/plugin-events-node@0.4.8-next.2 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 1.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/plugin-auth-node@0.6.0-next.1 + - @backstage/backend-defaults@0.8.0-next.2 + - @backstage/backend-app-api@1.2.0-next.2 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-events-node@0.4.8-next.1 + +## 1.3.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@1.1.2-next.1 + - @backstage/backend-defaults@0.8.0-next.1 + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-auth-node@0.5.7-next.0 + - @backstage/plugin-events-node@0.4.8-next.0 + +## 1.3.0-next.0 + +### Minor Changes + +- dd05a97: Added mocks for the new `PermissionsRegistryService`. +- a4aa244: This change introduces mocks for the `auditor` service. + +### Patch Changes + +- f866b86: Internal refactor to use explicit `require` for lazy-loading dependency. +- fb051f2: Sync feature installation compatibility logic with `@backstage/backend-app-api`. +- Updated dependencies + - @backstage/backend-defaults@0.8.0-next.0 + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/backend-app-api@1.1.2-next.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-auth-node@0.5.7-next.0 + - @backstage/plugin-events-node@0.4.8-next.0 + +## 1.2.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0 + - @backstage/backend-app-api@1.1.1 + - @backstage/types@1.2.1 + - @backstage/plugin-auth-node@0.5.6 + - @backstage/backend-plugin-api@1.1.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-events-node@0.4.7 + +## 1.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-app-api@1.1.1-next.1 + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-events-node@0.4.7-next.1 + +## 1.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/backend-app-api@1.1.1-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-events-node@0.4.7-next.0 + +## 1.2.0 + +### Minor Changes + +- de6f280: **BREAKING** Upgraded @keyv/redis and keyv packages to resolve a bug related to incorrect resolution of cache keys. + + This is a breaking change for clients using the `redis` store for cache with `useRedisSets` option set to false since cache keys will be calculated differently (without the sets:namespace: prefix). For clients with default configuration (or useRedisSets set to false) the cache keys will stay the same, but since @keyv/redis library no longer supports redis sets they won't be utilised anymore. + + If you were using `useRedisSets` option in configuration make sure to remove it from `app-config.yaml`: + + ```diff + backend: + cache: + store: redis + connection: redis://user:pass@cache.example.com:6379 + - useRedisSets: false + ``` + +### Patch Changes + +- 0e9c9fa: Mock the new `RootLifecycleService.addBeforeShutdownHook` method. +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/backend-app-api@1.1.0 + - @backstage/plugin-events-node@0.4.6 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## 1.2.0-next.2 + +### Patch Changes + +- 0e9c9fa: Mock the new `RootLifecycleService.addBeforeShutdownHook` method. +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/backend-app-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/plugin-events-node@0.4.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## 1.2.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5-next.1 + - @backstage/backend-defaults@0.6.0-next.1 + - @backstage/backend-app-api@1.1.0-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + - @backstage/config@1.3.0 + - @backstage/errors@1.2.5 + - @backstage/types@1.2.0 + - @backstage/plugin-events-node@0.4.6-next.1 + +## 1.2.0-next.0 + +### Minor Changes + +- de6f280: **BREAKING** Upgraded @keyv/redis and keyv packages to resolve a bug related to incorrect resolution of cache keys. + + This is a breaking change for clients using the `redis` store for cache with `useRedisSets` option set to false since cache keys will be calculated differently (without the sets:namespace: prefix). For clients with default configuration (or useRedisSets set to false) the cache keys will stay the same, but since @keyv/redis library no longer supports redis sets they won't be utilised anymore. + + If you were using `useRedisSets` option in configuration make sure to remove it from `app-config.yaml`: + + ```diff + backend: + cache: + store: redis + connection: redis://user:pass@cache.example.com:6379 + - useRedisSets: false + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.0 + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/backend-app-api@1.0.3-next.0 + - @backstage/plugin-events-node@0.4.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.0 + - @backstage/config@1.3.0 + - @backstage/errors@1.2.5 + - @backstage/types@1.2.0 + +## 1.1.0 + +### Minor Changes + +- 5064827: Made it possible to construct `mockServices.database` with a given knex instance + +### Patch Changes + +- 7aae8e3: The `mockServices.discovery.factory()` factory now uses the mocked discovery service as its implementation, avoid the need for configuration. +- eb82994: Removed unused `msw` dependency. +- 4e58bc7: Upgrade to uuid v11 internally +- Updated dependencies + - @backstage/config@1.3.0 + - @backstage/plugin-events-node@0.4.5 + - @backstage/backend-defaults@0.5.3 + - @backstage/types@1.2.0 + - @backstage/plugin-auth-node@0.5.4 + - @backstage/backend-plugin-api@1.0.2 + - @backstage/backend-app-api@1.0.2 + - @backstage/errors@1.2.5 + +## 1.1.0-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-events-node@0.4.5-next.3 + - @backstage/backend-defaults@0.5.3-next.3 + - @backstage/backend-app-api@1.0.2-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.5.4-next.2 + +## 1.1.0-next.2 + +### Minor Changes + +- 5064827: Made it possible to construct `mockServices.database` with a given knex instance + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.3-next.2 + - @backstage/plugin-events-node@0.4.5-next.2 + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/backend-app-api@1.0.2-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 1.0.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@1.0.2-next.1 + - @backstage/backend-defaults@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.5.4-next.1 + - @backstage/plugin-events-node@0.4.4-next.1 + +## 1.0.3-next.0 + +### Patch Changes + +- 7aae8e3: The `mockServices.discovery.factory()` factory now uses the mocked discovery service as its implementation, avoid the need for configuration. +- eb82994: Removed unused `msw` dependency. +- Updated dependencies + - @backstage/plugin-events-node@0.4.3-next.0 + - @backstage/plugin-auth-node@0.5.4-next.0 + - @backstage/backend-defaults@0.5.3-next.0 + - @backstage/backend-app-api@1.0.2-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 1.0.1 + +### Patch Changes + +- fd6e6f4: build(deps): bump `cookie` from 0.6.0 to 0.7.0 +- a19ce00: The `createMockDirectory` cleanup strategy has been changed, no longer requiring it to be called outside individual tests. +- 9cc7dd6: Minor doc string changes +- Updated dependencies + - @backstage/backend-defaults@0.5.1 + - @backstage/backend-app-api@1.0.1 + - @backstage/plugin-auth-node@0.5.3 + - @backstage/plugin-events-node@0.4.1 + - @backstage/backend-plugin-api@1.0.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 1.0.1-next.2 + +### Patch Changes + +- fd6e6f4: build(deps): bump `cookie` from 0.6.0 to 0.7.0 +- Updated dependencies + - @backstage/backend-app-api@1.0.1-next.1 + - @backstage/backend-defaults@0.5.1-next.2 + - @backstage/plugin-auth-node@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-events-node@0.4.1-next.1 + +## 1.0.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/backend-app-api@1.0.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + +## 1.0.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.0 + - @backstage/backend-app-api@1.0.1-next.0 + - @backstage/plugin-events-node@0.4.1-next.0 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 1.0.0 + +### Major Changes + +- ec1b4be: Release 1.0 of the new backend system! :tada: + + The backend system is finally getting promoted to 1.0.0. This means that the API is now stable and breaking changes should not occur until version 2.0.0, see our [package versioning policy](https://backstage.io/docs/overview/versioning-policy/#package-versioning-policy) for more information what this means. + + This release also marks the end of the old backend system based on `createRouter` exports. Going forward backend plugins packages will start to deprecate and later this year remove exports supporting the old backend system. If you would like to help out with this transition, see or consult the [migration guide](https://backstage.io/docs/backend-system/building-plugins-and-modules/migrating/#remove-support-for-the-old-backend-system). + +### Minor Changes + +- 19ff127: **BREAKING**: Removed service mocks for the identity and token manager services, which have been removed from `@backstage/backend-plugin-api`. +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- 710f621: Added missing service mock for `mockServices.rootConfig.mock`, and fixed the definition of `mockServices.rootHttpRouter.factory` to not have a duplicate callback. +- f421d2a: Make MySQL pool settings a bit more lax +- 0363bf1: There is a new `mockErrorHandler` utility to help in mocking the error middleware in tests. +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-defaults@0.5.0 + - @backstage/backend-app-api@1.0.0 + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-auth-node@0.5.2 + - @backstage/plugin-events-node@0.4.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 1.0.0-next.2 + +### Major Changes + +- ec1b4be: Release 1.0 of the new backend system! :tada: + + The backend system is finally getting promoted to 1.0.0. This means that the API is now stable and breaking changes should not occur until version 2.0.0, see our [package versioning policy](https://backstage.io/docs/overview/versioning-policy/#package-versioning-policy) for more information what this means. + + This release also marks the end of the old backend system based on `createRouter` exports. Going forward backend plugins packages will start to deprecate and later this year remove exports supporting the old backend system. If you would like to help out with this transition, see or consult the [migration guide](https://backstage.io/docs/backend-system/building-plugins-and-modules/migrating/#remove-support-for-the-old-backend-system). + +### Patch Changes + +- f421d2a: Make MySQL pool settings a bit more lax +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-app-api@1.0.0-next.2 + - @backstage/backend-defaults@0.5.0-next.2 + - @backstage/plugin-auth-node@0.5.2-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-events-node@0.4.0-next.2 + +## 0.6.0-next.1 + +### Patch Changes + +- 710f621: Added missing service mock for `mockServices.rootConfig.mock`, and fixed the definition of `mockServices.rootHttpRouter.factory` to not have a duplicate callback. +- Updated dependencies + - @backstage/backend-defaults@0.5.0-next.1 + - @backstage/plugin-auth-node@0.5.2-next.1 + - @backstage/backend-app-api@0.10.0-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-events-node@0.4.0-next.1 + +## 0.6.0-next.0 + +### Minor Changes + +- 19ff127: **BREAKING**: Removed service mocks for the identity and token manager services, which have been removed from `@backstage/backend-plugin-api`. +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- 0363bf1: There is a new `mockErrorHandler` utility to help in mocking the error middleware in tests. +- Updated dependencies + - @backstage/backend-app-api@0.10.0-next.0 + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/backend-defaults@0.5.0-next.0 + - @backstage/plugin-events-node@0.4.0-next.0 + - @backstage/plugin-auth-node@0.5.2-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.5.0 + +### Minor Changes + +- 861f162: **BREAKING**: Removed these deprecated helpers: + + - `setupRequestMockHandlers` is removed; use `registerMswTestHooks` instead. + - `MockDirectoryOptions` is removed; use `CreateMockDirectoryOptions` instead. + + Stopped exporting the deprecated and internal `isDockerDisabledForTests` helper. + + Removed `get` method from `ServiceFactoryTester` which is replaced by `getSubject` + +### Patch Changes + +- 8b13183: Internal updates to support latest version of `BackendFeauture`s from `@backstage/backend-plugin-api`. +- b63d378: Update internal imports +- 7c5f3b0: Update the `ServiceFactoryTester` to be able to test services that enables multi implementation installation. +- 4e79d19: The default services for `startTestBackend` and `ServiceFactoryTester` now includes the Root Health Service. +- Updated dependencies + - @backstage/backend-defaults@0.4.2 + - @backstage/backend-app-api@0.9.0 + - @backstage/backend-plugin-api@0.8.0 + - @backstage/plugin-auth-node@0.5.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-events-node@0.3.9 + +## 0.4.5-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/backend-defaults@0.4.2-next.3 + - @backstage/backend-app-api@0.8.1-next.3 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.5.0-next.3 + - @backstage/plugin-events-node@0.3.9-next.3 + +## 0.4.5-next.2 + +### Patch Changes + +- 8b13183: Internal updates to support latest version of `BackendFeauture`s from `@backstage/backend-plugin-api`. +- 7c5f3b0: Update the `ServiceFactoryTester` to be able to test services that enables multi implementation installation. +- Updated dependencies + - @backstage/backend-defaults@0.4.2-next.2 + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/backend-app-api@0.8.1-next.2 + - @backstage/plugin-auth-node@0.5.0-next.2 + - @backstage/plugin-events-node@0.3.9-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/backend-app-api@0.8.1-next.1 + - @backstage/backend-defaults@0.4.2-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.18-next.1 + - @backstage/plugin-events-node@0.3.9-next.1 + +## 0.4.5-next.0 + +### Patch Changes + +- 4e79d19: The default services for `startTestBackend` and `ServiceFactoryTester` now includes the Root Health Service. +- Updated dependencies + - @backstage/backend-defaults@0.4.2-next.0 + - @backstage/backend-app-api@0.8.1-next.0 + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.18-next.0 + - @backstage/plugin-events-node@0.3.9-next.0 + +## 0.4.4 + +### Patch Changes + +- 2f99178: The `ServiceFactoryTest.get` method was deprecated and the `ServiceFactoryTest.getSubject` should be used instead. The `getSubject` method has the same behavior, but has a better method name to indicate that the service instance returned is the subject currently being tested. +- edf5cc3: The function `isDockerDisabledForTests` is deprecated and will no longer be exported in the near future as it should only be used internally. +- b05e1e1: Service factories exported by this package have been updated to use the new service factory format that doesn't use a callback. +- fce7887: Added mock for the Root Health Service in `mockServices`. +- 906c817: Updated `startTestBackend` and `ServiceFactoryTester` to only accept plain service factory or backend feature objects, no longer supporting the callback form. This lines up with the changes to `@backstage/backend-plugin-api` and should not require any code changes. +- 95a3a0b: Rename frontend and backend `setupRequestMockHandlers` methods to `registerMswTestHooks`. +- b9ed1bb: bumped better-sqlite3 from ^9.0.0 to ^11.0.0 +- 98ccf00: Internal refactor of `mockServices.httpAuth.factory` to allow it to still be constructed with options, but without declaring options via `createServiceFactory`. +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/backend-defaults@0.4.0 + - @backstage/backend-app-api@0.8.0 + - @backstage/plugin-events-node@0.3.8 + - @backstage/plugin-auth-node@0.4.17 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.4-next.1 + +### Patch Changes + +- b9ed1bb: bumped better-sqlite3 from ^9.0.0 to ^11.0.0 +- Updated dependencies + - @backstage/backend-defaults@0.3.4-next.1 + - @backstage/backend-app-api@0.7.10-next.1 + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.17-next.1 + - @backstage/plugin-events-node@0.3.8-next.1 + +## 0.4.3-next.0 + +### Patch Changes + +- fce7887: Added mock for the Root Health Service in `mockServices`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/backend-defaults@0.3.3-next.0 + - @backstage/backend-app-api@0.7.9-next.0 + - @backstage/plugin-auth-node@0.4.16-next.0 + - @backstage/plugin-events-node@0.3.7-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.0 + +### Minor Changes + +- 805cbe7: Added `TestCaches` that functions just like `TestDatabases` + +### Patch Changes + +- 78a0b08: Internal refactor to handle `BackendFeature` contract change. +- 9e63318: Made it possible to give access restrictions to `mockCredentials.service` +- 006b3e8: The type `MockDirectoryOptions` was renamed to `CreateMockDirectoryOptions` so that it's clear these options are exclusive to the mock directory factory. +- 0634fdc: Refactored `TestDatabases` to no longer depend on `backend-common` +- 6a576dc: Fix the logger service mock to prevent returning `undefined` from the `child` method. +- 6c11f6e: Use imports from backend-defaults instead of the deprecated ones from backend-app-api +- Updated dependencies + - @backstage/backend-app-api@0.7.6 + - @backstage/backend-plugin-api@0.6.19 + - @backstage/plugin-auth-node@0.4.14 + - @backstage/backend-defaults@0.3.0 + - @backstage/plugin-events-node@0.3.5 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.0-next.3 + +### Patch Changes + +- 006b3e8: The type `MockDirectoryOptions` was renamed to `CreateMockDirectoryOptions` so that it's clear these options are exclusive to the mock directory factory. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/plugin-auth-node@0.4.14-next.3 + - @backstage/plugin-events-node@0.3.5-next.2 + - @backstage/backend-app-api@0.7.6-next.3 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.0-next.2 + +### Patch Changes + +- 0634fdc: Refactored `TestDatabases` to no longer depend on `backend-common` +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/backend-app-api@0.7.6-next.2 + - @backstage/plugin-auth-node@0.4.14-next.2 + - @backstage/plugin-events-node@0.3.5-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.0-next.1 + +### Minor Changes + +- 805cbe7: Added `TestCaches` that functions just like `TestDatabases` + +### Patch Changes + +- 9e63318: Made it possible to give access restrictions to `mockCredentials.service` +- Updated dependencies + - @backstage/backend-app-api@0.7.6-next.1 + - @backstage/backend-plugin-api@0.6.19-next.1 + - @backstage/backend-common@0.23.0-next.1 + - @backstage/plugin-auth-node@0.4.14-next.1 + - @backstage/plugin-events-node@0.3.5-next.0 + +## 0.3.9-next.0 + +### Patch Changes + +- 6a576dc: Fix the logger service mock to prevent returning `undefined` from the `child` method. +- Updated dependencies + - @backstage/backend-app-api@0.7.6-next.0 + - @backstage/backend-common@0.22.1-next.0 + - @backstage/plugin-events-node@0.3.5-next.0 + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/plugin-auth-node@0.4.14-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.3.8 + +### Patch Changes + +- d229dc4: Move path utilities from `backend-common` to the `backend-plugin-api` package. +- 7e5a50d: added `eventsServiceFactory` to `defaultServiceFactories` to resolve issue where different instances of the EventsServices could be used +- Updated dependencies + - @backstage/backend-app-api@0.7.3 + - @backstage/backend-common@0.22.0 + - @backstage/backend-plugin-api@0.6.18 + - @backstage/plugin-events-node@0.3.4 + - @backstage/plugin-auth-node@0.4.13 + +## 0.3.8-next.2 + +### Patch Changes + +- 7e5a50d: added `eventsServiceFactory` to `defaultServiceFactories` to resolve issue where different instances of the EventsServices could be used +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-events-node@0.3.4-next.2 + +## 0.3.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.7.2-next.1 + - @backstage/backend-common@0.22.0-next.1 + - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + +## 0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.7.1-next.0 + - @backstage/plugin-auth-node@0.4.13-next.0 + - @backstage/backend-common@0.21.8-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.3.7 + +### Patch Changes + +- 3256f14: `startTestBackend` will now add placeholder plugins when a modules are provided without their parent plugin. +- 007e7ea: Added mock of the new `listPublicServiceKeys` method for `AuthService`. +- Updated dependencies + - @backstage/backend-common@0.21.7 + - @backstage/backend-app-api@0.7.0 + - @backstage/backend-plugin-api@0.6.17 + - @backstage/plugin-auth-node@0.4.12 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.3.7-next.1 + +### Patch Changes + +- 3256f14: `startTestBackend` will now add placeholder plugins when a modules are provided without their parent plugin. +- 007e7ea: Added mock of the new `listPublicServiceKeys` method for `AuthService`. +- Updated dependencies + - @backstage/backend-common@0.21.7-next.1 + - @backstage/backend-app-api@0.7.0-next.1 + - @backstage/backend-plugin-api@0.6.17-next.1 + - @backstage/plugin-auth-node@0.4.12-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.6.3-next.0 + - @backstage/backend-common@0.21.7-next.0 + - @backstage/backend-plugin-api@0.6.17-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.12-next.0 + +## 0.3.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.6.2 + - @backstage/plugin-auth-node@0.4.11 + - @backstage/backend-common@0.21.6 + - @backstage/backend-plugin-api@0.6.16 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.3.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.6.1 + - @backstage/backend-common@0.21.5 + - @backstage/plugin-auth-node@0.4.10 + - @backstage/backend-plugin-api@0.6.15 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.3.4 + +### Patch Changes + +- 4a3d434: Added support for the new [`auth`](https://backstage.io/docs/backend-system/core-services/auth/) and [`httpAuth`](https://backstage.io/docs/backend-system/core-services/http-auth) services that were created as part of [BEP-0003](https://github.com/backstage/backstage/tree/master/beps/0003-auth-architecture-evolution). These services will be present by default in test apps, and you can access mocked versions of their features under `mockServices.auth` and `mockServices.httpAuth` if you want to inspect or replace their behaviors. + + There is also a new `mockCredentials` that you can use for acquiring mocks of the various types of credentials that are used in the new system. + +- 9802004: Added `mockServices.userInfo`, which now also automatically is made available in test backends. + +- fd61d39: Updated dependency `testcontainers` to `^10.0.0`. + +- ff40ada: Updated dependency `mysql2` to `^3.0.0`. + +- 0fb419b: Updated dependency `uuid` to `^9.0.0`. + Updated dependency `@types/uuid` to `^9.0.0`. + +- Updated dependencies + - @backstage/backend-common@0.21.4 + - @backstage/plugin-auth-node@0.4.9 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/backend-plugin-api@0.6.14 + - @backstage/backend-app-api@0.6.0 + - @backstage/types@1.1.1 + +## 0.3.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.6.0-next.2 + - @backstage/backend-common@0.21.4-next.2 + - @backstage/plugin-auth-node@0.4.9-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 + - @backstage/config@1.2.0-next.1 + - @backstage/errors@1.2.4-next.0 + - @backstage/types@1.1.1 + +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.2.0-next.1 + - @backstage/backend-app-api@0.6.0-next.1 + - @backstage/backend-common@0.21.4-next.1 + - @backstage/backend-plugin-api@0.6.14-next.1 + - @backstage/plugin-auth-node@0.4.9-next.1 + - @backstage/errors@1.2.4-next.0 + - @backstage/types@1.1.1 + +## 0.3.3-next.0 + +### Patch Changes + +- 4a3d434: Added support for the new [`auth`](https://backstage.io/docs/backend-system/core-services/auth/) and [`httpAuth`](https://backstage.io/docs/backend-system/core-services/http-auth) services that were created as part of [BEP-0003](https://github.com/backstage/backstage/tree/master/beps/0003-auth-architecture-evolution). These services will be present by default in test apps, and you can access mocked versions of their features under `mockServices.auth` and `mockServices.httpAuth` if you want to inspect or replace their behaviors. + + There is also a new `mockCredentials` that you can use for acquiring mocks of the various types of credentials that are used in the new system. + +- 9802004: Added `mockServices.userInfo`, which now also automatically is made available in test backends. + +- fd61d39: Updated dependency `testcontainers` to `^10.0.0`. + +- ff40ada: Updated dependency `mysql2` to `^3.0.0`. + +- 0fb419b: Updated dependency `uuid` to `^9.0.0`. + Updated dependency `@types/uuid` to `^9.0.0`. + +- Updated dependencies + - @backstage/backend-common@0.21.3-next.0 + - @backstage/plugin-auth-node@0.4.8-next.0 + - @backstage/errors@1.2.4-next.0 + - @backstage/backend-plugin-api@0.6.13-next.0 + - @backstage/backend-app-api@0.6.0-next.0 + - @backstage/config@1.1.2-next.0 + - @backstage/types@1.1.1 + +## 0.3.0 + +### Minor Changes + +- e85aa98: drop databases after unit tests if the database instance is not running in docker + +### Patch Changes + +- 6bb6f3e: Updated dependency `fs-extra` to `^11.2.0`. + Updated dependency `@types/fs-extra` to `^11.0.0`. +- Updated dependencies + - @backstage/backend-common@0.21.0 + - @backstage/plugin-auth-node@0.4.4 + - @backstage/backend-app-api@0.5.11 + - @backstage/backend-plugin-api@0.6.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.3.0-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0-next.3 + - @backstage/backend-app-api@0.5.11-next.3 + - @backstage/plugin-auth-node@0.4.4-next.3 + - @backstage/backend-plugin-api@0.6.10-next.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0-next.2 + - @backstage/backend-plugin-api@0.6.10-next.2 + - @backstage/backend-app-api@0.5.11-next.2 + - @backstage/plugin-auth-node@0.4.4-next.2 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.3.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/backend-common@0.21.0-next.1 + - @backstage/backend-app-api@0.5.11-next.1 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.4-next.1 + +## 0.3.0-next.0 + +### Minor Changes + +- e85aa98: drop databases after unit tests if the database instance is not running in docker + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0-next.0 + - @backstage/backend-app-api@0.5.11-next.0 + - @backstage/plugin-auth-node@0.4.4-next.0 + - @backstage/backend-plugin-api@0.6.10-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.10 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-app-api@0.5.10 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-app-api@0.5.10-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## 0.2.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.5.10-next.1 + - @backstage/backend-common@0.20.1-next.1 + - @backstage/config@1.1.1 + - @backstage/plugin-auth-node@0.4.3-next.1 + - @backstage/backend-plugin-api@0.6.9-next.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.0 + - @backstage/backend-app-api@0.5.10-next.0 + - @backstage/backend-plugin-api@0.6.9-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.3-next.0 + +## 0.2.9 + +### Patch Changes + +- cc4228e: Switched module ID to use kebab-case. + +- b7de76a: Added support for PostgreSQL versions 15 and 16 + + Also introduced a new `setDefaults(options: { ids?: TestDatabaseId[] })` static method that can be added to the `setupTests.ts` file to define the default database ids you want to use throughout your package. Usage would look like this: `TestDatabases.setDefaults({ ids: ['POSTGRES_12','POSTGRES_16'] })` and would result in PostgreSQL versions 12 and 16 being used for your tests. + +- Updated dependencies + - @backstage/backend-common@0.20.0 + - @backstage/backend-app-api@0.5.9 + - @backstage/plugin-auth-node@0.4.2 + - @backstage/backend-plugin-api@0.6.8 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.9-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.3 + - @backstage/backend-app-api@0.5.9-next.3 + - @backstage/backend-plugin-api@0.6.8-next.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.2-next.3 + +## 0.2.9-next.2 + +### Patch Changes + +- cc4228e: Switched module ID to use kebab-case. +- Updated dependencies + - @backstage/backend-common@0.20.0-next.2 + - @backstage/plugin-auth-node@0.4.2-next.2 + - @backstage/backend-app-api@0.5.9-next.2 + - @backstage/backend-plugin-api@0.6.8-next.2 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.5.9-next.1 + - @backstage/backend-common@0.20.0-next.1 + - @backstage/backend-plugin-api@0.6.8-next.1 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.2-next.1 + +## 0.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.0 + - @backstage/backend-app-api@0.5.9-next.0 + - @backstage/plugin-auth-node@0.4.2-next.0 + - @backstage/backend-plugin-api@0.6.8-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.8 + +### Patch Changes + +- 013611b42e: `knex` has been bumped to major version 3 and `better-sqlite3` to major version 9, which deprecate node 16 support. +- bb688f7b3b: Ensure recursive deletion of temporary directories in tests +- Updated dependencies + - @backstage/backend-common@0.19.9 + - @backstage/backend-plugin-api@0.6.7 + - @backstage/backend-app-api@0.5.8 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.1 + +## 0.2.8-next.2 + +### Patch Changes + +- [#20570](https://github.com/backstage/backstage/pull/20570) [`013611b42e`](https://github.com/backstage/backstage/commit/013611b42ed457fefa9bb85fddf416cf5e0c1f76) Thanks [@freben](https://github.com/freben)! - `knex` has been bumped to major version 3 and `better-sqlite3` to major version 9, which deprecate node 16 support. + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.7-next.2 + - @backstage/backend-common@0.19.9-next.2 + - @backstage/backend-app-api@0.5.8-next.2 + - @backstage/plugin-auth-node@0.4.1-next.2 + +## 0.2.8-next.1 + +### Patch Changes + +- bb688f7b3b: Ensure recursive deletion of temporary directories in tests +- Updated dependencies + - @backstage/backend-common@0.19.9-next.1 + - @backstage/backend-app-api@0.5.8-next.1 + - @backstage/plugin-auth-node@0.4.1-next.1 + - @backstage/backend-plugin-api@0.6.7-next.1 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.5.8-next.0 + - @backstage/backend-common@0.19.9-next.0 + - @backstage/backend-plugin-api@0.6.7-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.1-next.0 + +## 0.2.7 + +### Patch Changes + +- a250ad775f: Added `createMockDirectory()` to help out with file system mocking in tests. +- 5ddc03813e: Remove third type parameter used for `MockInstance`, in order to be compatible with older versions of `@types/jest`. +- 74491c9602: Updated to import `HostDiscovery` from `@backstage/backend-app-api`. +- Updated dependencies + - @backstage/backend-common@0.19.8 + - @backstage/plugin-auth-node@0.4.0 + - @backstage/errors@1.2.3 + - @backstage/backend-app-api@0.5.6 + - @backstage/backend-plugin-api@0.6.6 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + +## 0.2.7-next.2 + +### Patch Changes + +- a250ad775f: Added `createMockDirectory()` to help out with file system mocking in tests. +- 74491c9602: Updated to import `HostDiscovery` from `@backstage/backend-app-api`. +- Updated dependencies + - @backstage/backend-common@0.19.8-next.2 + - @backstage/plugin-auth-node@0.4.0-next.2 + - @backstage/errors@1.2.3-next.0 + - @backstage/backend-app-api@0.5.6-next.2 + - @backstage/backend-plugin-api@0.6.6-next.2 + - @backstage/config@1.1.1-next.0 + - @backstage/types@1.1.1 + +## 0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.1 + - @backstage/backend-app-api@0.5.5-next.1 + - @backstage/backend-plugin-api@0.6.5-next.1 + - @backstage/plugin-auth-node@0.3.2-next.1 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + +## 0.2.6-next.0 + +### Patch Changes + +- 5ddc03813e: Remove third type parameter used for `MockInstance`, in order to be compatible with older versions of `@types/jest`. +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-app-api@0.5.5-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/types@1.1.1 + +## 0.2.3 + +### Patch Changes + +- 58cb5e5cea7b: Introduced a new utility for testing service factories, `ServiceFactoryTester`. +- 202e52c5e361: Add support for installing backend features via module imports, for example `startTestBackend({ features: [import('my-plugin')] })`. +- 9fb3b5373c45: Extended `mockService` to also include mocked variants, for example `mockServices.lifecycle.mock()`. The returned mocked implementation will have a `factory` property which is a service factory for itself. You can also pass a partial implementation of the service to the mock function to use a mock implementation of specific methods. +- eb1594da5812: Serialize test database shutdown, and add logging +- Updated dependencies + - @backstage/backend-app-api@0.5.3 + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + +## 0.2.3-next.3 + +### Patch Changes + +- 202e52c5e361: Add support for installing backend features via module imports, for example `startTestBackend({ features: [import('my-plugin')] })`. +- Updated dependencies + - @backstage/backend-app-api@0.5.3-next.3 + - @backstage/config@1.1.0-next.2 + - @backstage/types@1.1.1-next.0 + - @backstage/backend-plugin-api@0.6.3-next.3 + - @backstage/backend-common@0.19.5-next.3 + - @backstage/plugin-auth-node@0.3.0-next.3 + +## 0.2.3-next.2 + +### Patch Changes + +- 58cb5e5cea7b: Introduced a new utility for testing service factories, `ServiceFactoryTester`. +- Updated dependencies + - @backstage/backend-app-api@0.5.3-next.2 + - @backstage/config@1.1.0-next.1 + - @backstage/backend-common@0.19.5-next.2 + - @backstage/plugin-auth-node@0.3.0-next.2 + - @backstage/backend-plugin-api@0.6.3-next.2 + - @backstage/types@1.1.0 + +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0-next.0 + - @backstage/backend-app-api@0.5.3-next.1 + - @backstage/backend-common@0.19.5-next.1 + - @backstage/backend-plugin-api@0.6.3-next.1 + - @backstage/plugin-auth-node@0.3.0-next.1 + - @backstage/types@1.1.0 + +## 0.2.2-next.0 + +### Patch Changes + +- 9fb3b5373c45: Extended `mockService` to also include mocked variants, for example `mockServices.lifecycle.mock()`. The returned mocked implementation will have a `factory` property which is a service factory for itself. You can also pass a partial implementation of the service to the mock function to use a mock implementation of specific methods. +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0-next.0 + - @backstage/backend-common@0.19.4-next.0 + - @backstage/backend-app-api@0.5.2-next.0 + - @backstage/backend-plugin-api@0.6.2-next.0 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + +## 0.2.0 + +### Minor Changes + +- b9c57a4f857e: **BREAKING**: Renamed `mockServices.config` to `mockServices.rootConfig`. +- a6d7983f349c: **BREAKING**: Removed the `services` option from `createBackend`. Service factories are now `BackendFeature`s and should be installed with `backend.add(...)` instead. The following should be migrated: + + ```ts + const backend = createBackend({ services: [myCustomServiceFactory] }); + ``` + + To instead pass the service factory via `backend.add(...)`: + + ```ts + const backend = createBackend(); + backend.add(customRootLoggerServiceFactory); + ``` + +### Patch Changes + +- ae9304818136: Add needed constants and constructs to support PostgreSQL version 14 as test database +- Updated dependencies + - @backstage/backend-common@0.19.2 + - @backstage/backend-app-api@0.5.0 + - @backstage/backend-plugin-api@0.6.0 + - @backstage/plugin-auth-node@0.2.17 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + +## 0.2.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.5.0-next.2 + - @backstage/backend-plugin-api@0.6.0-next.2 + - @backstage/backend-common@0.19.2-next.2 + - @backstage/plugin-auth-node@0.2.17-next.2 + +## 0.2.0-next.1 + +### Minor Changes + +- b9c57a4f857e: **BREAKING**: Renamed `mockServices.config` to `mockServices.rootConfig`. + +### Patch Changes + +- ae9304818136: Add needed constants and constructs to support PostgreSQL version 14 as test database +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-app-api@0.5.0-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + +## 0.1.40-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.4.6-next.0 + - @backstage/backend-common@0.19.2-next.0 + - @backstage/backend-plugin-api@0.5.5-next.0 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/plugin-auth-node@0.2.17-next.0 + +## 0.1.39 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.1 + - @backstage/backend-app-api@0.4.5 + - @backstage/backend-plugin-api@0.5.4 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/plugin-auth-node@0.2.16 + +## 0.1.39-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.1-next.0 + - @backstage/backend-app-api@0.4.5-next.0 + - @backstage/backend-plugin-api@0.5.4-next.0 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/plugin-auth-node@0.2.16-next.0 + +## 0.1.38 + +### Patch Changes + +- 68a21956ef52: Remove reference to deprecated import +- Updated dependencies + - @backstage/backend-common@0.19.0 + - @backstage/types@1.1.0 + - @backstage/backend-app-api@0.4.4 + - @backstage/backend-plugin-api@0.5.3 + - @backstage/plugin-auth-node@0.2.15 + - @backstage/config@1.0.8 + +## 0.1.38-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.2 + - @backstage/backend-app-api@0.4.4-next.2 + - @backstage/backend-plugin-api@0.5.3-next.2 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.15-next.2 + +## 0.1.38-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/backend-app-api@0.4.4-next.1 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## 0.1.38-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.4.4-next.0 + - @backstage/backend-common@0.18.6-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.3-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.15-next.0 + +## 0.1.37 + +### Patch Changes + +- 63af7f6d53f: Allow specifying custom Docker registry for database tests +- b1eb268bf9d: Added `POSTGRES_11` and `POSTGRES_12` as supported test database IDs. +- Updated dependencies + - @backstage/backend-common@0.18.5 + - @backstage/backend-app-api@0.4.3 + - @backstage/plugin-auth-node@0.2.14 + - @backstage/backend-plugin-api@0.5.2 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## 0.1.37-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.5-next.1 + - @backstage/backend-app-api@0.4.3-next.1 + - @backstage/plugin-auth-node@0.2.14-next.1 + - @backstage/backend-plugin-api@0.5.2-next.1 + - @backstage/config@1.0.7 + +## 0.1.37-next.0 + +### Patch Changes + +- b1eb268bf9d: Added `POSTGRES_11` and `POSTGRES_12` as supported test database IDs. +- Updated dependencies + - @backstage/backend-common@0.18.5-next.0 + - @backstage/backend-app-api@0.4.3-next.0 + - @backstage/plugin-auth-node@0.2.14-next.0 + - @backstage/backend-plugin-api@0.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## 0.1.36 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4 + - @backstage/backend-app-api@0.4.2 + - @backstage/plugin-auth-node@0.2.13 + - @backstage/backend-plugin-api@0.5.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## 0.1.36-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.2 + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + +## 0.1.36-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + +## 0.1.36-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.4.2-next.0 + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.1-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.0 + +## 0.1.35 + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/backend-plugin-api@0.5.0 + - @backstage/backend-app-api@0.4.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## 0.1.35-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/backend-app-api@0.4.1-next.2 + - @backstage/backend-plugin-api@0.4.1-next.2 + - @backstage/config@1.0.7-next.0 + +## 0.1.35-next.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- 482dae5de1c: Updated link to docs. +- Updated dependencies + - @backstage/backend-common@0.18.3-next.1 + - @backstage/plugin-auth-node@0.2.12-next.1 + - @backstage/backend-plugin-api@0.4.1-next.1 + - @backstage/backend-app-api@0.4.1-next.1 + - @backstage/config@1.0.7-next.0 + - @backstage/types@1.0.2 + +## 0.1.35-next.0 + +### Patch Changes + +- 928a12a9b3: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/backend-plugin-api@0.4.1-next.0 + - @backstage/backend-app-api@0.4.1-next.0 + - @backstage/backend-common@0.18.3-next.0 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.12-next.0 + +## 0.1.34 + +### Patch Changes + +- baf6e4c96a: Removed unnecessary `@backstage/cli` dependency. +- c51efce2a0: Update docs to always use `yarn add --cwd` for app & backend +- 1835311713: Added explicit return type signature for `mockServices.config()`. +- e716946103: Updated usage of the lifecycle service. +- 7e7557a2be: Updated the `mockServices.rootLogger` options to accept a single level option instead. +- 610d65e143: Updates to match new `BackendFeature` type. +- e412d33025: Use the new `*ServiceFactory` exports from `@backstage/backend-app-api` +- b86efa2d04: Updated usage of `ServiceFactory`. +- 17b573e4be: The new backend system testing utilities have now been marked as stable API. +- f1adb2e36b: Removed the `ref` from all `mockServices`. +- d0901c9ba4: All mock service factories and mock service implementations are now available via the new experimental `mockServices` export. +- 71a5ec0f06: Updated usages of `LogMeta`. +- Updated dependencies + - @backstage/backend-app-api@0.4.0 + - @backstage/backend-plugin-api@0.4.0 + - @backstage/backend-common@0.18.2 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11 + +## 0.1.34-next.2 + +### Patch Changes + +- baf6e4c96a: Removed unnecessary `@backstage/cli` dependency. +- 1835311713: Added explicit return type signature for `mockServices.config()`. +- e716946103: Updated usage of the lifecycle service. +- 7e7557a2be: Updated the `mockServices.rootLogger` options to accept a single level option instead. +- 610d65e143: Updates to match new `BackendFeature` type. +- e412d33025: Use the new `*ServiceFactory` exports from `@backstage/backend-app-api` +- f1adb2e36b: Removed the `ref` from all `mockServices`. +- 71a5ec0f06: Updated usages of `LogMeta`. +- Updated dependencies + - @backstage/backend-app-api@0.4.0-next.2 + - @backstage/backend-plugin-api@0.4.0-next.2 + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + +## 0.1.34-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.2-next.0 + - @backstage/backend-common@0.18.2-next.1 + - @backstage/backend-plugin-api@0.3.2-next.1 + - @backstage/backend-app-api@0.3.2-next.1 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11-next.1 + +## 0.1.34-next.0 + +### Patch Changes + +- d0901c9ba4: All mock service factories and mock service implementations are now available via the new experimental `mockServices` export. +- Updated dependencies + - @backstage/backend-app-api@0.3.2-next.0 + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + - @backstage/cli@0.22.1 + - @backstage/backend-plugin-api@0.3.2-next.0 + +## 0.1.32 + +### Patch Changes + +- 6cfd4d7073: Include implementations for the new `rootLifecycleServiceRef`. +- 015a6dced6: Updated to make sure that service implementations replace default service implementations. +- a3ec2f32ea: The `startTestBackend` setup now includes default implementations for all core services. +- 483e907eaf: Internal updates of `createServiceFactory` from `@backstage/backend-plugin-api`. +- 51b7a7ed07: The backend started by `startTestBackend` now has default implementations of all core services. It now also returns a `TestBackend` instance, which provides access to the underlying `server` that can be used with testing libraries such as `supertest`. +- f23eef3aa2: Updated dependency `better-sqlite3` to `^8.0.0`. +- Updated dependencies + - @backstage/backend-plugin-api@0.3.0 + - @backstage/cli@0.22.1 + - @backstage/backend-common@0.18.0 + - @backstage/backend-app-api@0.3.0 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.9 + +## 0.1.32-next.2 + +### Patch Changes + +- 015a6dced6: Updated to make sure that service implementations replace default service implementations. +- a3ec2f32ea: The `startTestBackend` setup now includes default implementations for all core services. +- f23eef3aa2: Updated dependency `better-sqlite3` to `^8.0.0`. +- Updated dependencies + - @backstage/backend-app-api@0.3.0-next.1 + - @backstage/backend-plugin-api@0.3.0-next.1 + - @backstage/backend-common@0.18.0-next.1 + - @backstage/cli@0.22.1-next.2 + - @backstage/config@1.0.6-next.0 + +## 0.1.32-next.1 + +### Patch Changes + +- 6cfd4d7073: Include implementations for the new `rootLifecycleServiceRef`. +- Updated dependencies + - @backstage/backend-plugin-api@0.2.1-next.0 + - @backstage/cli@0.22.1-next.1 + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/backend-app-api@0.2.5-next.0 + +## 0.1.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.1-next.0 + - @backstage/backend-app-api@0.2.4 + - @backstage/backend-common@0.17.0 + - @backstage/backend-plugin-api@0.2.0 + - @backstage/config@1.0.5 + +## 0.1.31 + +### Patch Changes + +- afa3bf5657: Backends started with `startTestBackend` are now automatically stopped after all tests have run. +- 3280711113: Updated dependency `msw` to `^0.49.0`. +- Updated dependencies + - @backstage/backend-app-api@0.2.4 + - @backstage/cli@0.22.0 + - @backstage/backend-common@0.17.0 + - @backstage/backend-plugin-api@0.2.0 + - @backstage/config@1.0.5 + +## 0.1.31-next.4 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.0-next.4 + - @backstage/backend-common@0.17.0-next.3 + - @backstage/backend-app-api@0.2.4-next.3 + - @backstage/backend-plugin-api@0.2.0-next.3 + - @backstage/config@1.0.5-next.1 + +## 0.1.31-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.21.2-next.3 + - @backstage/backend-app-api@0.2.4-next.2 + - @backstage/backend-common@0.17.0-next.2 + - @backstage/backend-plugin-api@0.2.0-next.2 + - @backstage/config@1.0.5-next.1 + +## 0.1.31-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-app-api@0.2.4-next.2 + - @backstage/backend-common@0.17.0-next.2 + - @backstage/cli@0.21.2-next.2 + - @backstage/backend-plugin-api@0.2.0-next.2 + - @backstage/config@1.0.5-next.1 + +## 0.1.31-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.17.0-next.1 + - @backstage/cli@0.21.2-next.1 + - @backstage/backend-app-api@0.2.4-next.1 + - @backstage/backend-plugin-api@0.1.5-next.1 + - @backstage/config@1.0.5-next.1 + +## 0.1.31-next.0 + +### Patch Changes + +- 3280711113: Updated dependency `msw` to `^0.49.0`. +- Updated dependencies + - @backstage/cli@0.21.2-next.0 + - @backstage/backend-app-api@0.2.4-next.0 + - @backstage/backend-common@0.16.1-next.0 + - @backstage/backend-plugin-api@0.1.5-next.0 + - @backstage/config@1.0.5-next.0 + +## 0.1.30 + +### Patch Changes + +- e13cd3feaf: Updated dependency `msw` to `^0.48.0`. +- Updated dependencies + - @backstage/backend-common@0.16.0 + - @backstage/cli@0.21.0 + - @backstage/backend-app-api@0.2.3 + - @backstage/backend-plugin-api@0.1.4 + - @backstage/config@1.0.4 + +## 0.1.30-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.16.0-next.1 + - @backstage/cli@0.21.0-next.1 + - @backstage/backend-app-api@0.2.3-next.1 + - @backstage/backend-plugin-api@0.1.4-next.1 + - @backstage/config@1.0.4-next.0 + +## 0.1.30-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.16.0-next.0 + - @backstage/cli@0.21.0-next.0 + - @backstage/backend-app-api@0.2.3-next.0 + - @backstage/backend-plugin-api@0.1.4-next.0 + - @backstage/config@1.0.4-next.0 + +## 0.1.29 + +### Patch Changes + +- 72549952d1: Fixed handling of root scoped services in `startTestBackend`. +- e91e8e9c55: Increased test database max connection pool size to reduce the risk of resource exhaustion. +- Updated dependencies + - @backstage/backend-common@0.15.2 + - @backstage/cli@0.20.0 + - @backstage/backend-app-api@0.2.2 + - @backstage/backend-plugin-api@0.1.3 + - @backstage/config@1.0.3 + +## 0.1.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.2-next.2 + - @backstage/cli@0.20.0-next.2 + - @backstage/backend-app-api@0.2.2-next.2 + - @backstage/backend-plugin-api@0.1.3-next.2 + - @backstage/config@1.0.3-next.2 + +## 0.1.29-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.20.0-next.1 + - @backstage/backend-common@0.15.2-next.1 + - @backstage/backend-plugin-api@0.1.3-next.1 + - @backstage/backend-app-api@0.2.2-next.1 + - @backstage/config@1.0.3-next.1 + +## 0.1.29-next.0 + +### Patch Changes + +- 72549952d1: Fixed handling of root scoped services in `startTestBackend`. +- e91e8e9c55: Increased test database max connection pool size to reduce the risk of resource exhaustion. +- Updated dependencies + - @backstage/backend-app-api@0.2.2-next.0 + - @backstage/backend-plugin-api@0.1.3-next.0 + - @backstage/cli@0.20.0-next.0 + - @backstage/backend-common@0.15.2-next.0 + - @backstage/config@1.0.3-next.0 + +## 0.1.28 + +### Patch Changes + +- 854ba37357: Updated to support new `ServiceFactory` formats. +- 667d917488: Updated dependency `msw` to `^0.47.0`. +- 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`. +- bf5e9030eb: Updated dependency `msw` to `^0.45.0`. +- de3347ca74: Updated usages of `ServiceFactory`. +- Updated dependencies + - @backstage/cli@0.19.0 + - @backstage/backend-app-api@0.2.1 + - @backstage/backend-plugin-api@0.1.2 + - @backstage/backend-common@0.15.1 + - @backstage/config@1.0.2 + +## 0.1.28-next.3 + +### Patch Changes + +- 854ba37357: Updated to support new `ServiceFactory` formats. +- Updated dependencies + - @backstage/backend-plugin-api@0.1.2-next.2 + - @backstage/config@1.0.2-next.0 + - @backstage/backend-app-api@0.2.1-next.2 + - @backstage/cli@0.19.0-next.3 + - @backstage/backend-common@0.15.1-next.3 + +## 0.1.28-next.2 + +### Patch Changes + +- 667d917488: Updated dependency `msw` to `^0.47.0`. +- 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`. +- Updated dependencies + - @backstage/cli@0.19.0-next.2 + - @backstage/backend-app-api@0.2.1-next.1 + - @backstage/backend-plugin-api@0.1.2-next.1 + - @backstage/backend-common@0.15.1-next.2 + +## 0.1.28-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.1-next.1 + - @backstage/cli@0.19.0-next.1 + +## 0.1.28-next.0 + +### Patch Changes + +- bf5e9030eb: Updated dependency `msw` to `^0.45.0`. +- de3347ca74: Updated usages of `ServiceFactory`. +- Updated dependencies + - @backstage/backend-common@0.15.1-next.0 + - @backstage/cli@0.18.2-next.0 + - @backstage/backend-plugin-api@0.1.2-next.0 + - @backstage/backend-app-api@0.2.1-next.0 + +## 0.1.27 + +### Patch Changes + +- 0599732ec0: Refactored experimental backend system with new type names. +- 56e1b4b89c: Added alpha test helpers for the new experimental backend system. +- Updated dependencies + - @backstage/cli@0.18.1 + - @backstage/backend-common@0.15.0 + - @backstage/backend-app-api@0.2.0 + - @backstage/backend-plugin-api@0.1.1 + +## 0.1.27-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.0-next.0 + - @backstage/cli@0.18.1-next.0 + +## 0.1.26 + +### Patch Changes + +- a70869e775: Updated dependency `msw` to `^0.43.0`. +- 8006d0f9bf: Updated dependency `msw` to `^0.44.0`. +- 679b32172e: Updated dependency `knex` to `^2.0.0`. +- Updated dependencies + - @backstage/backend-common@0.14.1 + - @backstage/cli@0.18.0 + +## 0.1.26-next.3 + +### Patch Changes + +- a70869e775: Updated dependency `msw` to `^0.43.0`. +- Updated dependencies + - @backstage/backend-common@0.14.1-next.3 + - @backstage/cli@0.18.0-next.3 + +## 0.1.26-next.2 + +### Patch Changes + +- 679b32172e: Updated dependency `knex` to `^2.0.0`. +- Updated dependencies + - @backstage/backend-common@0.14.1-next.2 + - @backstage/cli@0.18.0-next.2 + +## 0.1.26-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.18.0-next.1 + - @backstage/backend-common@0.14.1-next.1 + +## 0.1.26-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/cli@0.17.3-next.0 + +## 0.1.25 + +### Patch Changes + +- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. +- Updated dependencies + - @backstage/cli@0.17.2 + - @backstage/backend-common@0.14.0 + +## 0.1.25-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.17.2-next.2 + - @backstage/backend-common@0.14.0-next.2 + +## 0.1.25-next.1 + +### Patch Changes + +- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. +- Updated dependencies + - @backstage/cli@0.17.2-next.1 + - @backstage/backend-common@0.13.6-next.1 + +## 0.1.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.17.2-next.0 + - @backstage/backend-common@0.13.6-next.0 + +## 0.1.24 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3 + - @backstage/cli@0.17.1 + - @backstage/config@1.0.1 + +## 0.1.24-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/cli@0.17.1-next.2 + +## 0.1.24-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.0 + - @backstage/cli@0.17.1-next.0 + +## 0.1.23 + +### Patch Changes + +- 0654c87cf2: `TestDatabases.create` will no longer set up an `afterAll` test handler if no databases are supported. +- Updated dependencies + - @backstage/cli@0.17.0 + - @backstage/backend-common@0.13.2 + +## 0.1.23-next.1 + +### Patch Changes + +- 0654c87cf2: `TestDatabases.create` will no longer set up an `afterAll` test handler if no databases are supported. +- Updated dependencies + - @backstage/cli@0.17.0-next.1 + - @backstage/backend-common@0.13.2-next.1 + +## 0.1.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.16.1-next.0 + - @backstage/backend-common@0.13.2-next.0 + +## 0.1.22 + +### Patch Changes + +- 89c7e47967: Minor README update +- efc73db10c: Use `better-sqlite3` instead of `@vscode/sqlite3` +- Updated dependencies + - @backstage/cli@0.16.0 + - @backstage/backend-common@0.13.1 + - @backstage/config@1.0.0 + +## 0.1.21 + +### Patch Changes + +- ab7cd7d70e: Do some groundwork for supporting the `better-sqlite3` driver, to maybe eventually replace `@vscode/sqlite3` (#9912) +- 3c2bc73901: Add `setupRequestMockHandlers` which sets up a good `msw` server foundation, copied from `@backstage/test-utils` which is a frontend-only package and should not be used from backends. +- Updated dependencies + - @backstage/backend-common@0.13.0 + - @backstage/cli@0.15.2 + +## 0.1.21-next.0 + +### Patch Changes + +- ab7cd7d70e: Do some groundwork for supporting the `better-sqlite3` driver, to maybe eventually replace `@vscode/sqlite3` (#9912) +- 3c2bc73901: Add `setupRequestMockHandlers` which sets up a good `msw` server foundation, copied from `@backstage/test-utils` which is a frontend-only package and should not be used from backends. +- Updated dependencies + - @backstage/backend-common@0.13.0-next.0 + - @backstage/cli@0.15.2-next.0 + +## 0.1.20 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.12.0 + - @backstage/cli@0.15.0 + +## 0.1.19 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.11.0 + - @backstage/cli@0.14.1 + +## 0.1.18 + +### Patch Changes + +- c77c5c7eb6: Added `backstage.role` to `package.json` +- Updated dependencies + - @backstage/cli@0.14.0 + - @backstage/backend-common@0.10.8 + - @backstage/config@0.1.14 + +## 0.1.17 + +### Patch Changes + +- 2441d1cf59: chore(deps): bump `knex` from 0.95.6 to 1.0.2 + + This also replaces `sqlite3` with `@vscode/sqlite3` 5.0.7 + +- Updated dependencies + - @backstage/cli@0.13.2 + - @backstage/backend-common@0.10.7 + +## 0.1.17-next.0 + +### Patch Changes + +- 2441d1cf59: chore(deps): bump `knex` from 0.95.6 to 1.0.2 + + This also replaces `sqlite3` with `@vscode/sqlite3` 5.0.7 + +- Updated dependencies + - @backstage/cli@0.13.2-next.0 + - @backstage/backend-common@0.10.7-next.0 + +## 0.1.16 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.13.1 + - @backstage/backend-common@0.10.6 + +## 0.1.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.13.1-next.1 + - @backstage/backend-common@0.10.6-next.0 + +## 0.1.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.13.1-next.0 + +## 0.1.15 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.13.0 + - @backstage/backend-common@0.10.5 + +## 0.1.14 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.12.0 + - @backstage/backend-common@0.10.4 + - @backstage/config@0.1.13 + +## 0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.12.0-next.0 + - @backstage/backend-common@0.10.4-next.0 + - @backstage/config@0.1.13-next.0 + +## 0.1.13 + +### Patch Changes + +- b1bc55405e: Bump `testcontainers` dependency to version `8.1.2` +- Updated dependencies + - @backstage/config@0.1.12 + - @backstage/backend-common@0.10.3 + - @backstage/cli@0.11.0 + +## 0.1.12 + +### Patch Changes + +- 130b7aadf2: Lazy-load `testcontainers` module in order to avoid side-effects. +- Updated dependencies + - @backstage/backend-common@0.10.1 + - @backstage/cli@0.10.4 + +## 0.1.11 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.10.0 + - @backstage/cli@0.10.3 + +## 0.1.10 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.9.12 + - @backstage/cli@0.10.0 + +## 0.1.9 + +### Patch Changes + +- e21e3c6102: Bumping minimum requirements for `dockerode` and `testcontainers` +- Updated dependencies + - @backstage/cli@0.9.0 + - @backstage/backend-common@0.9.10 + +## 0.1.8 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.9.7 + - @backstage/cli@0.8.0 + +## 0.1.7 + +### Patch Changes + +- d1da88a19: Properly export all used types. +- Updated dependencies + - @backstage/config@0.1.9 + - @backstage/backend-common@0.9.2 + - @backstage/cli@0.7.11 + +## 0.1.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.9.0 + - @backstage/config@0.1.8 + +## 0.1.5 + +### Patch Changes + +- 524045758: Make sure that the unique databases names generated by `TestDatabases.create()` + don't collide. +- Updated dependencies + - @backstage/backend-common@0.8.9 + - @backstage/cli@0.7.8 + +## 0.1.4 + +### Patch Changes + +- f7134c368: bump sqlite3 to 5.0.1 +- Updated dependencies + - @backstage/backend-common@0.8.5 + +## 0.1.3 + +### Patch Changes + +- 772dbdb51: Deprecates `SingleConnectionDatabaseManager` and provides an API compatible database + connection manager, `DatabaseManager`, which allows developers to configure database + connections on a per plugin basis. + + The `backend.database` config path allows you to set `prefix` to use an + alternate prefix for automatically generated database names, the default is + `backstage_plugin_`. Use `backend.database.plugin.` to set plugin + specific database connection configuration, e.g. + + ```yaml + backend: + database: + client: 'pg', + prefix: 'custom_prefix_' + connection: + host: 'localhost' + user: 'foo' + password: 'bar' + plugin: + catalog: + connection: + database: 'database_name_overriden' + scaffolder: + client: 'sqlite3' + connection: ':memory:' + ``` + + Migrate existing backstage installations by swapping out the database manager in the + `packages/backend/src/index.ts` file as shown below: + + ```diff + import { + - SingleConnectionDatabaseManager, + + DatabaseManager, + } from '@backstage/backend-common'; + + // ... + + function makeCreateEnv(config: Config) { + // ... + - const databaseManager = SingleConnectionDatabaseManager.fromConfig(config); + + const databaseManager = DatabaseManager.fromConfig(config); + // ... + } + ``` + +- Updated dependencies + - @backstage/backend-common@0.8.3 + - @backstage/cli@0.7.1 + +## 0.1.2 + +### Patch Changes + +- 0711954a9: Skip running docker tests unless in CI +- Updated dependencies [9cd3c533c] +- Updated dependencies [92963779b] +- Updated dependencies [7f7443308] +- Updated dependencies [21e8ebef5] +- Updated dependencies [eda9dbd5f] + - @backstage/cli@0.7.0 + - @backstage/backend-common@0.8.2 + +## @backstage/core-app-api@1.19.5-next.0 + +# @backstage/core-app-api + +## 1.19.4-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## 1.19.3 + +### Patch Changes + +- 75683ed: Added replay functionality to `AlertApiForwarder` to buffer and replay recent alerts to new subscribers, preventing missed alerts that were posted before subscription. +- 97cd16f: Internal update of translation imports. +- Updated dependencies + - @backstage/core-plugin-api@1.12.1 + +## 1.19.3-next.1 + +### Patch Changes + +- 75683ed: Added replay functionality to `AlertApiForwarder` to buffer and replay recent alerts to new subscribers, preventing missed alerts that were posted before subscription. +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## 1.19.3-next.0 + +### Patch Changes + +- 97cd16f: Internal update of translation imports. +- Updated dependencies + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## 1.19.2 + +### Patch Changes + +- b2bef92: Convert all enums to erasable-syntax compliant patterns +- 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.12.0 + - @backstage/config@1.3.6 + +## 1.19.2-next.1 + +### Patch Changes + +- b2bef92: Convert all enums to erasable-syntax compliant patterns +- Updated dependencies + - @backstage/core-plugin-api@1.11.2-next.1 + +## 1.19.2-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/config@1.3.6-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## 1.19.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.5 + - @backstage/core-plugin-api@1.11.1 + +## 1.19.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/core-plugin-api@1.11.1-next.0 + +## 1.19.0 + +### Minor Changes + +- 3fca906: Add `OpenShiftAuth` helper to create default OAuth flow for OpenShift. + +### Patch Changes + +- 5ae6d9d: feat: support no en languages +- Updated dependencies + - @backstage/core-plugin-api@1.11.0 + - @backstage/types@1.2.2 + +## 1.18.0 + +### Minor Changes + +- 5ddc0fe: if session exists and refresh fails, then create a new session if not instant popup + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.3 + - @backstage/core-plugin-api@1.10.9 + +## 1.18.0-next.1 + +### Minor Changes + +- 5ddc0fe: if session exists and refresh fails, then create a new session if not instant popup + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.9-next.0 + +## 1.17.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.3-next.0 + - @backstage/core-plugin-api@1.10.9-next.0 + +## 1.17.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.8 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + +## 1.17.0 + +### Minor Changes + +- 1e0230e: Support custom `AuthConnector` for `OAuth2`. + + A user can pass their own `AuthConnector` implementation in `OAuth2` constructor. + In which case the session manager will use that instead of the `DefaultAuthConnector` to interact with the + authentication provider. + + A custom `AuthConnector` may call the authentication provider from the front-end, store and retrieve tokens + in the session storage, for example, and otherwise send custom requests to the authentication provider and + handle its responses. + + Note, that if the custom `AuthConnector` transforms scopes returned from the authentication provider, + the transformation must be the same as `OAuth2CreateOptions#scopeTransform` passed to `OAuth2` constructor. + See creating `DefaultAuthConnector` in `OAuth2#create(...)` for an example. + +### Patch Changes + +- 73f6cc3: Updated `I18nextTranslationApi` to support interpolation of JSX elements. +- cc119b2: Fixed an issue causing `OAuthRequestDialog` to re-render on mount. +- Updated dependencies + - @backstage/core-plugin-api@1.10.7 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + +## 1.17.0-next.1 + +### Minor Changes + +- 1e0230e: Support custom `AuthConnector` for `OAuth2`. + + A user can pass their own `AuthConnector` implementation in `OAuth2` constructor. + In which case the session manager will use that instead of the `DefaultAuthConnector` to interact with the + authentication provider. + + A custom `AuthConnector` may call the authentication provider from the front-end, store and retrieve tokens + in the session storage, for example, and otherwise send custom requests to the authentication provider and + handle its responses. + + Note, that if the custom `AuthConnector` transforms scopes returned from the authentication provider, + the transformation must be the same as `OAuth2CreateOptions#scopeTransform` passed to `OAuth2` constructor. + See creating `DefaultAuthConnector` in `OAuth2#create(...)` for an example. + +### Patch Changes + +- cc119b2: Fixed an issue causing `OAuthRequestDialog` to re-render on mount. +- Updated dependencies + - @backstage/core-plugin-api@1.10.7-next.0 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + +## 1.16.2-next.0 + +### Patch Changes + +- 73f6cc3: Updated `I18nextTranslationApi` to support interpolation of JSX elements. +- Updated dependencies + - @backstage/core-plugin-api@1.10.7-next.0 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + +## 1.16.1 + +### Patch Changes + +- a47fd39: Removes instances of default React imports, a necessary update for the upcoming React 19 migration. + + + +- Updated dependencies + - @backstage/core-plugin-api@1.10.6 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + +## 1.16.1-next.0 + +### Patch Changes + +- a47fd39: Removes instances of default React imports, a necessary update for the upcoming React 19 migration. + + + +- Updated dependencies + - @backstage/core-plugin-api@1.10.6-next.0 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + +## 1.16.0 + +### Minor Changes + +- 9262001: The default auth injection middleware for the `FetchApi` will now also take configuration under `discovery.endpoints` into consideration when deciding whether to include credentials or not. +- 12f8e01: The `discovery.endpoints` configuration no longer requires both `internal` and `external` target when using the object form, instead falling back to the default. + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.5 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + +## 1.16.0-next.0 + +### Minor Changes + +- 9262001: The default auth injection middleware for the `FetchApi` will now also take configuration under `discovery.endpoints` into consideration when deciding whether to include credentials or not. +- 12f8e01: The `discovery.endpoints` configuration no longer requires both `internal` and `external` target when using the object form, instead falling back to the default. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.2 + - @backstage/core-plugin-api@1.10.4 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + +## 1.15.5 + +### 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-plugin-api@1.10.4 + - @backstage/version-bridge@1.0.11 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + +## 1.15.5-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-plugin-api@1.10.4-next.0 + - @backstage/version-bridge@1.0.11-next.0 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + +## 1.15.4 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3 + - @backstage/types@1.2.1 + - @backstage/config@1.3.2 + - @backstage/version-bridge@1.0.10 + +## 1.15.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/types@1.2.1-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/version-bridge@1.0.10 + +## 1.15.3 + +### Patch Changes + +- e5fa018: The OAuth 2 client implementations will now attempt to refresh the session when the existing session doesn't have the required scopes. The previous behavior was to only try to refresh the session of it was missing, and otherwise directly request a new session. This fixes an issue where some auth providers will not return access tokens with certain scopes unless explicitly requested, leading to an auth popup even if the underlying session already had been granted the requested scopes. +- 2830689: Decrease OAuth2 token refresh grace period +- Updated dependencies + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## 1.15.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.1-next.0 + - @backstage/core-plugin-api@1.10.2-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## 1.15.3-next.0 + +### Patch Changes + +- e5fa018: The OAuth 2 client implementations will now attempt to refresh the session when the existing session doesn't have the required scopes. The previous behavior was to only try to refresh the session of it was missing, and otherwise directly request a new session. This fixes an issue where some auth providers will not return access tokens with certain scopes unless explicitly requested, leading to an auth popup even if the underlying session already had been granted the requested scopes. +- 2830689: Decrease OAuth2 token refresh grace period +- Updated dependencies + - @backstage/config@1.3.0 + - @backstage/core-plugin-api@1.10.1 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## 1.15.2 + +### Patch Changes + +- 44b82da: The default config loader no longer requires `process.env.APP_CONFIG` to be set, allowing config to be read from other sources instead. +- Updated dependencies + - @backstage/config@1.3.0 + - @backstage/types@1.2.0 + - @backstage/core-plugin-api@1.10.1 + - @backstage/version-bridge@1.0.10 + +## 1.15.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-plugin-api@1.10.0 + - @backstage/version-bridge@1.0.10 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + +## 1.15.1-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + +## 1.15.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.10.0-next.0 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.9 + +## 1.15.0 + +### Minor Changes + +- ddbeace: Added the ability to explicitly disable routes through the `bindRoutes` option by passing `false` as the route target. This also fixes a bug where route bindings in config were incorrectly prioritized above the ones in code in certain situations. + +### Patch Changes + +- ea69e46: The `defaultConfigLoader` now also reads configuration from scripts tags with `type="backstage.io/config"`. The tag is expected to contain a JSON-serialized array of `AppConfig` objects. If any of these script tags are present, the injected runtime configuration in the static assets will no longer be used. +- b537bd7: Allow custom star icons to be provided via the `star` and `unstarred` icon overrides. See how to override existing icons in the [Backstage documentation](https://backstage.io/docs/getting-started/app-custom-theme/#custom-icons). +- 836127c: Updated dependency `@testing-library/react` to `^16.0.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.9.4 + - @backstage/version-bridge@1.0.9 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + +## 1.14.3-next.0 + +### Patch Changes + +- ea69e46: The `defaultConfigLoader` now also reads configuration from scripts tags with `type="backstage.io/config"`. The tag is expected to contain a JSON-serialized array of `AppConfig` objects. If any of these script tags are present, the injected runtime configuration in the static assets will no longer be used. +- b537bd7: Allow custom star icons to be provided via the `star` and `unstarred` icon overrides. See how to override existing icons in the [Backstage documentation](https://backstage.io/docs/getting-started/app-custom-theme/#custom-icons). +- 836127c: Updated dependency `@testing-library/react` to `^16.0.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.9.4-next.0 + - @backstage/version-bridge@1.0.9-next.0 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + +## 1.14.2 + +### Patch Changes + +- 9a46a81: The request to delete the session cookie when running the app in protected mode is now done with a plain `fetch` rather than `FetchApi`. This fixes a bug where the app would immediately try to sign-in again when removing the cookie during logout. +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.8 + +## 1.14.1-next.0 + +### Patch Changes + +- 9a46a81: The request to delete the session cookie when running the app in protected mode is now done with a plain `fetch` rather than `FetchApi`. This fixes a bug where the app would immediately try to sign-in again when removing the cookie during logout. +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.8 + +## 1.14.0 + +### Minor Changes + +- d3c39fc: Allow for the disabling of external routes through config, which was rendered impossible after the introduction of default targets. + + ```yaml + app: + routes: + bindings: + # This has the effect of removing the button for registering new + # catalog entities in the scaffolder template list view + scaffolder.registerComponent: false + ``` + +### Patch Changes + +- db2e2d5: Updated config schema to support app.routes.bindings +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.8 + +## 1.13.1-next.1 + +### Patch Changes + +- db2e2d5: Updated config schema to support app.routes.bindings +- Updated dependencies + - @backstage/core-plugin-api@1.9.3 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.8 + +## 1.13.0-next.0 + +### Minor Changes + +- d3c39fc: Allow for the disabling of external routes through config, which was rendered impossible after the introduction of default targets. + + ```yaml + app: + routes: + bindings: + # This has the effect of removing the button for registering new + # catalog entities in the scaffolder template list view + scaffolder.registerComponent: false + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.9.3 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.8 + +## 1.12.6 + +### Patch Changes + +- 35fbe09: Added support for configuration of route bindings through static configuration, and default targets for external route refs. + + In addition to configuring route bindings through code, it is now also possible to configure route bindings under the `app.routes.bindings` key, for example: + + ```yaml + app: + routes: + bindings: + catalog.createComponent: catalog-import.importPage + ``` + + Each key in the route binding object is of the form `.`, where the route name is key used in the `externalRoutes` object passed to `createPlugin`. The value is of the same form, but with the name taken from the plugin `routes` option instead. + + The equivalent of the above configuration in code is the following: + + ```ts + const app = createApp({ + // ... + bindRoutes({ bind }) { + bind(catalogPlugin.externalRoutes, { + createComponent: catalogImportPlugin.routes.importPage, + }); + }, + }); + ``` + +- Updated dependencies + - @backstage/core-plugin-api@1.9.3 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.8 + +## 1.12.6-next.0 + +### Patch Changes + +- 35fbe09: Added support for configuration of route bindings through static configuration, and default targets for external route refs. + + In addition to configuring route bindings through code, it is now also possible to configure route bindings under the `app.routes.bindings` key, for example: + + ```yaml + app: + routes: + bindings: + catalog.createComponent: catalog-import.importPage + ``` + + Each key in the route binding object is of the form `.`, where the route name is key used in the `externalRoutes` object passed to `createPlugin`. The value is of the same form, but with the name taken from the plugin `routes` option instead. + + The equivalent of the above configuration in code is the following: + + ```ts + const app = createApp({ + // ... + bindRoutes({ bind }) { + bind(catalogPlugin.externalRoutes, { + createComponent: catalogImportPlugin.routes.importPage, + }); + }, + }); + ``` + +- Updated dependencies + - @backstage/core-plugin-api@1.9.3-next.0 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.8 + +## 1.12.5 + +### Patch Changes + +- 1bed9a3: The Backstage identity session expiration check will no longer fall back to using the provider expiration. This was introduced to smooth out the rollout of Backstage release 1.18, and is no longer needed. + +## 1.12.4 + +### Patch Changes + +- c884b9a: The app is now aware of if it is being served from the `app-backend` with a separate public and protected bundles. When in protected mode the app will now continuously refresh the session cookie, as well as clear the cookie if the user signs out. +- abfbcfc: Updated dependency `@testing-library/react` to `^15.0.0`. +- cb1e3b0: Updated dependency `@testing-library/dom` to `^10.0.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.9.2 + - @backstage/version-bridge@1.0.8 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + +## 1.12.4-next.0 + +### Patch Changes + +- c884b9a: The app is now aware of if it is being served from the `app-backend` with a separate public and protected bundles. When in protected mode the app will now continuously refresh the session cookie, as well as clear the cookie if the user signs out. +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/core-plugin-api@1.9.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.12.3 + +### Patch Changes + +- e8f026a: Use ESM exports of react-use library +- Updated dependencies + - @backstage/core-plugin-api@1.9.1 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.12.2 + +### Patch Changes + +- e8f026a: Use ESM exports of react-use library +- Updated dependencies + - @backstage/core-plugin-api@1.9.1 + - @backstage/config@1.2.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.12.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/core-plugin-api@1.9.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.12.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.2.0-next.1 + - @backstage/core-plugin-api@1.9.1-next.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.12.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.2-next.0 + - @backstage/core-plugin-api@1.9.1-next.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.12.0 + +### Minor Changes + +- f919be9: Added a utility API for VMware Cloud auth; the API ref is available in the + `@backstage/core-plugin-api` and `@backstage/frontend-plugin-api` packages, the + implementation is in `@backstage/core-app-api` and a factory has been added to + `@backstage/app-defaults`. + +### Patch Changes + +- 9aac2b0: Use `--cwd` as the first `yarn` argument +- 8fe56a8: Widen `@types/react` dependency range to include version 18. +- 7da67ce: Change `defaultScopes` for Bitbucket auth from invalid `team` to `account`. +- Updated dependencies + - @backstage/core-plugin-api@1.9.0 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.12.0-next.1 + +### Minor Changes + +- f919be9: Added a utility API for VMware Cloud auth; the API ref is available in the + `@backstage/core-plugin-api` and `@backstage/frontend-plugin-api` packages, the + implementation is in `@backstage/core-app-api` and a factory has been added to + `@backstage/app-defaults`. + +### Patch Changes + +- 9aac2b0: Use `--cwd` as the first `yarn` argument +- 8fe56a8: Widen `@types/react` dependency range to include version 18. +- Updated dependencies + - @backstage/core-plugin-api@1.9.0-next.1 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.11.4-next.0 + +### Patch Changes + +- 7da67ce: Change `defaultScopes` for Bitbucket auth from invalid `team` to `account`. +- Updated dependencies + - @backstage/core-plugin-api@1.8.3-next.0 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.11.3 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.2 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.11.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.2-next.0 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.11.2 + +### Patch Changes + +- 3e358b0: Added deprecation warning for React Router v6 beta, please make sure you have migrated your apps to use React Router v6 stable as support for the beta version will be removed. See the [migration tutorial](https://backstage.io/docs/tutorials/react-router-stable-migration) for more information. +- 0cbb03b: Fixing regular expression ReDoS with zod packages. Upgrading to latest. ref: +- Updated dependencies + - @backstage/core-plugin-api@1.8.1 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.11.2-next.1 + +### Patch Changes + +- 3e358b0dff: Added deprecation warning for React Router v6 beta, please make sure you have migrated your apps to use React Router v6 stable as support for the beta version will be removed. See the [migration tutorial](https://backstage.io/docs/tutorials/react-router-stable-migration) for more information. +- Updated dependencies + - @backstage/core-plugin-api@1.8.1-next.1 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.11.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.1-next.0 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.11.1 + +### Patch Changes + +- 6c2b872153: Add official support for React 18. +- 89d13e5618: Add current and default scopes when refreshing session +- 9ab0572217: Add component data `core.type` marker for `AppRouter` and `FlatRoutes`. +- Updated dependencies + - @backstage/core-plugin-api@1.8.0 + - @backstage/version-bridge@1.0.7 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + +## 1.11.1-next.0 + +### Patch Changes + +- 6c2b872153: Add official support for React 18. +- 89d13e5618: Add current and default scopes when refreshing session +- 9ab0572217: Add component data `core.type` marker for `AppRouter` and `FlatRoutes`. +- Updated dependencies + - @backstage/core-plugin-api@1.8.0-next.0 + - @backstage/version-bridge@1.0.7-next.0 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + +## 1.11.0 + +### Minor Changes + +- c9d9bfeca2: URL encode some well known unsafe characters in `RouteResolver` (and therefore `useRouteRef`) + +### Patch Changes + +- 29e4d8b76b: Fixed bug in `AppRouter` to determine the correct `signOutTargetUrl` if `app.baseUrl` contains a `basePath` +- acca17e91a: Wrap entire app in ``, enabling support for using translations outside plugins. +- 1a0616fa10: Add missing resource and template app icons +- 9a1fce352e: Updated dependency `@testing-library/jest-dom` to `^6.0.0`. +- f95af4e540: Updated dependency `@testing-library/dom` to `^9.0.0`. +- f1b349cfba: Fixed a bug in `TranslationApi` implementation where in some cases it wouldn't notify subscribers of language changes. +- Updated dependencies + - @backstage/core-plugin-api@1.7.0 + - @backstage/version-bridge@1.0.6 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + +## 1.11.0-next.2 + +### Minor Changes + +- c9d9bfeca2: URL encode some well known unsafe characters in `RouteResolver` (and therefore `useRouteRef`) + +### Patch Changes + +- acca17e91a: Wrap entire app in ``, enabling support for using translations outside plugins. +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.1 + - @backstage/config@1.1.1-next.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## 1.10.1-next.1 + +### Patch Changes + +- 1a0616fa10: Add missing resource and template app icons +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## 1.10.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## 1.10.0 + +### Minor Changes + +- 18619f793c94: Fixed two bugs in how the `OAuth2Session` type represents the underlying data. The `expiresAt` and `backstageIdentity` are now both optional, since that's what they are in practice. This is not considered a breaking change since it was effectively a bug in the modelling of the state that this type represents, and the type was not used in any other external contract. +- 18619f793c94: The `OAuth` class which is used by all OAuth providers will now consider both the session expiration of both the Backstage identity as well as the upstream identity provider, and refresh the session with either of them is about to expire. +- 6e30769cc627: Introduced experimental support for internationalization. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 9fe827b380e1: Internal refactor +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## 1.10.0-next.3 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 9fe827b380e1: Internal refactor +- Updated dependencies + - @backstage/config@1.1.0-next.2 + - @backstage/core-plugin-api@1.6.0-next.3 + - @backstage/types@1.1.1-next.0 + - @backstage/version-bridge@1.0.5-next.0 + +## 1.10.0-next.2 + +### Minor Changes + +- 6e30769cc627: Introduced experimental support for internationalization. + +### Patch Changes + +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/core-plugin-api@1.6.0-next.2 + - @backstage/config@1.1.0-next.1 + - @backstage/types@1.1.0 + - @backstage/version-bridge@1.0.4 + +## 1.10.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0-next.0 + - @backstage/core-plugin-api@1.6.0-next.1 + - @backstage/types@1.1.0 + - @backstage/version-bridge@1.0.4 + +## 1.10.0-next.0 + +### Minor Changes + +- 18619f793c94: Fixed two bugs in how the `OAuth2Session` type represents the underlying data. The `expiresAt` and `backstageIdentity` are now both optional, since that's what they are in practice. This is not considered a breaking change since it was effectively a bug in the modelling of the state that this type represents, and the type was not used in any other external contract. +- 18619f793c94: The `OAuth` class which is used by all OAuth providers will now consider both the session expiration of both the Backstage identity as well as the upstream identity provider, and refresh the session with either of them is about to expire. + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.6.0-next.0 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/version-bridge@1.0.4 + +## 1.9.1 + +### Patch Changes + +- 9ae4e7e63836: Fixed a bug that could cause `navigate` analytics events to be misattributed to the plugin mounted on the root route (e.g. the `home` plugin at `/`) when the route that was navigated to wasn't associated with a routable extension. +- Updated dependencies + - @backstage/core-plugin-api@1.5.3 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/version-bridge@1.0.4 + +## 1.9.1-next.0 + +### Patch Changes + +- 9ae4e7e63836: Fixed a bug that could cause `navigate` analytics events to be misattributed to the plugin mounted on the root route (e.g. the `home` plugin at `/`) when the route that was navigated to wasn't associated with a routable extension. +- Updated dependencies + - @backstage/core-plugin-api@1.5.3 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/version-bridge@1.0.4 + +## 1.9.0 + +### Minor Changes + +- a77ddf7ccd71: add login in popup options to config popup width and height + +### Patch Changes + +- 8174cf4c0edf: Fixing MUI / Material UI references +- Updated dependencies + - @backstage/core-plugin-api@1.5.3 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/version-bridge@1.0.4 + +## 1.8.2-next.1 + +### Patch Changes + +- 8174cf4c0edf: Fixing MUI / Material UI references +- Updated dependencies + - @backstage/core-plugin-api@1.5.3-next.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/version-bridge@1.0.4 + +## 1.8.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.3-next.0 + - @backstage/config@1.0.8 + +## 1.8.1 + +### Patch Changes + +- 12adfbc8fe2d: Fixed a bug that prevented accurate plugin and route data from being applied to `navigate` analytics events when users visited pages constructed with ``, ``, and similar components that are used to gather one or more routable extensions under a given path. +- ac677bc30ae0: Expose discovery.endpoints configuration to use FrontendHostDiscovery +- 74b216ee4e50: Add `PropsWithChildren` to usages of `ComponentType`, in preparation for React 18 where the children are no longer implicit. +- Updated dependencies + - @backstage/core-plugin-api@1.5.2 + - @backstage/types@1.1.0 + - @backstage/config@1.0.8 + - @backstage/version-bridge@1.0.4 + +## 1.8.1-next.0 + +### Patch Changes + +- 74b216ee4e50: Add `PropsWithChildren` to usages of `ComponentType`, in preparation for React 18 where the children are no longer implicit. +- Updated dependencies + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4 + +## 1.8.0 + +### Minor Changes + +- c89437db899: The analytics' `navigate` event will now include the route parameters as attributes of the navigate event + +### Patch Changes + +- b645d70034a: Fixed a bug in the Azure auth provider which prevented getting access tokens with multiple scopes for one resource +- 42d817e76ab: Added `FrontendHostDiscovery` for config driven discovery implementation +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/core-plugin-api@1.5.1 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4 + +## 1.8.0-next.1 + +### Minor Changes + +- c89437db899: The analytics' `navigate` event will now include the route parameters as attributes of the navigate event + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.1 + - @backstage/config@1.0.7 + +## 1.7.1-next.0 + +### Patch Changes + +- 42d817e76ab: Added `FrontendHostDiscovery` for config driven discovery implementation +- Updated dependencies + - @backstage/core-plugin-api@1.5.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4 + +## 1.7.0 + +### Minor Changes + +- 7908d72e033: Introduce a new global config parameter, `enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. +- c15e0cedbe1: The `AuthConnector` interface now supports specifying a set of scopes when + refreshing a session. The `DefaultAuthConnector` implementation passes the + `scope` query parameter to the auth-backend plugin appropriately. The + `RefreshingAuthSessionManager` passes any scopes in its `GetSessionRequest` + appropriately. + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-plugin-api@1.5.1 + - @backstage/version-bridge@1.0.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## 1.7.0-next.3 + +### Minor Changes + +- c15e0cedbe1: The `AuthConnector` interface now supports specifying a set of scopes when + refreshing a session. The `DefaultAuthConnector` implementation passes the + `scope` query parameter to the auth-backend plugin appropriately. The + `RefreshingAuthSessionManager` passes any scopes in its `GetSessionRequest` + appropriately. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4-next.0 + +## 1.7.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4-next.0 + +## 1.7.0-next.1 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## 1.7.0-next.0 + +### Minor Changes + +- 7908d72e033: Introduce a new global config parameter, `enableExperimentalRedirectFlow`. When enabled, auth will happen with an in-window redirect flow rather than through a popup window. + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.6.0 + +### Minor Changes + +- 456eaa8cf83: `OAuth2` now gets ID tokens from a session with the `openid` scope explicitly + requested. + + This should not be considered a breaking change, because spec-compliant OIDC + providers will already be returning ID tokens if and only if the `openid` scope + is granted. + + This change makes the dependence explicit, and removes the burden on + OAuth2-based providers which require an ID token (e.g. this is done by various + default [auth handlers](https://backstage.io/docs/auth/identity-resolver/#authhandler)) to add + `openid` to their default scopes. _That_ could carry another indirect benefit: + by removing `openid` from the default scopes for a provider, grants for + resource-specific access tokens can avoid requesting excess ID token-related + scopes. + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.6.0-next.2 + +### Minor Changes + +- 456eaa8cf83: `OAuth2` now gets ID tokens from a session with the `openid` scope explicitly + requested. + + This should not be considered a breaking change, because spec-compliant OIDC + providers will already be returning ID tokens if and only if the `openid` scope + is granted. + + This change makes the dependence explicit, and removes the burden on + OAuth2-based providers which require an ID token (e.g. this is done by various + default [auth handlers](https://backstage.io/docs/auth/identity-resolver/#authhandler)) to add + `openid` to their default scopes. _That_ could carry another indirect benefit: + by removing `openid` from the default scopes for a provider, grants for + resource-specific access tokens can avoid requesting excess ID token-related + scopes. + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/config@1.0.7-next.0 + +## 1.5.1-next.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.4.1-next.1 + - @backstage/config@1.0.7-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.5.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.4.1-next.0 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.5.0 + +### Minor Changes + +- db10b6ef65: Added a Bitbucket Server Auth Provider and added its API to the app defaults + +### Patch Changes + +- dff4d8ddb1: Fixed an issue where an explicit port the frontend base URL could break the app. +- Updated dependencies + - @backstage/core-plugin-api@1.4.0 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.4.1-next.0 + +### Patch Changes + +- dff4d8ddb1: Fixed an issue where an explicit port the frontend base URL could break the app. +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.4.0 + +### Minor Changes + +- bca8e8b393: Allow defining application level feature flags. See [Feature Flags documentation](https://backstage.io/docs/plugins/feature-flags#in-the-application) for reference. + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0 + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.4.0-next.1 + +### Minor Changes + +- bca8e8b393: Allow defining application level feature flags. See [Feature Flags documentation](https://backstage.io/docs/plugins/feature-flags#in-the-application) for reference. + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.3.0 + +### Minor Changes + +- e0d9c9559a: Added a new `AppRouter` component and `app.createRoot()` method that replaces `app.getRouter()` and `app.getProvider()`, which are now deprecated. The new `AppRouter` component is a drop-in replacement for the old router component, while the new `app.createRoot()` method is used instead of the old provider component. + + An old app setup might look like this: + + ```tsx + const app = createApp(/* ... */); + + const AppProvider = app.getProvider(); + const AppRouter = app.getRouter(); + + const routes = ...; + + const App = () => ( + + + + + {routes} + + + ); + + export default App; + ``` + + With these new APIs, the setup now looks like this: + + ```tsx + import { AppRouter } from '@backstage/core-app-api'; + + const app = createApp(/* ... */); + + const routes = ...; + + export default app.createRoot( + <> + + + + {routes} + + , + ); + ``` + + Note that `app.createRoot()` accepts a React element, rather than a component. + +### Patch Changes + +- d3fea4ae0a: Internal fixes to avoid implicit usage of globals +- b05dcd5530: Move the `zod` dependency to a version that does not collide with other libraries +- b4b5b02315: Tweak feature flag registration so that it happens immediately before the first rendering of the app, rather than just after. +- 6870b43dd1: Fix for the automatic rewriting of base URLs. +- 203271b746: Prevent duplicate feature flag components from rendering in the settings when using components +- 3280711113: Updated dependency `msw` to `^0.49.0`. +- 19356df560: Updated dependency `zen-observable` to `^0.9.0`. +- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`. +- 8015ff1258: Tweaked wording to use inclusive terminology +- 653d7912ac: Made `WebStorage` notify its subscribers when `localStorage` values change in other tabs/windows +- 63310e3987: Apps will now rewrite the `app.baseUrl` configuration to match the current `location.origin`. The `backend.baseUrl` will also be rewritten in the same way when the `app.baseUrl` and `backend.baseUrl` have matching origins. This will reduce the need for separate frontend builds for different environments. +- Updated dependencies + - @backstage/core-plugin-api@1.2.0 + - @backstage/version-bridge@1.0.3 + - @backstage/types@1.0.2 + - @backstage/config@1.0.5 + +## 1.3.0-next.4 + +### Minor Changes + +- e0d9c9559a: Added a new `AppRouter` component and `app.createRoot()` method that replaces `app.getRouter()` and `app.getProvider()`, which are now deprecated. The new `AppRouter` component is a drop-in replacement for the old router component, while the new `app.createRoot()` method is used instead of the old provider component. + + An old app setup might look like this: + + ```tsx + const app = createApp(/* ... */); + + const AppProvider = app.getProvider(); + const AppRouter = app.getRouter(); + + const routes = ...; + + const App = () => ( + + + + + {routes} + + + ); + + export default App; + ``` + + With these new APIs, the setup now looks like this: + + ```tsx + import { AppRouter } from '@backstage/core-app-api'; + + const app = createApp(/* ... */); + + const routes = ...; + + export default app.createRoot( + <> + + + + {routes} + + , + ); + ``` + + Note that `app.createRoot()` accepts a React element, rather than a component. + +### Patch Changes + +- b05dcd5530: Move the `zod` dependency to a version that does not collide with other libraries +- Updated dependencies + - @backstage/config@1.0.5-next.1 + - @backstage/core-plugin-api@1.2.0-next.2 + - @backstage/types@1.0.2-next.1 + - @backstage/version-bridge@1.0.3-next.0 + +## 1.2.1-next.3 + +### Patch Changes + +- 6870b43dd1: Fix for the automatic rewriting of base URLs. +- 653d7912ac: Made `WebStorage` notify its subscribers when `localStorage` values change in other tabs/windows +- Updated dependencies + - @backstage/config@1.0.5-next.1 + - @backstage/core-plugin-api@1.2.0-next.2 + - @backstage/types@1.0.2-next.1 + - @backstage/version-bridge@1.0.3-next.0 + +## 1.2.1-next.2 + +### Patch Changes + +- b4b5b02315: Tweak feature flag registration so that it happens immediately before the first rendering of the app, rather than just after. +- 203271b746: Prevent duplicate feature flag components from rendering in the settings when using components +- 8015ff1258: Tweaked wording to use inclusive terminology +- 63310e3987: Apps will now rewrite the `app.baseUrl` configuration to match the current `location.origin`. The `backend.baseUrl` will also be rewritten in the same way when the `app.baseUrl` and `backend.baseUrl` have matching origins. This will reduce the need for separate frontend builds for different environments. +- Updated dependencies + - @backstage/core-plugin-api@1.2.0-next.2 + - @backstage/config@1.0.5-next.1 + - @backstage/types@1.0.2-next.1 + - @backstage/version-bridge@1.0.3-next.0 + +## 1.2.1-next.1 + +### Patch Changes + +- d3fea4ae0a: Internal fixes to avoid implicit usage of globals +- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`. +- Updated dependencies + - @backstage/version-bridge@1.0.3-next.0 + - @backstage/core-plugin-api@1.1.1-next.1 + - @backstage/types@1.0.2-next.1 + - @backstage/config@1.0.5-next.1 + +## 1.2.1-next.0 + +### Patch Changes + +- 3280711113: Updated dependency `msw` to `^0.49.0`. +- 19356df560: Updated dependency `zen-observable` to `^0.9.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.1.1-next.0 + - @backstage/types@1.0.2-next.0 + - @backstage/config@1.0.5-next.0 + - @backstage/version-bridge@1.0.2 + +## 1.2.0 + +### Minor Changes + +- 9b737e5f2e: Updated the React Router wiring to make use of the new `basename` property of the router components in React Router v6 stable. To implement this, a new optional `basename` property has been added to the `Router` app component, which can be forwarded to the concrete router implementation in order to support this new behavior. This is done by default in any app that does not have a `Router` component override. +- 127fcad26d: Deprecated the `homepage` config as the component that used it - `HomepageTimer` - has been removed and replaced by the `HeaderWorldClock` in the home plugin + +### Patch Changes + +- Updated dependencies + - @backstage/version-bridge@1.0.2 + - @backstage/core-plugin-api@1.1.0 + - @backstage/types@1.0.1 + - @backstage/config@1.0.4 + +## 1.2.0-next.0 + +### Minor Changes + +- 9b737e5f2e: Updated the React Router wiring to make use of the new `basename` property of the router components in React Router v6 stable. To implement this, a new optional `basename` property has been added to the `Router` app component, which can be forwarded to the concrete router implementation in order to support this new behavior. This is done by default in any app that does not have a `Router` component override. +- 127fcad26d: Deprecated the `homepage` config as the component that used it - `HomepageTimer` - has been removed and replaced by the `HeaderWorldClock` in the home plugin + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.1.0-next.0 + - @backstage/types@1.0.1-next.0 + - @backstage/config@1.0.4-next.0 + - @backstage/version-bridge@1.0.1 + +## 1.1.1 + +### Patch Changes + +- 27e6404aba: Fixed a bug where gathered index routes would fail to bind routable extensions. This would typically show up when placing a routable extension in the entity page overview tab. +- Updated dependencies + - @backstage/core-plugin-api@1.0.7 + - @backstage/config@1.0.3 + - @backstage/types@1.0.0 + - @backstage/version-bridge@1.0.1 + +## 1.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.3-next.2 + - @backstage/core-plugin-api@1.0.7-next.2 + - @backstage/types@1.0.0 + - @backstage/version-bridge@1.0.1 + +## 1.1.1-next.1 + +### Patch Changes + +- 27e6404aba: Fixed a bug where gathered index routes would fail to bind routable extensions. This would typically show up when placing a routable extension in the entity page overview tab. +- Updated dependencies + - @backstage/core-plugin-api@1.0.7-next.1 + - @backstage/config@1.0.3-next.1 + - @backstage/types@1.0.0 + - @backstage/version-bridge@1.0.1 + +## 1.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.3-next.0 + - @backstage/core-plugin-api@1.0.7-next.0 + - @backstage/types@1.0.0 + - @backstage/version-bridge@1.0.1 + +## 1.1.0 + +### Minor Changes + +- a448fea691: Updated the routing system to be compatible with React Router v6 stable. + +### Patch Changes + +- 817f3196f6: Updated React Router dependencies to be peer dependencies. + +- f9ec4e46e3: When using React Router v6 stable, it is now possible for components within the `Route` element tree to have `path` props, although they will be ignored. + +- 7d47def9c4: Removed dependency on `@types/jest`. + +- 744fea158b: Added `getSystemIcons()` function to the `AppContext` available through `useApp` that will pull a list of all the icons that have been registered in the App. + +- 667d917488: Updated dependency `msw` to `^0.47.0`. + +- 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`. + +- bf5e9030eb: Updated dependency `msw` to `^0.45.0`. + +- 8448b53dd6: Clarify that the `WebStorage` observable returns `JsonValue` items. + +- 70299c99d5: Updated `FlatRoutes` to be compatible with React Router v6 stable. + +- e9d40ebf54: If you'd like to send analytics events to multiple implementations, you may now + do so using the `MultipleAnalyticsApi` implementation provided by this package. + + ```tsx + import { MultipleAnalyticsApi } from '@backstage/core-app-api'; + import { + analyticsApiRef, + configApiRef, + storageApiRef, + identityApiRef, + } from '@internal/backstage/core-plugin-api'; + import { CustomAnalyticsApi } from '@internal/analytics'; + import { VendorAnalyticsApi } from '@vendor/analytics'; + + createApiFactory({ + api: analyticsApiRef, + deps: { configApi: configApiRef, identityApi: identityApiRef, storageApi: storageApiRef }, + factory: ({ configApi, identityApi, storageApi }) => + MultipleAnalyticsApi.fromApis([ + VendorAnalyticsApi.fromConfig(configApi, { identityApi }), + CustomAnalyticsApi.fromConfig(configApi, { identityApi, storageApi }), + ]), + }), + ``` + +- Updated dependencies + - @backstage/core-plugin-api@1.0.6 + - @backstage/config@1.0.2 + +## 1.1.0-next.3 + +### Patch Changes + +- 7d47def9c4: Removed dependency on `@types/jest`. +- Updated dependencies + - @backstage/config@1.0.2-next.0 + - @backstage/core-plugin-api@1.0.6-next.3 + +## 1.1.0-next.2 + +### Patch Changes + +- f9ec4e46e3: When using React Router v6 stable, it is now possible for components within the `Route` element tree to have `path` props, although they will be ignored. + +- 667d917488: Updated dependency `msw` to `^0.47.0`. + +- 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`. + +- e9d40ebf54: If you'd like to send analytics events to multiple implementations, you may now + do so using the `MultipleAnalyticsApi` implementation provided by this package. + + ```tsx + import { MultipleAnalyticsApi } from '@backstage/core-app-api'; + import { + analyticsApiRef, + configApiRef, + storageApiRef, + identityApiRef, + } from '@internal/backstage/core-plugin-api'; + import { CustomAnalyticsApi } from '@internal/analytics'; + import { VendorAnalyticsApi } from '@vendor/analytics'; + + createApiFactory({ + api: analyticsApiRef, + deps: { configApi: configApiRef, identityApi: identityApiRef, storageApi: storageApiRef }, + factory: ({ configApi, identityApi, storageApi }) => + MultipleAnalyticsApi.fromApis([ + VendorAnalyticsApi.fromConfig(configApi, { identityApi }), + CustomAnalyticsApi.fromConfig(configApi, { identityApi, storageApi }), + ]), + }), + ``` + +- Updated dependencies + - @backstage/core-plugin-api@1.0.6-next.2 + +## 1.1.0-next.1 + +### Minor Changes + +- a448fea691: Updated the routing system to be compatible with React Router v6 stable. + +### Patch Changes + +- 817f3196f6: Updated React Router dependencies to be peer dependencies. +- 70299c99d5: Updated `FlatRoutes` to be compatible with React Router v6 stable. +- Updated dependencies + - @backstage/core-plugin-api@1.0.6-next.1 + +## 1.0.6-next.0 + +### Patch Changes + +- 744fea158b: Added `getSystemIcons()` function to the `AppContext` available through `useApp` that will pull a list of all the icons that have been registered in the App. +- bf5e9030eb: Updated dependency `msw` to `^0.45.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.0.6-next.0 + +## 1.0.5 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.0.5 + +## 1.0.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.0.5-next.0 + +## 1.0.4 + +### Patch Changes + +- 881fc75a75: Internal tweak removing usage of explicit type parameters for the `BackstagePlugin` type. +- 8fe2357101: The `signOut` method of the `IdentityApi` will now navigate the user back to the base URL of the app as indicated by the `app.baseUrl` config. +- a70869e775: Updated dependency `msw` to `^0.43.0`. +- 8006d0f9bf: Updated dependency `msw` to `^0.44.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.0.4 + +## 1.0.4-next.1 + +### Patch Changes + +- 881fc75a75: Internal tweak removing usage of explicit type parameters for the `BackstagePlugin` type. +- a70869e775: Updated dependency `msw` to `^0.43.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.0.4-next.0 + +## 1.0.4-next.0 + +### Patch Changes + +- 8fe2357101: The `signOut` method of the `IdentityApi` will now navigate the user back to the base URL of the app as indicated by the `app.baseUrl` config. + +## 1.0.3 + +### Patch Changes + +- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. +- 19781483a2: Handle URLs as the first argument to `fetchApi`, when using the `plugin:` protocol +- Updated dependencies + - @backstage/core-plugin-api@1.0.3 + +## 1.0.3-next.0 + +### Patch Changes + +- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. +- Updated dependencies + - @backstage/core-plugin-api@1.0.3-next.0 + +## 1.0.2 + +### Patch Changes + +- 1fae1f57c9: Fix SAML session schema to no longer require the (deprecated) id, to unbreak session data storage. +- Updated dependencies + - @backstage/core-plugin-api@1.0.2 + - @backstage/config@1.0.1 + +## 1.0.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.1-next.0 + - @backstage/core-plugin-api@1.0.2-next.1 + +## 1.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.0.2-next.0 + +## 1.0.1 + +### Patch Changes + +- 7c7919777e: build(deps-dev): bump `@testing-library/react-hooks` from 7.0.2 to 8.0.0 +- 24254fd433: build(deps): bump `@testing-library/user-event` from 13.5.0 to 14.0.0 +- 3ff2bfb66e: Refactored the route collection logic to prepare for future changes and avoid duplicate element tree traversal for the analytics context. +- a7bb762dab: fixed empty body issue for POST requests using FetchAPI with 'plugin://' prefix +- 230ad0826f: Bump to using `@types/node` v16 +- c47509e1a0: Implemented changes suggested by Deepsource.io including multiple double non-null assertion operators and unexpected awaits for non-promise values. +- Updated dependencies + - @backstage/core-plugin-api@1.0.1 + - @backstage/version-bridge@1.0.1 + +## 1.0.1-next.1 + +### Patch Changes + +- 24254fd433: build(deps): bump `@testing-library/user-event` from 13.5.0 to 14.0.0 +- 3ff2bfb66e: Refactored the route collection logic to prepare for future changes and avoid duplicate element tree traversal for the analytics context. +- 230ad0826f: Bump to using `@types/node` v16 +- Updated dependencies + - @backstage/core-plugin-api@1.0.1-next.0 + +## 1.0.1-next.0 + +### Patch Changes + +- a7bb762dab: fixed empty body issue for POST requests using FetchAPI with 'plugin://' prefix +- c47509e1a0: Implemented changes suggested by Deepsource.io including multiple double non-null assertion operators and unexpected awaits for non-promise values. + +## 1.0.0 + +### Major Changes + +- b58c70c223: This package has been promoted to v1.0! To understand how this change affects the package, please check out our [versioning policy](https://backstage.io/docs/overview/versioning-policy). + +### Patch Changes + +- a422d7ce5e: chore(deps): bump `@testing-library/react` from 11.2.6 to 12.1.3 +- f24ef7864e: Minor typo fixes +- Updated dependencies + - @backstage/core-plugin-api@1.0.0 + - @backstage/version-bridge@1.0.0 + - @backstage/config@1.0.0 + - @backstage/types@1.0.0 + +## 0.6.0 + +### Minor Changes + +- bb2bb36651: **BREAKING**: Removed the deprecated `get` method from `StorageAPI` and its implementations, this method has been replaced by the `snapshot` method. The return value from snapshot no longer includes `newValue` which has been replaced by `value`. For getting notified when a value changes, use \`observe# @backstage/core-app-api. +- f3cce3dcf7: **BREAKING**: Removed export of `GithubSession` and `SamlSession` which are only used internally. +- af5eaa87f4: **BREAKING**: Removed deprecated `auth0AuthApiRef`, `oauth2ApiRef`, `samlAuthApiRef` and `oidcAuthApiRef` as these APIs are too generic to be useful. Instructions for how to migrate can be found at . +- dbf84eee55: **BREAKING**: Removed the deprecated `GithubAuth.normalizeScopes` method. + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@0.8.0 + +## 0.5.4 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@0.7.0 + +## 0.5.3 + +### 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` +- Updated dependencies + - @backstage/core-plugin-api@0.6.1 + - @backstage/config@0.1.14 + - @backstage/types@0.1.2 + - @backstage/version-bridge@0.1.2 + +## 0.5.2 + +### Patch Changes + +- 40775bd263: Switched out the `GithubAuth` implementation to use the common `OAuth2` implementation. This relies on the simultaneous change in `@backstage/plugin-auth-backend` that enabled access token storage in cookies rather than the current solution that's based on `LocalStorage`. + + > **NOTE:** Make sure you upgrade the `auth-backend` deployment before or at the same time as you deploy this change. + +## 0.5.2-next.0 + +### Patch Changes + +- 40775bd263: Switched out the `GithubAuth` implementation to use the common `OAuth2` implementation. This relies on the simultaneous change in `@backstage/plugin-auth-backend` that enabled access token storage in cookies rather than the current solution that's based on `LocalStorage`. + + > **NOTE:** Make sure you upgrade the `auth-backend` deployment before or at the same time as you deploy this change. + +## 0.5.1 + +### Patch Changes + +- f959c22787: Asynchronous methods on the identity API can now reliably be called at any time, including early in the bootstrap process or prior to successful sign-in. + + Previously in such situations, a `Tried to access IdentityApi before app was loaded` error would be thrown. Now, those methods will wait and resolve eventually (as soon as a concrete identity API is provided). + +## 0.5.0 + +### Minor Changes + +- ceebe25391: Removed deprecated `SignInResult` type, which was replaced with the new `onSignInSuccess` callback. + +### Patch Changes + +- fb565073ec: Add an `allowUrl` callback option to `FetchMiddlewares.injectIdentityAuth` +- f050eec2c0: Added validation during the application startup that detects if there are any plugins present that have not had their required external routes bound. Failing the validation will cause a hard crash as it is a programmer error. It lets you detect early on that there are dangling routes, rather than having them cause an error later on. +- Updated dependencies + - @backstage/core-plugin-api@0.6.0 + - @backstage/config@0.1.13 + +## 0.5.0-next.0 + +### Minor Changes + +- ceebe25391: Removed deprecated `SignInResult` type, which was replaced with the new `onSignInSuccess` callback. + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@0.6.0-next.0 + - @backstage/config@0.1.13-next.0 + +## 0.4.0 + +### Minor Changes + +- e2eb92c109: Removed previously deprecated `ApiRegistry` export. + +### Patch Changes + +- 34442cd5cf: Fixed an issue where valid SAML and GitHub sessions would be considered invalid and not be stored. + + Deprecated the `SamlSession` and `GithubSession` types. + +- 784d8078ab: Removed direct and transitive Material UI dependencies. + +- Updated dependencies + - @backstage/config@0.1.12 + - @backstage/core-plugin-api@0.5.0 + +## 0.3.1 + +### 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.3.0 + +### Minor Changes + +- a195284c7b: Updated `WebStorageApi` to reflect the `StorageApi` changes in `@backstage/core-plugin-api`. +- b3605da81c: - Removed deprecated definition `createApp` from `@backstage/core-app-api` which has been replaced by `@backstage/app-defaults#createApp` + - Removed deprecated type `BackstagePluginWithAnyOutput` + - Removed deprecated constructors for `GithubAuth`, `OAuth2`, and `SamlAuth` as the `create` method should be used instead +- 68f8b10ccd: - Removed deprecation configuration option `theme` from `AppTheme` of the `AppThemeApi` + - Removed reference to `theme` in the `app-defaults` default `AppTheme` + - Removed logic in `AppThemeProvider` that creates `ThemeProvider` from `appTheme.theme` + +### Patch Changes + +- 7927005152: Add `FetchApi` and related `fetchApiRef` which implement fetch, with an added Backstage token header when available. +- 518ddc00bc: Schema-validate local storage cached session info on load +- Updated dependencies + - @backstage/app-defaults@0.1.3 + - @backstage/core-plugin-api@0.4.0 + - @backstage/core-components@0.8.2 + +## 0.2.1 + +### Patch Changes + +- c11ce4f552: Deprecated `Auth0Auth`, pointing to using `OAuth2` directly instead. +- 9d6503e86c: Switched out usage of deprecated `OAuthRequestApi` types from `@backstage/core-plugin-api`. +- Updated dependencies + - @backstage/core-plugin-api@0.3.1 + - @backstage/core-components@0.8.1 + +## 0.2.0 + +### Minor Changes + +- a036b65c2f: **BREAKING CHANGE** + + The app `SignInPage` component has been updated to switch out the `onResult` callback for a new `onSignInSuccess` callback. This is an immediate breaking change without any deprecation period, as it was deemed to be the way of making this change that had the lowest impact. + + The new `onSignInSuccess` callback directly accepts an implementation of an `IdentityApi`, rather than a `SignInResult`. The `SignInPage` from `@backstage/core-component` has been updated to fit this new API, and as long as you pass on `props` directly you should not see any breakage. + + However, if you implement your own custom `SignInPage`, then this will be a breaking change and you need to migrate over to using the new callback. While doing so you can take advantage of the `UserIdentity.fromLegacy` helper from `@backstage/core-components` to make the migration simpler by still using the `SignInResult` type. This helper is also deprecated though and is only provided for immediate migration. Long-term it will be necessary to build the `IdentityApi` using for example `UserIdentity.create` instead. + + The following is an example of how you can migrate existing usage immediately using `UserIdentity.fromLegacy`: + + ```ts + onResult(signInResult); + // becomes + onSignInSuccess(UserIdentity.fromLegacy(signInResult)); + ``` + + The following is an example of how implement the new `onSignInSuccess` callback of the `SignInPage` using `UserIdentity.create`: + + ```ts + const identityResponse = await authApi.getBackstageIdentity(); + // Profile is optional and will be removed, but allows the + // synchronous getProfile method of the IdentityApi to be used. + const profile = await authApi.getProfile(); + onSignInSuccess( + UserIdentity.create({ + identity: identityResponse.identity, + authApi, + profile, + }), + ); + ``` + +### Patch Changes + +- cd450844f6: Moved React dependencies to `peerDependencies` and allow both React v16 and v17 to be used. +- dcd1a0c3f4: Minor improvement to the API reports, by not unpacking arguments directly +- Updated dependencies + - @backstage/core-components@0.8.0 + - @backstage/core-plugin-api@0.3.0 + - @backstage/app-defaults@0.1.2 + - @backstage/version-bridge@0.1.1 + +## 0.1.24 + +### Patch Changes + +- 0e7f256034: Fixed a bug where `useRouteRef` would fail in situations where relative navigation was needed and the app was is mounted on a sub-path. This would typically show up as a failure to navigate to a tab on an entity page. +- Updated dependencies + - @backstage/core-components@0.7.6 + - @backstage/theme@0.2.14 + - @backstage/core-plugin-api@0.2.2 + +## 0.1.23 + +### Patch Changes + +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + + More information can be found here: + +- 000190de69: The `ApiRegistry` from `@backstage/core-app-api` class has been deprecated and will be removed in a future release. To replace it, we have introduced two new helpers that are exported from `@backstage/test-utils`, namely `TestApiProvider` and `TestApiRegistry`. + + These two new helpers are more tailored for writing tests and development setups, as they allow for partial implementations of each of the APIs. + + When migrating existing code it is typically best to prefer usage of `TestApiProvider` when possible, so for example the following code: + + ```tsx + render( + + {...} + + ) + ``` + + Would be migrated to this: + + ```tsx + render( + + {...} + + ) + ``` + + In cases where the `ApiProvider` is used in a more standalone way, for example to reuse a set of APIs across multiple tests, the `TestApiRegistry` can be used instead. Note that the `TestApiRegistry` only has a single static factory method, `.from()`, and it is slightly different from the existing `.from()` method on `ApiRegistry` in that it doesn't require the API pairs to be wrapped in an outer array. + + Usage that looks like this: + + ```ts + const apis = ApiRegistry.with( + identityApiRef, + mockIdentityApi as unknown as IdentityApi, + ).with(configApiRef, new ConfigReader({})); + ``` + + OR like this: + + ```ts + const apis = ApiRegistry.from([ + [identityApiRef, mockIdentityApi as unknown as IdentityApi], + [configApiRef, new ConfigReader({})], + ]); + ``` + + Would be migrated to this: + + ```ts + const apis = TestApiRegistry.from( + [identityApiRef, mockIdentityApi], + [configApiRef, new ConfigReader({})], + ); + ``` + + If your app is still using the `ApiRegistry` to construct the `apis` for `createApp`, we recommend that you move over to use the new method of supplying API factories instead, using `createApiFactory`. + +- Updated dependencies + - @backstage/core-plugin-api@0.2.1 + - @backstage/core-components@0.7.5 + +## 0.1.22 + +### Patch Changes + +- Reverted the `createApp` TypeScript type to match the one before version `0.1.21`, as it was an accidental breaking change. + +## 0.1.21 + +### Patch Changes + +- 0b1de52732: Migrated to using new `ErrorApiError` and `ErrorApiErrorContext` names. + +- ecd1fcb80a: Deprecated the `BackstagePluginWithAnyOutput` type. + +- 32bfbafb0f: Start exporting and marking several types as public to address errors in the API report. + +- 014cbf8cb9: The `createApp` function from `@backstage/core-app-api` has been deprecated, with two new options being provided as a replacement. + + The first and most commonly used one is `createApp` from the new `@backstage/app-defaults` package, which behaves just like the existing `createApp`. In the future this method is likely to be expanded to add more APIs and other pieces into the default setup, for example the Utility APIs from `@backstage/integration-react`. + + The other option that we now provide is to use `createSpecializedApp` from `@backstage/core-app-api`. This is a more low-level API where you need to provide a full set of options, including your own `components`, `icons`, `defaultApis`, and `themes`. The `createSpecializedApp` way of creating an app is particularly useful if you are not using `@backstage/core-components` or Material UI, as it allows you to avoid those dependencies completely. + +- 475edb5bc5: move the BehaviorSubject init into the constructor + +- Updated dependencies + - @backstage/core-components@0.7.4 + - @backstage/core-plugin-api@0.2.0 + - @backstage/app-defaults@0.1.1 + +## 0.1.20 + +### Patch Changes + +- 78c512ce8f: I have added default icons for the catalog, scaffolder, techdocs, and search. +- 8b4284cd5c: Improve API documentation for @backstage/core-plugin-api +- Updated dependencies + - @backstage/core-components@0.7.3 + - @backstage/theme@0.2.13 + - @backstage/core-plugin-api@0.1.13 + +## 0.1.19 + +### Patch Changes + +- 10615525f3: Switch to use the json and observable types from `@backstage/types` +- 41c49884d2: Start using the new `@backstage/types` package. Initially, this means using the `Observable` and `Json*` types from there. The types also remain in their old places but deprecated, and will be removed in a future release. +- 925a967f36: Replace usage of test-utils-core with test-utils +- 6b615e92c8: Api cleanup, adding `@public` where necessary and tweaking some comments +- Updated dependencies + - @backstage/config@0.1.11 + - @backstage/theme@0.2.12 + - @backstage/core-components@0.7.2 + - @backstage/core-plugin-api@0.1.12 + +## 0.1.18 + +### Patch Changes + +- 202f322927: Atlassian auth provider + + - AtlassianAuth added to core-app-api + - Atlassian provider added to plugin-auth-backend + - Updated user-settings with Atlassian connection + +- 36e67d2f24: Internal updates to apply more strict checks to throw errors. + +- Updated dependencies + - @backstage/core-components@0.7.1 + - @backstage/core-plugin-api@0.1.11 + +## 0.1.17 + +### Patch Changes + +- 75bc878221: Internal refactor to avoid importing all of `@material-ui/core`. +- Updated dependencies + - @backstage/core-components@0.7.0 + - @backstage/theme@0.2.11 + +## 0.1.16 + +### Patch Changes + +- d9fd798cc8: The Core App API now automatically instruments all route location changes using + the new Analytics API. Each location change triggers a `navigate` event, which + is an analogue of a "pageview" event in traditional web analytics systems. In + addition to the path, these events provide plugin-level metadata via the + analytics context, which can be useful for analyzing plugin usage: + + ```json + { + "action": "navigate", + "subject": "/the-path/navigated/to?with=params#and-hashes", + "context": { + "extension": "App", + "pluginId": "id-of-plugin-that-exported-the-route", + "routeRef": "associated-route-ref-id" + } + } + ``` + + These events can be identified and handled by checking for the action + `navigate` and the extension `App`. + +- 4c3eea7788: Bitbucket Cloud authentication - based on the existing GitHub authentication + changes around BB apis and updated scope. + + - BitbucketAuth added to core-app-api. + - Bitbucket provider added to plugin-auth-backend. + - Cosmetic entry for Bitbucket connection in user-settings Authentication Providers tab. + +- d6ad46eb22: Stop calling connector.removeSession in StaticAuthSessionManager, instead just discarding the + session locally. + +- Updated dependencies + - @backstage/core-components@0.6.1 + - @backstage/core-plugin-api@0.1.10 + +## 0.1.15 + +### Patch Changes + +- 0c4ee1876f: Enables late registration of plugins into the application by updating ApiHolder when additional plugins have been added in. +- Updated dependencies + - @backstage/core-plugin-api@0.1.9 + - @backstage/core-components@0.6.0 + +## 0.1.14 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.5.0 + - @backstage/config@0.1.10 + +## 0.1.13 + +### Patch Changes + +- 671015f132: Switch to using utilities from \`@backstage/version-bridge'. +- bd1981d609: Allow users to specify their own AppThemeProvider +- Updated dependencies + - @backstage/core-components@0.4.2 + - @backstage/core-plugin-api@0.1.8 + +## 0.1.12 + +### Patch Changes + +- 841666a19: Removed deprecated internal functions. +- Updated dependencies + - @backstage/core-components@0.4.1 + - @backstage/config@0.1.9 + - @backstage/core-plugin-api@0.1.7 + +## 0.1.11 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.4.0 + +## 0.1.10 + +### Patch Changes + +- cfcb486aa: Add system icons for the built-in entity types and use them in the entity list of the `catalog-import` plugin. + +- 392b36fa1: Added support for using authenticating via GitHub Apps in addition to GitHub OAuth Apps. It used to be possible to use GitHub Apps, but they did not handle session refresh correctly. + + Note that GitHub Apps handle OAuth scope at the app installation level, meaning that the `scope` parameter for `getAccessToken` has no effect. When calling `getAccessToken` in open source plugins, one should still include the appropriate scope, but also document in the plugin README what scopes are required in the case of GitHub Apps. + + In addition, the `authHandler` and `signInResolver` options have been implemented for the GitHub provider in the auth backend. + +- Updated dependencies + - @backstage/core-components@0.3.3 + - @backstage/config@0.1.8 + +## 0.1.9 + +### Patch Changes + +- 72a31c29a: Add support for additional app origins +- Updated dependencies + - @backstage/config@0.1.7 + - @backstage/core-components@0.3.2 + - @backstage/theme@0.2.10 + +## 0.1.8 + +### Patch Changes + +- 362657623: Add support for serving the app with a base path other than `/`, which is enabled by including the path in `app.baseUrl`. +- 56c773909: Switched `@types/react` dependency to request `*` rather than a specific version. +- Updated dependencies + - @backstage/core-components@0.3.1 + - @backstage/core-plugin-api@0.1.6 + +## 0.1.7 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.3.0 + - @backstage/config@0.1.6 + - @backstage/core-plugin-api@0.1.5 + +## 0.1.6 + +### Patch Changes + +- 9d40fcb1e: - Bumping `material-ui/core` version to at least `4.12.2` as they made some breaking changes in later versions which broke `Pagination` of the `Table`. + - Switching out `material-table` to `@material-table/core` for support for the later versions of `material-ui/core` + - This causes a minor API change to `@backstage/core-components` as the interface for `Table` re-exports the `prop` from the underlying `Table` components. + - `onChangeRowsPerPage` has been renamed to `onRowsPerPageChange` + - `onChangePage` has been renamed to `onPageChange` + - Migration guide is here: +- Updated dependencies + - @backstage/core-components@0.2.0 + - @backstage/core-plugin-api@0.1.4 + - @backstage/theme@0.2.9 + +## 0.1.5 + +### Patch Changes + +- ea249c6e6: Fix a bug in `FlatRoutes` that prevented outlets from working with the root route, as well as matching root routes too broadly. +- Updated dependencies + - @backstage/core-components@0.1.6 + +## 0.1.4 + +### Patch Changes + +- 62abffee4: Reintroduce export of `defaultConfigLoader`. +- Updated dependencies + - @backstage/core-components@0.1.4 + +## 0.1.3 + +### Patch Changes + +- dc3e7ce68: Introducing new UnhandledErrorForwarder installed by default. For catching unhandled promise rejections, you can override the API to align with general error handling. +- 5f4339b8c: Adding `FeatureFlag` component and treating `FeatureFlags` as first class citizens to composability API +- Updated dependencies + - @backstage/core-plugin-api@0.1.3 + +## 0.1.2 + +### Patch Changes + +- 9bca2a252: Fixes a type bug where supplying all app icons to `createApp` was required, rather than just a partial list. + +- 75b8537ce: This change adds automatic error boundaries around extensions. + + This means that all exposed parts of a plugin are wrapped in a general error boundary component, that is plugin aware. The default design for the error box is borrowed from `@backstage/errors`. To override the default "fallback", one must provide a component named `ErrorBoundaryFallback` to `createApp`, like so: + + ```ts + const app = createApp({ + components: { + ErrorBoundaryFallback: props => { + // a custom fallback component + return ( + <> +

    Oops.

    +

    + The plugin {props.plugin.getId()} failed with{' '} + {props.error.message} +

    + + + ); + }, + }, + }); + ``` + + The props here include: + + - `error`. An `Error` object or something that inherits it that represents the error that was thrown from any inner component. + - `resetError`. A callback that will simply attempt to mount the children of the error boundary again. + - `plugin`. A `BackstagePlugin` that can be used to look up info to be presented in the error message. For instance, you may want to keep a map of your internal plugins and team names or slack channels and present these when an error occurs. Typically, you'll do that by getting the plugin ID with `plugin.getId()`. + +- da8cba44f: Deprecate and disable the extension creation methods, which were added to this package by mistake and should only exist within `@backstage/core-plugin-api`. + +- 9bca2a252: Update `createApp` options to allow plugins with unknown output types in order to improve forwards and backwards compatibility. + +- Updated dependencies [e47336ea4] + +- Updated dependencies [75b8537ce] + +- Updated dependencies [da8cba44f] + - @backstage/core-components@0.1.2 + - @backstage/core-plugin-api@0.1.2 + +## 0.1.1 + +### Patch Changes + +- e7c5e4b30: Update installation instructions in README. +- Updated dependencies [031ccd45f] +- Updated dependencies [e7c5e4b30] + - @backstage/core-plugin-api@0.1.1 + - @backstage/core-components@0.1.1 + - @backstage/theme@0.2.8 + +## @backstage/core-plugin-api@1.12.3-next.0 + +# @backstage/core-plugin-api + +## 1.12.2-next.0 + +### Patch Changes + +- 53b6549: Plugins in the new frontend system now have a `pluginId` field rather than `id` to better align with naming conventions used throughout the frontend and backend systems. The old field is still present but marked as deprecated. All internal code has been updated to prefer `pluginId` while maintaining backward compatibility by falling back to `id` when needed. +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## 1.12.1 + +### Patch Changes + +- 358c6f7: The `useApp` and `useRouteRef` functions are now forwards compatible with the new frontend system. Along with the previous route reference changes this means that there is no longer a need to use `compatWrapper` from `@backstage/core-compat-api` to make code based on `@backstage/core-plugin-api` compatible with `@backstage/frontend-plugin-api` APIs. +- 97cd16f: Reversed the relationship between the old `@backstage/core-plugin-api` and the new `@backstage/frontend-plugin-api`. Previously, the a lot of API definitions and utilities where defined in the old and re-exported from the old, but this change flips that around so that they now reside in the new package and are re-exported from the old. The external API of both packages remain the same, but this is a step towards being able to add further compatibility with the new frontend system built into the old. +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2 + +## 1.12.1-next.0 + +### Patch Changes + +- 358c6f7: The `useApp` and `useRouteRef` functions are now forwards compatible with the new frontend system. Along with the previous route reference changes this means that there is no longer a need to use `compatWrapper` from `@backstage/core-compat-api` to make code based on `@backstage/core-plugin-api` compatible with `@backstage/frontend-plugin-api` APIs. +- 97cd16f: Reversed the relationship between the old `@backstage/core-plugin-api` and the new `@backstage/frontend-plugin-api`. Previously, the a lot of API definitions and utilities where defined in the old and re-exported from the old, but this change flips that around so that they now reside in the new package and are re-exported from the old. The external API of both packages remain the same, but this is a step towards being able to add further compatibility with the new frontend system built into the old. +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.2-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## 1.12.0 + +### Minor Changes + +- 83439b1: All route references are now forwards compatible with the new frontend system, i.e. `@backstage/frontend-plugin-api`. This means they no longer need to be converted with `convertLegacyRouteRef` or `convertLegacyRouteRefs` from `@backstage/core-compat-api`. + +### Patch Changes + +- b2bef92: Convert all enums to erasable-syntax compliant patterns +- 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/config@1.3.6 + +## 1.11.2-next.1 + +### Patch Changes + +- b2bef92: Convert all enums to erasable-syntax compliant patterns + +## 1.11.2-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/config@1.3.6-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## 1.11.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.5 + +## 1.11.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + +## 1.11.0 + +### Minor Changes + +- 5114627: Make `openshiftAuthApiRef` available in `@backstage/core-plugin-api`. + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.2 + +## 1.10.9 + +### Patch Changes + +- f6ffea6: Add optional message field for auth providers. This is intended to be a user friendly message that displays in the OAuth request dialog. A default message will be displayed if one is not provided. +- Updated dependencies + - @backstage/config@1.3.3 + +## 1.10.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.3-next.0 + +## 1.10.8 + +### Patch Changes + +- c83cd8b: Fixed some circular or otherwise unclear imports +- 0169b23: Internal tweak to avoid circular dependencies +- Updated dependencies + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + +## 1.10.7 + +### Patch Changes + +- 73f6cc3: The `TranslationApi` now supports interpolation of JSX elements by passing them directly as values to the translation function. If any of the provided interpolation values are JSX elements, the translation function will return a JSX element instead of a string. +- Updated dependencies + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + +## 1.10.7-next.0 + +### Patch Changes + +- 73f6cc3: The `TranslationApi` now supports interpolation of JSX elements by passing them directly as values to the translation function. If any of the provided interpolation values are JSX elements, the translation function will return a JSX element instead of a string. +- Updated dependencies + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + +## 1.10.6 + +### Patch Changes + +- a47fd39: Removes instances of default React imports, a necessary update for the upcoming React 19 migration. + + + +- Updated dependencies + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + +## 1.10.6-next.0 + +### Patch Changes + +- a47fd39: Removes instances of default React imports, a necessary update for the upcoming React 19 migration. + + + +- Updated dependencies + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + +## 1.10.5 + +### Patch Changes + +- 327d21e: Failure to lazy load an extension will now always result in an error being thrown to be forwarded to error boundaries, rather than being rendered using the `BootErrorPage` app component. +- Updated dependencies + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/version-bridge@1.0.11 + +## 1.10.4 + +### 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/version-bridge@1.0.11 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 1.10.4-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/version-bridge@1.0.11-next.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 1.10.3 + +### Patch Changes + +- b40eb41: Move `Expand` and `ExpandRecursive` to `@backstage/types` +- Updated dependencies + - @backstage/types@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/version-bridge@1.0.10 + +## 1.10.3-next.0 + +### Patch Changes + +- b40eb41: Move `Expand` and `ExpandRecursive` to `@backstage/types` +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/version-bridge@1.0.10 + +## 1.10.2 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## 1.10.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/version-bridge@1.0.10 + +## 1.10.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.0 + - @backstage/types@1.2.0 + - @backstage/errors@1.2.5 + - @backstage/version-bridge@1.0.10 + +## 1.10.0 + +### Minor Changes + +- bfd4bec: **BREAKING PRODUCERS**: The `IconComponent` no longer accepts `fontSize="default"`. This has effectively been removed from Material-UI since its last two major versions, and has not worked properly for them in a long time. + + This change should not have an effect on neither users of MUI4 nor MUI5/6, since the updated interface should still let you send the respective `SvgIcon` types into interfaces where relevant (e.g. as app icons). + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- 39001f4: Fixing issue with types for `ParamKeys` leading to type mismatches across versions +- Updated dependencies + - @backstage/version-bridge@1.0.10 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 1.10.0-next.1 + +### Patch Changes + +- e969dc7: Move `@types/react` to a peer dependency. +- Updated dependencies + - @backstage/version-bridge@1.0.10-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 1.10.0-next.0 + +### Minor Changes + +- bfd4bec: **BREAKING PRODUCERS**: The `IconComponent` no longer accepts `fontSize="default"`. This has effectively been removed from Material-UI since its last two major versions, and has not worked properly for them in a long time. + + This change should not have an effect on neither users of MUI4 nor MUI5/6, since the updated interface should still let you send the respective `SvgIcon` types into interfaces where relevant (e.g. as app icons). + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.9 + +## 1.9.4 + +### Patch Changes + +- 836127c: Updated dependency `@testing-library/react` to `^16.0.0`. +- Updated dependencies + - @backstage/version-bridge@1.0.9 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 1.9.4-next.0 + +### Patch Changes + +- 836127c: Updated dependency `@testing-library/react` to `^16.0.0`. +- Updated dependencies + - @backstage/version-bridge@1.0.9-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 1.9.3 + +### Patch Changes + +- 35fbe09: A new `defaultTarget` option has been added to `createExternalRouteRef`. This allows one to specify a default target of the route by name, for example `'catalog.catalogIndex'`, which will be used if the target route is present in the app and there is no explicit route binding. +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.8 + +## 1.9.3-next.0 + +### Patch Changes + +- 35fbe09: Added a new `defaultTarget` option to `createExternalRouteRef`. I lets you specify a default target of the route by name, for example `'catalog.catalogIndex'`, which will be used if the target route is present in the app and there is no explicit route binding. +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.8 + +## 1.9.2 + +### 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/version-bridge@1.0.8 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 1.9.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.9.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.2.0-next.1 + - @backstage/errors@1.2.4-next.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.9.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.4-next.0 + - @backstage/config@1.1.2-next.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.9.0 + +### Minor Changes + +- f919be9: Added a utility API for VMware Cloud auth; the API ref is available in the + `@backstage/core-plugin-api` and `@backstage/frontend-plugin-api` packages, the + implementation is in `@backstage/core-app-api` and a factory has been added to + `@backstage/app-defaults`. + +### Patch Changes + +- 8fe56a8: Widen `@types/react` dependency range to include version 18. +- e586f79: Throw a more specific exception `NotImplementedError` when an API implementation cannot be found. +- Updated dependencies + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.9.0-next.1 + +### Minor Changes + +- f919be9: Added a utility API for VMware Cloud auth; the API ref is available in the + `@backstage/core-plugin-api` and `@backstage/frontend-plugin-api` packages, the + implementation is in `@backstage/core-app-api` and a factory has been added to + `@backstage/app-defaults`. + +### Patch Changes + +- 8fe56a8: Widen `@types/react` dependency range to include version 18. +- Updated dependencies + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.8.3-next.0 + +### Patch Changes + +- e586f79: Throw a more specific exception `NotImplementedError` when an API implementation cannot be found. +- Updated dependencies + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.8.2 + +### Patch Changes + +- 6878b1d: Removed unnecessary `i18next` dependency. +- Updated dependencies + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.8.2-next.0 + +### Patch Changes + +- 6878b1d: Removed unnecessary `i18next` dependency. +- Updated dependencies + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.8.1 + +### Patch Changes + +- 03d0b6d: Removed the alpha `convertLegacyRouteRef` utility, which as been moved to `@backstage/core-compat-api` +- 0c93dc3: The `createTranslationRef` function from the `/alpha` subpath can now also accept a nested object structure of default translation messages, which will be flatted using `.` separators. +- Updated dependencies + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.8.1-next.1 + +### Patch Changes + +- 0c93dc37b2: The `createTranslationRef` function from the `/alpha` subpath can now also accept a nested object structure of default translation messages, which will be flatted using `.` separators. +- Updated dependencies + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.8.1-next.0 + +### Patch Changes + +- 03d0b6dcdc: Removed the alpha `convertLegacyRouteRef` utility, which as been moved to `@backstage/core-compat-api` +- Updated dependencies + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.7 + +## 1.8.0 + +### Minor Changes + +- 1e5b7d993a: `IconComponent` can now have a `fontSize` of `inherit`, which is useful for in-line icons. +- cb6db75bc2: Introduced `AnyRouteRefParams` as a replacement for `AnyParams`, which is now deprecated. + +### Patch Changes + +- 6c2b872153: Add official support for React 18. +- cb6db75bc2: Deprecated several types related to the routing system that are scheduled to be removed, as well as several fields on the route ref types themselves. +- 68fc9dc60e: Added a new `/alpha` export `convertLegacyRouteRef`, which is a temporary utility to allow existing route refs to be used with the new experimental packages. +- Updated dependencies + - @backstage/version-bridge@1.0.7 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + +## 1.8.0-next.0 + +### Minor Changes + +- 1e5b7d993a: `IconComponent` can now have a `fontSize` of `inherit`, which is useful for in-line icons. +- cb6db75bc2: Introduced `AnyRouteRefParams` as a replacement for `AnyParams`, which is now deprecated. + +### Patch Changes + +- 6c2b872153: Add official support for React 18. +- cb6db75bc2: Deprecated several types related to the routing system that are scheduled to be removed, as well as several fields on the route ref types themselves. +- 68fc9dc60e: Added a new `/alpha` export `convertLegacyRouteRef`, which is a temporary utility to allow existing route refs to be used with the new experimental packages. +- Updated dependencies + - @backstage/version-bridge@1.0.7-next.0 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + +## 1.7.0 + +### Minor Changes + +- 322bbcae24: Removed the exprimental plugin configuration API. The `__experimentalReconfigure()` from the plugin options as well as the `__experimentalConfigure()` method on plugin instances have both been removed. + +### Patch Changes + +- 0b55f773a7: Removed some unused dependencies +- 9a1fce352e: Updated dependency `@testing-library/jest-dom` to `^6.0.0`. +- f95af4e540: Updated dependency `@testing-library/dom` to `^9.0.0`. +- Updated dependencies + - @backstage/version-bridge@1.0.6 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + +## 1.7.0-next.1 + +### Patch Changes + +- 0b55f773a7: Removed some unused dependencies +- Updated dependencies + - @backstage/config@1.1.1-next.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## 1.7.0-next.0 + +### Minor Changes + +- 322bbcae24: Removed the exprimental plugin configuration API. The `__experimentalReconfigure()` from the plugin options as well as the `__experimentalConfigure()` method on plugin instances have both been removed. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## 1.6.0 + +### Minor Changes + +- 18619f793c94: Added the optional `expiresAt` field that may now be part of a `BackstageIdentityResponse`. +- 6e30769cc627: Introduced experimental support for internationalization. + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/types@1.1.1 + - @backstage/version-bridge@1.0.5 + +## 1.6.0-next.3 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0-next.2 + - @backstage/types@1.1.1-next.0 + - @backstage/version-bridge@1.0.5-next.0 + +## 1.6.0-next.2 + +### Minor Changes + +- 6e30769cc627: Introduced experimental support for internationalization. + +### Patch Changes + +- 8cec7664e146: Removed `@types/node` dependency +- Updated dependencies + - @backstage/config@1.1.0-next.1 + - @backstage/types@1.1.0 + - @backstage/version-bridge@1.0.4 + +## 1.6.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0-next.0 + - @backstage/types@1.1.0 + - @backstage/version-bridge@1.0.4 + +## 1.6.0-next.0 + +### Minor Changes + +- 18619f793c94: Added the optional `expiresAt` field that may now be part of a `BackstageIdentityResponse`. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/version-bridge@1.0.4 + +## 1.5.3 + +### Patch Changes + +- 8174cf4c0edf: Fixing MUI / Material UI references +- 13426ebd1235: Change `IconComponent` type to be compatible with Material UI v5 icons. +- Updated dependencies + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/version-bridge@1.0.4 + +## 1.5.3-next.1 + +### Patch Changes + +- 8174cf4c0edf: Fixing MUI / Material UI references +- Updated dependencies + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/version-bridge@1.0.4 + +## 1.5.3-next.0 + +### Patch Changes + +- 13426ebd1235: Change `IconComponent` type to be compatible with Material UI v5 icons. +- Updated dependencies + - @backstage/config@1.0.8 + +## 1.5.2 + +### Patch Changes + +- 12adfbc8fe2d: Fixed a bug that prevented accurate plugin and route data from being applied to `navigate` analytics events when users visited pages constructed with ``, ``, and similar components that are used to gather one or more routable extensions under a given path. +- 74b216ee4e50: Add `PropsWithChildren` to usages of `ComponentType`, in preparation for React 18 where the children are no longer implicit. +- Updated dependencies + - @backstage/types@1.1.0 + - @backstage/config@1.0.8 + - @backstage/version-bridge@1.0.4 + +## 1.5.2-next.0 + +### Patch Changes + +- 74b216ee4e50: Add `PropsWithChildren` to usages of `ComponentType`, in preparation for React 18 where the children are no longer implicit. +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4 + +## 1.5.1 + +### Patch Changes + +- 760f521b979: Add component name as data attribute for all components +- 2898b6c8d52: Minor type tweaks for TypeScript 5.0 +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/version-bridge@1.0.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## 1.5.1-next.1 + +### Patch Changes + +- 2898b6c8d52: Minor type tweaks for TypeScript 5.0 +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.4-next.0 + +## 1.5.1-next.0 + +### Patch Changes + +- e0c6e8b9c3c: Update peer dependencies +- Updated dependencies + - @backstage/version-bridge@1.0.4-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## 1.5.0 + +### Minor Changes + +- ab750ddc4f2: The GitLab auth provider can now be used to get OpenID tokens. + +### Patch Changes + +- 928a12a9b3e: Internal refactor of `/alpha` exports. +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.5.0-next.2 + +### Minor Changes + +- ab750ddc4f2: The GitLab auth provider can now be used to get OpenID tokens. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.7-next.0 + +## 1.4.1-next.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/config@1.0.7-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.4.1-next.0 + +### Patch Changes + +- 928a12a9b3: Internal refactor of `/alpha` exports. +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.4.0 + +### Minor Changes + +- db10b6ef65: Added a Bitbucket Server Auth Provider and added its API to the app defaults + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.3.0 + +### Minor Changes + +- bca8e8b393: Allow defining application level feature flags. See [Feature Flags documentation](https://backstage.io/docs/plugins/feature-flags#in-the-application) for reference. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.3.0-next.1 + +### Minor Changes + +- bca8e8b393: Allow defining application level feature flags. See [Feature Flags documentation](https://backstage.io/docs/plugins/feature-flags#in-the-application) for reference. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/types@1.0.2 + - @backstage/version-bridge@1.0.3 + +## 1.2.0 + +### Minor Changes + +- 9a1864976a: Added a new `display` property to the `AlertMessage` which can accept the values `permanent` or `transient`. + + Here's a rough example of how to trigger an alert using the new `display` property: + + ```ts + import { alertApiRef, useApi } from '@backstage/core-plugin-api'; + + const ExampleTransient = () => { + const alertApi = useApi(alertApiRef); + alertApi.post({ + message: 'Example of Transient Alert', + severity: 'success', + display: 'transient', + }); + }; + ``` + +### Patch Changes + +- d56127c712: useRouteRef - Limit re-resolving to location pathname changes only +- 3280711113: Updated dependency `msw` to `^0.49.0`. +- 19356df560: Updated dependency `zen-observable` to `^0.9.0`. +- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`. +- Updated dependencies + - @backstage/version-bridge@1.0.3 + - @backstage/types@1.0.2 + - @backstage/config@1.0.5 + +## 1.2.0-next.2 + +### Minor Changes + +- 9a1864976a: Added a new `display` property to the `AlertMessage` which can accept the values `permanent` or `transient`. + + Here's a rough example of how to trigger an alert using the new `display` property: + + ```ts + import { alertApiRef, useApi } from '@backstage/core-plugin-api'; + + const ExampleTransient = () => { + const alertApi = useApi(alertApiRef); + alertApi.post({ + message: 'Example of Transient Alert', + severity: 'success', + display: 'transient', + }); + }; + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.5-next.1 + - @backstage/types@1.0.2-next.1 + - @backstage/version-bridge@1.0.3-next.0 + +## 1.1.1-next.1 + +### Patch Changes + +- c3fa90e184: Updated dependency `zen-observable` to `^0.10.0`. +- Updated dependencies + - @backstage/version-bridge@1.0.3-next.0 + - @backstage/types@1.0.2-next.1 + - @backstage/config@1.0.5-next.1 + +## 1.1.1-next.0 + +### Patch Changes + +- 3280711113: Updated dependency `msw` to `^0.49.0`. +- 19356df560: Updated dependency `zen-observable` to `^0.9.0`. +- Updated dependencies + - @backstage/types@1.0.2-next.0 + - @backstage/config@1.0.5-next.0 + - @backstage/version-bridge@1.0.2 + +## 1.1.0 + +### Minor Changes + +- a228f113d0: The app `Router` component now accepts an optional `basename` property. + +### Patch Changes + +- Updated dependencies + - @backstage/version-bridge@1.0.2 + - @backstage/types@1.0.1 + - @backstage/config@1.0.4 + +## 1.1.0-next.0 + +### Minor Changes + +- a228f113d0: The app `Router` component now accepts an optional `basename` property. + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.0.1-next.0 + - @backstage/config@1.0.4-next.0 + - @backstage/version-bridge@1.0.1 + +## 1.0.7 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.3 + - @backstage/types@1.0.0 + - @backstage/version-bridge@1.0.1 + +## 1.0.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.3-next.2 + - @backstage/types@1.0.0 + - @backstage/version-bridge@1.0.1 + +## 1.0.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.3-next.1 + - @backstage/types@1.0.0 + - @backstage/version-bridge@1.0.1 + +## 1.0.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.3-next.0 + - @backstage/types@1.0.0 + - @backstage/version-bridge@1.0.1 + +## 1.0.6 + +### Patch Changes + +- 817f3196f6: Updated React Router dependencies to be peer dependencies. +- 7d47def9c4: Removed dependency on `@types/jest`. +- 744fea158b: Added `getSystemIcons()` function to the `AppContext` available through `useApp` that will pull a list of all the icons that have been registered in the App. +- 667d917488: Updated dependency `msw` to `^0.47.0`. +- 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`. +- bf5e9030eb: Updated dependency `msw` to `^0.45.0`. +- ef9ab322de: Minor API signatures cleanup +- Updated dependencies + - @backstage/config@1.0.2 + +## 1.0.6-next.3 + +### Patch Changes + +- 7d47def9c4: Removed dependency on `@types/jest`. +- Updated dependencies + - @backstage/config@1.0.2-next.0 + +## 1.0.6-next.2 + +### Patch Changes + +- 667d917488: Updated dependency `msw` to `^0.47.0`. +- 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`. + +## 1.0.6-next.1 + +### Patch Changes + +- 817f3196f6: Updated React Router dependencies to be peer dependencies. + +## 1.0.6-next.0 + +### Patch Changes + +- 744fea158b: Added `getSystemIcons()` function to the `AppContext` available through `useApp` that will pull a list of all the icons that have been registered in the App. +- bf5e9030eb: Updated dependency `msw` to `^0.45.0`. +- ef9ab322de: Minor API signatures cleanup + +## 1.0.5 + +### Patch Changes + +- 80da5162c7: Introduced a new experimental feature that allows you to declare plugin-wide options for your plugin by defining + `__experimentalConfigure` in your `createPlugin` options. See for more information. + + This is an experimental feature and it will have breaking changes in the future. + +- 87649a06bf: Add a note that the `fetchApi` utility should not be used on sign-in page implementations and similar. + +## 1.0.5-next.0 + +### Patch Changes + +- 80da5162c7: Introduced a new experimental feature that allows you to declare plugin-wide options for your plugin by defining + `__experimentalConfigure` in your `createPlugin` options. See for more information. + + This is an experimental feature and it will have breaking changes in the future. + +## 1.0.4 + +### Patch Changes + +- 881fc75a75: Internal tweak removing usage of explicit type parameters for the `BackstagePlugin` type. +- a70869e775: Updated dependency `msw` to `^0.43.0`. +- 8006d0f9bf: Updated dependency `msw` to `^0.44.0`. +- 2990fff4e5: Enabled the `@backstage/core-plugin-api/alpha` entry point. + +## 1.0.4-next.0 + +### Patch Changes + +- 881fc75a75: Internal tweak removing usage of explicit type parameters for the `BackstagePlugin` type. +- a70869e775: Updated dependency `msw` to `^0.43.0`. +- 2990fff4e5: Enabled the `@backstage/core-plugin-api/alpha` entry point. + +## 1.0.3 + +### Patch Changes + +- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. + +## 1.0.3-next.0 + +### Patch Changes + +- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. + +## 1.0.2 + +### Patch Changes + +- b653a5595c: The authentication APIs are no longer `@alpha`. Since the `@backstage/core-plugin-api` has no `/alpha` entrypoint, the only effect of marking the APIs as `@alpha` was to hide them in documentation. They are still expected to be widely used and there will be a migration path if they are changed in the future. +- Updated dependencies + - @backstage/config@1.0.1 + +## 1.0.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.1-next.0 + +## 1.0.2-next.0 + +### Patch Changes + +- b653a5595c: The authentication APIs are no longer `@alpha`. Since the `@backstage/core-plugin-api` has no `/alpha` entrypoint, the only effect of marking the APIs as `@alpha` was to hide them in documentation. They are still expected to be widely used and there will be a migration path if they are changed in the future. + +## 1.0.1 + +### Patch Changes + +- 7c7919777e: build(deps-dev): bump `@testing-library/react-hooks` from 7.0.2 to 8.0.0 +- 24254fd433: build(deps): bump `@testing-library/user-event` from 13.5.0 to 14.0.0 +- 230ad0826f: Bump to using `@types/node` v16 +- Updated dependencies + - @backstage/version-bridge@1.0.1 + +## 1.0.1-next.0 + +### Patch Changes + +- 24254fd433: build(deps): bump `@testing-library/user-event` from 13.5.0 to 14.0.0 +- 230ad0826f: Bump to using `@types/node` v16 + +## 1.0.0 + +### Major Changes + +- b58c70c223: This package has been promoted to v1.0! To understand how this change affects the package, please check out our [versioning policy](https://backstage.io/docs/overview/versioning-policy). + +### Patch Changes + +- a422d7ce5e: chore(deps): bump `@testing-library/react` from 11.2.6 to 12.1.3 +- f24ef7864e: Minor typo fixes +- Updated dependencies + - @backstage/version-bridge@1.0.0 + - @backstage/config@1.0.0 + - @backstage/types@1.0.0 + +## 0.8.0 + +### Minor Changes + +- bb2bb36651: **BREAKING**: Removed the deprecated `get` method from `StorageAPI` and its implementations, this method has been replaced by the `snapshot` method. The return value from snapshot no longer includes `newValue` which has been replaced by `value`. For getting notified when a value changes, use \`observe# @backstage/core-plugin-api. +- af5eaa87f4: **BREAKING**: Removed deprecated `auth0AuthApiRef`, `oauth2ApiRef`, `samlAuthApiRef` and `oidcAuthApiRef` as these APIs are too generic to be useful. Instructions for how to migrate can be found at . +- a480f670c7: **BREAKING**: OAuth provider id is now required when passing a provider to `createAuthRequester`. + +## 0.7.0 + +### Minor Changes + +- 33cd215b11: **BREAKING**: Removed deprecated `AnyAnalyticsContext` type which is replaced by `AnalyticsContextValue` + +## 0.6.1 + +### 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` +- 2714145cf5: Removes unused react-use dependency. +- Updated dependencies + - @backstage/config@0.1.14 + - @backstage/types@0.1.2 + - @backstage/version-bridge@0.1.2 + +## 0.6.0 + +### Minor Changes + +- ceebe25391: Removed deprecated `IdentityApi` methods: `getUserId`, `getIdToken`, and `getProfile`. + + Existing usage of `getUserId` can be replaced by `getBackstageIdentity`, more precisely the equivalent of the previous `userId` can be retrieved like this: + + ```ts + import { parseEntityRef } from '@backstage/catalog-model'; + + const identity = await identityApi.getBackstageIdentity(); + const { name: userId } = parseEntityRef(identity.userEntityRef); + ``` + + Note that it is recommended to consume the entire `userEntityRef` rather than parsing out just the name, in order to support namespaces. + + Existing usage of `getIdToken` can be replaced by `getCredentials`, like this: + + ```ts + const { token } = await identityApi.getCredentials(); + ``` + + And existing usage of `getProfile` is replaced by `getProfileInfo`, which returns the same profile object, but is now async. + +- ceebe25391: Removed deprecated `SignInResult` type, which was replaced with the new `onSignInSuccess` callback. + +- d879072b0c: Removed the deprecated `id` field of `BackstageIdentityResponse`. + + Existing usage can be replaced by parsing the `name` of the `identity.userEntityRef` with `parseEntityRef` from `@backstage/catalog-model`, although note that it is recommended to consume the entire `userEntityRef` in order to support namespaces. + +- 94c02b4246: Removed deprecated `BackstageIdentity` type, which was replaced by `BackstageIdentityResponse`. + +- 234a36405b: Removed deprecated `OAuthRequestApi` types: `AuthProvider`, `AuthRequesterOptions`, `AuthRequester`, and `PendingAuthRequest`. + +### Patch Changes + +- Updated dependencies + - @backstage/config@0.1.13 + +## 0.6.0-next.0 + +### Minor Changes + +- ceebe25391: Removed deprecated `IdentityApi` methods: `getUserId`, `getIdToken`, and `getProfile`. + + Existing usage of `getUserId` can be replaced by `getBackstageIdentity`, more precisely the equivalent of the previous `userId` can be retrieved like this: + + ```ts + import { parseEntityRef } from '@backstage/catalog-model'; + + const identity = await identityApi.getBackstageIdentity(); + const { name: userId } = parseEntityRef(identity.userEntityRef); + ``` + + Note that it is recommended to consume the entire `userEntityRef` rather than parsing out just the name, in order to support namespaces. + + Existing usage of `getIdToken` can be replaced by `getCredentials`, like this: + + ```ts + const { token } = await identityApi.getCredentials(); + ``` + + And existing usage of `getProfile` is replaced by `getProfileInfo`, which returns the same profile object, but is now async. + +- ceebe25391: Removed deprecated `SignInResult` type, which was replaced with the new `onSignInSuccess` callback. + +- d879072b0c: Removed the deprecated `id` field of `BackstageIdentityResponse`. + + Existing usage can be replaced by parsing the `name` of the `identity.userEntityRef` with `parseEntityRef` from `@backstage/catalog-model`, although note that it is recommended to consume the entire `userEntityRef` in order to support namespaces. + +- 94c02b4246: Removed deprecated `BackstageIdentity` type, which was replaced by `BackstageIdentityResponse`. + +- 234a36405b: Removed deprecated `OAuthRequestApi` types: `AuthProvider`, `AuthRequesterOptions`, `AuthRequester`, and `PendingAuthRequest`. + +### Patch Changes + +- Updated dependencies + - @backstage/config@0.1.13-next.0 + +## 0.5.0 + +### Minor Changes + +- 784d8078ab: Removed the deprecated `OldIconComponent` type. +- e2eb92c109: Removed previously deprecated exports: `PluginHooks`, `PluginOutput`, and `FeatureFlagOutput`. + + The deprecated `register` method of `PluginConfig` has been removed, as well as the deprecated `output` method of `BackstagePlugin`. + +### Patch Changes + +- 784d8078ab: Removed direct and transitive Material UI dependencies. +- Updated dependencies + - @backstage/config@0.1.12 + +## 0.4.1 + +### Patch Changes + +- c534ef2242: Deprecated `OldIconComponent`. Existing usage should be replaced with `IconComponent`. + +## 0.4.0 + +### Minor Changes + +- a195284c7b: **BREAKING CHANGE** The `StorageApi` has received several updates that fills in gaps for some use-cases and makes it easier to avoid mistakes: + + - The `StorageValueChange` type has been renamed to `StorageValueSnapshot`, the `newValue` property has been renamed to `value`, the stored value type has been narrowed to `JsonValue`, and it has received a new `presence` property that is `'unknown'`, `'absent'`, or `'present'`. + - The `get` method has been deprecated in favor of a new `snapshot` method, which returns a `StorageValueSnapshot`. + - The `observe# @backstage/core-plugin-api method has had its contract changed. It should now emit values when the`presence`of a key changes, this may for example happen when remotely stored values are requested on page load and the presence switches from`'unknown'`to either`'absent'`or`'present'\`. + + The above changes have been made with deprecations in place to maintain much of the backwards compatibility for consumers of the `StorageApi`. The only breaking change is the narrowing of the stored value type, which may in some cases require the addition of an explicit type parameter to the `get` and \`observe# @backstage/core-plugin-api methods. + +- f6722d2458: - Removed deprecated option `description` from `ApiRefConfig` + + - Removed descriptions from all plugin API refs + - Removed deprecated parameters `path`, `icon`, and `title` in `createRouteRef` + - Removed deprecated types `Error` and `ErrorContext` from `ErrorApi` + +- 68f8b10ccd: - Removed deprecation configuration option `theme` from `AppTheme` of the `AppThemeApi` + + - Removed reference to `theme` in the `app-defaults` default `AppTheme` + - Removed logic in `AppThemeProvider` that creates `ThemeProvider` from `appTheme.theme` + +- 6b69b44862: Removed deprecated types `ApiRefType` and `ApiRefsToTypes` + +### Patch Changes + +- 7927005152: Add `FetchApi` and related `fetchApiRef` which implement fetch, with an added Backstage token header when available. + +## 0.3.1 + +### Patch Changes + +- 18d4f500af: Deprecated the `AnyAnalyticsContext` type and mark the `AnalyticsApi` experimental. +- 8a7372cfd5: Deprecated `auth0AuthApiRef`, `oauth2ApiRef`, `oidcAuthApiRef`, `samlAuthApiRef`, and marked the rest of the auth `ApiRef`s as experimental. For more information on how to address the deprecations, see . +- 760791a642: Renamed `AuthProvider` to `AuthProviderInfo` and add a required 'id' property to match the majority of usage. The `AuthProvider` type without the `id` property still exists but is deprecated, and all usage of it without an `id` is deprecated as well. For example, calling `createAuthRequest` without a `provider.id` is deprecated and it will be required in the future. + + The following types have been renamed. The old names are still exported but deprecated, and are scheduled for removal in a future release. + + - Renamed `AuthRequesterOptions` to `OAuthRequesterOptions` + - Renamed `AuthRequester` to `OAuthRequester` + - Renamed `PendingAuthRequest` to `PendingOAuthRequest` + +## 0.3.0 + +### Minor Changes + +- a036b65c2f: The `IdentityApi` has received several updates. The `getUserId`, `getProfile`, and `getIdToken` have all been deprecated. + + The replacement for `getUserId` is the new `getBackstageIdentity` method, which provides both the `userEntityRef` as well as the `ownershipEntityRefs` that are used to resolve ownership. Existing usage of the user ID would typically be using a fixed entity kind and namespace, for example `` `user:default/${identityApi.getUserId()}` ``, this kind of usage should now instead use the `userEntityRef` directly. + + The replacement for `getProfile` is the new async `getProfileInfo`. + + The replacement for `getIdToken` is the new `getCredentials` method, which provides an optional token to the caller like before, but it is now wrapped in an object for forwards compatibility. + + The deprecated `idToken` field of the `BackstageIdentity` type has been removed, leaving only the new `token` field, which should be used instead. The `BackstageIdentity` also received a new `identity` field, which is a decoded version of the information within the token. Furthermore the `BackstageIdentity` has been renamed to `BackstageIdentityResponse`, with the old name being deprecated. + + We expect most of the breaking changes in this update to have low impact since the `IdentityApi` implementation is provided by the app, but it is likely that some tests need to be updated. + + Another breaking change is that the `SignInPage` props have been updated, and the `SignInResult` type is now deprecated. This is unlikely to have any impact on the usage of this package, but it is an important change that you can find more information about in the [`@backstage/core-app-api` CHANGELOG.md](https://github.com/backstage/backstage/blob/master/packages/core-app-api/CHANGELOG.md). + +### Patch Changes + +- cd450844f6: Moved React dependencies to `peerDependencies` and allow both React v16 and v17 to be used. +- dcd1a0c3f4: Minor improvement to the API reports, by not unpacking arguments directly +- Updated dependencies + - @backstage/version-bridge@0.1.1 + +## 0.2.2 + +### Patch Changes + +- b291d0ed7e: Tweaked the logged deprecation warning for `createRouteRef` to hopefully make it more clear. +- bacb94ea8f: Documented the options of each of the extension creation functions. +- Updated dependencies + - @backstage/theme@0.2.14 + +## 0.2.1 + +### Patch Changes + +- 950b36393c: Deprecated `register` option of `createPlugin` and the `outputs` methods of the plugin instance. + + Introduces the `featureFlags` property to define your feature flags instead. + +## 0.2.0 + +### Minor Changes + +- 7e18ed7f29: Removed the unused `UserFlags` type. +- 7df99cdb77: Remove exports of unused types(`RouteOptions` and `RoutePath`). + +### Patch Changes + +- 37ebea2d68: Add deprecation warnings around `title` `icon` and `path` as they are no longer controlled when creating `routeRefs` +- 2dd2a7b2cc: Deprecated the `theme` property on `AppTheme`, replacing it with `Provider`. See for more details. +- b6a4bacdc4: Deprecated the `Error` and `ErrorContext` types, replacing them with identical `ErrorApiError` and `ErrorApiErrorContext` types. + +## 0.1.13 + +### Patch Changes + +- 4a336fd292: Deprecate use of extensions without name. Adds a warning to the developer console to prompt integrators to provide names for extensions. +- 8b4284cd5c: Improve API documentation for @backstage/core-plugin-api +- e059aea7b9: Deprecate unused ApiRef types +- Updated dependencies + - @backstage/theme@0.2.13 + +## 0.1.12 + +### Patch Changes + +- 41c49884d2: Start using the new `@backstage/types` package. Initially, this means using the `Observable` and `Json*` types from there. The types also remain in their old places but deprecated, and will be removed in a future release. +- 925a967f36: Replace usage of test-utils-core with test-utils +- Updated dependencies + - @backstage/config@0.1.11 + - @backstage/theme@0.2.12 + +## 0.1.11 + +### Patch Changes + +- 202f322927: Atlassian auth provider + + - AtlassianAuth added to core-app-api + - Atlassian provider added to plugin-auth-backend + - Updated user-settings with Atlassian connection + +- 36e67d2f24: Internal updates to apply more strict checks to throw errors. + +## 0.1.10 + +### Patch Changes + +- 829bc698f4: Introducing the Analytics API: a lightweight way for plugins to instrument key + events that could help inform a Backstage Integrator how their instance of + Backstage is being used. The API consists of the following: + + - `useAnalytics()`, a hook to be used inside plugin components which retrieves + an Analytics Tracker. + - `tracker.captureEvent()`, a method on the tracker used to instrument key + events. The method expects an action (the event name) and a subject (a unique + identifier of the object the action is being taken on). + - ``, a way to declaratively attach additional information + to any/all events captured in the underlying React tree. There is also a + `withAnalyticsContext()` HOC utility. + - The `tracker.captureEvent()` method also accepts an `attributes` option for + providing additional run-time information about an event, as well as a + `value` option for capturing a numeric/metric value. + + By default, captured events are not sent anywhere. In order to collect and + redirect events to an analytics system, the `analyticsApi` will need to be + implemented and instantiated by an App Integrator. + +- 4c3eea7788: Bitbucket Cloud authentication - based on the existing GitHub authentication + changes around BB apis and updated scope. + + - BitbucketAuth added to core-app-api. + - Bitbucket provider added to plugin-auth-backend. + - Cosmetic entry for Bitbucket connection in user-settings Authentication Providers tab. + +## 0.1.9 + +### Patch Changes + +- 98bd661240: Improve compatibility between different versions by defining the route reference type using a string key rather than a unique symbol. This change only applies to type checking and has no effect on the runtime value, where we still use the symbol. + +## 0.1.8 + +### Patch Changes + +- 671015f132: Switch to using utilities from \`@backstage/version-bridge'. + +## 0.1.7 + +### Patch Changes + +- 3d238b028: Migrated component data attachment method to have better compatibility with component proxies such as `react-hot-loader`. +- Updated dependencies + - @backstage/config@0.1.9 + +## 0.1.6 + +### Patch Changes + +- 56c773909: Switched `@types/react` dependency to request `*` rather than a specific version. + +## 0.1.5 + +### Patch Changes + +- c4d8ff963: Switched frontend identity code to use `token` instead of the deprecated `idToken` field +- Updated dependencies + - @backstage/config@0.1.6 + +## 0.1.4 + +### Patch Changes + +- 9d40fcb1e: - Bumping `material-ui/core` version to at least `4.12.2` as they made some breaking changes in later versions which broke `Pagination` of the `Table`. + - Switching out `material-table` to `@material-table/core` for support for the later versions of `material-ui/core` + - This causes a minor API change to `@backstage/core-components` as the interface for `Table` re-exports the `prop` from the underlying `Table` components. + - `onChangeRowsPerPage` has been renamed to `onRowsPerPageChange` + - `onChangePage` has been renamed to `onPageChange` + - Migration guide is here: +- Updated dependencies + - @backstage/theme@0.2.9 + +## 0.1.3 + +### Patch Changes + +- 5f4339b8c: Adding `FeatureFlag` component and treating `FeatureFlags` as first class citizens to composability API + +## 0.1.2 + +### Patch Changes + +- 75b8537ce: This change adds automatic error boundaries around extensions. + + This means that all exposed parts of a plugin are wrapped in a general error boundary component, that is plugin aware. The default design for the error box is borrowed from `@backstage/errors`. To override the default "fallback", one must provide a component named `ErrorBoundaryFallback` to `createApp`, like so: + + ```ts + const app = createApp({ + components: { + ErrorBoundaryFallback: props => { + // a custom fallback component + return ( + <> +

    Oops.

    +

    + The plugin {props.plugin.getId()} failed with{' '} + {props.error.message} +

    + + + ); + }, + }, + }); + ``` + + The props here include: + + - `error`. An `Error` object or something that inherits it that represents the error that was thrown from any inner component. + - `resetError`. A callback that will simply attempt to mount the children of the error boundary again. + - `plugin`. A `BackstagePlugin` that can be used to look up info to be presented in the error message. For instance, you may want to keep a map of your internal plugins and team names or slack channels and present these when an error occurs. Typically, you'll do that by getting the plugin ID with `plugin.getId()`. + +- da8cba44f: Apply fixes to the extension creation API that were mistakenly applied to `@backstage/core-app-api` instead. + +## 0.1.1 + +### Patch Changes + +- 031ccd45f: Made the deprecated `icon` fields compatible with the `IconComponent` type from `@backstage/core` in order to smooth out the migration. +- e7c5e4b30: Update installation instructions in README. +- Updated dependencies [e7c5e4b30] + - @backstage/theme@0.2.8 + +## @backstage/plugin-search-backend@2.0.12-next.0 + +# @backstage/plugin-search-backend + +## 2.0.11-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.6-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-search-backend-node@1.4.1-next.0 + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/plugin-search-common@1.2.22-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/plugin-permission-node@0.10.9-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## 2.0.10 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/backend-plugin-api@1.6.1 + - @backstage/backend-openapi-utils@0.6.5 + - @backstage/plugin-permission-common@0.9.4 + - @backstage/plugin-permission-node@0.10.8 + +## 2.0.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + - @backstage/plugin-permission-node@0.10.7 + - @backstage/plugin-search-backend-node@1.4.0 + +## 2.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.5-next.0 + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-permission-node@0.10.7 + - @backstage/plugin-search-backend-node@1.4.0 + - @backstage/plugin-search-common@1.2.21 + +## 2.0.9 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-search-backend-node@1.4.0 + - @backstage/backend-defaults@0.14.0 + - @backstage/backend-openapi-utils@0.6.4 + - @backstage/plugin-permission-node@0.10.7 + - @backstage/backend-plugin-api@1.6.0 + +## 2.0.9-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/backend-openapi-utils@0.6.4-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-search-backend-node@1.4.0-next.1 + - @backstage/plugin-search-common@1.2.21 + +## 2.0.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-node@1.4.0-next.0 + - @backstage/backend-defaults@0.14.0-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + - @backstage/plugin-permission-node@0.10.7-next.0 + - @backstage/backend-openapi-utils@0.6.4-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-search-common@1.2.21 + +## 2.0.8 + +### Patch Changes + +- b2bef92: Convert all enums to erasable-syntax compliant patterns +- 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/backend-defaults@0.13.1 + - @backstage/backend-plugin-api@1.5.0 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-search-backend-node@1.3.17 + - @backstage/config@1.3.6 + - @backstage/backend-openapi-utils@0.6.3 + - @backstage/plugin-permission-node@0.10.6 + - @backstage/plugin-search-common@1.2.21 + +## 2.0.8-next.1 + +### Patch Changes + +- b2bef92: Convert all enums to erasable-syntax compliant patterns +- Updated dependencies + - @backstage/backend-defaults@0.13.1-next.1 + - @backstage/backend-plugin-api@1.5.0-next.1 + - @backstage/plugin-permission-common@0.9.3-next.1 + - @backstage/backend-openapi-utils@0.6.3-next.1 + - @backstage/plugin-permission-node@0.10.6-next.1 + - @backstage/plugin-search-backend-node@1.3.17-next.1 + +## 2.0.8-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/backend-defaults@0.13.1-next.0 + - @backstage/plugin-search-backend-node@1.3.17-next.0 + - @backstage/config@1.3.6-next.0 + - @backstage/plugin-permission-node@0.10.6-next.0 + - @backstage/backend-openapi-utils@0.6.3-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.3-next.0 + - @backstage/plugin-search-common@1.2.21-next.0 + +## 2.0.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0 + - @backstage/config@1.3.5 + - @backstage/backend-openapi-utils@0.6.2 + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-permission-common@0.9.2 + - @backstage/plugin-permission-node@0.10.5 + - @backstage/plugin-search-backend-node@1.3.16 + - @backstage/plugin-search-common@1.2.20 + +## 2.0.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + - @backstage/plugin-search-backend-node@1.3.16-next.0 + - @backstage/backend-openapi-utils@0.6.2-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + +## 2.0.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/plugin-permission-node@0.10.4 + - @backstage/plugin-search-backend-node@1.3.15 + - @backstage/backend-openapi-utils@0.6.1 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-common@0.9.1 + - @backstage/plugin-search-common@1.2.19 + +## 2.0.6 + +### Patch Changes + +- 0efcc97: Updated generated schemas +- Updated dependencies + - @backstage/backend-defaults@0.12.1 + - @backstage/types@1.2.2 + - @backstage/backend-openapi-utils@0.6.1 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/plugin-permission-node@0.10.4 + - @backstage/plugin-search-backend-node@1.3.15 + +## 2.0.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.12.1-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + - @backstage/plugin-permission-node@0.10.4-next.0 + - @backstage/plugin-search-backend-node@1.3.15-next.0 + - @backstage/backend-openapi-utils@0.6.1-next.0 + +## 2.0.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.6.0 + - @backstage/backend-defaults@0.12.0 + - @backstage/plugin-permission-node@0.10.3 + - @backstage/plugin-search-backend-node@1.3.14 + - @backstage/backend-plugin-api@1.4.2 + +## 2.0.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.11.2-next.0 + - @backstage/backend-openapi-utils@0.6.0-next.0 + - @backstage/plugin-permission-node@0.10.3-next.0 + - @backstage/plugin-search-backend-node@1.3.14-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.9.1 + - @backstage/plugin-search-common@1.2.19 + +## 2.0.4 + +### Patch Changes + +- 69fb975: Error messages should not contain backend SQL query strings in the API response, this change will ensure that messages are logged and empty response is returned to the user +- Updated dependencies + - @backstage/config@1.3.3 + - @backstage/plugin-permission-common@0.9.1 + - @backstage/plugin-permission-node@0.10.2 + - @backstage/backend-defaults@0.11.1 + - @backstage/backend-openapi-utils@0.5.5 + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-search-backend-node@1.3.13 + - @backstage/plugin-search-common@1.2.19 + +## 2.0.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.3-next.0 + - @backstage/plugin-permission-common@0.9.1-next.0 + - @backstage/plugin-permission-node@0.10.2-next.0 + - @backstage/backend-defaults@0.11.1-next.1 + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-search-backend-node@1.3.13-next.0 + - @backstage/plugin-search-common@1.2.19-next.0 + - @backstage/backend-openapi-utils@0.5.5-next.0 + +## 2.0.4-next.0 + +### Patch Changes + +- 69fb975: Error messages should not contain backend SQL query strings in the API response, this change will ensure that messages are logged and empty response is returned to the user +- Updated dependencies + - @backstage/backend-defaults@0.11.1-next.0 + - @backstage/plugin-permission-node@0.10.1 + - @backstage/plugin-search-backend-node@1.3.12 + - @backstage/backend-plugin-api@1.4.0 + - @backstage/backend-openapi-utils@0.5.4 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.9.0 + - @backstage/plugin-search-common@1.2.18 + +## 2.0.3 + +### Patch Changes + +- c83cd8b: Fixed some circular or otherwise unclear imports +- Updated dependencies + - @backstage/backend-defaults@0.11.0 + - @backstage/backend-plugin-api@1.4.0 + - @backstage/backend-openapi-utils@0.5.4 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.9.0 + - @backstage/plugin-permission-node@0.10.1 + - @backstage/plugin-search-backend-node@1.3.12 + - @backstage/plugin-search-common@1.2.18 + +## 2.0.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.11.0-next.2 + - @backstage/backend-openapi-utils@0.5.4-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.9.0 + - @backstage/plugin-permission-node@0.10.1-next.1 + - @backstage/plugin-search-backend-node@1.3.12-next.1 + - @backstage/plugin-search-common@1.2.18 + +## 2.0.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.10.1-next.1 + - @backstage/backend-openapi-utils@0.5.4-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.9.0 + - @backstage/plugin-permission-node@0.10.1-next.1 + - @backstage/plugin-search-backend-node@1.3.12-next.1 + - @backstage/plugin-search-common@1.2.18 + +## 2.0.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + - @backstage/backend-defaults@0.10.1-next.0 + - @backstage/plugin-permission-node@0.10.1-next.0 + - @backstage/plugin-search-backend-node@1.3.12-next.0 + - @backstage/backend-openapi-utils@0.5.4-next.0 + +## 2.0.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.10.0 + - @backstage/backend-plugin-api@1.3.1 + - @backstage/plugin-permission-common@0.9.0 + - @backstage/plugin-permission-node@0.10.0 + - @backstage/backend-openapi-utils@0.5.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-search-backend-node@1.3.11 + - @backstage/plugin-search-common@1.2.18 + +## 2.0.2-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.10.0-next.3 + - @backstage/backend-openapi-utils@0.5.3-next.2 + - @backstage/backend-plugin-api@1.3.1-next.2 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.9.0-next.0 + - @backstage/plugin-permission-node@0.10.0-next.2 + - @backstage/plugin-search-backend-node@1.3.11-next.2 + - @backstage/plugin-search-common@1.2.18-next.0 + +## 2.0.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.10.0-next.2 + - @backstage/backend-openapi-utils@0.5.3-next.1 + - @backstage/config@1.3.2 + - @backstage/plugin-permission-node@0.10.0-next.1 + - @backstage/plugin-search-backend-node@1.3.11-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.9.0-next.0 + - @backstage/plugin-search-common@1.2.18-next.0 + +## 2.0.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.10.0-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + - @backstage/plugin-permission-common@0.9.0-next.0 + - @backstage/plugin-permission-node@0.10.0-next.1 + - @backstage/plugin-search-backend-node@1.3.11-next.1 + - @backstage/backend-openapi-utils@0.5.3-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-search-common@1.2.18-next.0 + +## 2.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.1-next.0 + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/plugin-permission-node@0.9.2-next.0 + - @backstage/plugin-search-backend-node@1.3.11-next.0 + - @backstage/backend-openapi-utils@0.5.3-next.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-common@1.2.17 + +## 2.0.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0 + - @backstage/backend-plugin-api@1.3.0 + - @backstage/plugin-permission-node@0.9.1 + - @backstage/plugin-search-backend-node@1.3.10 + - @backstage/backend-openapi-utils@0.5.2 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-common@1.2.17 + +## 2.0.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.2 + - @backstage/backend-openapi-utils@0.5.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/plugin-search-common@1.2.17 + +## 2.0.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.1 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/backend-openapi-utils@0.5.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-common@1.2.17 + +## 2.0.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.9.0-next.0 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/backend-openapi-utils@0.5.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-common@1.2.17 + +## 2.0.0 + +### Major Changes + +- d5c4a9d: **BREAKING** Removed support for the legacy backend system and references to `@backstage/backend-common`, please migrate to the new backend system. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.8.2 + - @backstage/plugin-permission-node@0.9.0 + - @backstage/backend-openapi-utils@0.5.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-backend-node@1.3.9 + - @backstage/plugin-search-common@1.2.17 + +## 1.8.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.8.2-next.2 + - @backstage/backend-openapi-utils@0.5.1-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-permission-node@0.8.9-next.1 + - @backstage/plugin-search-backend-node@1.3.9-next.1 + - @backstage/plugin-search-common@1.2.17 + +## 1.8.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.8.2-next.1 + - @backstage/backend-openapi-utils@0.5.1-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-permission-node@0.8.9-next.1 + - @backstage/plugin-search-backend-node@1.3.9-next.1 + - @backstage/plugin-search-common@1.2.17 + +## 1.8.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.8.2-next.0 + - @backstage/plugin-permission-node@0.8.9-next.0 + - @backstage/plugin-search-backend-node@1.3.9-next.0 + - @backstage/backend-plugin-api@1.2.1-next.0 + - @backstage/backend-openapi-utils@0.5.1-next.0 + +## 1.8.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.8.8 + - @backstage/backend-defaults@0.8.0 + - @backstage/backend-plugin-api@1.2.0 + - @backstage/plugin-search-backend-node@1.3.8 + - @backstage/backend-openapi-utils@0.5.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-common@1.2.17 + +## 1.8.2-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.8.8-next.2 + - @backstage/backend-defaults@0.8.0-next.3 + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/plugin-search-backend-node@1.3.8-next.2 + - @backstage/backend-openapi-utils@0.5.0-next.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-common@1.2.17 + +## 1.8.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/plugin-search-backend-node@1.3.8-next.1 + - @backstage/backend-defaults@0.8.0-next.2 + - @backstage/backend-openapi-utils@0.5.0-next.2 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-permission-node@0.8.8-next.1 + - @backstage/plugin-search-common@1.2.17 + +## 1.8.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.5.0-next.1 + - @backstage/backend-defaults@0.8.0-next.1 + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-permission-node@0.8.8-next.0 + - @backstage/plugin-search-backend-node@1.3.8-next.0 + - @backstage/plugin-search-common@1.2.17 + +## 1.8.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.8.8-next.0 + - @backstage/backend-defaults@0.8.0-next.0 + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/backend-openapi-utils@0.4.2-next.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-backend-node@1.3.8-next.0 + - @backstage/plugin-search-common@1.2.17 + +## 1.8.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0 + - @backstage/types@1.2.1 + - @backstage/plugin-permission-node@0.8.7 + - @backstage/backend-openapi-utils@0.4.1 + - @backstage/backend-plugin-api@1.1.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-search-backend-node@1.3.7 + - @backstage/plugin-search-common@1.2.17 + +## 1.8.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-defaults@0.7.0-next.1 + - @backstage/backend-openapi-utils@0.4.1-next.1 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + - @backstage/plugin-search-backend-node@1.3.7-next.1 + +## 1.8.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.7.0-next.0 + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/backend-openapi-utils@0.4.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-backend-node@1.3.7-next.0 + - @backstage/plugin-search-common@1.2.16 + +## 1.8.0 + +### Minor Changes + +- 384e494: Internal updates to generated code. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/backend-openapi-utils@0.4.0 + - @backstage/plugin-search-backend-node@1.3.6 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3 + - @backstage/plugin-search-common@1.2.16 + +## 1.8.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.2 + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/backend-openapi-utils@0.4.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-search-backend-node@1.3.6-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + - @backstage/plugin-search-common@1.2.16-next.0 + +## 1.8.0-next.1 + +### Minor Changes + +- 384e494: Internal updates to generated code. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.1 + - @backstage/plugin-search-backend-node@1.3.6-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + - @backstage/plugin-permission-node@0.8.6-next.1 + - @backstage/backend-openapi-utils@0.3.1-next.1 + - @backstage/config@1.3.0 + - @backstage/errors@1.2.5 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.2 + - @backstage/plugin-search-common@1.2.15 + +## 1.7.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.6.0-next.0 + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/backend-openapi-utils@0.3.1-next.0 + - @backstage/config@1.3.0 + - @backstage/errors@1.2.5 + - @backstage/types@1.2.0 + - @backstage/plugin-permission-common@0.8.2 + - @backstage/plugin-permission-node@0.8.6-next.0 + - @backstage/plugin-search-backend-node@1.3.6-next.0 + - @backstage/plugin-search-common@1.2.15 + +## 1.7.0 + +### Minor Changes + +- 39fd704: Internal update to use the new generated server types from `backstage-cli package schema openapi generate --server`. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.0 + - @backstage/backend-defaults@0.5.3 + - @backstage/types@1.2.0 + - @backstage/backend-plugin-api@1.0.2 + - @backstage/backend-openapi-utils@0.3.0 + - @backstage/plugin-search-backend-node@1.3.5 + - @backstage/plugin-permission-common@0.8.2 + - @backstage/errors@1.2.5 + - @backstage/plugin-permission-node@0.8.5 + - @backstage/plugin-search-common@1.2.15 + +## 1.7.0-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.3-next.3 + - @backstage/backend-openapi-utils@0.3.0-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.5-next.2 + - @backstage/plugin-search-backend-node@1.3.5-next.3 + - @backstage/plugin-search-common@1.2.14 + +## 1.7.0-next.2 + +### Minor Changes + +- 39fd704: Internal update to use the new generated server types from `backstage-cli package schema openapi generate --server`. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.3-next.2 + - @backstage/backend-openapi-utils@0.3.0-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.5-next.2 + - @backstage/plugin-search-backend-node@1.3.5-next.2 + - @backstage/plugin-search-common@1.2.14 + +## 1.6.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.3-next.1 + - @backstage/backend-openapi-utils@0.2.1-next.1 + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.5-next.1 + - @backstage/plugin-search-backend-node@1.3.5-next.1 + - @backstage/plugin-search-common@1.2.14 + +## 1.6.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.3-next.0 + - @backstage/backend-openapi-utils@0.2.1-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.5-next.0 + - @backstage/plugin-search-backend-node@1.3.5-next.0 + - @backstage/plugin-search-common@1.2.14 + +## 1.6.0 + +### Minor Changes + +- 3109c24: The export for the new backend system at the `/alpha` export is now also available via the main entry point, which means that you can remove the `/alpha` suffix from the import. + +### Patch Changes + +- 66af016: Fix to schema to allow arbitrary query parameters. +- 094eaa3: Remove references to in-repo backend-common +- Updated dependencies + - @backstage/backend-defaults@0.5.1 + - @backstage/plugin-search-backend-node@1.3.3 + - @backstage/plugin-permission-node@0.8.4 + - @backstage/backend-openapi-utils@0.2.0 + - @backstage/backend-plugin-api@1.0.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-search-common@1.2.14 + +## 1.5.18-next.2 + +### Patch Changes + +- 66af016: Fix to schema to allow arbitrary query parameters. +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.2 + - @backstage/backend-openapi-utils@0.2.0-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.4-next.1 + - @backstage/plugin-search-backend-node@1.3.3-next.2 + - @backstage/plugin-search-common@1.2.14 + +## 1.5.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.1-next.1 + - @backstage/backend-openapi-utils@0.1.19-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.4-next.0 + - @backstage/plugin-search-backend-node@1.3.3-next.1 + - @backstage/plugin-search-common@1.2.14 + +## 1.5.18-next.0 + +### Patch Changes + +- 094eaa3: Remove references to in-repo backend-common +- Updated dependencies + - @backstage/plugin-search-backend-node@1.3.3-next.0 + - @backstage/backend-defaults@0.5.1-next.0 + - @backstage/plugin-permission-node@0.8.4-next.0 + - @backstage/backend-openapi-utils@0.1.19-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-search-common@1.2.14 + +## 1.5.17 + +### Patch Changes + +- 5726390: Deprecate create router as the legacy backend system will no longer be supported. +- d425fc4: Modules, plugins, and services are now `BackendFeature`, not a function that returns a feature. +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-defaults@0.5.0 + - @backstage/backend-common@0.25.0 + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-permission-node@0.8.3 + - @backstage/backend-openapi-utils@0.1.18 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-search-backend-node@1.3.2 + - @backstage/plugin-search-common@1.2.14 + +## 1.5.17-next.2 + +### Patch Changes + +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-common@0.25.0-next.2 + - @backstage/backend-defaults@0.5.0-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + - @backstage/backend-openapi-utils@0.1.18-next.2 + - @backstage/plugin-permission-node@0.8.3-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-search-backend-node@1.3.2-next.2 + - @backstage/plugin-search-common@1.2.14 + +## 1.5.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.5.0-next.1 + - @backstage/backend-common@0.25.0-next.1 + - @backstage/backend-openapi-utils@0.1.18-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.3-next.1 + - @backstage/plugin-search-backend-node@1.3.2-next.1 + - @backstage/plugin-search-common@1.2.14 + +## 1.5.17-next.0 + +### Patch Changes + +- 5726390: Deprecate create router as the legacy backend system will no longer be supported. +- d425fc4: Modules, plugins, and services are now `BackendFeature`, not a function that returns a feature. +- Updated dependencies + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/backend-defaults@0.5.0-next.0 + - @backstage/plugin-permission-node@0.8.3-next.0 + - @backstage/backend-common@0.25.0-next.0 + - @backstage/backend-openapi-utils@0.1.18-next.0 + - @backstage/plugin-search-backend-node@1.3.2-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-search-common@1.2.14 + +## 1.5.15 + +### Patch Changes + +- 3123c16: Fix package metadata +- Updated dependencies + - @backstage/backend-defaults@0.4.2 + - @backstage/backend-plugin-api@0.8.0 + - @backstage/backend-common@0.24.0 + - @backstage/plugin-search-backend-node@1.3.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.1 + - @backstage/plugin-search-common@1.2.14 + - @backstage/backend-openapi-utils@0.1.16 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 1.5.15-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/backend-common@0.23.4-next.3 + - @backstage/backend-defaults@0.4.2-next.3 + - @backstage/backend-openapi-utils@0.1.16-next.3 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.8.1-next.1 + - @backstage/plugin-permission-node@0.8.1-next.3 + - @backstage/plugin-search-backend-node@1.2.28-next.3 + - @backstage/plugin-search-common@1.2.14-next.1 + +## 1.5.15-next.2 + +### Patch Changes + +- 3123c16: Fix package metadata +- Updated dependencies + - @backstage/backend-defaults@0.4.2-next.2 + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/plugin-permission-common@0.8.1-next.1 + - @backstage/backend-common@0.23.4-next.2 + - @backstage/plugin-permission-node@0.8.1-next.2 + - @backstage/plugin-search-backend-node@1.2.28-next.2 + - @backstage/plugin-search-common@1.2.14-next.1 + - @backstage/backend-openapi-utils@0.1.16-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 1.5.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.8.1-next.0 + - @backstage/plugin-permission-node@0.8.1-next.1 + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/backend-common@0.23.4-next.1 + - @backstage/backend-defaults@0.4.2-next.1 + - @backstage/plugin-search-backend-node@1.2.28-next.1 + - @backstage/plugin-search-common@1.2.14-next.0 + - @backstage/backend-openapi-utils@0.1.16-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 1.5.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.23.4-next.0 + - @backstage/backend-defaults@0.4.2-next.0 + - @backstage/backend-openapi-utils@0.1.16-next.0 + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.8.0 + - @backstage/plugin-permission-node@0.8.1-next.0 + - @backstage/plugin-search-backend-node@1.2.28-next.0 + - @backstage/plugin-search-common@1.2.13 + +## 1.5.14 + +### Patch Changes + +- 343f656: The `AuthorizedSearchEngine` will now ignore the deprecated `token` option, and treat it as an unauthorized request. This will not have any effect in practice, since credentials are always provided by the router. +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/backend-defaults@0.4.0 + - @backstage/backend-common@0.23.3 + - @backstage/plugin-permission-common@0.8.0 + - @backstage/plugin-permission-node@0.8.0 + - @backstage/backend-openapi-utils@0.1.15 + - @backstage/plugin-search-backend-node@1.2.27 + - @backstage/plugin-search-common@1.2.13 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 1.5.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.3.4-next.1 + - @backstage/backend-common@0.23.3-next.1 + - @backstage/backend-openapi-utils@0.1.15-next.1 + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.14 + - @backstage/plugin-permission-node@0.7.33-next.1 + - @backstage/plugin-search-backend-node@1.2.27-next.1 + - @backstage/plugin-search-common@1.2.12 + +## 1.5.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/backend-defaults@0.3.3-next.0 + - @backstage/backend-common@0.23.2-next.0 + - @backstage/backend-openapi-utils@0.1.14-next.0 + - @backstage/plugin-permission-node@0.7.32-next.0 + - @backstage/plugin-search-backend-node@1.2.26-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.14 + - @backstage/plugin-search-common@1.2.12 + +## 1.5.10 + +### Patch Changes + +- 8869b8e: Updated local development setup. +- 78a0b08: Internal refactor to handle `BackendFeature` contract change. +- d44a20a: Added additional plugin metadata to `package.json`. +- 5b6f979: Split backend search plugin startup into "init" and "start" stages to ensure necessary initialization has happened before startup +- 34dc47d: Move @backstage/repo-tools to devDependencies +- Updated dependencies + - @backstage/backend-common@0.23.0 + - @backstage/backend-plugin-api@0.6.19 + - @backstage/backend-defaults@0.3.0 + - @backstage/plugin-search-backend-node@1.2.24 + - @backstage/plugin-permission-node@0.7.30 + - @backstage/plugin-permission-common@0.7.14 + - @backstage/plugin-search-common@1.2.12 + - @backstage/backend-openapi-utils@0.1.12 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 1.5.10-next.3 + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/backend-defaults@0.3.0-next.3 + - @backstage/plugin-search-backend-node@1.2.24-next.3 + - @backstage/plugin-permission-common@0.7.14-next.0 + - @backstage/plugin-permission-node@0.7.30-next.3 + - @backstage/plugin-search-common@1.2.12-next.0 + - @backstage/backend-common@0.23.0-next.3 + - @backstage/backend-openapi-utils@0.1.12-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 1.5.10-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/backend-common@0.23.0-next.2 + - @backstage/backend-defaults@0.3.0-next.2 + - @backstage/plugin-permission-node@0.7.30-next.2 + - @backstage/backend-openapi-utils@0.1.12-next.1 + - @backstage/plugin-search-backend-node@1.2.24-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.13 + - @backstage/plugin-search-common@1.2.11 + +## 1.5.10-next.1 + +### Patch Changes + +- 34dc47d: Move @backstage/repo-tools to devDependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.1 + - @backstage/plugin-permission-node@0.7.30-next.1 + - @backstage/backend-defaults@0.3.0-next.1 + - @backstage/backend-common@0.23.0-next.1 + - @backstage/plugin-search-backend-node@1.2.24-next.1 + +## 1.5.10-next.0 + +### Patch Changes + +- 8869b8e: Updated local development setup. +- 5b6f979: Split backend search plugin startup into "init" and "start" stages to ensure necessary initialization has happened before startup +- Updated dependencies + - @backstage/backend-common@0.22.1-next.0 + - @backstage/plugin-search-backend-node@1.2.24-next.0 + - @backstage/backend-defaults@0.2.19-next.0 + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/repo-tools@0.9.1-next.0 + - @backstage/plugin-permission-node@0.7.30-next.0 + - @backstage/backend-openapi-utils@0.1.12-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.13 + - @backstage/plugin-search-common@1.2.11 + +## 1.5.8 + +### Patch Changes + +- c6cb568: Add lifecycle monitoring for the search index registry +- Updated dependencies + - @backstage/repo-tools@0.9.0 + - @backstage/backend-common@0.22.0 + - @backstage/backend-plugin-api@0.6.18 + - @backstage/plugin-search-backend-node@1.2.22 + - @backstage/backend-openapi-utils@0.1.11 + - @backstage/plugin-permission-node@0.7.29 + +## 1.5.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/repo-tools@0.9.0-next.2 + +## 1.5.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/repo-tools@0.8.1-next.1 + - @backstage/backend-common@0.22.0-next.1 + - @backstage/plugin-permission-node@0.7.29-next.1 + - @backstage/plugin-search-backend-node@1.2.22-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + - @backstage/backend-openapi-utils@0.1.11-next.1 + +## 1.5.8-next.0 + +### Patch Changes + +- c6cb568: Add lifecycle monitoring for the search index registry +- Updated dependencies + - @backstage/plugin-search-backend-node@1.2.22-next.0 + - @backstage/backend-common@0.21.8-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + - @backstage/repo-tools@0.8.1-next.0 + - @backstage/backend-openapi-utils@0.1.11-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.13 + - @backstage/plugin-permission-node@0.7.29-next.0 + - @backstage/plugin-search-common@1.2.11 + +## 1.5.7 + +### Patch Changes + +- 2bd291e: Allow reserved characters in requests. +- d5a1fe1: Replaced winston logger with `LoggerService` +- Updated dependencies + - @backstage/backend-common@0.21.7 + - @backstage/repo-tools@0.8.0 + - @backstage/plugin-permission-node@0.7.28 + - @backstage/backend-plugin-api@0.6.17 + - @backstage/plugin-search-backend-node@1.2.21 + - @backstage/backend-openapi-utils@0.1.10 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.13 + - @backstage/plugin-search-common@1.2.11 + +## 1.5.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.7-next.1 + - @backstage/backend-plugin-api@0.6.17-next.1 + - @backstage/repo-tools@0.8.0-next.1 + - @backstage/plugin-permission-node@0.7.28-next.1 + - @backstage/plugin-search-backend-node@1.2.21-next.1 + - @backstage/backend-openapi-utils@0.1.10-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.13 + - @backstage/plugin-search-common@1.2.11 + +## 1.5.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.7-next.0 + - @backstage/repo-tools@0.8.0-next.0 + - @backstage/backend-openapi-utils@0.1.10-next.0 + - @backstage/backend-plugin-api@0.6.17-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.13 + - @backstage/plugin-permission-node@0.7.28-next.0 + - @backstage/plugin-search-backend-node@1.2.21-next.0 + - @backstage/plugin-search-common@1.2.11 + +## 1.5.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.6 + - @backstage/backend-plugin-api@0.6.16 + - @backstage/plugin-permission-node@0.7.27 + - @backstage/plugin-search-backend-node@1.2.20 + - @backstage/backend-openapi-utils@0.1.9 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.13 + - @backstage/plugin-search-common@1.2.11 + +## 1.5.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.5 + - @backstage/plugin-permission-node@0.7.26 + - @backstage/plugin-search-backend-node@1.2.19 + - @backstage/backend-openapi-utils@0.1.8 + - @backstage/backend-plugin-api@0.6.15 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.13 + - @backstage/plugin-search-common@1.2.11 + +## 1.5.4 + +### Patch Changes + +- 2bd1410: Removed unused dependencies +- 744c0cb: Update the router to use the new `auth` services, it now accepts an optional discovery service option to get credentials for the permission service. +- Updated dependencies + - @backstage/backend-common@0.21.4 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/backend-plugin-api@0.6.14 + - @backstage/plugin-permission-common@0.7.13 + - @backstage/plugin-search-common@1.2.11 + - @backstage/backend-openapi-utils@0.1.7 + - @backstage/plugin-search-backend-node@1.2.18 + - @backstage/plugin-permission-node@0.7.25 + - @backstage/types@1.1.1 + +## 1.5.4-next.2 + +### Patch Changes + +- 2bd1410: Removed unused dependencies +- Updated dependencies + - @backstage/backend-common@0.21.4-next.2 + - @backstage/backend-openapi-utils@0.1.7-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 + - @backstage/config@1.2.0-next.1 + - @backstage/errors@1.2.4-next.0 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.13-next.1 + - @backstage/plugin-permission-node@0.7.25-next.2 + - @backstage/plugin-search-backend-node@1.2.18-next.2 + - @backstage/plugin-search-common@1.2.11-next.1 + +## 1.5.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.2.0-next.1 + - @backstage/backend-common@0.21.4-next.1 + - @backstage/backend-plugin-api@0.6.14-next.1 + - @backstage/plugin-auth-node@0.4.9-next.1 + - @backstage/plugin-permission-common@0.7.13-next.1 + - @backstage/plugin-permission-node@0.7.25-next.1 + - @backstage/plugin-search-backend-node@1.2.18-next.1 + - @backstage/backend-openapi-utils@0.1.7-next.1 + - @backstage/errors@1.2.4-next.0 + - @backstage/types@1.1.1 + - @backstage/plugin-search-common@1.2.11-next.1 + +## 1.5.3-next.0 + +### Patch Changes + +- 744c0cb: Update the router to use the new `auth` services, it now accepts an optional discovery service option to get credentials for the permission service. +- Updated dependencies + - @backstage/backend-common@0.21.3-next.0 + - @backstage/plugin-auth-node@0.4.8-next.0 + - @backstage/errors@1.2.4-next.0 + - @backstage/backend-plugin-api@0.6.13-next.0 + - @backstage/plugin-permission-common@0.7.13-next.0 + - @backstage/plugin-search-common@1.2.11-next.0 + - @backstage/backend-openapi-utils@0.1.6-next.0 + - @backstage/plugin-search-backend-node@1.2.17-next.0 + - @backstage/plugin-permission-node@0.7.24-next.0 + - @backstage/config@1.1.2-next.0 + - @backstage/types@1.1.1 + +## 1.5.0 + +### Minor Changes + +- 126c2f9: Updates the OpenAPI spec to use plugin as `info.title` instead of package name. +- 04907c3: Updates the OpenAPI specification title to plugin ID instead of package name. + +### Patch Changes + +- 3ed0eac: Authorized search engine now obeys query page limit +- Updated dependencies + - @backstage/backend-common@0.21.0 + - @backstage/plugin-auth-node@0.4.4 + - @backstage/backend-plugin-api@0.6.10 + - @backstage/backend-openapi-utils@0.1.3 + - @backstage/plugin-permission-node@0.7.21 + - @backstage/plugin-search-backend-node@1.2.14 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-search-common@1.2.10 + +## 1.5.0-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0-next.3 + - @backstage/plugin-auth-node@0.4.4-next.3 + - @backstage/plugin-permission-node@0.7.21-next.3 + - @backstage/plugin-search-backend-node@1.2.14-next.3 + - @backstage/backend-openapi-utils@0.1.3-next.3 + - @backstage/backend-plugin-api@0.6.10-next.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-search-common@1.2.10 + +## 1.5.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0-next.2 + - @backstage/backend-plugin-api@0.6.10-next.2 + - @backstage/plugin-auth-node@0.4.4-next.2 + - @backstage/plugin-permission-node@0.7.21-next.2 + - @backstage/plugin-search-backend-node@1.2.14-next.2 + - @backstage/backend-openapi-utils@0.1.3-next.2 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-search-common@1.2.10 + +## 1.5.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/backend-common@0.21.0-next.1 + - @backstage/backend-openapi-utils@0.1.3-next.1 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.4-next.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.21-next.1 + - @backstage/plugin-search-backend-node@1.2.14-next.1 + - @backstage/plugin-search-common@1.2.10 + +## 1.5.0-next.0 + +### Minor Changes + +- 126c2f9: Updates the OpenAPI spec to use plugin as `info.title` instead of package name. +- 04907c3: Updates the OpenAPI specification title to plugin ID instead of package name. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0-next.0 + - @backstage/backend-openapi-utils@0.1.3-next.0 + - @backstage/plugin-auth-node@0.4.4-next.0 + - @backstage/plugin-permission-node@0.7.21-next.0 + - @backstage/plugin-search-backend-node@1.2.14-next.0 + - @backstage/backend-plugin-api@0.6.10-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-search-common@1.2.10 + +## 1.4.9 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/backend-openapi-utils@0.1.2 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/plugin-search-backend-node@1.2.13 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-search-common@1.2.10 + +## 1.4.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/backend-openapi-utils@0.1.2-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + - @backstage/plugin-search-backend-node@1.2.13-next.2 + +## 1.4.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.1 + - @backstage/config@1.1.1 + - @backstage/plugin-auth-node@0.4.3-next.1 + - @backstage/plugin-permission-node@0.7.20-next.1 + - @backstage/plugin-search-backend-node@1.2.13-next.1 + - @backstage/backend-openapi-utils@0.1.2-next.1 + - @backstage/backend-plugin-api@0.6.9-next.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.11 + - @backstage/plugin-search-common@1.2.9 + +## 1.4.9-next.0 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-common@0.20.1-next.0 + - @backstage/backend-openapi-utils@0.1.2-next.0 + - @backstage/backend-plugin-api@0.6.9-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.3-next.0 + - @backstage/plugin-permission-common@0.7.11 + - @backstage/plugin-permission-node@0.7.20-next.0 + - @backstage/plugin-search-backend-node@1.2.13-next.0 + - @backstage/plugin-search-common@1.2.9 + +## 1.4.8 + +### Patch Changes + +- 0cbb03b: Fixing regular expression ReDoS with zod packages. Upgrading to latest. ref: +- Updated dependencies + - @backstage/backend-common@0.20.0 + - @backstage/backend-openapi-utils@0.1.1 + - @backstage/plugin-auth-node@0.4.2 + - @backstage/plugin-permission-common@0.7.11 + - @backstage/plugin-permission-node@0.7.19 + - @backstage/plugin-search-backend-node@1.2.12 + - @backstage/backend-plugin-api@0.6.8 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-search-common@1.2.9 + +## 1.4.8-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.3 + - @backstage/backend-openapi-utils@0.1.1-next.3 + - @backstage/backend-plugin-api@0.6.8-next.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.2-next.3 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/plugin-permission-node@0.7.19-next.3 + - @backstage/plugin-search-backend-node@1.2.12-next.3 + - @backstage/plugin-search-common@1.2.8 + +## 1.4.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.2 + - @backstage/plugin-auth-node@0.4.2-next.2 + - @backstage/backend-openapi-utils@0.1.1-next.2 + - @backstage/backend-plugin-api@0.6.8-next.2 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/plugin-permission-node@0.7.19-next.2 + - @backstage/plugin-search-backend-node@1.2.12-next.2 + - @backstage/plugin-search-common@1.2.8 + +## 1.4.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.1 + - @backstage/backend-openapi-utils@0.1.1-next.1 + - @backstage/backend-plugin-api@0.6.8-next.1 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.2-next.1 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/plugin-permission-node@0.7.19-next.1 + - @backstage/plugin-search-backend-node@1.2.12-next.1 + - @backstage/plugin-search-common@1.2.8 + +## 1.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.0 + - @backstage/backend-openapi-utils@0.1.1-next.0 + - @backstage/plugin-auth-node@0.4.2-next.0 + - @backstage/plugin-permission-node@0.7.19-next.0 + - @backstage/plugin-search-backend-node@1.2.12-next.0 + - @backstage/backend-plugin-api@0.6.8-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/plugin-search-common@1.2.8 + +## 1.4.7 + +### Patch Changes + +- 6694b369a3: Update the OpenAPI spec with more complete error responses and request bodies using Optic. Also, updates the test cases to use the new `supertest` pass through from `@backstage/backend-openapi-utils`. +- Updated dependencies + - @backstage/plugin-search-backend-node@1.2.11 + - @backstage/backend-common@0.19.9 + - @backstage/backend-plugin-api@0.6.7 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/backend-openapi-utils@0.1.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.1 + - @backstage/plugin-permission-node@0.7.18 + - @backstage/plugin-search-common@1.2.8 + +## 1.4.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.7-next.2 + - @backstage/backend-common@0.19.9-next.2 + - @backstage/backend-openapi-utils@0.1.0-next.2 + - @backstage/plugin-auth-node@0.4.1-next.2 + - @backstage/plugin-permission-node@0.7.18-next.2 + - @backstage/plugin-search-backend-node@1.2.11-next.2 + +## 1.4.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.9-next.1 + - @backstage/plugin-auth-node@0.4.1-next.1 + - @backstage/plugin-permission-node@0.7.18-next.1 + - @backstage/plugin-search-backend-node@1.2.11-next.1 + - @backstage/backend-openapi-utils@0.1.0-next.1 + - @backstage/backend-plugin-api@0.6.7-next.1 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.9 + - @backstage/plugin-search-common@1.2.7 + +## 1.4.7-next.0 + +### Patch Changes + +- 6694b369a3: Update the OpenAPI spec with more complete error responses and request bodies using Optic. Also, updates the test cases to use the new `supertest` pass through from `@backstage/backend-openapi-utils`. +- Updated dependencies + - @backstage/plugin-search-backend-node@1.2.11-next.0 + - @backstage/backend-openapi-utils@0.1.0-next.0 + - @backstage/backend-common@0.19.9-next.0 + - @backstage/backend-plugin-api@0.6.7-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.1-next.0 + - @backstage/plugin-permission-common@0.7.9 + - @backstage/plugin-permission-node@0.7.18-next.0 + - @backstage/plugin-search-common@1.2.7 + +## 1.4.6 + +### Patch Changes + +- 16be6f9473: Set the default length limit to search query to 100. To override it, define `search.maxTermLength` in the config file. +- Updated dependencies + - @backstage/backend-common@0.19.8 + - @backstage/plugin-auth-node@0.4.0 + - @backstage/errors@1.2.3 + - @backstage/backend-openapi-utils@0.0.5 + - @backstage/backend-plugin-api@0.6.6 + - @backstage/plugin-search-backend-node@1.2.10 + - @backstage/plugin-permission-node@0.7.17 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.9 + - @backstage/plugin-search-common@1.2.7 + +## 1.4.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.8-next.2 + - @backstage/plugin-auth-node@0.4.0-next.2 + - @backstage/errors@1.2.3-next.0 + - @backstage/backend-openapi-utils@0.0.5-next.0 + - @backstage/plugin-permission-node@0.7.17-next.2 + - @backstage/plugin-search-backend-node@1.2.10-next.2 + - @backstage/backend-plugin-api@0.6.6-next.2 + - @backstage/config@1.1.1-next.0 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.9-next.0 + - @backstage/plugin-search-common@1.2.7-next.0 + +## 1.4.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.1 + - @backstage/backend-plugin-api@0.6.5-next.1 + - @backstage/plugin-search-backend-node@1.2.9-next.1 + - @backstage/plugin-auth-node@0.3.2-next.1 + - @backstage/plugin-permission-node@0.7.16-next.1 + - @backstage/config@1.1.0 + - @backstage/backend-openapi-utils@0.0.4 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + +## 1.4.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-openapi-utils@0.0.4 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + - @backstage/plugin-search-backend-node@1.2.9-next.0 + - @backstage/plugin-search-common@1.2.6 + +## 1.4.3 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-search-common@1.2.6 + - @backstage/types@1.1.1 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + - @backstage/backend-openapi-utils@0.0.4 + - @backstage/plugin-search-backend-node@1.2.7 + +## 1.4.3-next.3 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/config@1.1.0-next.2 + - @backstage/errors@1.2.2-next.0 + - @backstage/plugin-permission-common@0.7.8-next.2 + - @backstage/plugin-search-common@1.2.6-next.2 + - @backstage/types@1.1.1-next.0 + - @backstage/plugin-permission-node@0.7.14-next.3 + - @backstage/backend-plugin-api@0.6.3-next.3 + - @backstage/backend-common@0.19.5-next.3 + - @backstage/backend-openapi-utils@0.0.4-next.0 + - @backstage/plugin-auth-node@0.3.0-next.3 + - @backstage/plugin-search-backend-node@1.2.7-next.3 + +## 1.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0-next.1 + - @backstage/backend-common@0.19.5-next.2 + - @backstage/plugin-auth-node@0.3.0-next.2 + - @backstage/plugin-permission-node@0.7.14-next.2 + - @backstage/backend-plugin-api@0.6.3-next.2 + - @backstage/plugin-permission-common@0.7.8-next.1 + - @backstage/plugin-search-backend-node@1.2.7-next.2 + - @backstage/backend-openapi-utils@0.0.3 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-search-common@1.2.6-next.1 + +## 1.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0-next.0 + - @backstage/backend-common@0.19.5-next.1 + - @backstage/backend-plugin-api@0.6.3-next.1 + - @backstage/plugin-auth-node@0.3.0-next.1 + - @backstage/plugin-permission-common@0.7.8-next.0 + - @backstage/plugin-permission-node@0.7.14-next.1 + - @backstage/plugin-search-backend-node@1.2.7-next.1 + - @backstage/backend-openapi-utils@0.0.3 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-search-common@1.2.6-next.0 + +## 1.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0-next.0 + - @backstage/backend-common@0.19.4-next.0 + - @backstage/backend-openapi-utils@0.0.3 + - @backstage/backend-plugin-api@0.6.2-next.0 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-permission-node@0.7.13-next.0 + - @backstage/plugin-search-backend-node@1.2.6-next.0 + - @backstage/plugin-search-common@1.2.5 + +## 1.4.0 + +### Minor Changes + +- ebeb77586975: Now performs request validation based on OpenAPI schema through `@backstage/backend-openapi-utils`. Error responses for invalid input, like `"a"` instead of a number, may have changed. + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- 951ab6c9db58: Add missing `configSchema` to package.json +- Updated dependencies + - @backstage/backend-common@0.19.2 + - @backstage/backend-plugin-api@0.6.0 + - @backstage/backend-openapi-utils@0.0.3 + - @backstage/plugin-search-backend-node@1.2.4 + - @backstage/plugin-auth-node@0.2.17 + - @backstage/plugin-permission-node@0.7.11 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-search-common@1.2.5 + +## 1.4.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.0-next.2 + - @backstage/backend-common@0.19.2-next.2 + - @backstage/plugin-permission-node@0.7.11-next.2 + - @backstage/plugin-search-backend-node@1.2.4-next.2 + - @backstage/plugin-auth-node@0.2.17-next.2 + +## 1.4.0-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- 951ab6c9db58: Add missing `configSchema` to package.json +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/backend-openapi-utils@0.0.3-next.1 + - @backstage/plugin-search-backend-node@1.2.4-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-search-common@1.2.5 + +## 1.4.0-next.0 + +### Minor Changes + +- ebeb77586975: Now performs request validation based on OpenAPI schema through `@backstage/backend-openapi-utils`. Error responses for invalid input, like `"a"` instead of a number, may have changed. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-openapi-utils@0.0.3-next.0 + - @backstage/plugin-search-backend-node@1.2.4-next.0 + - @backstage/backend-common@0.19.2-next.0 + - @backstage/backend-plugin-api@0.5.5-next.0 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + - @backstage/plugin-auth-node@0.2.17-next.0 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-permission-node@0.7.11-next.0 + - @backstage/plugin-search-common@1.2.5 + +## 1.3.3 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.1 + - @backstage/backend-common@0.19.1 + - @backstage/backend-plugin-api@0.5.4 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/plugin-auth-node@0.2.16 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-permission-node@0.7.10 + - @backstage/plugin-search-backend-node@1.2.3 + - @backstage/plugin-search-common@1.2.5 + +## 1.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.1-next.0 + - @backstage/backend-common@0.19.1-next.0 + - @backstage/backend-plugin-api@0.5.4-next.0 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + - @backstage/plugin-auth-node@0.2.16-next.0 + - @backstage/plugin-permission-common@0.7.7-next.0 + - @backstage/plugin-permission-node@0.7.10-next.0 + - @backstage/plugin-search-backend-node@1.2.3-next.0 + - @backstage/plugin-search-common@1.2.5-next.0 + +## 1.3.2 + +### Patch Changes + +- ee411e7c2623: Update OpenAPI specs to be in line with linting standards. +- Updated dependencies + - @backstage/backend-common@0.19.0 + - @backstage/types@1.1.0 + - @backstage/errors@1.2.0 + - @backstage/backend-plugin-api@0.5.3 + - @backstage/plugin-auth-node@0.2.15 + - @backstage/plugin-permission-node@0.7.9 + - @backstage/plugin-search-backend-node@1.2.2 + - @backstage/config@1.0.8 + - @backstage/plugin-permission-common@0.7.6 + - @backstage/plugin-search-common@1.2.4 + +## 1.3.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.2 + - @backstage/backend-plugin-api@0.5.3-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.2.0-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.15-next.2 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-permission-node@0.7.9-next.2 + - @backstage/plugin-search-backend-node@1.2.2-next.2 + - @backstage/plugin-search-common@1.2.4-next.0 + +## 1.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/plugin-search-backend-node@1.2.2-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-search-common@1.2.4-next.0 + +## 1.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.6-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.3-next.0 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.15-next.0 + - @backstage/plugin-permission-common@0.7.5 + - @backstage/plugin-permission-node@0.7.9-next.0 + - @backstage/plugin-search-backend-node@1.2.2-next.0 + - @backstage/plugin-search-common@1.2.3 + +## 1.3.1 + +### Patch Changes + +- 021cfbb5152: Added an OpenAPI 3.0 spec and enforced schema-first model on the router. +- Updated dependencies + - @backstage/backend-common@0.18.5 + - @backstage/plugin-permission-node@0.7.8 + - @backstage/plugin-auth-node@0.2.14 + - @backstage/plugin-search-backend-node@1.2.1 + - @backstage/backend-plugin-api@0.5.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-common@0.7.5 + - @backstage/plugin-search-common@1.2.3 + +## 1.3.1-next.2 + +### Patch Changes + +- 021cfbb5152: Added an OpenAPI 3.0 spec and enforced schema-first model on the router. +- Updated dependencies + - @backstage/config@1.0.7 + +## 1.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.5-next.1 + - @backstage/plugin-auth-node@0.2.14-next.1 + - @backstage/plugin-permission-node@0.7.8-next.1 + - @backstage/plugin-search-backend-node@1.2.1-next.1 + - @backstage/backend-plugin-api@0.5.2-next.1 + - @backstage/config@1.0.7 + +## 1.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.5-next.0 + - @backstage/plugin-permission-node@0.7.8-next.0 + - @backstage/plugin-auth-node@0.2.14-next.0 + - @backstage/plugin-search-backend-node@1.2.1-next.0 + - @backstage/backend-plugin-api@0.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-common@0.7.5 + - @backstage/plugin-search-common@1.2.3 + +## 1.3.0 + +### Minor Changes + +- 1469daa409e: Exports search plugin that can be used with the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/backend-common@0.18.4 + - @backstage/plugin-permission-node@0.7.7 + - @backstage/plugin-permission-common@0.7.5 + - @backstage/plugin-search-backend-node@1.2.0 + - @backstage/plugin-auth-node@0.2.13 + - @backstage/backend-plugin-api@0.5.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-search-common@1.2.3 + +## 1.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend-node@1.2.0-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + +## 1.3.0-next.1 + +### Minor Changes + +- 1469daa409e: Exports search plugin that can be used with the new backend system. For documentation on how to migrate, check out the [how to migrate to the new backend system guide](https://backstage.io/docs/features/search/how-to-guides/#how-to-migrate-your-backend-installation-to-use-search-together-with-the-new-backend-system). + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/plugin-search-backend-node@1.2.0-next.1 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/backend-plugin-api@0.5.1-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.1 + - @backstage/plugin-search-common@1.2.3-next.0 + +## 1.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-permission-node@0.7.7-next.0 + - @backstage/plugin-search-backend-node@1.1.5-next.0 + - @backstage/plugin-search-common@1.2.2 + +## 1.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + - @backstage/plugin-search-backend-node@1.1.4 + - @backstage/plugin-search-common@1.2.2 + +## 1.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-permission-node@0.7.6-next.2 + - @backstage/plugin-search-backend-node@1.1.4-next.2 + - @backstage/config@1.0.7-next.0 + +## 1.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.7.6-next.1 + - @backstage/errors@1.1.5-next.0 + - @backstage/backend-common@0.18.3-next.1 + - @backstage/plugin-auth-node@0.2.12-next.1 + - @backstage/plugin-permission-common@0.7.4-next.0 + - @backstage/config@1.0.7-next.0 + - @backstage/types@1.0.2 + - @backstage/plugin-search-backend-node@1.1.4-next.1 + - @backstage/plugin-search-common@1.2.2-next.0 + +## 1.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.12-next.0 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.6-next.0 + - @backstage/plugin-search-backend-node@1.1.4-next.0 + - @backstage/plugin-search-common@1.2.1 + +## 1.2.3 + +### Patch Changes + +- 1b30c9a0f7: Change the router's response to include the error message instead of its object type in case it fails during a search query because the messages have more info. +- Updated dependencies + - @backstage/backend-common@0.18.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.5 + - @backstage/plugin-search-backend-node@1.1.3 + - @backstage/plugin-search-common@1.2.1 + +## 1.2.3-next.2 + +### Patch Changes + +- 1b30c9a0f7: Change the router's response to include the error message instead of its object type in case it fails during a search query because the messages have more info. +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/plugin-permission-node@0.7.5-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-search-backend-node@1.1.3-next.2 + - @backstage/plugin-search-common@1.2.1 + +## 1.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.5-next.1 + - @backstage/plugin-search-backend-node@1.1.3-next.1 + - @backstage/plugin-search-common@1.2.1 + +## 1.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + - @backstage/plugin-permission-node@0.7.5-next.0 + - @backstage/plugin-search-backend-node@1.1.3-next.0 + +## 1.2.1 + +### Patch Changes + +- bfd66b0478: Allow max page limit for search results to be configurable +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/plugin-search-backend-node@1.1.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.9 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.3 + - @backstage/plugin-search-common@1.2.1 + +## 1.2.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/plugin-auth-node@0.2.9-next.1 + - @backstage/plugin-permission-node@0.7.3-next.1 + - @backstage/plugin-search-backend-node@1.1.1-next.2 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-permission-common@0.7.3-next.0 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 1.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.9-next.0 + - @backstage/plugin-permission-common@0.7.3-next.0 + - @backstage/plugin-permission-node@0.7.3-next.0 + - @backstage/plugin-search-backend-node@1.1.1-next.1 + - @backstage/plugin-search-common@1.2.1-next.0 + +## 1.2.1-next.0 + +### Patch Changes + +- bfd66b0478: Allow max page limit for search results to be configurable +- Updated dependencies + - @backstage/plugin-search-backend-node@1.1.1-next.0 + - @backstage/backend-common@0.17.0 + - @backstage/config@1.0.5 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/plugin-auth-node@0.2.8 + - @backstage/plugin-permission-common@0.7.2 + - @backstage/plugin-permission-node@0.7.2 + - @backstage/plugin-search-common@1.2.0 + +## 1.2.0 + +### Minor Changes + +- 29ebc43a0b: numberOfResults is now provided alongside the query result + +### Patch Changes + +- b05dcd5530: Move the `zod` dependency to a version that does not collide with other libraries +- Updated dependencies + - @backstage/plugin-search-backend-node@1.1.0 + - @backstage/backend-common@0.17.0 + - @backstage/plugin-permission-common@0.7.2 + - @backstage/plugin-permission-node@0.7.2 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.8 + - @backstage/types@1.0.2 + - @backstage/plugin-search-common@1.2.0 + - @backstage/config@1.0.5 + +## 1.2.0-next.3 + +### Patch Changes + +- b05dcd5530: Move the `zod` dependency to a version that does not collide with other libraries +- Updated dependencies + - @backstage/plugin-permission-common@0.7.2-next.2 + - @backstage/plugin-permission-node@0.7.2-next.3 + - @backstage/backend-common@0.17.0-next.3 + - @backstage/config@1.0.5-next.1 + - @backstage/errors@1.1.4-next.1 + - @backstage/types@1.0.2-next.1 + - @backstage/plugin-auth-node@0.2.8-next.3 + - @backstage/plugin-search-backend-node@1.1.0-next.3 + - @backstage/plugin-search-common@1.2.0-next.3 + +## 1.2.0-next.2 + +### Minor Changes + +- 29ebc43a0b: numberOfResults is now provided alongside the query result + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-node@1.1.0-next.2 + - @backstage/backend-common@0.17.0-next.2 + - @backstage/plugin-search-common@1.2.0-next.2 + - @backstage/plugin-auth-node@0.2.8-next.2 + - @backstage/plugin-permission-node@0.7.2-next.2 + - @backstage/config@1.0.5-next.1 + - @backstage/errors@1.1.4-next.1 + - @backstage/types@1.0.2-next.1 + - @backstage/plugin-permission-common@0.7.2-next.1 + +## 1.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.17.0-next.1 + - @backstage/plugin-search-backend-node@1.0.5-next.1 + - @backstage/types@1.0.2-next.1 + - @backstage/plugin-auth-node@0.2.8-next.1 + - @backstage/plugin-permission-node@0.7.2-next.1 + - @backstage/config@1.0.5-next.1 + - @backstage/errors@1.1.4-next.1 + - @backstage/plugin-permission-common@0.7.2-next.1 + - @backstage/plugin-search-common@1.1.2-next.1 + +## 1.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-node@1.0.5-next.0 + - @backstage/backend-common@0.16.1-next.0 + - @backstage/plugin-auth-node@0.2.8-next.0 + - @backstage/plugin-permission-common@0.7.2-next.0 + - @backstage/plugin-permission-node@0.7.2-next.0 + - @backstage/types@1.0.2-next.0 + - @backstage/config@1.0.5-next.0 + - @backstage/errors@1.1.4-next.0 + - @backstage/plugin-search-common@1.1.2-next.0 + +## 1.1.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.16.0 + - @backstage/plugin-auth-node@0.2.7 + - @backstage/plugin-permission-common@0.7.1 + - @backstage/types@1.0.1 + - @backstage/plugin-permission-node@0.7.1 + - @backstage/plugin-search-backend-node@1.0.4 + - @backstage/config@1.0.4 + - @backstage/errors@1.1.3 + - @backstage/plugin-search-common@1.1.1 + +## 1.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.16.0-next.1 + - @backstage/plugin-auth-node@0.2.7-next.1 + - @backstage/plugin-permission-node@0.7.1-next.1 + - @backstage/plugin-search-backend-node@1.0.4-next.1 + - @backstage/config@1.0.4-next.0 + - @backstage/errors@1.1.3-next.0 + - @backstage/types@1.0.1-next.0 + - @backstage/plugin-permission-common@0.7.1-next.0 + - @backstage/plugin-search-common@1.1.1-next.0 + +## 1.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.16.0-next.0 + - @backstage/plugin-auth-node@0.2.7-next.0 + - @backstage/plugin-permission-common@0.7.1-next.0 + - @backstage/types@1.0.1-next.0 + - @backstage/plugin-permission-node@0.7.1-next.0 + - @backstage/plugin-search-backend-node@1.0.4-next.0 + - @backstage/config@1.0.4-next.0 + - @backstage/errors@1.1.3-next.0 + - @backstage/plugin-search-common@1.1.1-next.0 + +## 1.1.0 + +### Minor Changes + +- 16c853a6ed: Be less restrictive with unknown keys on query endpoint +- a799972bb1: The query received by search engines now contains a property called `pageLimit`, it specifies how many results to return per page when sending a query request to the search backend. + + Example: + _Returns up to 30 results per page_ + + GET /query?pageLimit=30 + + The search backend validates the page limit and this value must not exceed 100, but it doesn't set a default value for the page limit parameter, it leaves it up to each search engine to set this, so Lunr, Postgres and Elastic Search set 25 results per page as a default value. + +### Patch Changes + +- 2d3a5f09ab: Use `response.json` rather than `response.send` where appropriate, as outlined in `SECURITY.md` +- Updated dependencies + - @backstage/backend-common@0.15.2 + - @backstage/plugin-auth-node@0.2.6 + - @backstage/plugin-permission-node@0.7.0 + - @backstage/plugin-permission-common@0.7.0 + - @backstage/plugin-search-common@1.1.0 + - @backstage/plugin-search-backend-node@1.0.3 + - @backstage/config@1.0.3 + - @backstage/errors@1.1.2 + - @backstage/types@1.0.0 + +## 1.1.0-next.2 + +### Patch Changes + +- 2d3a5f09ab: Use `response.json` rather than `response.send` where appropriate, as outlined in `SECURITY.md` +- Updated dependencies + - @backstage/backend-common@0.15.2-next.2 + - @backstage/plugin-permission-common@0.7.0-next.2 + - @backstage/plugin-permission-node@0.7.0-next.2 + - @backstage/plugin-search-backend-node@1.0.3-next.2 + - @backstage/plugin-auth-node@0.2.6-next.2 + - @backstage/plugin-search-common@1.1.0-next.2 + - @backstage/config@1.0.3-next.2 + - @backstage/errors@1.1.2-next.2 + - @backstage/types@1.0.0 + +## 1.1.0-next.1 + +### Minor Changes + +- 16c853a6ed: Be less restrictive with unknown keys on query endpoint +- a799972bb1: The query received by search engines now contains a property called `pageLimit`, it specifies how many results to return per page when sending a query request to the search backend. + + Example: + _Returns up to 30 results per page_ + + GET /query?pageLimit=30 + + The search backend validates the page limit and this value must not exceed 100, but it doesn't set a default value for the page limit parameter, it leaves it up to each search engine to set this, so Lunr, Postgres and Elastic Search set 25 results per page as a default value. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.2-next.1 + - @backstage/plugin-search-common@1.1.0-next.1 + - @backstage/plugin-search-backend-node@1.0.3-next.1 + - @backstage/config@1.0.3-next.1 + - @backstage/errors@1.1.2-next.1 + - @backstage/types@1.0.0 + - @backstage/plugin-auth-node@0.2.6-next.1 + - @backstage/plugin-permission-common@0.6.5-next.1 + - @backstage/plugin-permission-node@0.6.6-next.1 + +## 1.0.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.2-next.0 + - @backstage/plugin-auth-node@0.2.6-next.0 + - @backstage/plugin-permission-node@0.6.6-next.0 + - @backstage/config@1.0.3-next.0 + - @backstage/errors@1.1.2-next.0 + - @backstage/types@1.0.0 + - @backstage/plugin-permission-common@0.6.5-next.0 + - @backstage/plugin-search-backend-node@1.0.3-next.0 + - @backstage/plugin-search-common@1.0.2-next.0 + +## 1.0.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.1 + - @backstage/plugin-auth-node@0.2.5 + - @backstage/plugin-permission-node@0.6.5 + - @backstage/plugin-search-backend-node@1.0.2 + - @backstage/config@1.0.2 + - @backstage/errors@1.1.1 + - @backstage/plugin-permission-common@0.6.4 + - @backstage/plugin-search-common@1.0.1 + +## 1.0.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.2-next.0 + - @backstage/errors@1.1.1-next.0 + - @backstage/plugin-permission-common@0.6.4-next.2 + - @backstage/backend-common@0.15.1-next.3 + - @backstage/plugin-auth-node@0.2.5-next.3 + - @backstage/plugin-permission-node@0.6.5-next.3 + - @backstage/plugin-search-backend-node@1.0.2-next.2 + +## 1.0.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.1-next.0 + - @backstage/plugin-search-backend-node@1.0.2-next.0 + - @backstage/plugin-auth-node@0.2.5-next.0 + - @backstage/plugin-permission-common@0.6.4-next.0 + - @backstage/plugin-permission-node@0.6.5-next.0 + - @backstage/plugin-search-common@1.0.1-next.0 + +## 1.0.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.0 + - @backstage/plugin-auth-node@0.2.4 + - @backstage/plugin-permission-node@0.6.4 + - @backstage/plugin-search-backend-node@1.0.1 + +## 1.0.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.0-next.0 + - @backstage/plugin-auth-node@0.2.4-next.0 + - @backstage/plugin-permission-node@0.6.4-next.0 + - @backstage/plugin-search-backend-node@1.0.1-next.0 + +## 1.0.0 + +### Major Changes + +- 7bd7d336b2: This package has been promoted to 1.0. Read more about what it means in [New release: Backstage Search 1.0 blog](https://backstage.io/blog/2022/07/19/releasing-backstage-search-1.0) + +### Patch Changes + +- a21cd43467: If error is `MissingIndexError` we return a 400 response with a more clear error message. +- Updated dependencies + - @backstage/backend-common@0.14.1 + - @backstage/plugin-search-backend-node@1.0.0 + - @backstage/plugin-search-common@1.0.0 + - @backstage/plugin-auth-node@0.2.3 + - @backstage/plugin-permission-common@0.6.3 + - @backstage/plugin-permission-node@0.6.3 + - @backstage/errors@1.1.0 + +## 0.5.4-next.2 + +### Patch Changes + +- a21cd43467: If error is `MissingIndexError` we return a 400 response with a more clear error message. +- Updated dependencies + - @backstage/backend-common@0.14.1-next.3 + - @backstage/plugin-auth-node@0.2.3-next.2 + - @backstage/plugin-permission-common@0.6.3-next.1 + - @backstage/plugin-permission-node@0.6.3-next.2 + - @backstage/plugin-search-backend-node@0.6.3-next.2 + +## 0.5.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.1 + - @backstage/errors@1.1.0-next.0 + - @backstage/plugin-auth-node@0.2.3-next.1 + - @backstage/plugin-permission-common@0.6.3-next.0 + - @backstage/plugin-permission-node@0.6.3-next.1 + - @backstage/plugin-search-backend-node@0.6.3-next.1 + - @backstage/plugin-search-common@0.3.6-next.0 + +## 0.5.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-auth-node@0.2.3-next.0 + - @backstage/plugin-permission-node@0.6.3-next.0 + - @backstage/plugin-search-backend-node@0.6.3-next.0 + +## 0.5.3 + +### Patch Changes + +- 7d8acfc32e: `RouterOptions` and `createRouter` now marked as public exports +- 915700f64f: The provided search engine now adds a pagination-aware `rank` value to all results. +- Updated dependencies + - @backstage/plugin-search-common@0.3.5 + - @backstage/plugin-permission-node@0.6.2 + - @backstage/backend-common@0.14.0 + - @backstage/plugin-auth-node@0.2.2 + - @backstage/plugin-search-backend-node@0.6.2 + - @backstage/plugin-permission-common@0.6.2 + +## 0.5.3-next.2 + +### Patch Changes + +- 7d8acfc32e: `RouterOptions` and `createRouter` now marked as public exports +- Updated dependencies + - @backstage/plugin-search-common@0.3.5-next.1 + - @backstage/backend-common@0.14.0-next.2 + - @backstage/plugin-search-backend-node@0.6.2-next.2 + - @backstage/plugin-auth-node@0.2.2-next.2 + - @backstage/plugin-permission-node@0.6.2-next.2 + +## 0.5.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.6-next.1 + - @backstage/plugin-auth-node@0.2.2-next.1 + - @backstage/plugin-permission-common@0.6.2-next.0 + - @backstage/plugin-permission-node@0.6.2-next.1 + - @backstage/plugin-search-backend-node@0.6.2-next.1 + - @backstage/plugin-search-common@0.3.5-next.0 + +## 0.5.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.6-next.0 + - @backstage/plugin-search-backend-node@0.6.2-next.0 + - @backstage/plugin-auth-node@0.2.2-next.0 + - @backstage/plugin-permission-node@0.6.2-next.0 + +## 0.5.2 + +### Patch Changes + +- 8cc75993a6: Fixed issue in `PermissionEvaluator` instance check that would cause unexpected "invalid union" errors. +- Updated dependencies + - @backstage/backend-common@0.13.3 + - @backstage/config@1.0.1 + - @backstage/plugin-search-backend-node@0.6.1 + - @backstage/plugin-auth-node@0.2.1 + - @backstage/plugin-search-common@0.3.4 + - @backstage/plugin-permission-common@0.6.1 + - @backstage/plugin-permission-node@0.6.1 + +## 0.5.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-search-backend-node@0.6.1-next.1 + - @backstage/plugin-search-common@0.3.4-next.0 + - @backstage/plugin-auth-node@0.2.1-next.1 + - @backstage/plugin-permission-common@0.6.1-next.0 + - @backstage/plugin-permission-node@0.6.1-next.1 + +## 0.5.2-next.0 + +### Patch Changes + +- 8cc75993a6: Fixed issue in `PermissionEvaluator` instance check that would cause unexpected "invalid union" errors. +- Updated dependencies + - @backstage/backend-common@0.13.3-next.0 + - @backstage/plugin-auth-node@0.2.1-next.0 + - @backstage/plugin-permission-node@0.6.1-next.0 + - @backstage/plugin-search-backend-node@0.6.1-next.0 + +## 0.5.0 + +### Minor Changes + +- 94ccd772d4: **BREAKING**: The `authorization` property is no longer returned on search results when queried. Note: this will only result in a breaking change if you have custom code in your frontend that relies on the `authorization.resourceRef` property on documents. + +### Patch Changes + +- 30f9884359: Check for non-resource permissions when authorizing result-by-result in AuthorizedSearchEngine. +- 3c8cfaaa80: Use `PermissionEvaluator` instead of `PermissionAuthorizer`, which is now deprecated. +- 62ee65422c: Use new `IndexableResultSet` type as return type of query method in `SearchEngine` implementation. +- c98d271466: Use updated types from `@backstage/plugin-permission-common` +- Updated dependencies + - @backstage/plugin-permission-common@0.6.0 + - @backstage/plugin-permission-node@0.6.0 + - @backstage/plugin-auth-node@0.2.0 + - @backstage/plugin-search-common@0.3.3 + - @backstage/backend-common@0.13.2 + - @backstage/plugin-search-backend-node@0.6.0 + +## 0.5.0-next.2 + +### Patch Changes + +- 3c8cfaaa80: Use `PermissionEvaluator` instead of `PermissionAuthorizer`, which is now deprecated. +- Updated dependencies + - @backstage/plugin-permission-common@0.6.0-next.1 + - @backstage/plugin-permission-node@0.6.0-next.2 + - @backstage/backend-common@0.13.2-next.2 + - @backstage/plugin-search-backend-node@0.6.0-next.1 + +## 0.5.0-next.1 + +### Patch Changes + +- 30f9884359: Check for non-resource permissions when authorizing result-by-result in AuthorizedSearchEngine. +- c98d271466: Use updated types from `@backstage/plugin-permission-common` +- Updated dependencies + - @backstage/plugin-permission-common@0.6.0-next.0 + - @backstage/plugin-permission-node@0.6.0-next.1 + - @backstage/backend-common@0.13.2-next.1 + - @backstage/plugin-search-common@0.3.3-next.1 + +## 0.5.0-next.0 + +### Minor Changes + +- 94ccd772d4: **BREAKING**: The `authorization` property is no longer returned on search results when queried. Note: this will only result in a breaking change if you have custom code in your frontend that relies on the `authorization.resourceRef` property on documents. + +### Patch Changes + +- 62ee65422c: Use new `IndexableResultSet` type as return type of query method in `SearchEngine` implementation. +- Updated dependencies + - @backstage/plugin-auth-node@0.2.0-next.0 + - @backstage/plugin-search-common@0.3.3-next.0 + - @backstage/plugin-search-backend-node@0.5.3-next.0 + - @backstage/backend-common@0.13.2-next.0 + - @backstage/plugin-permission-node@0.5.6-next.0 + +## 0.4.8 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.1 + - @backstage/config@1.0.0 + - @backstage/errors@1.0.0 + - @backstage/types@1.0.0 + - @backstage/plugin-permission-common@0.5.3 + - @backstage/plugin-search-backend-node@0.5.2 + - @backstage/plugin-auth-node@0.1.6 + - @backstage/plugin-permission-node@0.5.5 + - @backstage/plugin-search-common@0.3.2 + +## 0.4.7 + +### Patch Changes + +- 3e54f6c436: Use `@backstage/plugin-search-common` package instead of `@backstage/search-common`. +- Updated dependencies + - @backstage/backend-common@0.13.0 + - @backstage/plugin-search-common@0.3.1 + - @backstage/plugin-search-backend-node@0.5.1 + - @backstage/plugin-auth-node@0.1.5 + - @backstage/plugin-permission-node@0.5.4 + +## 0.4.7-next.0 + +### Patch Changes + +- 3e54f6c436: Use `@backstage/plugin-search-common` package instead of `@backstage/search-common`. +- Updated dependencies + - @backstage/backend-common@0.13.0-next.0 + - @backstage/plugin-search-common@0.3.1-next.0 + - @backstage/plugin-search-backend-node@0.5.1-next.0 + - @backstage/plugin-auth-node@0.1.5-next.0 + - @backstage/plugin-permission-node@0.5.4-next.0 + +## 0.4.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.12.0 + - @backstage/plugin-permission-common@0.5.2 + - @backstage/plugin-permission-node@0.5.3 + - @backstage/plugin-search-backend-node@0.5.0 + - @backstage/search-common@0.3.0 + - @backstage/plugin-auth-node@0.1.4 + +## 0.4.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.11.0 + - @backstage/plugin-permission-node@0.5.2 + - @backstage/plugin-auth-node@0.1.3 + +## 0.4.4 + +### Patch Changes + +- Fix for the previous release with missing type declarations. +- Updated dependencies + - @backstage/backend-common@0.10.9 + - @backstage/config@0.1.15 + - @backstage/errors@0.2.2 + - @backstage/search-common@0.2.4 + - @backstage/types@0.1.3 + - @backstage/plugin-auth-node@0.1.2 + - @backstage/plugin-permission-common@0.5.1 + - @backstage/plugin-permission-node@0.5.1 + - @backstage/plugin-search-backend-node@0.4.7 + +## 0.4.3 + +### Patch Changes + +- c77c5c7eb6: Added `backstage.role` to `package.json` +- Updated dependencies + - @backstage/backend-common@0.10.8 + - @backstage/errors@0.2.1 + - @backstage/plugin-auth-node@0.1.1 + - @backstage/plugin-permission-common@0.5.0 + - @backstage/config@0.1.14 + - @backstage/search-common@0.2.3 + - @backstage/types@0.1.2 + - @backstage/plugin-permission-node@0.5.0 + - @backstage/plugin-search-backend-node@0.4.6 + +## 0.4.2 + +### Patch Changes + +- b3f3e42036: Use `getBearerTokenFromAuthorizationHeader` from `@backstage/plugin-auth-node` instead of the deprecated `IdentityClient` method. +- Updated dependencies + - @backstage/backend-common@0.10.7 + - @backstage/plugin-auth-node@0.1.0 + - @backstage/plugin-permission-node@0.4.3 + +## 0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.10.0-next.0 + - @backstage/backend-common@0.10.7-next.0 + - @backstage/plugin-permission-node@0.4.3-next.0 + +## 0.4.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.9.0 + - @backstage/backend-common@0.10.6 + - @backstage/plugin-permission-node@0.4.2 + +## 0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.9.0-next.1 + - @backstage/backend-common@0.10.6-next.0 + - @backstage/plugin-permission-node@0.4.2-next.1 + +## 0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.9.0-next.0 + - @backstage/plugin-permission-node@0.4.2-next.0 + +## 0.4.0 + +### Minor Changes + +- bbfbc755aa: **BREAKING** Added three additional required properties to `createRouter` to support filtering search results based on permissions. To make this change to an existing app, add the required parameters to the `createRouter` call in `packages/backend/src/plugins/search.ts`: + + ```diff + export default async function createPlugin({ + logger, + + permissions, + discovery, + config, + tokenManager, + }: PluginEnvironment) { + /* ... */ + + return await createRouter({ + engine: indexBuilder.getSearchEngine(), + + types: indexBuilder.getDocumentTypes(), + + permissions, + + config, + logger, + }); + } + ``` + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-node@0.4.5 + - @backstage/plugin-auth-backend@0.8.0 + - @backstage/search-common@0.2.2 + - @backstage/backend-common@0.10.5 + - @backstage/plugin-permission-node@0.4.1 + +## 0.3.1 + +### Patch Changes + +- cd6854046e: Validate query string in search endpoint +- Updated dependencies + - @backstage/backend-common@0.10.4 + - @backstage/config@0.1.13 + +## 0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.10.4-next.0 + +## 0.3.0 + +### Minor Changes + +- a41fbfe739: Search result location filtering + + This change introduces a filter for search results based on their location protocol. The intention is to filter out unsafe or + malicious values before they can be consumed by the frontend. By default locations must be http/https URLs (or paths). + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.10.0 + +## 0.2.8 + +### Patch Changes + +- dcd1a0c3f4: Minor improvement to the API reports, by not unpacking arguments directly +- Updated dependencies + - @backstage/backend-common@0.9.13 + +## 0.2.7 + +### Patch Changes + +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + + More information can be found here: + +- Updated dependencies + - @backstage/backend-common@0.9.11 + +## 0.2.6 + +### Patch Changes + +- a13f21cdc: Implement optional `pageCursor` based paging in search. + + To use paging in your app, add a `` to your + `SearchPage.tsx`. + +- Updated dependencies + - @backstage/search-common@0.2.0 + - @backstage/plugin-search-backend-node@0.4.2 + - @backstage/backend-common@0.9.1 + +## 0.2.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.9.0 + +## 0.2.4 + +### Patch Changes + +- 64baedea5: Improve search query logging message +- Updated dependencies + - @backstage/backend-common@0.8.10 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.8.6 + - @backstage/plugin-search-backend-node@0.4.0 + +## 0.2.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.8.5 + - @backstage/plugin-search-backend-node@0.3.0 + +## 0.2.1 + +### Patch Changes + +- 3108ff7bf: Make `yarn dev` respect the `PLUGIN_PORT` environment variable. +- Updated dependencies + - @backstage/plugin-search-backend-node@0.2.1 + - @backstage/backend-common@0.8.3 + +## 0.2.0 + +### Minor Changes + +- 5aff84759: This release represents a move out of a pre-alpha phase of the Backstage Search + plugin, into an alpha phase. With this release, you gain more control over the + layout of your search page on the frontend, as well as the ability to extend + search on the backend to encompass everything Backstage users may want to find. + + If you are updating to version `v0.4.0` of `@backstage/plugin-search` from a + prior release, you will need to make modifications to your app backend. + + First, navigate to your backend package and install the two related search + backend packages: + + ```sh + cd packages/backend + yarn add @backstage/plugin-search-backend @backstage/plugin-search-backend-node + ``` + + Wire up these new packages into your app backend by first creating a new + `search.ts` file at `src/plugins/search.ts` with contents like the following: + + ```typescript + import { useHotCleanup } from '@backstage/backend-common'; + import { createRouter } from '@backstage/plugin-search-backend'; + import { + IndexBuilder, + LunrSearchEngine, + } from '@backstage/plugin-search-backend-node'; + import { PluginEnvironment } from '../types'; + import { DefaultCatalogCollator } from '@backstage/plugin-catalog-backend'; + + export default async function createPlugin({ + logger, + discovery, + }: PluginEnvironment) { + // Initialize a connection to a search engine. + const searchEngine = new LunrSearchEngine({ logger }); + const indexBuilder = new IndexBuilder({ logger, searchEngine }); + + // Collators are responsible for gathering documents known to plugins. This + // particular collator gathers entities from the software catalog. + indexBuilder.addCollator({ + defaultRefreshIntervalSeconds: 600, + collator: new DefaultCatalogCollator({ discovery }), + }); + + // The scheduler controls when documents are gathered from collators and sent + // to the search engine for indexing. + const { scheduler } = await indexBuilder.build(); + + // A 3 second delay gives the backend server a chance to initialize before + // any collators are executed, which may attempt requests against the API. + setTimeout(() => scheduler.start(), 3000); + useHotCleanup(module, () => scheduler.stop()); + + return await createRouter({ + engine: indexBuilder.getSearchEngine(), + logger, + }); + } + ``` + + Then, ensure the search plugin you configured above is initialized by modifying + your backend's `index.ts` file in the following ways: + + ```diff + +import search from './plugins/search'; + // ... + +const searchEnv = useHotMemoize(module, () => createEnv('search')); + // ... + +apiRouter.use('/search', await search(searchEnv)); + // ... + ``` + +### Patch Changes + +- Updated dependencies [92963779b] +- Updated dependencies [db1c8f93b] +- Updated dependencies [5aff84759] +- Updated dependencies [eda9dbd5f] + - @backstage/backend-common@0.8.2 + - @backstage/search-common@0.1.2 + - @backstage/plugin-search-backend-node@0.2.0 + +## 0.1.5 + +### Patch Changes + +- Updated dependencies [22fd8ce2a] +- Updated dependencies [f9fb4a205] + - @backstage/backend-common@0.8.0 + +## 0.1.4 + +### Patch Changes + +- Updated dependencies [e0bfd3d44] +- Updated dependencies [38ca05168] + - @backstage/backend-common@0.7.0 + +## 0.1.3 + +### Patch Changes + +- b9b2b4b76: Lunr Search Engine support +- Updated dependencies [b9b2b4b76] +- Updated dependencies [d367f63b5] +- Updated dependencies [b42531cfe] + - @backstage/plugin-search-backend-node@0.1.3 + - @backstage/backend-common@0.6.3 + +## 0.1.2 + +### Patch Changes + +- 4d248725e: Bump to use the in-repo latest `backend-common`, and the correct version of `express-promise-router` + +## @backstage/backend-plugin-api@1.7.0-next.1 + +### Minor Changes + +- bb9b471: Plugin IDs that do not match the standard format are deprecated (letters, digits, and dashes only, starting with a letter). Plugin IDs that do no match this format will be rejected in a future release. + + In addition, plugin IDs that don't match the legacy pattern that also allows underscores, with be rejected. + +## @backstage/frontend-app-api@0.15.0-next.1 + +### Minor Changes + +- 55b2ef6: **BREAKING**: Updated the behavior of the new API override logic to reject the override and block app startup instead of just logging a deprecation warning. + +### Patch Changes + +- 09032d7: Internal update to simplify testing utility implementations. +- Updated dependencies + - @backstage/frontend-defaults@0.4.0-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + +## @backstage/frontend-defaults@0.4.0-next.1 + +### Minor Changes + +- 55b2ef6: **BREAKING**: The `API_FACTORY_CONFLICT` warning is now treated as an error and will prevent the app from starting. + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-app-api@0.15.0-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/plugin-app@0.4.0-next.1 + - @backstage/core-components@0.18.7-next.1 + +## @backstage/frontend-plugin-api@0.14.0-next.1 + +### Minor Changes + +- bb9b471: Plugin IDs that do not match the standard format are deprecated (letters, digits, and dashes only, starting with a letter). Plugin IDs that do no match this format will be rejected in a future release. +- 10ebed4: **BREAKING**: Removed type support for multiple attachment points in the `ExtensionDefinitionAttachTo` type. Extensions can no longer specify an array of attachment points in the `attachTo` property. + + The runtime still supports multiple attachment points for backward compatibility with existing compiled code, but new code will receive type errors if attempting to use this pattern. + + Extensions that previously used multiple attachment points should migrate to using a Utility API pattern instead. See the [Sharing Extensions Across Multiple Locations](https://backstage.io/docs/frontend-system/architecture/27-sharing-extensions) guide for the recommended approach. + +## @backstage/integration@1.20.0-next.1 + +### Minor Changes + +- 6999f6d: The AzureUrl class in the @backstage/integration package is now able to process BOTH git branches and git tags. Initially this class only processed git branches and threw an error when non-branch Azure URLs were passed in. + +## @backstage/ui@0.12.0-next.1 + +### Minor Changes + +- 058ffd9: **BREAKING**: Removed `large` size variant from Button component as it was never implemented. + + **Migration:** + + ```diff + - + + + ``` + + **Affected components:** Button + +- 110fec0: **BREAKING**: Removed link and tint color tokens, added new status foreground tokens, and improved Link component styling + + The following color tokens have been removed: + + - `--bui-fg-link` (and all related tokens: `-hover`, `-pressed`, `-disabled`) + - `--bui-fg-tint` (and all related tokens: `-hover`, `-pressed`, `-disabled`) + - `--bui-bg-tint` (and all related tokens: `-hover`, `-pressed`, `-disabled`) + - `--bui-border-tint` (and all related tokens) + + **New Status Tokens:** + + Added dedicated tokens for status colors that distinguish between usage on status backgrounds vs. standalone usage: + + - `--bui-fg-danger-on-bg` / `--bui-fg-danger` + - `--bui-fg-warning-on-bg` / `--bui-fg-warning` + - `--bui-fg-success-on-bg` / `--bui-fg-success` + - `--bui-fg-info-on-bg` / `--bui-fg-info` + + The `-on-bg` variants are designed for text on colored backgrounds, while the base variants are for standalone status indicators with improved visibility and contrast. + + **Migration:** + + For link colors, migrate to one of the following alternatives: + + ```diff + .custom-link { + - color: var(--bui-fg-link); + + color: var(--bui-fg-info); /* For informational links */ + + /* or */ + + color: var(--bui-fg-primary); /* For standard text links */ + } + ``` + + For tint colors (backgrounds, foregrounds, borders), migrate to appropriate status or neutral colors: + + ```diff + .info-section { + - background: var(--bui-bg-tint); + + background: var(--bui-bg-info); /* For informational sections */ + + /* or */ + + background: var(--bui-bg-neutral-on-surface-0); /* For neutral emphasis */ + } + ``` + + If you're using status foreground colors on colored backgrounds, update to the new `-on-bg` tokens: + + ```diff + .error-badge { + - color: var(--bui-fg-danger); + + color: var(--bui-fg-danger-on-bg); + background: var(--bui-bg-danger); + } + ``` + + **Affected components:** Link + +### Patch Changes + +- 4d1b7f4: Fixed CSS Module syntax to comply with Next.js 16 Turbopack validation by flattening nested dark theme selectors. + + **Affected components:** Popover, Tooltip + +- 2c219b9: Added `destructive` prop to Button for dangerous actions like delete or remove. Works with all variants (primary, secondary, tertiary). + + **Affected components:** Button + +- 5af9e14: Fixed `useDefinition` hook adding literal "undefined" class name when no className prop was passed. + +- 74c5a76: Fixed Switch component disabled state styling to show `not-allowed` cursor and disabled text color. + + **Affected components:** Switch + +## @backstage/plugin-auth-backend-module-atlassian-provider@0.4.12-next.0 + +# @backstage/plugin-auth-backend-module-atlassian-provider + +## 0.4.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## 0.4.10 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10 + - @backstage/backend-plugin-api@1.6.0 + +## 0.4.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## 0.4.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + +## 0.4.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0 + - @backstage/plugin-auth-node@0.6.9 + +## 0.4.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0-next.1 + - @backstage/plugin-auth-node@0.6.9-next.1 + +## 0.4.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.9-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + +## 0.4.8 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-auth-node@0.6.8 + +## 0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## 0.4.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + +## 0.4.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + +## 0.4.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6 + - @backstage/backend-plugin-api@1.4.2 + +## 0.4.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + +## 0.4.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-auth-node@0.6.5 + +## 0.4.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-auth-node@0.6.5-next.0 + +## 0.4.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4 + - @backstage/backend-plugin-api@1.4.0 + +## 0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + +## 0.4.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + - @backstage/plugin-auth-node@0.6.4-next.0 + +## 0.4.3 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3 + - @backstage/backend-plugin-api@1.3.1 + +## 0.4.3-next.2 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.2 + - @backstage/backend-plugin-api@1.3.1-next.2 + +## 0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + +## 0.4.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/plugin-auth-node@0.6.3-next.0 + +## 0.4.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.0 + - @backstage/plugin-auth-node@0.6.2 + +## 0.4.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + +## 0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + +## 0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.0 + - @backstage/backend-plugin-api@1.2.1-next.0 + +## 0.4.0 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0 + - @backstage/plugin-auth-node@0.6.0 + +## 0.4.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/plugin-auth-node@0.6.0-next.2 + +## 0.4.0-next.1 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/plugin-auth-node@0.6.0-next.1 + +## 0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/plugin-auth-node@0.5.7-next.0 + +## 0.3.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6 + - @backstage/backend-plugin-api@1.1.1 + +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.3.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## 0.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + +## 0.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/plugin-auth-node@0.5.5-next.0 + +## 0.3.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4 + - @backstage/backend-plugin-api@1.0.2 + +## 0.3.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + +## 0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/plugin-auth-node@0.5.4-next.1 + +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + +## 0.3.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3 + - @backstage/backend-plugin-api@1.0.1 + +## 0.3.1-next.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + +## 0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + +## 0.3.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-auth-node@0.5.2 + +## 0.3.0-next.2 + +### Patch Changes + +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + +## 0.3.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + +## 0.3.0-next.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/plugin-auth-node@0.5.2-next.0 + +## 0.2.4 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0 + - @backstage/plugin-auth-node@0.5.0 + +## 0.2.4-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/plugin-auth-node@0.5.0-next.3 + +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/plugin-auth-node@0.5.0-next.2 + +## 0.2.4-next.1 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/plugin-auth-node@0.4.18-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/plugin-auth-node@0.4.18-next.0 + +## 0.2.3 + +### Patch Changes + +- b9832ae: Fix several issues with the Atlassian auth provider (type definition, profile url, profile transformation, scopes) +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/plugin-auth-node@0.4.17 + +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/plugin-auth-node@0.4.17-next.1 + +## 0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/plugin-auth-node@0.4.16-next.0 + +## 0.2.0 + +### Minor Changes + +- 8efc6cf: **BREAKING**: The `scope` and `scopes` config options have been removed and replaced by the standard `additionalScopes` config. In addition, the `offline_access`, `read:jira-work`, and `read:jira-user` scopes have been set to required and will always be present. + +### Patch Changes + +- 78a0b08: Internal refactor to handle `BackendFeature` contract change. +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19 + - @backstage/plugin-auth-node@0.4.14 + +## 0.2.0-next.2 + +### Minor Changes + +- 8efc6cf: **BREAKING**: The `scope` and `scopes` config options have been removed and replaced by the standard `additionalScopes` config. In addition, the `offline_access`, `read:jira-work`, and `read:jira-user` scopes have been set to required and will always be present. + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/plugin-auth-node@0.4.14-next.3 + +## 0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/plugin-auth-node@0.4.14-next.2 + +## 0.1.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/plugin-auth-node@0.4.14-next.0 + +## 0.1.10 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.18 + - @backstage/plugin-auth-node@0.4.13 + +## 0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + +## 0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + +## 0.1.9 + +### Patch Changes + +- 269b4c1: Read scopes from config and pass to AtlassianProvider as they are required +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17 + - @backstage/plugin-auth-node@0.4.12 + +## 0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17-next.1 + - @backstage/plugin-auth-node@0.4.12-next.1 + +## 0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17-next.0 + - @backstage/plugin-auth-node@0.4.12-next.0 + +## 0.1.8 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.11 + - @backstage/backend-plugin-api@0.6.16 + +## 0.1.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.10 + - @backstage/backend-plugin-api@0.6.15 + +## 0.1.6 + +### Patch Changes + +- c511186: Addressed OAuth flow issue in Atlassian auth module +- Updated dependencies + - @backstage/plugin-auth-node@0.4.9 + - @backstage/backend-plugin-api@0.6.14 + +## 0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.9-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 + +## 0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.14-next.1 + - @backstage/plugin-auth-node@0.4.9-next.1 + +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.8-next.0 + - @backstage/backend-plugin-api@0.6.13-next.0 + +## 0.1.2 + +### Patch Changes + +- 8472188: Added or fixed the `repository` field in `package.json`. +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4 + - @backstage/backend-plugin-api@0.6.10 + +## 0.1.2-next.3 + +### Patch Changes + +- 8472188: Added or fixed the `repository` field in `package.json`. +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4-next.3 + - @backstage/backend-plugin-api@0.6.10-next.3 + +## 0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.2 + - @backstage/plugin-auth-node@0.4.4-next.2 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/plugin-auth-node@0.4.4-next.1 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4-next.0 + - @backstage/backend-plugin-api@0.6.10-next.0 + +## 0.1.1 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## 0.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.3-next.1 + - @backstage/backend-plugin-api@0.6.9-next.1 + +## 0.1.1-next.0 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.0 + - @backstage/plugin-auth-node@0.4.3-next.0 + +## 0.1.0 + +### Minor Changes + +- 2a5891e: New module for `@backstage/plugin-auth-backend` that adds an atlassian auth provider + +### Patch Changes + +- a62764b: Updated dependency `passport` to `^0.7.0`. +- Updated dependencies + - @backstage/backend-common@0.20.0 + - @backstage/plugin-auth-node@0.4.2 + - @backstage/backend-plugin-api@0.6.8 + +## 0.1.0-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.3 + - @backstage/backend-plugin-api@0.6.8-next.3 + - @backstage/plugin-auth-node@0.4.2-next.3 + +## 0.1.0-next.2 + +### Patch Changes + +- a62764b: Updated dependency `passport` to `^0.7.0`. +- Updated dependencies + - @backstage/backend-common@0.20.0-next.2 + - @backstage/plugin-auth-node@0.4.2-next.2 + - @backstage/backend-plugin-api@0.6.8-next.2 + +## 0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.1 + - @backstage/backend-plugin-api@0.6.8-next.1 + - @backstage/plugin-auth-node@0.4.2-next.1 + +## 0.1.0-next.0 + +### Minor Changes + +- 2a5891e816: New module for `@backstage/plugin-auth-backend` that adds an atlassian auth provider + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.0 + - @backstage/plugin-auth-node@0.4.2-next.0 + - @backstage/backend-plugin-api@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.13-next.0 + +# @backstage/plugin-auth-backend-module-aws-alb-provider + +## 0.4.12-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-backend@0.26.1-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/errors@1.2.7 + +## 0.4.11 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-auth-backend@0.26.0 + - @backstage/plugin-auth-node@0.6.11 + +## 0.4.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.26.0-next.0 + - @backstage/plugin-auth-node@0.6.10 + +## 0.4.10 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10 + - @backstage/plugin-auth-backend@0.25.7 + - @backstage/backend-plugin-api@1.6.0 + +## 0.4.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.7-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/errors@1.2.7 + +## 0.4.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + - @backstage/plugin-auth-backend@0.25.7-next.0 + - @backstage/errors@1.2.7 + +## 0.4.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0 + - @backstage/plugin-auth-backend@0.25.6 + - @backstage/plugin-auth-node@0.6.9 + +## 0.4.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0-next.1 + - @backstage/plugin-auth-backend@0.25.6-next.1 + - @backstage/plugin-auth-node@0.6.9-next.1 + +## 0.4.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.6-next.0 + - @backstage/plugin-auth-node@0.6.9-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + - @backstage/errors@1.2.7 + +## 0.4.8 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-auth-backend@0.25.5 + - @backstage/plugin-auth-node@0.6.8 + +## 0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-backend@0.25.5-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## 0.4.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.4 + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + +## 0.4.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + - @backstage/plugin-auth-backend@0.25.4-next.0 + +## 0.4.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.3 + - @backstage/plugin-auth-node@0.6.6 + - @backstage/backend-plugin-api@1.4.2 + +## 0.4.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.3-next.0 + - @backstage/plugin-auth-node@0.6.6-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + - @backstage/errors@1.2.7 + +## 0.4.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.2 + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-auth-node@0.6.5 + +## 0.4.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-auth-backend@0.25.2-next.0 + - @backstage/plugin-auth-node@0.6.5-next.0 + +## 0.4.4 + +### Patch Changes + +- c83cd8b: Fixed some circular or otherwise unclear imports +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4 + - @backstage/backend-plugin-api@1.4.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-backend@0.25.1 + +## 0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-backend@0.25.1-next.1 + +## 0.4.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + - @backstage/plugin-auth-backend@0.25.1-next.0 + - @backstage/plugin-auth-node@0.6.4-next.0 + +## 0.4.3 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.0 + - @backstage/plugin-auth-node@0.6.3 + - @backstage/backend-plugin-api@1.3.1 + - @backstage/errors@1.2.7 + +## 0.4.3-next.2 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.0-next.2 + - @backstage/plugin-auth-node@0.6.3-next.2 + - @backstage/backend-plugin-api@1.3.1-next.2 + - @backstage/errors@1.2.7 + +## 0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.0-next.1 + - @backstage/plugin-auth-node@0.6.3-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + - @backstage/errors@1.2.7 + +## 0.4.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.0-next.0 + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/plugin-auth-node@0.6.3-next.0 + - @backstage/errors@1.2.7 + +## 0.4.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.5 + - @backstage/backend-plugin-api@1.3.0 + - @backstage/plugin-auth-node@0.6.2 + - @backstage/errors@1.2.7 + +## 0.4.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.5-next.2 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.6.1 + +## 0.4.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.5-next.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/errors@1.2.7 + +## 0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.5-next.0 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/errors@1.2.7 + +## 0.4.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-auth-backend@0.24.4 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/errors@1.2.7 + +## 0.4.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.1-next.1 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-backend@0.24.4-next.2 + - @backstage/plugin-auth-node@0.6.1-next.1 + +## 0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.1 + - @backstage/plugin-auth-backend@0.24.4-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + - @backstage/errors@1.2.7 + +## 0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.4-next.0 + - @backstage/plugin-auth-node@0.6.1-next.0 + - @backstage/backend-plugin-api@1.2.1-next.0 + +## 0.4.0 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0 + - @backstage/plugin-auth-node@0.6.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-backend@0.24.3 + +## 0.4.0-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/plugin-auth-backend@0.24.3-next.3 + - @backstage/plugin-auth-node@0.6.0-next.2 + - @backstage/errors@1.2.7 + +## 0.4.0-next.2 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/plugin-auth-node@0.6.0-next.1 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-backend@0.24.3-next.2 + +## 0.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-backend@0.24.3-next.1 + - @backstage/plugin-auth-node@0.5.7-next.0 + +## 0.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-backend@0.24.3-next.0 + - @backstage/plugin-auth-node@0.5.7-next.0 + +## 0.3.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6 + - @backstage/plugin-auth-backend@0.24.2 + - @backstage/backend-plugin-api@1.1.1 + - @backstage/errors@1.2.7 + +## 0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-backend@0.24.2-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/plugin-auth-backend@0.24.2-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/errors@1.2.6 + +## 0.3.1 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.1 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + +## 0.3.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## 0.3.1-next.1 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.1-next.1 + - @backstage/plugin-auth-node@0.5.5-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + - @backstage/errors@1.2.5 + +## 0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/plugin-auth-node@0.5.5-next.0 + - @backstage/errors@1.2.5 + - @backstage/plugin-auth-backend@0.24.1-next.0 + +## 0.3.0 + +### Minor Changes + +- 75168e3: **BREAKING**: The AWS ALB `fullProfile` will no longer have the its username or email converted to lowercase. This is to ensure unique handling of the users. You may need to update and configure a custom sign-in resolver or profile transform as a result. + +### Patch Changes + +- 5d74716: Remove unused backend-common dependency +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.0 + - @backstage/plugin-auth-node@0.5.4 + - @backstage/backend-plugin-api@1.0.2 + - @backstage/errors@1.2.5 + +## 0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.0-next.2 + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + - @backstage/errors@1.2.4 + +## 0.3.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-backend@0.24.0-next.1 + - @backstage/plugin-auth-node@0.5.4-next.1 + +## 0.3.0-next.0 + +### Minor Changes + +- 75168e3: **BREAKING**: The AWS ALB `fullProfile` will no longer have the its username or email converted to lowercase. This is to ensure unique handling of the users. You may need to update and configure a custom sign-in resolver or profile transform as a result. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.0-next.0 + - @backstage/plugin-auth-node@0.5.4-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + - @backstage/errors@1.2.4 + +## 0.2.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- 094eaa3: Remove references to in-repo backend-common +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3 + - @backstage/plugin-auth-backend@0.23.1 + - @backstage/backend-plugin-api@1.0.1 + - @backstage/errors@1.2.4 + +## 0.2.1-next.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-backend@0.23.1-next.1 + +## 0.2.1-next.0 + +### Patch Changes + +- 094eaa3: Remove references to in-repo backend-common +- Updated dependencies + - @backstage/plugin-auth-backend@0.23.1-next.0 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/errors@1.2.4 + +## 0.2.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- ecbc47e: Fix a bug where the signer was checked from the payload instead of the header +- 8d1fb8d: Throw correct error when email is missing from the claims +- Updated dependencies + - @backstage/backend-common@0.25.0 + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-auth-node@0.5.2 + - @backstage/plugin-auth-backend@0.23.0 + - @backstage/errors@1.2.4 + +## 0.2.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.25.0-next.2 + - @backstage/plugin-auth-node@0.5.2-next.2 + - @backstage/plugin-auth-backend@0.23.0-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + - @backstage/errors@1.2.4 + +## 0.2.0-next.1 + +### Patch Changes + +- 8d1fb8d: Throw correct error when email is missing from the claims +- Updated dependencies + - @backstage/backend-common@0.25.0-next.1 + - @backstage/plugin-auth-node@0.5.2-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-backend@0.23.0-next.1 + +## 0.2.0-next.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- ecbc47e: Fix a bug where the signer was checked from the payload instead of the header +- Updated dependencies + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/plugin-auth-backend@0.23.0-next.0 + - @backstage/backend-common@0.25.0-next.0 + - @backstage/plugin-auth-node@0.5.2-next.0 + - @backstage/errors@1.2.4 + +## 0.1.15 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema + +- 4ea354f: Added a `signer` configuration option to validate against the token claims. We strongly recommend that you set this value (typically on the format `arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/my-load-balancer/1234567890123456`) to ensure that the auth provider can safely check the authenticity of any incoming tokens. + + Example: + + ```diff + auth: + providers: + awsalb: + # this is the URL of the IdP you configured + issuer: 'https://example.okta.com/oauth2/default' + # this is the ARN of your ALB instance + + signer: 'arn:aws:elasticloadbalancing:us-east-2:123456789012:loadbalancer/app/my-load-balancer/1234567890123456' + # this is the region where your ALB instance resides + region: 'us-west-2' + signIn: + resolvers: + # typically you would pick one of these + - resolver: emailMatchingUserEntityProfileEmail + - resolver: emailLocalPartMatchingUserEntityName + ``` + +- 93095ee: Make sure node-fetch is version 2.7.0 or greater + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0 + - @backstage/backend-common@0.24.0 + - @backstage/plugin-auth-backend@0.22.10 + - @backstage/plugin-auth-node@0.5.0 + - @backstage/errors@1.2.4 + +## 0.1.15-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/backend-common@0.23.4-next.3 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-backend@0.22.10-next.3 + - @backstage/plugin-auth-node@0.5.0-next.3 + +## 0.1.15-next.2 + +### Patch Changes + +- 93095ee: Make sure node-fetch is version 2.7.0 or greater +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/backend-common@0.23.4-next.2 + - @backstage/plugin-auth-backend@0.22.10-next.2 + - @backstage/plugin-auth-node@0.5.0-next.2 + - @backstage/errors@1.2.4 + +## 0.1.15-next.1 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/plugin-auth-backend@0.22.10-next.1 + - @backstage/backend-common@0.23.4-next.1 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.18-next.1 + +## 0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.23.4-next.0 + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-backend@0.22.10-next.0 + - @backstage/plugin-auth-node@0.4.18-next.0 + +## 0.1.14 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/backend-common@0.23.3 + - @backstage/plugin-auth-node@0.4.17 + - @backstage/plugin-auth-backend@0.22.9 + - @backstage/errors@1.2.4 + +## 0.1.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.23.3-next.1 + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-backend@0.22.9-next.1 + - @backstage/plugin-auth-node@0.4.17-next.1 + +## 0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/backend-common@0.23.2-next.0 + - @backstage/plugin-auth-backend@0.22.8-next.0 + - @backstage/plugin-auth-node@0.4.16-next.0 + - @backstage/errors@1.2.4 + +## 0.1.11 + +### Patch Changes + +- 78a0b08: Internal refactor to handle `BackendFeature` contract change. +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-common@0.23.0 + - @backstage/backend-plugin-api@0.6.19 + - @backstage/plugin-auth-node@0.4.14 + - @backstage/plugin-auth-backend@0.22.6 + - @backstage/errors@1.2.4 + +## 0.1.11-next.3 + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/plugin-auth-node@0.4.14-next.3 + - @backstage/plugin-auth-backend@0.22.6-next.3 + - @backstage/backend-common@0.23.0-next.3 + - @backstage/errors@1.2.4 + +## 0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/backend-common@0.23.0-next.2 + - @backstage/plugin-auth-backend@0.22.6-next.2 + - @backstage/plugin-auth-node@0.4.14-next.2 + - @backstage/errors@1.2.4 + +## 0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.1 + - @backstage/backend-common@0.23.0-next.1 + - @backstage/plugin-auth-backend@0.22.6-next.1 + - @backstage/plugin-auth-node@0.4.14-next.1 + +## 0.1.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.1-next.0 + - @backstage/plugin-auth-backend@0.22.6-next.0 + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/plugin-auth-node@0.4.14-next.0 + - @backstage/errors@1.2.4 + +## 0.1.10 + +### Patch Changes + +- 4a0577e: fix: Move config declarations to appropriate auth backend modules +- Updated dependencies + - @backstage/backend-common@0.22.0 + - @backstage/backend-plugin-api@0.6.18 + - @backstage/plugin-auth-backend@0.22.5 + - @backstage/plugin-auth-node@0.4.13 + +## 0.1.10-next.2 + +### Patch Changes + +- 4a0577e: fix: Move config declarations to appropriate auth backend modules +- Updated dependencies + - @backstage/backend-common@0.22.0-next.2 + - @backstage/plugin-auth-backend@0.22.5-next.2 + +## 0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.1 + - @backstage/plugin-auth-backend@0.22.5-next.1 + - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + +## 0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.22.5-next.0 + - @backstage/plugin-auth-node@0.4.13-next.0 + - @backstage/backend-common@0.21.8-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + - @backstage/errors@1.2.4 + +## 0.1.9 + +### Patch Changes + +- f286d59: Added support for AWS GovCloud (US) regions + +- 30f5a51: Added `authModuleAwsAlbProvider` as a default export. + + It can now be used like this in your backend: `backend.add(import('@backstage/plugin-auth-backend-module-aws-alb-provider'));` + +- Updated dependencies + - @backstage/backend-common@0.21.7 + - @backstage/plugin-auth-backend@0.22.4 + - @backstage/backend-plugin-api@0.6.17 + - @backstage/plugin-auth-node@0.4.12 + - @backstage/errors@1.2.4 + +## 0.1.9-next.1 + +### Patch Changes + +- 30f5a51: Added `authModuleAwsAlbProvider` as a default export. + + It can now be used like this in your backend: `backend.add(import('@backstage/plugin-auth-backend-module-aws-alb-provider'));` + +- Updated dependencies + - @backstage/backend-common@0.21.7-next.1 + - @backstage/plugin-auth-backend@0.22.4-next.1 + - @backstage/backend-plugin-api@0.6.17-next.1 + - @backstage/plugin-auth-node@0.4.12-next.1 + - @backstage/errors@1.2.4 + +## 0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.7-next.0 + - @backstage/backend-plugin-api@0.6.17-next.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-backend@0.22.4-next.0 + - @backstage/plugin-auth-node@0.4.12-next.0 + +## 0.1.8 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.22.3 + - @backstage/plugin-auth-node@0.4.11 + - @backstage/backend-common@0.21.6 + - @backstage/backend-plugin-api@0.6.16 + - @backstage/errors@1.2.4 + +## 0.1.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.5 + - @backstage/plugin-auth-backend@0.22.2 + - @backstage/plugin-auth-node@0.4.10 + - @backstage/backend-plugin-api@0.6.15 + - @backstage/errors@1.2.4 + +## 0.1.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.22.1 + +## 0.1.5 + +### Patch Changes + +- 2af5354: Bump dependency `jose` to v5 +- b1b012d: Fix issue with `providerInfo` not being set properly for some proxy providers, by making `providerInfo` an explicit optional return from `authenticate` +- Updated dependencies + - @backstage/backend-common@0.21.4 + - @backstage/plugin-auth-node@0.4.9 + - @backstage/errors@1.2.4 + - @backstage/backend-plugin-api@0.6.14 + - @backstage/plugin-auth-backend@0.22.0 + +## 0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.4-next.2 + - @backstage/plugin-auth-backend@0.22.0-next.2 + - @backstage/plugin-auth-node@0.4.9-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 + - @backstage/errors@1.2.4-next.0 + +## 0.1.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.4-next.1 + - @backstage/backend-plugin-api@0.6.14-next.1 + - @backstage/plugin-auth-backend@0.22.0-next.1 + - @backstage/plugin-auth-node@0.4.9-next.1 + - @backstage/errors@1.2.4-next.0 + +## 0.1.4-next.0 + +### Patch Changes + +- 2af5354: Bump dependency `jose` to v5 +- b1b012d: Fix issue with `providerInfo` not being set properly for some proxy providers, by making `providerInfo` an explicit optional return from `authenticate` +- Updated dependencies + - @backstage/backend-common@0.21.3-next.0 + - @backstage/plugin-auth-node@0.4.8-next.0 + - @backstage/errors@1.2.4-next.0 + - @backstage/backend-plugin-api@0.6.13-next.0 + - @backstage/plugin-auth-backend@0.22.0-next.0 + +## 0.1.0 + +### Minor Changes + +- 23a98f8: Migrated the AWS ALB auth provider to new `@backstage/plugin-auth-backend-module-aws-alb-provider` module package. + +### Patch Changes + +- d309cad: Refactored to use the `jose` library for JWT handling. +- Updated dependencies + - @backstage/backend-common@0.21.0 + - @backstage/plugin-auth-backend@0.21.0 + - @backstage/plugin-auth-node@0.4.4 + - @backstage/backend-plugin-api@0.6.10 + - @backstage/errors@1.2.3 + +## 0.1.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0-next.3 + - @backstage/plugin-auth-backend@0.21.0-next.3 + - @backstage/plugin-auth-node@0.4.4-next.3 + - @backstage/backend-plugin-api@0.6.10-next.3 + - @backstage/errors@1.2.3 + +## 0.1.0-next.1 + +### Patch Changes + +- d309cad: Refactored to use the `jose` library for JWT handling. +- Updated dependencies + - @backstage/plugin-auth-backend@0.21.0-next.2 + - @backstage/backend-common@0.21.0-next.2 + - @backstage/backend-plugin-api@0.6.10-next.2 + - @backstage/plugin-auth-node@0.4.4-next.2 + - @backstage/errors@1.2.3 + +## 0.1.0-next.0 + +### Minor Changes + +- 23a98f8: Migrated the AWS ALB auth provider to new `@backstage/plugin-auth-backend-module-aws-alb-provider` module package. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/backend-common@0.21.0-next.1 + - @backstage/plugin-auth-backend@0.20.4-next.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-auth-node@0.4.4-next.1 + +## @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.17-next.0 + +# @backstage/plugin-auth-backend-module-azure-easyauth-provider + +## 0.2.16-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + +## 0.2.15 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10 + - @backstage/backend-plugin-api@1.6.0 + +## 0.2.15-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + +## 0.2.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + +## 0.2.14 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0 + - @backstage/plugin-auth-node@0.6.9 + - @backstage/catalog-model@1.7.6 + +## 0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0-next.1 + - @backstage/plugin-auth-node@0.6.9-next.1 + +## 0.2.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.9-next.0 + - @backstage/catalog-model@1.7.6-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + - @backstage/errors@1.2.7 + +## 0.2.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-auth-node@0.6.8 + +## 0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## 0.2.12 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + +## 0.2.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + +## 0.2.11 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6 + - @backstage/backend-plugin-api@1.4.2 + +## 0.2.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/errors@1.2.7 + +## 0.2.10 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.5 + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-auth-node@0.6.5 + +## 0.2.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.7.5-next.0 + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-auth-node@0.6.5-next.0 + +## 0.2.9 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4 + - @backstage/backend-plugin-api@1.4.0 + - @backstage/catalog-model@1.7.4 + - @backstage/errors@1.2.7 + +## 0.2.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + - @backstage/catalog-model@1.7.4 + - @backstage/errors@1.2.7 + +## 0.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + - @backstage/plugin-auth-node@0.6.4-next.0 + +## 0.2.8 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/catalog-model@1.7.4 + - @backstage/plugin-auth-node@0.6.3 + - @backstage/backend-plugin-api@1.3.1 + - @backstage/errors@1.2.7 + +## 0.2.8-next.2 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.2 + - @backstage/backend-plugin-api@1.3.1-next.2 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + +## 0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/plugin-auth-node@0.6.3-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + +## 0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.0 + - @backstage/plugin-auth-node@0.6.2 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + +## 0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + +## 0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + +## 0.2.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.0 + - @backstage/backend-plugin-api@1.2.1-next.0 + +## 0.2.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0 + - @backstage/plugin-auth-node@0.6.0 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + +## 0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/plugin-auth-node@0.6.0-next.2 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + +## 0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/plugin-auth-node@0.6.0-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.5.7-next.0 + +## 0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6 + - @backstage/backend-plugin-api@1.1.1 + - @backstage/catalog-model@1.7.3 + - @backstage/errors@1.2.7 + +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-model@1.7.2 + - @backstage/errors@1.2.6 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/catalog-model@1.7.2-next.0 + +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + - @backstage/catalog-model@1.7.1 + - @backstage/errors@1.2.5 + +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/plugin-auth-node@0.5.5-next.0 + - @backstage/catalog-model@1.7.1 + - @backstage/errors@1.2.5 + +## 0.2.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4 + - @backstage/backend-plugin-api@1.0.2 + - @backstage/catalog-model@1.7.1 + - @backstage/errors@1.2.5 + +## 0.2.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + +## 0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.5.4-next.1 + +## 0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + +## 0.2.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3 + - @backstage/backend-plugin-api@1.0.1 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + +## 0.2.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-auth-node@0.5.2 + - @backstage/catalog-model@1.7.0 + - @backstage/errors@1.2.4 + +## 0.2.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + - @backstage/catalog-model@1.6.0 + - @backstage/errors@1.2.4 + +## 0.2.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + - @backstage/catalog-model@1.6.0 + - @backstage/errors@1.2.4 + +## 0.2.0-next.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/plugin-auth-node@0.5.2-next.0 + - @backstage/catalog-model@1.6.0 + - @backstage/errors@1.2.4 + +## 0.1.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0 + - @backstage/plugin-auth-node@0.5.0 + - @backstage/catalog-model@1.6.0 + - @backstage/errors@1.2.4 + +## 0.1.6-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/catalog-model@1.6.0-next.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.5.0-next.3 + +## 0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/plugin-auth-node@0.5.0-next.2 + - @backstage/catalog-model@1.5.0 + - @backstage/errors@1.2.4 + +## 0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/catalog-model@1.5.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.18-next.1 + +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/catalog-model@1.5.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.18-next.0 + +## 0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/plugin-auth-node@0.4.17 + - @backstage/catalog-model@1.5.0 + - @backstage/errors@1.2.4 + +## 0.1.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/catalog-model@1.5.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.17-next.1 + +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/plugin-auth-node@0.4.16-next.0 + - @backstage/catalog-model@1.5.0 + - @backstage/errors@1.2.4 + +## 0.1.2 + +### Patch Changes + +- 78a0b08: Internal refactor to handle `BackendFeature` contract change. +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19 + - @backstage/plugin-auth-node@0.4.14 + - @backstage/catalog-model@1.5.0 + - @backstage/errors@1.2.4 + +## 0.1.2-next.2 + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/plugin-auth-node@0.4.14-next.3 + - @backstage/catalog-model@1.5.0 + - @backstage/errors@1.2.4 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/plugin-auth-node@0.4.14-next.2 + - @backstage/catalog-model@1.5.0 + - @backstage/errors@1.2.4 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/plugin-auth-node@0.4.14-next.0 + - @backstage/catalog-model@1.5.0 + - @backstage/errors@1.2.4 + +## 0.1.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.5.0 + - @backstage/backend-plugin-api@0.6.18 + - @backstage/plugin-auth-node@0.4.13 + +## 0.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.5.0-next.0 + - @backstage/plugin-auth-node@0.4.13-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + - @backstage/errors@1.2.4 + +## 0.1.0 + +### Minor Changes + +- 06a6725: New auth backend module to add `azure-easyauth` provider. Note that as part of this change the default provider ID has been changed from `easyAuth` to `azureEasyAuth`, which means that if you switch to this new module you need to update your app config as well as the `provider` prop of the `ProxiedSignInPage` in the frontend. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17 + - @backstage/plugin-auth-node@0.4.12 + - @backstage/catalog-model@1.4.5 + - @backstage/errors@1.2.4 + +## @backstage/plugin-auth-backend-module-bitbucket-provider@0.3.12-next.0 + +# @backstage/plugin-auth-backend-module-bitbucket-provider + +## 0.3.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## 0.3.10 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10 + - @backstage/backend-plugin-api@1.6.0 + +## 0.3.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## 0.3.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + +## 0.3.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0 + - @backstage/plugin-auth-node@0.6.9 + +## 0.3.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0-next.1 + - @backstage/plugin-auth-node@0.6.9-next.1 + +## 0.3.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.9-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + +## 0.3.8 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-auth-node@0.6.8 + +## 0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## 0.3.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + +## 0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + +## 0.3.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6 + - @backstage/backend-plugin-api@1.4.2 + +## 0.3.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + +## 0.3.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-auth-node@0.6.5 + +## 0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-auth-node@0.6.5-next.0 + +## 0.3.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4 + - @backstage/backend-plugin-api@1.4.0 + +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + - @backstage/plugin-auth-node@0.6.4-next.0 + +## 0.3.3 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3 + - @backstage/backend-plugin-api@1.3.1 + +## 0.3.3-next.2 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.2 + - @backstage/backend-plugin-api@1.3.1-next.2 + +## 0.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + +## 0.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/plugin-auth-node@0.6.3-next.0 + +## 0.3.2 + +### Patch Changes + +- 5d10f99: Enabled persistency of scopes for Bitbucket Cloud. +- Updated dependencies + - @backstage/backend-plugin-api@1.3.0 + - @backstage/plugin-auth-node@0.6.2 + +## 0.3.2-next.0 + +### Patch Changes + +- 5d10f99: Enabled persistency of scopes for Bitbucket Cloud. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + +## 0.3.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + +## 0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + +## 0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.0 + - @backstage/backend-plugin-api@1.2.1-next.0 + +## 0.3.0 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0 + - @backstage/plugin-auth-node@0.6.0 + +## 0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/plugin-auth-node@0.6.0-next.2 + +## 0.3.0-next.1 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/plugin-auth-node@0.6.0-next.1 + +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/plugin-auth-node@0.5.7-next.0 + +## 0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6 + - @backstage/backend-plugin-api@1.1.1 + +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/plugin-auth-node@0.5.5-next.0 + +## 0.2.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4 + - @backstage/backend-plugin-api@1.0.2 + +## 0.2.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + +## 0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/plugin-auth-node@0.5.4-next.1 + +## 0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + +## 0.2.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3 + - @backstage/backend-plugin-api@1.0.1 + +## 0.2.1-next.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + +## 0.2.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-auth-node@0.5.2 + +## 0.2.0-next.2 + +### Patch Changes + +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + +## 0.2.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + +## 0.2.0-next.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/plugin-auth-node@0.5.2-next.0 + +## 0.1.6 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0 + - @backstage/plugin-auth-node@0.5.0 + +## 0.1.6-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/plugin-auth-node@0.5.0-next.3 + +## 0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/plugin-auth-node@0.5.0-next.2 + +## 0.1.6-next.1 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/plugin-auth-node@0.4.18-next.1 + +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/plugin-auth-node@0.4.18-next.0 + +## 0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/plugin-auth-node@0.4.17 + +## 0.1.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/plugin-auth-node@0.4.17-next.1 + +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/plugin-auth-node@0.4.16-next.0 + +## 0.1.2 + +### Patch Changes + +- 78a0b08: Internal refactor to handle `BackendFeature` contract change. +- 8efc6cf: Added support for the new shared `additionalScopes` configuration. In addition, the `account` scope has been set to required and will always be present. +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19 + - @backstage/plugin-auth-node@0.4.14 + +## 0.1.2-next.2 + +### Patch Changes + +- 8efc6cf: Added support for the new shared `additionalScopes` configuration. In addition, the `account` scope has been set to required and will always be present. +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/plugin-auth-node@0.4.14-next.3 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/plugin-auth-node@0.4.14-next.2 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/plugin-auth-node@0.4.14-next.0 + +## 0.1.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.18 + - @backstage/plugin-auth-node@0.4.13 + +## 0.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + +## 0.1.0 + +### Minor Changes + +- ba763b6: Migrate the Bitbucket auth provider to the new `@backstage/plugin-auth-backend-module-bitbucket-provider` module package. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17 + - @backstage/plugin-auth-node@0.4.12 + +## @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.2.12-next.0 + +# @backstage/plugin-auth-backend-module-bitbucket-server-provider + +## 0.2.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## 0.2.10 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10 + - @backstage/backend-plugin-api@1.6.0 + +## 0.2.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## 0.2.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + +## 0.2.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0 + - @backstage/plugin-auth-node@0.6.9 + +## 0.2.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0-next.1 + - @backstage/plugin-auth-node@0.6.9-next.1 + +## 0.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.9-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + +## 0.2.8 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-auth-node@0.6.8 + +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## 0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + +## 0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + +## 0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6 + - @backstage/backend-plugin-api@1.4.2 + +## 0.2.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + +## 0.2.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-auth-node@0.6.5 + +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-auth-node@0.6.5-next.0 + +## 0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4 + - @backstage/backend-plugin-api@1.4.0 + +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + - @backstage/plugin-auth-node@0.6.4-next.0 + +## 0.2.3 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3 + - @backstage/backend-plugin-api@1.3.1 + +## 0.2.3-next.2 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.2 + - @backstage/backend-plugin-api@1.3.1-next.2 + +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/plugin-auth-node@0.6.3-next.0 + +## 0.2.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.0 + - @backstage/plugin-auth-node@0.6.2 + +## 0.2.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.0 + - @backstage/backend-plugin-api@1.2.1-next.0 + +## 0.2.0 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0 + - @backstage/plugin-auth-node@0.6.0 + +## 0.2.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/plugin-auth-node@0.6.0-next.2 + +## 0.2.0-next.1 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/plugin-auth-node@0.6.0-next.1 + +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/plugin-auth-node@0.5.7-next.0 + +## 0.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6 + - @backstage/backend-plugin-api@1.1.1 + +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.1.3 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## 0.1.3-next.1 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + +## 0.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/plugin-auth-node@0.5.5-next.0 + +## 0.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4 + - @backstage/backend-plugin-api@1.0.2 + +## 0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/plugin-auth-node@0.5.4-next.1 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + +## 0.1.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3 + - @backstage/backend-plugin-api@1.0.1 + +## 0.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + +## 0.1.0 + +### Minor Changes + +- 527d973: New module for `@backstage/plugin-auth-backend` that adds a `Bitbucket Server` auth provider. + +### Patch Changes + +- 0a3a13e: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-auth-node@0.5.2 + +## 0.1.0-next.0 + +### Minor Changes + +- 527d973: New module for `@backstage/plugin-auth-backend` that adds a `Bitbucket Server` auth provider. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + +## @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.4.12-next.0 + +# @backstage/plugin-auth-backend-module-cloudflare-access-provider + +## 0.4.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## 0.4.10 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10 + - @backstage/backend-plugin-api@1.6.0 + +## 0.4.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## 0.4.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## 0.4.9 + +### 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/backend-plugin-api@1.5.0 + - @backstage/plugin-auth-node@0.6.9 + - @backstage/config@1.3.6 + +## 0.4.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0-next.1 + - @backstage/plugin-auth-node@0.6.9-next.1 + +## 0.4.9-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/plugin-auth-node@0.6.9-next.0 + - @backstage/config@1.3.6-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + - @backstage/errors@1.2.7 + +## 0.4.8 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.5 + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-auth-node@0.6.8 + +## 0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## 0.4.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + +## 0.4.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + +## 0.4.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6 + - @backstage/backend-plugin-api@1.4.2 + +## 0.4.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + +## 0.4.5 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.3 + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-auth-node@0.6.5 + +## 0.4.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.3-next.0 + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-auth-node@0.6.5-next.0 + +## 0.4.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4 + - @backstage/backend-plugin-api@1.4.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.4.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + - @backstage/plugin-auth-node@0.6.4-next.0 + +## 0.4.3 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3 + - @backstage/backend-plugin-api@1.3.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.4.3-next.2 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.2 + - @backstage/backend-plugin-api@1.3.1-next.2 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.4.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/plugin-auth-node@0.6.3-next.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.4.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.0 + - @backstage/plugin-auth-node@0.6.2 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.4.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.0 + - @backstage/backend-plugin-api@1.2.1-next.0 + +## 0.4.0 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0 + - @backstage/plugin-auth-node@0.6.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.4.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/plugin-auth-node@0.6.0-next.2 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.4.0-next.1 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/plugin-auth-node@0.6.0-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.5.7-next.0 + +## 0.3.4 + +### Patch Changes + +- d4a8246: Use the email from `cfIdentity` instead of `claims` when constructing user profile in order to support Cloudflare Service Tokens. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6 + - @backstage/backend-plugin-api@1.1.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + +## 0.3.3 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + +## 0.3.3-next.1 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + - @backstage/config@1.3.0 + - @backstage/errors@1.2.5 + +## 0.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/plugin-auth-node@0.5.5-next.0 + - @backstage/config@1.3.0 + - @backstage/errors@1.2.5 + +## 0.3.2 + +### Patch Changes + +- d52d7f9: Support ISO and ms string forms of durations in config too +- 4e58bc7: Upgrade to uuid v11 internally +- Updated dependencies + - @backstage/config@1.3.0 + - @backstage/plugin-auth-node@0.5.4 + - @backstage/backend-plugin-api@1.0.2 + - @backstage/errors@1.2.5 + +## 0.3.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.5.4-next.1 + +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.3.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3 + - @backstage/backend-plugin-api@1.0.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.3.1-next.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.3.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-auth-node@0.5.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.3.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.3.0-next.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/plugin-auth-node@0.5.2-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.2.0 + +### Minor Changes + +- 75d026a: Support for Cloudflare Custom Headers and Custom Cookie Auth Name + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- 93095ee: Make sure node-fetch is version 2.7.0 or greater +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0 + - @backstage/plugin-auth-node@0.5.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.2.0-next.3 + +### Minor Changes + +- 75d026a: Support for Cloudflare Custom Headers and Custom Cookie Auth Name + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.5.0-next.3 + +## 0.1.6-next.2 + +### Patch Changes + +- 93095ee: Make sure node-fetch is version 2.7.0 or greater +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/plugin-auth-node@0.5.0-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.1.6-next.1 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.18-next.1 + +## 0.1.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.18-next.0 + +## 0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/plugin-auth-node@0.4.17 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.1.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.17-next.1 + +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/plugin-auth-node@0.4.16-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.1.2 + +### Patch Changes + +- 78a0b08: Internal refactor to handle `BackendFeature` contract change. +- d44a20a: Added additional plugin metadata to `package.json`. +- 1354d81: Use `node-fetch` instead of native fetch, as per +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19 + - @backstage/plugin-auth-node@0.4.14 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.1.2-next.3 + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/plugin-auth-node@0.4.14-next.3 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/plugin-auth-node@0.4.14-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.1.2-next.1 + +### Patch Changes + +- 1354d81: Use `node-fetch` instead of native fetch, as per +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.1 + - @backstage/plugin-auth-node@0.4.14-next.1 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/plugin-auth-node@0.4.14-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.1.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.18 + - @backstage/plugin-auth-node@0.4.13 + +## 0.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.1.0 + +### Minor Changes + +- c26218d: Created a separate module for the Cloudflare Access auth provider + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17 + - @backstage/plugin-auth-node@0.4.12 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## @backstage/plugin-auth-backend-module-gcp-iap-provider@0.4.12-next.0 + +# @backstage/plugin-auth-backend-module-gcp-iap-provider + +## 0.4.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## 0.4.10 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10 + - @backstage/backend-plugin-api@1.6.0 + +## 0.4.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## 0.4.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## 0.4.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0 + - @backstage/plugin-auth-node@0.6.9 + +## 0.4.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0-next.1 + - @backstage/plugin-auth-node@0.6.9-next.1 + +## 0.4.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.9-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## 0.4.8 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-auth-node@0.6.8 + +## 0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## 0.4.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7 + - @backstage/types@1.2.2 + - @backstage/backend-plugin-api@1.4.3 + +## 0.4.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + +## 0.4.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6 + - @backstage/backend-plugin-api@1.4.2 + +## 0.4.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.4.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-auth-node@0.6.5 + +## 0.4.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-auth-node@0.6.5-next.0 + +## 0.4.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4 + - @backstage/backend-plugin-api@1.4.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.4.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + - @backstage/plugin-auth-node@0.6.4-next.0 + +## 0.4.3 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3 + - @backstage/backend-plugin-api@1.3.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.4.3-next.2 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.2 + - @backstage/backend-plugin-api@1.3.1-next.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.4.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/plugin-auth-node@0.6.3-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.4.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.0 + - @backstage/plugin-auth-node@0.6.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.4.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.0 + - @backstage/backend-plugin-api@1.2.1-next.0 + +## 0.4.0 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0 + - @backstage/plugin-auth-node@0.6.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.4.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/plugin-auth-node@0.6.0-next.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.4.0-next.1 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/plugin-auth-node@0.6.0-next.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + - @backstage/plugin-auth-node@0.5.7-next.0 + +## 0.3.4 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1 + - @backstage/plugin-auth-node@0.5.6 + - @backstage/backend-plugin-api@1.1.1 + - @backstage/errors@1.2.7 + +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## 0.3.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/types@1.2.0 + +## 0.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + - @backstage/errors@1.2.5 + - @backstage/types@1.2.0 + +## 0.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/plugin-auth-node@0.5.5-next.0 + - @backstage/errors@1.2.5 + - @backstage/types@1.2.0 + +## 0.3.2 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.0 + - @backstage/plugin-auth-node@0.5.4 + - @backstage/backend-plugin-api@1.0.2 + - @backstage/errors@1.2.5 + +## 0.3.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.5.4-next.1 + +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.3.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3 + - @backstage/backend-plugin-api@1.0.1 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.3.1-next.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.3.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-auth-node@0.5.2 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.3.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.3.0-next.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/plugin-auth-node@0.5.2-next.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.2.18 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- 13a9c63: Corrected the documentation for the GCP IAP auth module and updated the configuration to follow proxy configuration conventions by ignoring authEnv +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0 + - @backstage/plugin-auth-node@0.5.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.2.18-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.5.0-next.3 + +## 0.2.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/plugin-auth-node@0.5.0-next.2 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.2.18-next.1 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.18-next.1 + +## 0.2.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.18-next.0 + +## 0.2.17 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/plugin-auth-node@0.4.17 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.2.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.17-next.1 + +## 0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/plugin-auth-node@0.4.16-next.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.2.14 + +### Patch Changes + +- 78a0b08: Internal refactor to handle `BackendFeature` contract change. +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19 + - @backstage/plugin-auth-node@0.4.14 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.2.14-next.2 + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/plugin-auth-node@0.4.14-next.3 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/plugin-auth-node@0.4.14-next.2 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.2.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/plugin-auth-node@0.4.14-next.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.2.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.18 + - @backstage/plugin-auth-node@0.4.13 + +## 0.2.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + +## 0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.2.12 + +### Patch Changes + +- e0ed31c: Add user id annotation sign-in resolver +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17 + - @backstage/plugin-auth-node@0.4.12 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.2.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17-next.1 + - @backstage/plugin-auth-node@0.4.12-next.1 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.2.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17-next.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.12-next.0 + +## 0.2.11 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.11 + - @backstage/backend-plugin-api@0.6.16 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.2.10 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.10 + - @backstage/backend-plugin-api@0.6.15 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.2.9 + +### Patch Changes + +- 38af71a: Updated dependency `google-auth-library` to `^9.0.0`. +- b1b012d: Fix issue with `providerInfo` not being set properly for some proxy providers, by making `providerInfo` an explicit optional return from `authenticate` +- Updated dependencies + - @backstage/plugin-auth-node@0.4.9 + - @backstage/errors@1.2.4 + - @backstage/backend-plugin-api@0.6.14 + - @backstage/types@1.1.1 + +## 0.2.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.9-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 + - @backstage/errors@1.2.4-next.0 + - @backstage/types@1.1.1 + +## 0.2.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.14-next.1 + - @backstage/plugin-auth-node@0.4.9-next.1 + - @backstage/errors@1.2.4-next.0 + - @backstage/types@1.1.1 + +## 0.2.8-next.0 + +### Patch Changes + +- 38af71a: Updated dependency `google-auth-library` to `^9.0.0`. +- b1b012d: Fix issue with `providerInfo` not being set properly for some proxy providers, by making `providerInfo` an explicit optional return from `authenticate` +- Updated dependencies + - @backstage/plugin-auth-node@0.4.8-next.0 + - @backstage/errors@1.2.4-next.0 + - @backstage/backend-plugin-api@0.6.13-next.0 + - @backstage/types@1.1.1 + +## 0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4 + - @backstage/backend-plugin-api@0.6.10 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.4-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4-next.3 + - @backstage/backend-plugin-api@0.6.10-next.3 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.2 + - @backstage/plugin-auth-node@0.4.4-next.2 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.4-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4-next.0 + - @backstage/backend-plugin-api@0.6.10-next.0 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.3 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.3-next.1 + - @backstage/backend-plugin-api@0.6.9-next.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.3-next.0 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.0 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.3-next.0 + +## 0.2.2 + +### Patch Changes + +- cc4228e: Switched module ID to use kebab-case. +- Updated dependencies + - @backstage/plugin-auth-node@0.4.2 + - @backstage/backend-plugin-api@0.6.8 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.2-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.8-next.3 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.2-next.3 + +## 0.2.2-next.2 + +### Patch Changes + +- cc4228e: Switched module ID to use kebab-case. +- Updated dependencies + - @backstage/plugin-auth-node@0.4.2-next.2 + - @backstage/backend-plugin-api@0.6.8-next.2 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.8-next.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.2-next.1 + +## 0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.2-next.0 + - @backstage/backend-plugin-api@0.6.8-next.0 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.7 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.1 + +## 0.2.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.7-next.2 + - @backstage/plugin-auth-node@0.4.1-next.2 + +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.1-next.1 + - @backstage/backend-plugin-api@0.6.7-next.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.7-next.0 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + - @backstage/plugin-auth-node@0.4.1-next.0 + +## 0.2.0 + +### Minor Changes + +- 6f142d5356: **BREAKING** `gcpIapAuthenticator.initialize()` is no longer `async` + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.0 + - @backstage/errors@1.2.3 + - @backstage/backend-plugin-api@0.6.6 + - @backstage/types@1.1.1 + +## 0.2.0-next.2 + +### Minor Changes + +- 6f142d5356: **BREAKING** `gcpIapAuthenticator.initialize()` is no longer `async` + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.0-next.2 + - @backstage/errors@1.2.3-next.0 + - @backstage/backend-plugin-api@0.6.6-next.2 + - @backstage/types@1.1.1 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.5-next.1 + - @backstage/plugin-auth-node@0.3.2-next.1 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## 0.1.0 + +### Minor Changes + +- 8513cd7d00e3: New module for `@backstage/plugin-auth-backend` that adds a GCP IAP auth provider. + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + +## 0.1.0-next.3 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/errors@1.2.2-next.0 + - @backstage/types@1.1.1-next.0 + - @backstage/backend-plugin-api@0.6.3-next.3 + - @backstage/plugin-auth-node@0.3.0-next.3 + +## 0.1.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0-next.2 + - @backstage/backend-plugin-api@0.6.3-next.2 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## 0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3-next.1 + - @backstage/plugin-auth-node@0.3.0-next.1 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## 0.1.0-next.0 + +### Minor Changes + +- 8513cd7d00e3: New module for `@backstage/plugin-auth-backend` that adds a GCP IAP auth provider. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0-next.0 + - @backstage/backend-plugin-api@0.6.2-next.0 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## @backstage/plugin-auth-backend-module-google-provider@0.3.12-next.0 + +# @backstage/plugin-auth-backend-module-google-provider + +## 0.3.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## 0.3.10 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10 + - @backstage/backend-plugin-api@1.6.0 + +## 0.3.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## 0.3.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + +## 0.3.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0 + - @backstage/plugin-auth-node@0.6.9 + +## 0.3.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0-next.1 + - @backstage/plugin-auth-node@0.6.9-next.1 + +## 0.3.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.9-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + +## 0.3.8 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-auth-node@0.6.8 + +## 0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## 0.3.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + +## 0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + +## 0.3.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6 + - @backstage/backend-plugin-api@1.4.2 + +## 0.3.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + +## 0.3.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-auth-node@0.6.5 + +## 0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-auth-node@0.6.5-next.0 + +## 0.3.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4 + - @backstage/backend-plugin-api@1.4.0 + +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + - @backstage/plugin-auth-node@0.6.4-next.0 + +## 0.3.3 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3 + - @backstage/backend-plugin-api@1.3.1 + +## 0.3.3-next.2 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.2 + - @backstage/backend-plugin-api@1.3.1-next.2 + +## 0.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + +## 0.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/plugin-auth-node@0.6.3-next.0 + +## 0.3.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.0 + - @backstage/plugin-auth-node@0.6.2 + +## 0.3.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + +## 0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + +## 0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.0 + - @backstage/backend-plugin-api@1.2.1-next.0 + +## 0.3.0 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0 + - @backstage/plugin-auth-node@0.6.0 + +## 0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/plugin-auth-node@0.6.0-next.2 + +## 0.3.0-next.1 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/plugin-auth-node@0.6.0-next.1 + +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/plugin-auth-node@0.5.7-next.0 + +## 0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6 + - @backstage/backend-plugin-api@1.1.1 + +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.2.3 + +### Patch Changes + +- 79b055a: Pass through `includeGrantedScopes` in order to persist scopes across refresh calls +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## 0.2.3-next.1 + +### Patch Changes + +- 79b055a: Pass through `includeGrantedScopes` in order to persist scopes across refresh calls +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/plugin-auth-node@0.5.5-next.0 + +## 0.2.2 + +### Patch Changes + +- b833660: Fix visibility of config for use in front end code +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4 + - @backstage/backend-plugin-api@1.0.2 + +## 0.2.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + +## 0.2.2-next.1 + +### Patch Changes + +- b833660: Fix visibility of config for use in front end code +- Updated dependencies + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/plugin-auth-node@0.5.4-next.1 + +## 0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + +## 0.2.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3 + - @backstage/backend-plugin-api@1.0.1 + +## 0.2.1-next.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + +## 0.2.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-auth-node@0.5.2 + +## 0.2.0-next.2 + +### Patch Changes + +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + +## 0.2.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + +## 0.2.0-next.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/plugin-auth-node@0.5.2-next.0 + +## 0.1.20 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0 + - @backstage/plugin-auth-node@0.5.0 + +## 0.1.20-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/plugin-auth-node@0.5.0-next.3 + +## 0.1.20-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/plugin-auth-node@0.5.0-next.2 + +## 0.1.20-next.1 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/plugin-auth-node@0.4.18-next.1 + +## 0.1.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/plugin-auth-node@0.4.18-next.0 + +## 0.1.19 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/plugin-auth-node@0.4.17 + +## 0.1.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/plugin-auth-node@0.4.17-next.1 + +## 0.1.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/plugin-auth-node@0.4.16-next.0 + +## 0.1.16 + +### Patch Changes + +- 78a0b08: Internal refactor to handle `BackendFeature` contract change. +- 8efc6cf: Added support for the new shared `additionalScopes` configuration. In addition, the `openid`, `userinfo.email`, and `userinfo.profile` scopes have been set to required and will always be present. +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19 + - @backstage/plugin-auth-node@0.4.14 + +## 0.1.16-next.2 + +### Patch Changes + +- 8efc6cf: Added support for the new shared `additionalScopes` configuration. In addition, the `openid`, `userinfo.email`, and `userinfo.profile` scopes have been set to required and will always be present. +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/plugin-auth-node@0.4.14-next.3 + +## 0.1.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/plugin-auth-node@0.4.14-next.2 + +## 0.1.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/plugin-auth-node@0.4.14-next.0 + +## 0.1.15 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.18 + - @backstage/plugin-auth-node@0.4.13 + +## 0.1.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + +## 0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + +## 0.1.14 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17 + - @backstage/plugin-auth-node@0.4.12 + +## 0.1.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17-next.1 + - @backstage/plugin-auth-node@0.4.12-next.1 + +## 0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17-next.0 + - @backstage/plugin-auth-node@0.4.12-next.0 + +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.11 + - @backstage/backend-plugin-api@0.6.16 + +## 0.1.12 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.10 + - @backstage/backend-plugin-api@0.6.15 + +## 0.1.11 + +### Patch Changes + +- 38af71a: Updated dependency `google-auth-library` to `^9.0.0`. +- Updated dependencies + - @backstage/plugin-auth-node@0.4.9 + - @backstage/backend-plugin-api@0.6.14 + +## 0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.9-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 + +## 0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.14-next.1 + - @backstage/plugin-auth-node@0.4.9-next.1 + +## 0.1.10-next.0 + +### Patch Changes + +- 38af71a: Updated dependency `google-auth-library` to `^9.0.0`. +- Updated dependencies + - @backstage/plugin-auth-node@0.4.8-next.0 + - @backstage/backend-plugin-api@0.6.13-next.0 + +## 0.1.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4 + - @backstage/backend-plugin-api@0.6.10 + +## 0.1.7-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4-next.3 + - @backstage/backend-plugin-api@0.6.10-next.3 + +## 0.1.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.2 + - @backstage/plugin-auth-node@0.4.4-next.2 + +## 0.1.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/plugin-auth-node@0.4.4-next.1 + +## 0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4-next.0 + - @backstage/backend-plugin-api@0.6.10-next.0 + +## 0.1.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## 0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## 0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.3-next.1 + - @backstage/backend-plugin-api@0.6.9-next.1 + +## 0.1.6-next.0 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.0 + - @backstage/plugin-auth-node@0.4.3-next.0 + +## 0.1.5 + +### Patch Changes + +- cc4228e: Switched module ID to use kebab-case. +- Updated dependencies + - @backstage/plugin-auth-node@0.4.2 + - @backstage/backend-plugin-api@0.6.8 + +## 0.1.5-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.8-next.3 + - @backstage/plugin-auth-node@0.4.2-next.3 + +## 0.1.5-next.2 + +### Patch Changes + +- cc4228e: Switched module ID to use kebab-case. +- Updated dependencies + - @backstage/plugin-auth-node@0.4.2-next.2 + - @backstage/backend-plugin-api@0.6.8-next.2 + +## 0.1.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.8-next.1 + - @backstage/plugin-auth-node@0.4.2-next.1 + +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.2-next.0 + - @backstage/backend-plugin-api@0.6.8-next.0 + +## 0.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.7 + - @backstage/plugin-auth-node@0.4.1 + +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.7-next.2 + - @backstage/plugin-auth-node@0.4.1-next.2 + +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.1-next.1 + - @backstage/backend-plugin-api@0.6.7-next.1 + +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.7-next.0 + - @backstage/plugin-auth-node@0.4.1-next.0 + +## 0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.0 + - @backstage/backend-plugin-api@0.6.6 + +## 0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.0-next.2 + - @backstage/backend-plugin-api@0.6.6-next.2 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.5-next.1 + - @backstage/plugin-auth-node@0.3.2-next.1 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + +## 0.1.0 + +### Minor Changes + +- 8513cd7d00e3: New module for `@backstage/plugin-auth-backend` that adds a Google auth provider. + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0 + - @backstage/backend-plugin-api@0.6.3 + +## 0.1.0-next.3 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3-next.3 + - @backstage/plugin-auth-node@0.3.0-next.3 + +## 0.1.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0-next.2 + - @backstage/backend-plugin-api@0.6.3-next.2 + +## 0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3-next.1 + - @backstage/plugin-auth-node@0.3.0-next.1 + +## 0.1.0-next.0 + +### Minor Changes + +- 8513cd7d00e3: New module for `@backstage/plugin-auth-backend` that adds a Google auth provider. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0-next.0 + - @backstage/backend-plugin-api@0.6.2-next.0 + +## @backstage/plugin-auth-backend-module-microsoft-provider@0.3.12-next.0 + +# @backstage/plugin-auth-backend-module-microsoft-provider + +## 0.3.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## 0.3.10 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10 + - @backstage/backend-plugin-api@1.6.0 + +## 0.3.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## 0.3.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + +## 0.3.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0 + - @backstage/plugin-auth-node@0.6.9 + +## 0.3.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0-next.1 + - @backstage/plugin-auth-node@0.6.9-next.1 + +## 0.3.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.9-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + +## 0.3.8 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-auth-node@0.6.8 + +## 0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## 0.3.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + +## 0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + +## 0.3.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6 + - @backstage/backend-plugin-api@1.4.2 + +## 0.3.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + +## 0.3.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-auth-node@0.6.5 + +## 0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-auth-node@0.6.5-next.0 + +## 0.3.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4 + - @backstage/backend-plugin-api@1.4.0 + +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + - @backstage/plugin-auth-node@0.6.4-next.0 + +## 0.3.3 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3 + - @backstage/backend-plugin-api@1.3.1 + +## 0.3.3-next.2 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.2 + - @backstage/backend-plugin-api@1.3.1-next.2 + +## 0.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + +## 0.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/plugin-auth-node@0.6.3-next.0 + +## 0.3.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.0 + - @backstage/plugin-auth-node@0.6.2 + +## 0.3.1 + +### Patch Changes + +- fa15e80: Update `auth.microsoft.signIn.resolvers` config def to include the `userIdMatchingUserEntityAnnotation` resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + +## 0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + +## 0.3.1-next.0 + +### Patch Changes + +- fa15e80: Update `auth.microsoft.signIn.resolvers` config def to include the `userIdMatchingUserEntityAnnotation` resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.0 + - @backstage/backend-plugin-api@1.2.1-next.0 + +## 0.3.0 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0 + - @backstage/plugin-auth-node@0.6.0 + +## 0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/plugin-auth-node@0.6.0-next.2 + +## 0.3.0-next.1 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/plugin-auth-node@0.6.0-next.1 + +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/plugin-auth-node@0.5.7-next.0 + +## 0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6 + - @backstage/backend-plugin-api@1.1.1 + +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.2.3 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## 0.2.3-next.1 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/plugin-auth-node@0.5.5-next.0 + +## 0.2.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4 + - @backstage/backend-plugin-api@1.0.2 + +## 0.2.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + +## 0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/plugin-auth-node@0.5.4-next.1 + +## 0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + +## 0.2.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- daa02d6: Add `skipUserProfile` config flag to Microsoft authenticator +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3 + - @backstage/backend-plugin-api@1.0.1 + +## 0.2.1-next.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- daa02d6: Add `skipUserProfile` config flag to Microsoft authenticator +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + +## 0.2.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- 3c2d690: Allow users without defined email to be ingested by the `msgraph` catalog plugin and add `userIdMatchingUserEntityAnnotation` sign-in resolver for the Microsoft auth provider to support sign-in for users without defined email. +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-auth-node@0.5.2 + +## 0.2.0-next.2 + +### Patch Changes + +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + +## 0.2.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + +## 0.2.0-next.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- 3c2d690: Allow users without defined email to be ingested by the `msgraph` catalog plugin and add `userIdMatchingUserEntityAnnotation` sign-in resolver for the Microsoft auth provider to support sign-in for users without defined email. +- Updated dependencies + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/plugin-auth-node@0.5.2-next.0 + +## 0.1.18 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- 93095ee: Make sure node-fetch is version 2.7.0 or greater +- 39f36a9: Updated the Microsoft authenticator to accurately define required scopes, but to also omit the required and additional scopes when requesting resource scopes. +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0 + - @backstage/plugin-auth-node@0.5.0 + +## 0.1.18-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/plugin-auth-node@0.5.0-next.3 + +## 0.1.18-next.2 + +### Patch Changes + +- 93095ee: Make sure node-fetch is version 2.7.0 or greater +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/plugin-auth-node@0.5.0-next.2 + +## 0.1.18-next.1 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/plugin-auth-node@0.4.18-next.1 + +## 0.1.18-next.0 + +### Patch Changes + +- 39f36a9: Updated the Microsoft authenticator to accurately define required scopes, but to also omit the required and additional scopes when requesting resource scopes. +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/plugin-auth-node@0.4.18-next.0 + +## 0.1.17 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/plugin-auth-node@0.4.17 + +## 0.1.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/plugin-auth-node@0.4.17-next.1 + +## 0.1.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/plugin-auth-node@0.4.16-next.0 + +## 0.1.14 + +### Patch Changes + +- 78a0b08: Internal refactor to handle `BackendFeature` contract change. +- 8efc6cf: Added support for the new shared `additionalScopes` configuration. +- d44a20a: Added additional plugin metadata to `package.json`. +- c187a9c: Minor internal type updates +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19 + - @backstage/plugin-auth-node@0.4.14 + +## 0.1.14-next.2 + +### Patch Changes + +- 8efc6cf: Added support for the new shared `additionalScopes` configuration. +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/plugin-auth-node@0.4.14-next.3 + +## 0.1.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/plugin-auth-node@0.4.14-next.2 + +## 0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/plugin-auth-node@0.4.14-next.0 + +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.18 + - @backstage/plugin-auth-node@0.4.13 + +## 0.1.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + +## 0.1.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + +## 0.1.12 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17 + - @backstage/plugin-auth-node@0.4.12 + +## 0.1.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17-next.1 + - @backstage/plugin-auth-node@0.4.12-next.1 + +## 0.1.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17-next.0 + - @backstage/plugin-auth-node@0.4.12-next.0 + +## 0.1.11 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.11 + - @backstage/backend-plugin-api@0.6.16 + +## 0.1.10 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.10 + - @backstage/backend-plugin-api@0.6.15 + +## 0.1.9 + +### Patch Changes + +- 2af5354: Bump dependency `jose` to v5 +- Updated dependencies + - @backstage/plugin-auth-node@0.4.9 + - @backstage/backend-plugin-api@0.6.14 + +## 0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.9-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 + +## 0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.14-next.1 + - @backstage/plugin-auth-node@0.4.9-next.1 + +## 0.1.8-next.0 + +### Patch Changes + +- 2af5354: Bump dependency `jose` to v5 +- Updated dependencies + - @backstage/plugin-auth-node@0.4.8-next.0 + - @backstage/backend-plugin-api@0.6.13-next.0 + +## 0.1.5 + +### Patch Changes + +- 8472188: Added or fixed the `repository` field in `package.json`. +- 1ff2684: Added the possibility to use custom scopes for performing login with Microsoft EntraID. +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4 + - @backstage/backend-plugin-api@0.6.10 + +## 0.1.5-next.3 + +### Patch Changes + +- 8472188: Added or fixed the `repository` field in `package.json`. +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4-next.3 + - @backstage/backend-plugin-api@0.6.10-next.3 + +## 0.1.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.2 + - @backstage/plugin-auth-node@0.4.4-next.2 + +## 0.1.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/plugin-auth-node@0.4.4-next.1 + +## 0.1.5-next.0 + +### Patch Changes + +- 1ff2684: Added the possibility to use custom scopes for performing login with Microsoft EntraID. +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4-next.0 + - @backstage/backend-plugin-api@0.6.10-next.0 + +## 0.1.4 + +### Patch Changes + +- 928efbc: Deprecated the `authModuleMicrosoftProvider` export. A default export is now available and should be used like this in your backend: `backend.add(import('@backstage/plugin-auth-backend-module-microsoft-provider'));` +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.3-next.1 + - @backstage/backend-plugin-api@0.6.9-next.1 + +## 0.1.4-next.0 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.0 + - @backstage/plugin-auth-node@0.4.3-next.0 + +## 0.1.3 + +### Patch Changes + +- a62764b: Updated dependency `passport` to `^0.7.0`. +- Updated dependencies + - @backstage/backend-common@0.20.0 + - @backstage/plugin-auth-node@0.4.2 + - @backstage/backend-plugin-api@0.6.8 + +## 0.1.3-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.3 + - @backstage/backend-plugin-api@0.6.8-next.3 + - @backstage/plugin-auth-node@0.4.2-next.3 + +## 0.1.3-next.2 + +### Patch Changes + +- a62764b: Updated dependency `passport` to `^0.7.0`. +- Updated dependencies + - @backstage/backend-common@0.20.0-next.2 + - @backstage/plugin-auth-node@0.4.2-next.2 + - @backstage/backend-plugin-api@0.6.8-next.2 + +## 0.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.1 + - @backstage/backend-plugin-api@0.6.8-next.1 + - @backstage/plugin-auth-node@0.4.2-next.1 + +## 0.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.0 + - @backstage/plugin-auth-node@0.4.2-next.0 + - @backstage/backend-plugin-api@0.6.8-next.0 + +## 0.1.2 + +### Patch Changes + +- a3236ad0ca: Fix link to the repository in `README.md`. + +- 3979524c74: Added support for specifying a domain hint on the Microsoft authentication provider configuration. + +- fde212dd10: Re-add the missing profile photo + as well as access token retrieval for foreign scopes. + + Additionally, we switch from previously 48x48 to 96x96 + which is the size used at the profile card. + +- 5aeb14f035: Correctly mark the client secret in configuration as secret + +- 2817115d09: Removed `prompt=consent` from start method to fix #20641 + +- Updated dependencies + - @backstage/backend-common@0.19.9 + - @backstage/backend-plugin-api@0.6.7 + - @backstage/plugin-auth-node@0.4.1 + +## 0.1.2-next.2 + +### Patch Changes + +- [#20706](https://github.com/backstage/backstage/pull/20706) [`fde212dd10`](https://github.com/backstage/backstage/commit/fde212dd106e507c4a808e5ed8213e29d7338420) Thanks [@pjungermann](https://github.com/pjungermann)! - Re-add the missing profile photo + as well as access token retrieval for foreign scopes. + + Additionally, we switch from previously 48x48 to 96x96 + which is the size used at the profile card. + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.7-next.2 + - @backstage/backend-common@0.19.9-next.2 + - @backstage/plugin-auth-node@0.4.1-next.2 + +## 0.1.2-next.1 + +### Patch Changes + +- 3979524c74: Added support for specifying a domain hint on the Microsoft authentication provider configuration. +- 5aeb14f035: Correctly mark the client secret in configuration as secret +- Updated dependencies + - @backstage/backend-common@0.19.9-next.1 + - @backstage/plugin-auth-node@0.4.1-next.1 + - @backstage/backend-plugin-api@0.6.7-next.1 + +## 0.1.2-next.0 + +### Patch Changes + +- 2817115d09: Removed `prompt=consent` from start method to fix #20641 +- Updated dependencies + - @backstage/backend-common@0.19.9-next.0 + - @backstage/backend-plugin-api@0.6.7-next.0 + - @backstage/plugin-auth-node@0.4.1-next.0 + +## 0.1.0 + +### Minor Changes + +- 2d8f7e82c1: Migrated the Microsoft auth provider to new `@backstage/plugin-auth-backend-module-microsoft-provider` module package. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.8 + - @backstage/plugin-auth-node@0.4.0 + - @backstage/backend-plugin-api@0.6.6 + +## 0.1.0-next.0 + +### Minor Changes + +- 2d8f7e82c1: Migrated the Microsoft auth provider to new `@backstage/plugin-auth-backend-module-microsoft-provider` module package. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.8-next.2 + - @backstage/plugin-auth-node@0.4.0-next.2 + - @backstage/backend-plugin-api@0.6.6-next.2 + +## @backstage/plugin-auth-backend-module-oauth2-provider@0.4.12-next.0 + +# @backstage/plugin-auth-backend-module-oauth2-provider + +## 0.4.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## 0.4.10 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10 + - @backstage/backend-plugin-api@1.6.0 + +## 0.4.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## 0.4.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + +## 0.4.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0 + - @backstage/plugin-auth-node@0.6.9 + +## 0.4.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0-next.1 + - @backstage/plugin-auth-node@0.6.9-next.1 + +## 0.4.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.9-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + +## 0.4.8 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-auth-node@0.6.8 + +## 0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## 0.4.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + +## 0.4.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + +## 0.4.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6 + - @backstage/backend-plugin-api@1.4.2 + +## 0.4.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + +## 0.4.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-auth-node@0.6.5 + +## 0.4.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-auth-node@0.6.5-next.0 + +## 0.4.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4 + - @backstage/backend-plugin-api@1.4.0 + +## 0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + +## 0.4.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + - @backstage/plugin-auth-node@0.6.4-next.0 + +## 0.4.3 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3 + - @backstage/backend-plugin-api@1.3.1 + +## 0.4.3-next.2 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.2 + - @backstage/backend-plugin-api@1.3.1-next.2 + +## 0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + +## 0.4.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/plugin-auth-node@0.6.3-next.0 + +## 0.4.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.0 + - @backstage/plugin-auth-node@0.6.2 + +## 0.4.1 + +### Patch Changes + +- ce15e30: Fixed repository url in `README.md` +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + +## 0.4.1-next.2 + +### Patch Changes + +- ce15e30: Fixed repository url in `README.md` +- Updated dependencies + - @backstage/backend-plugin-api@1.2.1-next.1 + - @backstage/plugin-auth-node@0.6.1-next.1 + +## 0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + +## 0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.0 + - @backstage/backend-plugin-api@1.2.1-next.0 + +## 0.4.0 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0 + - @backstage/plugin-auth-node@0.6.0 + +## 0.4.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/plugin-auth-node@0.6.0-next.2 + +## 0.4.0-next.1 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/plugin-auth-node@0.6.0-next.1 + +## 0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/plugin-auth-node@0.5.7-next.0 + +## 0.3.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6 + - @backstage/backend-plugin-api@1.1.1 + +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.3.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## 0.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + +## 0.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/plugin-auth-node@0.5.5-next.0 + +## 0.3.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4 + - @backstage/backend-plugin-api@1.0.2 + +## 0.3.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + +## 0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/plugin-auth-node@0.5.4-next.1 + +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + +## 0.3.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3 + - @backstage/backend-plugin-api@1.0.1 + +## 0.3.1-next.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + +## 0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + +## 0.3.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-auth-node@0.5.2 + +## 0.3.0-next.2 + +### Patch Changes + +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + +## 0.3.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + +## 0.3.0-next.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/plugin-auth-node@0.5.2-next.0 + +## 0.2.4 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0 + - @backstage/plugin-auth-node@0.5.0 + +## 0.2.4-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/plugin-auth-node@0.5.0-next.3 + +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/plugin-auth-node@0.5.0-next.2 + +## 0.2.4-next.1 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/plugin-auth-node@0.4.18-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/plugin-auth-node@0.4.18-next.0 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/plugin-auth-node@0.4.17 + +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/plugin-auth-node@0.4.17-next.1 + +## 0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/plugin-auth-node@0.4.16-next.0 + +## 0.2.0 + +### Minor Changes + +- 8efc6cf: **BREAKING**: The `scope` config option have been removed and replaced by the standard `additionalScopes` config. + +### Patch Changes + +- 78a0b08: Internal refactor to handle `BackendFeature` contract change. +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19 + - @backstage/plugin-auth-node@0.4.14 + +## 0.2.0-next.2 + +### Minor Changes + +- 8efc6cf: **BREAKING**: The `scope` config option have been removed and replaced by the standard `additionalScopes` config. + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/plugin-auth-node@0.4.14-next.3 + +## 0.1.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/plugin-auth-node@0.4.14-next.2 + +## 0.1.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/plugin-auth-node@0.4.14-next.0 + +## 0.1.15 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.18 + - @backstage/plugin-auth-node@0.4.13 + +## 0.1.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + +## 0.1.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + +## 0.1.14 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17 + - @backstage/plugin-auth-node@0.4.12 + +## 0.1.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17-next.1 + - @backstage/plugin-auth-node@0.4.12-next.1 + +## 0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17-next.0 + - @backstage/plugin-auth-node@0.4.12-next.0 + +## 0.1.13 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.11 + - @backstage/backend-plugin-api@0.6.16 + +## 0.1.12 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.10 + - @backstage/backend-plugin-api@0.6.15 + +## 0.1.11 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.9 + - @backstage/backend-plugin-api@0.6.14 + +## 0.1.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.9-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 + +## 0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.14-next.1 + - @backstage/plugin-auth-node@0.4.9-next.1 + +## 0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.8-next.0 + - @backstage/backend-plugin-api@0.6.13-next.0 + +## 0.1.7 + +### Patch Changes + +- 8472188: Added or fixed the `repository` field in `package.json`. +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4 + - @backstage/backend-plugin-api@0.6.10 + +## 0.1.7-next.3 + +### Patch Changes + +- 8472188: Added or fixed the `repository` field in `package.json`. +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4-next.3 + - @backstage/backend-plugin-api@0.6.10-next.3 + +## 0.1.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.2 + - @backstage/plugin-auth-node@0.4.4-next.2 + +## 0.1.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/plugin-auth-node@0.4.4-next.1 + +## 0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4-next.0 + - @backstage/backend-plugin-api@0.6.10-next.0 + +## 0.1.6 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## 0.1.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## 0.1.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.3-next.1 + - @backstage/backend-plugin-api@0.6.9-next.1 + +## 0.1.6-next.0 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.0 + - @backstage/plugin-auth-node@0.4.3-next.0 + +## 0.1.5 + +### Patch Changes + +- a62764b: Updated dependency `passport` to `^0.7.0`. +- Updated dependencies + - @backstage/backend-common@0.20.0 + - @backstage/plugin-auth-node@0.4.2 + - @backstage/backend-plugin-api@0.6.8 + +## 0.1.5-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.3 + - @backstage/backend-plugin-api@0.6.8-next.3 + - @backstage/plugin-auth-node@0.4.2-next.3 + +## 0.1.5-next.2 + +### Patch Changes + +- a62764b: Updated dependency `passport` to `^0.7.0`. +- Updated dependencies + - @backstage/backend-common@0.20.0-next.2 + - @backstage/plugin-auth-node@0.4.2-next.2 + - @backstage/backend-plugin-api@0.6.8-next.2 + +## 0.1.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.1 + - @backstage/backend-plugin-api@0.6.8-next.1 + - @backstage/plugin-auth-node@0.4.2-next.1 + +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.0 + - @backstage/plugin-auth-node@0.4.2-next.0 + - @backstage/backend-plugin-api@0.6.8-next.0 + +## 0.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.9 + - @backstage/backend-plugin-api@0.6.7 + - @backstage/plugin-auth-node@0.4.1 + +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.7-next.2 + - @backstage/backend-common@0.19.9-next.2 + - @backstage/plugin-auth-node@0.4.1-next.2 + +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.9-next.1 + - @backstage/plugin-auth-node@0.4.1-next.1 + - @backstage/backend-plugin-api@0.6.7-next.1 + +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.9-next.0 + - @backstage/backend-plugin-api@0.6.7-next.0 + - @backstage/plugin-auth-node@0.4.1-next.0 + +## 0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.8 + - @backstage/plugin-auth-node@0.4.0 + - @backstage/backend-plugin-api@0.6.6 + +## 0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.8-next.2 + - @backstage/plugin-auth-node@0.4.0-next.2 + - @backstage/backend-plugin-api@0.6.6-next.2 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.1 + - @backstage/backend-plugin-api@0.6.5-next.1 + - @backstage/plugin-auth-node@0.3.2-next.1 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + +## 0.1.0 + +### Minor Changes + +- 101cf1d13b04: New module for `@backstage/plugin-auth-backend` that adds a `oauth2` auth provider. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/backend-plugin-api@0.6.3 + +## 0.1.0-next.0 + +### Minor Changes + +- 101cf1d13b04: New module for `@backstage/plugin-auth-backend` that adds a `oauth2` auth provider. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.3-next.3 + - @backstage/backend-common@0.19.5-next.3 + - @backstage/plugin-auth-node@0.3.0-next.3 + +## @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.17-next.0 + +# @backstage/plugin-auth-backend-module-oauth2-proxy-provider + +## 0.2.16-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/errors@1.2.7 + +## 0.2.15 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10 + - @backstage/backend-plugin-api@1.6.0 + +## 0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/errors@1.2.7 + +## 0.2.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + - @backstage/errors@1.2.7 + +## 0.2.14 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0 + - @backstage/plugin-auth-node@0.6.9 + +## 0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0-next.1 + - @backstage/plugin-auth-node@0.6.9-next.1 + +## 0.2.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.9-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + - @backstage/errors@1.2.7 + +## 0.2.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-auth-node@0.6.8 + +## 0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## 0.2.12 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + +## 0.2.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + +## 0.2.11 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6 + - @backstage/backend-plugin-api@1.4.2 + +## 0.2.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + - @backstage/errors@1.2.7 + +## 0.2.10 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-auth-node@0.6.5 + +## 0.2.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-auth-node@0.6.5-next.0 + +## 0.2.9 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4 + - @backstage/backend-plugin-api@1.4.0 + - @backstage/errors@1.2.7 + +## 0.2.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + - @backstage/errors@1.2.7 + +## 0.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + - @backstage/plugin-auth-node@0.6.4-next.0 + +## 0.2.8 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3 + - @backstage/backend-plugin-api@1.3.1 + - @backstage/errors@1.2.7 + +## 0.2.8-next.2 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.2 + - @backstage/backend-plugin-api@1.3.1-next.2 + - @backstage/errors@1.2.7 + +## 0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + - @backstage/errors@1.2.7 + +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/plugin-auth-node@0.6.3-next.0 + - @backstage/errors@1.2.7 + +## 0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.0 + - @backstage/plugin-auth-node@0.6.2 + - @backstage/errors@1.2.7 + +## 0.2.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/errors@1.2.7 + +## 0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + - @backstage/errors@1.2.7 + +## 0.2.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.0 + - @backstage/backend-plugin-api@1.2.1-next.0 + +## 0.2.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0 + - @backstage/plugin-auth-node@0.6.0 + - @backstage/errors@1.2.7 + +## 0.2.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/plugin-auth-node@0.6.0-next.2 + - @backstage/errors@1.2.7 + +## 0.2.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/plugin-auth-node@0.6.0-next.1 + - @backstage/errors@1.2.7 + +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.5.7-next.0 + +## 0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6 + - @backstage/backend-plugin-api@1.1.1 + - @backstage/errors@1.2.7 + +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/errors@1.2.6 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + - @backstage/errors@1.2.5 + +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/plugin-auth-node@0.5.5-next.0 + - @backstage/errors@1.2.5 + +## 0.2.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4 + - @backstage/backend-plugin-api@1.0.2 + - @backstage/errors@1.2.5 + +## 0.2.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + - @backstage/errors@1.2.4 + +## 0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.5.4-next.1 + +## 0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + - @backstage/errors@1.2.4 + +## 0.2.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3 + - @backstage/backend-plugin-api@1.0.1 + - @backstage/errors@1.2.4 + +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + - @backstage/errors@1.2.4 + +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/errors@1.2.4 + +## 0.2.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-auth-node@0.5.2 + - @backstage/errors@1.2.4 + +## 0.2.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + - @backstage/errors@1.2.4 + +## 0.2.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + - @backstage/errors@1.2.4 + +## 0.2.0-next.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/plugin-auth-node@0.5.2-next.0 + - @backstage/errors@1.2.4 + +## 0.1.16 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0 + - @backstage/plugin-auth-node@0.5.0 + - @backstage/errors@1.2.4 + +## 0.1.16-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.5.0-next.3 + +## 0.1.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/plugin-auth-node@0.5.0-next.2 + - @backstage/errors@1.2.4 + +## 0.1.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.18-next.1 + +## 0.1.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.18-next.0 + +## 0.1.15 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/plugin-auth-node@0.4.17 + - @backstage/errors@1.2.4 + +## 0.1.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.17-next.1 + +## 0.1.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/plugin-auth-node@0.4.16-next.0 + - @backstage/errors@1.2.4 + +## 0.1.12 + +### Patch Changes + +- 78a0b08: Internal refactor to handle `BackendFeature` contract change. +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19 + - @backstage/plugin-auth-node@0.4.14 + - @backstage/errors@1.2.4 + +## 0.1.12-next.2 + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/plugin-auth-node@0.4.14-next.3 + - @backstage/errors@1.2.4 + +## 0.1.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/plugin-auth-node@0.4.14-next.2 + - @backstage/errors@1.2.4 + +## 0.1.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/plugin-auth-node@0.4.14-next.0 + - @backstage/errors@1.2.4 + +## 0.1.11 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.18 + - @backstage/plugin-auth-node@0.4.13 + +## 0.1.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + +## 0.1.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + - @backstage/errors@1.2.4 + +## 0.1.10 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17 + - @backstage/plugin-auth-node@0.4.12 + - @backstage/errors@1.2.4 + +## 0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17-next.1 + - @backstage/plugin-auth-node@0.4.12-next.1 + - @backstage/errors@1.2.4 + +## 0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17-next.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.12-next.0 + +## 0.1.9 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.11 + - @backstage/backend-plugin-api@0.6.16 + - @backstage/errors@1.2.4 + +## 0.1.8 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.10 + - @backstage/backend-plugin-api@0.6.15 + - @backstage/errors@1.2.4 + +## 0.1.7 + +### Patch Changes + +- 2af5354: Bump dependency `jose` to v5 +- e77d7a9: Internal refactor to avoid deprecated method. +- b1b012d: Fix issue with `providerInfo` not being set properly for some proxy providers, by making `providerInfo` an explicit optional return from `authenticate` +- Updated dependencies + - @backstage/plugin-auth-node@0.4.9 + - @backstage/errors@1.2.4 + - @backstage/backend-plugin-api@0.6.14 + +## 0.1.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.9-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 + - @backstage/errors@1.2.4-next.0 + +## 0.1.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.14-next.1 + - @backstage/plugin-auth-node@0.4.9-next.1 + - @backstage/errors@1.2.4-next.0 + +## 0.1.6-next.0 + +### Patch Changes + +- 2af5354: Bump dependency `jose` to v5 +- e77d7a9: Internal refactor to avoid deprecated method. +- b1b012d: Fix issue with `providerInfo` not being set properly for some proxy providers, by making `providerInfo` an explicit optional return from `authenticate` +- Updated dependencies + - @backstage/plugin-auth-node@0.4.8-next.0 + - @backstage/errors@1.2.4-next.0 + - @backstage/backend-plugin-api@0.6.13-next.0 + +## 0.1.2 + +### Patch Changes + +- 8472188: Added or fixed the `repository` field in `package.json`. +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4 + - @backstage/backend-plugin-api@0.6.10 + - @backstage/errors@1.2.3 + +## 0.1.2-next.3 + +### Patch Changes + +- 8472188: Added or fixed the `repository` field in `package.json`. +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4-next.3 + - @backstage/backend-plugin-api@0.6.10-next.3 + - @backstage/errors@1.2.3 + +## 0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.2 + - @backstage/plugin-auth-node@0.4.4-next.2 + - @backstage/errors@1.2.3 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-auth-node@0.4.4-next.1 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4-next.0 + - @backstage/backend-plugin-api@0.6.10-next.0 + - @backstage/errors@1.2.3 + +## 0.1.1 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/errors@1.2.3 + +## 0.1.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## 0.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.3-next.1 + - @backstage/backend-plugin-api@0.6.9-next.1 + - @backstage/errors@1.2.3 + +## 0.1.1-next.0 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.0 + - @backstage/errors@1.2.3 + - @backstage/plugin-auth-node@0.4.3-next.0 + +## 0.1.0 + +### Minor Changes + +- 271aa12: Release of `oauth2-proxy-provider` plugin + +### Patch Changes + +- a6be465: Exported the provider as default so it gets discovered when using `featureDiscoveryServiceFactory()` +- 510dab4: Change provider id from `oauth2ProxyProvider` to `oauth2Proxy` +- cc4228e: Switched module ID to use kebab-case. +- Updated dependencies + - @backstage/backend-common@0.20.0 + - @backstage/plugin-auth-node@0.4.2 + - @backstage/backend-plugin-api@0.6.8 + - @backstage/errors@1.2.3 + +## 0.1.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.3 + - @backstage/backend-plugin-api@0.6.8-next.3 + - @backstage/errors@1.2.3 + - @backstage/plugin-auth-node@0.4.2-next.3 + +## 0.1.0-next.1 + +### Patch Changes + +- a6be465: Exported the provider as default so it gets discovered when using `featureDiscoveryServiceFactory()` +- 510dab4: Change provider id from `oauth2ProxyProvider` to `oauth2Proxy` +- cc4228e: Switched module ID to use kebab-case. +- Updated dependencies + - @backstage/backend-common@0.20.0-next.2 + - @backstage/plugin-auth-node@0.4.2-next.2 + - @backstage/backend-plugin-api@0.6.8-next.2 + - @backstage/errors@1.2.3 + +## 0.1.0-next.0 + +### Minor Changes + +- 271aa12c7c: Release of `oauth2-proxy-provider` plugin + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.1 + - @backstage/backend-plugin-api@0.6.8-next.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-auth-node@0.4.2-next.1 + +## @backstage/plugin-auth-backend-module-oidc-provider@0.4.13-next.0 + +# @backstage/plugin-auth-backend-module-oidc-provider + +## 0.4.12-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-backend@0.26.1-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + +## 0.4.11 + +### Patch Changes + +- e54fcb2: Added support for custom start URL search parameters (with the new `startUrlSearchParams` config property) +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-auth-backend@0.26.0 + - @backstage/plugin-auth-node@0.6.11 + +## 0.4.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.26.0-next.0 + - @backstage/plugin-auth-node@0.6.10 + +## 0.4.11-next.0 + +### Patch Changes + +- e54fcb2: Added support for custom start URL search parameters (with the new `startUrlSearchParams` config property) +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-auth-backend@0.25.7 + - @backstage/plugin-auth-node@0.6.10 + +## 0.4.10 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10 + - @backstage/plugin-auth-backend@0.25.7 + - @backstage/backend-plugin-api@1.6.0 + +## 0.4.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.7-next.1 + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + +## 0.4.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + - @backstage/plugin-auth-backend@0.25.7-next.0 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + +## 0.4.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0 + - @backstage/plugin-auth-backend@0.25.6 + - @backstage/plugin-auth-node@0.6.9 + - @backstage/config@1.3.6 + +## 0.4.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0-next.1 + - @backstage/plugin-auth-backend@0.25.6-next.1 + - @backstage/plugin-auth-node@0.6.9-next.1 + +## 0.4.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.6-next.0 + - @backstage/plugin-auth-node@0.6.9-next.0 + - @backstage/config@1.3.6-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + - @backstage/types@1.2.2 + +## 0.4.8 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.5 + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-auth-backend@0.25.5 + - @backstage/plugin-auth-node@0.6.8 + +## 0.4.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-backend@0.25.5-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## 0.4.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.4 + - @backstage/plugin-auth-node@0.6.7 + - @backstage/types@1.2.2 + - @backstage/backend-plugin-api@1.4.3 + +## 0.4.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + - @backstage/plugin-auth-backend@0.25.4-next.0 + +## 0.4.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.3 + - @backstage/plugin-auth-node@0.6.6 + - @backstage/backend-plugin-api@1.4.2 + +## 0.4.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.3-next.0 + - @backstage/plugin-auth-node@0.6.6-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + - @backstage/config@1.3.3 + - @backstage/types@1.2.1 + +## 0.4.5 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.3 + - @backstage/plugin-auth-backend@0.25.2 + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-auth-node@0.6.5 + +## 0.4.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.3-next.0 + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-auth-backend@0.25.2-next.0 + - @backstage/plugin-auth-node@0.6.5-next.0 + +## 0.4.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4 + - @backstage/backend-plugin-api@1.4.0 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + - @backstage/plugin-auth-backend@0.25.1 + +## 0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + - @backstage/plugin-auth-backend@0.25.1-next.1 + +## 0.4.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + - @backstage/plugin-auth-backend@0.25.1-next.0 + - @backstage/plugin-auth-node@0.6.4-next.0 + +## 0.4.3 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.0 + - @backstage/plugin-auth-node@0.6.3 + - @backstage/backend-plugin-api@1.3.1 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + +## 0.4.3-next.2 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.0-next.2 + - @backstage/plugin-auth-node@0.6.3-next.2 + - @backstage/backend-plugin-api@1.3.1-next.2 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + +## 0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.0-next.1 + - @backstage/plugin-auth-node@0.6.3-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + +## 0.4.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.25.0-next.0 + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/plugin-auth-node@0.6.3-next.0 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + +## 0.4.2 + +### Patch Changes + +- 7495edf: Added custom timeout setting for oidc provider + + Here is an example of how to use a custom timeout with the configuration: + + ```yaml + auth: + oidc: + production: + clientId: ${AUTH_GOOGLE_CLIENT_ID} + clientSecret: ${AUTH_GOOGLE_CLIENT_SECRET} + timeout: + seconds: 30 + ``` + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.5 + - @backstage/backend-plugin-api@1.3.0 + - @backstage/plugin-auth-node@0.6.2 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + +## 0.4.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.5-next.2 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + - @backstage/plugin-auth-node@0.6.1 + +## 0.4.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.5-next.1 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + +## 0.4.2-next.0 + +### Patch Changes + +- 7495edf: Added custom timeout setting for oidc provider + + Here is an example of how to use a custom timeout with the configuration: + + ```yaml + auth: + oidc: + production: + clientId: ${AUTH_GOOGLE_CLIENT_ID} + clientSecret: ${AUTH_GOOGLE_CLIENT_SECRET} + timeout: + seconds: 30 + ``` + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.5-next.0 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/types@1.2.1 + +## 0.4.1 + +### Patch Changes + +- ce15e30: Fixed repository url in `README.md` +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/plugin-auth-backend@0.24.4 + - @backstage/backend-plugin-api@1.2.1 + +## 0.4.1-next.2 + +### Patch Changes + +- ce15e30: Fixed repository url in `README.md` +- Updated dependencies + - @backstage/backend-plugin-api@1.2.1-next.1 + - @backstage/plugin-auth-backend@0.24.4-next.2 + - @backstage/plugin-auth-node@0.6.1-next.1 + +## 0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.1 + - @backstage/plugin-auth-backend@0.24.4-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + +## 0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.4-next.0 + - @backstage/plugin-auth-node@0.6.1-next.0 + - @backstage/backend-plugin-api@1.2.1-next.0 + +## 0.4.0 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- 0afc4f2: Simplify the `start` method in the `authenticator` to just return the helper promise +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0 + - @backstage/plugin-auth-node@0.6.0 + - @backstage/plugin-auth-backend@0.24.3 + +## 0.4.0-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/plugin-auth-backend@0.24.3-next.3 + - @backstage/plugin-auth-node@0.6.0-next.2 + +## 0.4.0-next.2 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/plugin-auth-node@0.6.0-next.1 + - @backstage/plugin-auth-backend@0.24.3-next.2 + +## 0.3.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/plugin-auth-backend@0.24.3-next.1 + - @backstage/plugin-auth-node@0.5.7-next.0 + +## 0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/plugin-auth-backend@0.24.3-next.0 + - @backstage/plugin-auth-node@0.5.7-next.0 + +## 0.3.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6 + - @backstage/plugin-auth-backend@0.24.2 + - @backstage/backend-plugin-api@1.1.1 + +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-backend@0.24.2-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/plugin-auth-backend@0.24.2-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.3.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.1 + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.3.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-backend@0.24.1-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## 0.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.1-next.1 + - @backstage/plugin-auth-node@0.5.5-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + +## 0.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/plugin-auth-node@0.5.5-next.0 + - @backstage/plugin-auth-backend@0.24.1-next.0 + +## 0.3.2 + +### Patch Changes + +- 5d74716: Remove unused backend-common dependency +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.0 + - @backstage/plugin-auth-node@0.5.4 + - @backstage/backend-plugin-api@1.0.2 + +## 0.3.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.0-next.2 + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + +## 0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/plugin-auth-backend@0.24.0-next.1 + - @backstage/plugin-auth-node@0.5.4-next.1 + +## 0.3.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.24.0-next.0 + - @backstage/plugin-auth-node@0.5.4-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + +## 0.3.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- 094eaa3: Remove references to in-repo backend-common +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3 + - @backstage/plugin-auth-backend@0.23.1 + - @backstage/backend-plugin-api@1.0.1 + +## 0.3.1-next.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + - @backstage/plugin-auth-backend@0.23.1-next.1 + +## 0.3.1-next.0 + +### Patch Changes + +- 094eaa3: Remove references to in-repo backend-common +- Updated dependencies + - @backstage/plugin-auth-backend@0.23.1-next.0 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + +## 0.3.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-common@0.25.0 + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-auth-node@0.5.2 + - @backstage/plugin-auth-backend@0.23.0 + +## 0.3.0-next.2 + +### Patch Changes + +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-common@0.25.0-next.2 + - @backstage/plugin-auth-node@0.5.2-next.2 + - @backstage/plugin-auth-backend@0.23.0-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + +## 0.3.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.25.0-next.1 + - @backstage/plugin-auth-node@0.5.2-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + - @backstage/plugin-auth-backend@0.23.0-next.1 + +## 0.3.0-next.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/plugin-auth-backend@0.23.0-next.0 + - @backstage/backend-common@0.25.0-next.0 + - @backstage/plugin-auth-node@0.5.2-next.0 + +## 0.2.4 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0 + - @backstage/backend-common@0.24.0 + - @backstage/plugin-auth-backend@0.22.10 + - @backstage/plugin-auth-node@0.5.0 + +## 0.2.4-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/backend-common@0.23.4-next.3 + - @backstage/plugin-auth-backend@0.22.10-next.3 + - @backstage/plugin-auth-node@0.5.0-next.3 + +## 0.2.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/backend-common@0.23.4-next.2 + - @backstage/plugin-auth-backend@0.22.10-next.2 + - @backstage/plugin-auth-node@0.5.0-next.2 + +## 0.2.4-next.1 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/plugin-auth-backend@0.22.10-next.1 + - @backstage/backend-common@0.23.4-next.1 + - @backstage/plugin-auth-node@0.4.18-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.23.4-next.0 + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/plugin-auth-backend@0.22.10-next.0 + - @backstage/plugin-auth-node@0.4.18-next.0 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/backend-common@0.23.3 + - @backstage/plugin-auth-node@0.4.17 + - @backstage/plugin-auth-backend@0.22.9 + +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.23.3-next.1 + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/plugin-auth-backend@0.22.9-next.1 + - @backstage/plugin-auth-node@0.4.17-next.1 + +## 0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/backend-common@0.23.2-next.0 + - @backstage/plugin-auth-backend@0.22.8-next.0 + - @backstage/plugin-auth-node@0.4.16-next.0 + +## 0.2.0 + +### Minor Changes + +- 8efc6cf: **BREAKING**: The `scope` config option have been removed and replaced by the standard `additionalScopes` config. In addition, `openid`, `profile`, and `email` scopes have been set to required and will always be present. + +### Patch Changes + +- 78a0b08: Internal refactor to handle `BackendFeature` contract change. +- d44a20a: Added additional plugin metadata to `package.json`. +- 4f21993: if oidc server do not provide revocation_endpoint,we should not call revoke function +- Updated dependencies + - @backstage/backend-common@0.23.0 + - @backstage/backend-plugin-api@0.6.19 + - @backstage/plugin-auth-node@0.4.14 + - @backstage/plugin-auth-backend@0.22.6 + +## 0.2.0-next.3 + +### Minor Changes + +- 8efc6cf: **BREAKING**: The `scope` config option have been removed and replaced by the standard `additionalScopes` config. In addition, `openid`, `profile`, and `email` scopes have been set to required and will always be present. + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/plugin-auth-node@0.4.14-next.3 + - @backstage/plugin-auth-backend@0.22.6-next.3 + - @backstage/backend-common@0.23.0-next.3 + +## 0.1.10-next.2 + +### Patch Changes + +- 4f21993: if oidc server do not provide revocation_endpoint,we should not call revoke function +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/backend-common@0.23.0-next.2 + - @backstage/plugin-auth-backend@0.22.6-next.2 + - @backstage/plugin-auth-node@0.4.14-next.2 + +## 0.1.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.1 + - @backstage/backend-common@0.23.0-next.1 + - @backstage/plugin-auth-backend@0.22.6-next.1 + - @backstage/plugin-auth-node@0.4.14-next.1 + +## 0.1.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.1-next.0 + - @backstage/plugin-auth-backend@0.22.6-next.0 + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/plugin-auth-node@0.4.14-next.0 + +## 0.1.9 + +### Patch Changes + +- dd53bf3: Add nonce to authorize request to be added in ID token +- Updated dependencies + - @backstage/backend-common@0.22.0 + - @backstage/backend-plugin-api@0.6.18 + - @backstage/plugin-auth-backend@0.22.5 + - @backstage/plugin-auth-node@0.4.13 + +## 0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.1 + - @backstage/plugin-auth-backend@0.22.5-next.1 + - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + +## 0.1.9-next.0 + +### Patch Changes + +- dd53bf3: Add nonce to authorize request to be added in ID token +- Updated dependencies + - @backstage/plugin-auth-backend@0.22.5-next.0 + - @backstage/plugin-auth-node@0.4.13-next.0 + - @backstage/backend-common@0.21.8-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + +## 0.1.8 + +### Patch Changes + +- 28eb473: Support revoke refresh token to oidc logout function +- Updated dependencies + - @backstage/backend-common@0.21.7 + - @backstage/plugin-auth-backend@0.22.4 + - @backstage/backend-plugin-api@0.6.17 + - @backstage/plugin-auth-node@0.4.12 + +## 0.1.8-next.1 + +### Patch Changes + +- 28eb473: Support revoke refresh token to oidc logout function +- Updated dependencies + - @backstage/backend-common@0.21.7-next.1 + - @backstage/plugin-auth-backend@0.22.4-next.1 + - @backstage/backend-plugin-api@0.6.17-next.1 + - @backstage/plugin-auth-node@0.4.12-next.1 + +## 0.1.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.7-next.0 + - @backstage/backend-plugin-api@0.6.17-next.0 + - @backstage/plugin-auth-backend@0.22.4-next.0 + - @backstage/plugin-auth-node@0.4.12-next.0 + +## 0.1.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.22.3 + - @backstage/plugin-auth-node@0.4.11 + - @backstage/backend-common@0.21.6 + - @backstage/backend-plugin-api@0.6.16 + +## 0.1.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.5 + - @backstage/plugin-auth-backend@0.22.2 + - @backstage/plugin-auth-node@0.4.10 + - @backstage/backend-plugin-api@0.6.15 + +## 0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.22.1 + +## 0.1.4 + +### Patch Changes + +- 74b1dc9: Increased HTTP request timeout used by OIDC authenticator. +- 2af5354: Bump dependency `jose` to v5 +- Updated dependencies + - @backstage/backend-common@0.21.4 + - @backstage/plugin-auth-node@0.4.9 + - @backstage/backend-plugin-api@0.6.14 + - @backstage/plugin-auth-backend@0.22.0 + +## 0.1.4-next.2 + +### Patch Changes + +- 74b1dc9: Increased HTTP request timeout used by OIDC authenticator. +- Updated dependencies + - @backstage/backend-common@0.21.4-next.2 + - @backstage/plugin-auth-backend@0.22.0-next.2 + - @backstage/plugin-auth-node@0.4.9-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 + +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.4-next.1 + - @backstage/backend-plugin-api@0.6.14-next.1 + - @backstage/plugin-auth-backend@0.22.0-next.1 + - @backstage/plugin-auth-node@0.4.9-next.1 + +## 0.1.3-next.0 + +### Patch Changes + +- 2af5354: Bump dependency `jose` to v5 +- Updated dependencies + - @backstage/backend-common@0.21.3-next.0 + - @backstage/plugin-auth-node@0.4.8-next.0 + - @backstage/backend-plugin-api@0.6.13-next.0 + - @backstage/plugin-auth-backend@0.22.0-next.0 + +## 0.1.0 + +### Minor Changes + +- 5d2fcba: Created new `@backstage/plugin-auth-backend-module-oidc-provider` module package to house oidc auth provider migration. + +### Patch Changes + +- e471890: Fixed a bug where the OIDC authenticator did not properly persist granted OAuth scopes. +- 8472188: Added or fixed the `repository` field in `package.json`. +- 8afb6f4: Updated dependency `passport` to `^0.7.0`. +- Updated dependencies + - @backstage/backend-common@0.21.0 + - @backstage/plugin-auth-backend@0.21.0 + - @backstage/plugin-auth-node@0.4.4 + - @backstage/backend-plugin-api@0.6.10 + +## 0.1.0-next.3 + +### Patch Changes + +- e471890: Fixed a bug where the OIDC authenticator did not properly persist granted OAuth scopes. +- 8472188: Added or fixed the `repository` field in `package.json`. +- Updated dependencies + - @backstage/backend-common@0.21.0-next.3 + - @backstage/plugin-auth-backend@0.21.0-next.3 + - @backstage/plugin-auth-node@0.4.4-next.3 + - @backstage/backend-plugin-api@0.6.10-next.3 + +## 0.1.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.21.0-next.2 + - @backstage/backend-common@0.21.0-next.2 + - @backstage/backend-plugin-api@0.6.10-next.2 + - @backstage/plugin-auth-node@0.4.4-next.2 + +## 0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/backend-common@0.21.0-next.1 + - @backstage/plugin-auth-backend@0.20.4-next.1 + - @backstage/plugin-auth-node@0.4.4-next.1 + +## 0.1.0-next.0 + +### Minor Changes + +- 5d2fcba: Created new `@backstage/plugin-auth-backend-module-oidc-provider` module package to house oidc auth provider migration. + +### Patch Changes + +- 8afb6f4: Updated dependency `passport` to `^0.7.0`. +- Updated dependencies + - @backstage/plugin-auth-backend@0.20.4-next.0 + - @backstage/backend-common@0.21.0-next.0 + - @backstage/plugin-auth-node@0.4.4-next.0 + - @backstage/backend-plugin-api@0.6.10-next.0 + +## @backstage/plugin-auth-backend-module-okta-provider@0.2.12-next.0 + +# @backstage/plugin-auth-backend-module-okta-provider + +## 0.2.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## 0.2.10 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10 + - @backstage/backend-plugin-api@1.6.0 + +## 0.2.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## 0.2.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + +## 0.2.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0 + - @backstage/plugin-auth-node@0.6.9 + +## 0.2.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0-next.1 + - @backstage/plugin-auth-node@0.6.9-next.1 + +## 0.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.9-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + +## 0.2.8 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-auth-node@0.6.8 + +## 0.2.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## 0.2.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + +## 0.2.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + +## 0.2.6 + +### Patch Changes + +- 94476d2: Updated dependency `@davidzemon/passport-okta-oauth` to `^0.0.7`. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6 + - @backstage/backend-plugin-api@1.4.2 + +## 0.2.6-next.1 + +### Patch Changes + +- 94476d2: Updated dependency `@davidzemon/passport-okta-oauth` to `^0.0.7`. + +## 0.2.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + +## 0.2.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-auth-node@0.6.5 + +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-auth-node@0.6.5-next.0 + +## 0.2.4 + +### Patch Changes + +- b25977f: Updated dependency `@davidzemon/passport-okta-oauth` to `^0.0.6`. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4 + - @backstage/backend-plugin-api@1.4.0 + +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + - @backstage/plugin-auth-node@0.6.4-next.0 + +## 0.2.3 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3 + - @backstage/backend-plugin-api@1.3.1 + +## 0.2.3-next.2 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.2 + - @backstage/backend-plugin-api@1.3.1-next.2 + +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/plugin-auth-node@0.6.3-next.0 + +## 0.2.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.0 + - @backstage/plugin-auth-node@0.6.2 + +## 0.2.1 + +### Patch Changes + +- ce15e30: Fixed repository url in `README.md` +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + +## 0.2.1-next.2 + +### Patch Changes + +- ce15e30: Fixed repository url in `README.md` +- Updated dependencies + - @backstage/backend-plugin-api@1.2.1-next.1 + - @backstage/plugin-auth-node@0.6.1-next.1 + +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.0 + - @backstage/backend-plugin-api@1.2.1-next.0 + +## 0.2.0 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0 + - @backstage/plugin-auth-node@0.6.0 + +## 0.2.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/plugin-auth-node@0.6.0-next.2 + +## 0.2.0-next.1 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/plugin-auth-node@0.6.0-next.1 + +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/plugin-auth-node@0.5.7-next.0 + +## 0.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6 + - @backstage/backend-plugin-api@1.1.1 + +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.1.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## 0.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + +## 0.1.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/plugin-auth-node@0.5.5-next.0 + +## 0.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4 + - @backstage/backend-plugin-api@1.0.2 + +## 0.1.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + +## 0.1.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/plugin-auth-node@0.5.4-next.1 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + +## 0.1.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3 + - @backstage/backend-plugin-api@1.0.1 + +## 0.1.1-next.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + +## 0.1.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + +## 0.1.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-auth-node@0.5.2 + +## 0.1.0-next.2 + +### Patch Changes + +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + +## 0.1.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + +## 0.1.0-next.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/plugin-auth-node@0.5.2-next.0 + +## 0.0.16 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0 + - @backstage/plugin-auth-node@0.5.0 + +## 0.0.16-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/plugin-auth-node@0.5.0-next.3 + +## 0.0.16-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/plugin-auth-node@0.5.0-next.2 + +## 0.0.16-next.1 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/plugin-auth-node@0.4.18-next.1 + +## 0.0.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/plugin-auth-node@0.4.18-next.0 + +## 0.0.15 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/plugin-auth-node@0.4.17 + +## 0.0.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/plugin-auth-node@0.4.17-next.1 + +## 0.0.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/plugin-auth-node@0.4.16-next.0 + +## 0.0.12 + +### Patch Changes + +- 78a0b08: Internal refactor to handle `BackendFeature` contract change. +- 8efc6cf: Added support for the new shared `additionalScopes` configuration, which means it can now also be specified as an array. In addition, the `openid`, `email`, `profile`, and `offline_access` scopes have been set to required and will always be present. +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19 + - @backstage/plugin-auth-node@0.4.14 + +## 0.0.12-next.2 + +### Patch Changes + +- 8efc6cf: Added support for the new shared `additionalScopes` configuration, which means it can now also be specified as an array. In addition, the `openid`, `email`, `profile`, and `offline_access` scopes have been set to required and will always be present. +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/plugin-auth-node@0.4.14-next.3 + +## 0.0.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/plugin-auth-node@0.4.14-next.2 + +## 0.0.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/plugin-auth-node@0.4.14-next.0 + +## 0.0.11 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.18 + - @backstage/plugin-auth-node@0.4.13 + +## 0.0.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + +## 0.0.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + +## 0.0.10 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17 + - @backstage/plugin-auth-node@0.4.12 + +## 0.0.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17-next.1 + - @backstage/plugin-auth-node@0.4.12-next.1 + +## 0.0.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.17-next.0 + - @backstage/plugin-auth-node@0.4.12-next.0 + +## 0.0.9 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.11 + - @backstage/backend-plugin-api@0.6.16 + +## 0.0.8 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.10 + - @backstage/backend-plugin-api@0.6.15 + +## 0.0.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.9 + - @backstage/backend-plugin-api@0.6.14 + +## 0.0.7-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.9-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 + +## 0.0.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.14-next.1 + - @backstage/plugin-auth-node@0.4.9-next.1 + +## 0.0.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.8-next.0 + - @backstage/backend-plugin-api@0.6.13-next.0 + +## 0.0.3 + +### Patch Changes + +- cd5114c: Added missing `additionalScopes` option to configuration schema. +- 8472188: Added or fixed the `repository` field in `package.json`. +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4 + - @backstage/backend-plugin-api@0.6.10 + +## 0.0.3-next.3 + +### Patch Changes + +- 8472188: Added or fixed the `repository` field in `package.json`. +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4-next.3 + - @backstage/backend-plugin-api@0.6.10-next.3 + +## 0.0.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.2 + - @backstage/plugin-auth-node@0.4.4-next.2 + +## 0.0.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/plugin-auth-node@0.4.4-next.1 + +## 0.0.3-next.0 + +### Patch Changes + +- cd5114c: Added missing `additionalScopes` option to configuration schema. +- Updated dependencies + - @backstage/plugin-auth-node@0.4.4-next.0 + - @backstage/backend-plugin-api@0.6.10-next.0 + +## 0.0.2 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-auth-node@0.4.3 + +## 0.0.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## 0.0.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.3-next.1 + - @backstage/backend-plugin-api@0.6.9-next.1 + +## 0.0.2-next.0 + +### Patch Changes + +- 4016f21: Remove some unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.0 + - @backstage/plugin-auth-node@0.4.3-next.0 + +## 0.0.1 + +### Patch Changes + +- e1c189b: Adds okta-provider backend module for the auth plugin +- a62764b: Updated dependency `passport` to `^0.7.0`. +- Updated dependencies + - @backstage/backend-common@0.20.0 + - @backstage/plugin-auth-node@0.4.2 + - @backstage/backend-plugin-api@0.6.8 + +## 0.0.1-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.3 + - @backstage/backend-plugin-api@0.6.8-next.3 + - @backstage/plugin-auth-node@0.4.2-next.3 + +## 0.0.1-next.2 + +### Patch Changes + +- a62764b: Updated dependency `passport` to `^0.7.0`. +- Updated dependencies + - @backstage/backend-common@0.20.0-next.2 + - @backstage/plugin-auth-node@0.4.2-next.2 + - @backstage/backend-plugin-api@0.6.8-next.2 + +## 0.0.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.1 + - @backstage/backend-plugin-api@0.6.8-next.1 + - @backstage/plugin-auth-node@0.4.2-next.1 + +## 0.0.1-next.0 + +### Patch Changes + +- e1c189b524: Adds okta-provider backend module for the auth plugin +- Updated dependencies + - @backstage/backend-common@0.20.0-next.0 + - @backstage/plugin-auth-node@0.4.2-next.0 + - @backstage/backend-plugin-api@0.6.8-next.0 + +## @backstage/plugin-auth-backend-module-onelogin-provider@0.3.12-next.0 + +# @backstage/plugin-auth-backend-module-onelogin-provider + +## 0.3.11-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + +## 0.3.10 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10 + - @backstage/backend-plugin-api@1.6.0 + +## 0.3.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + +## 0.3.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + +## 0.3.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0 + - @backstage/plugin-auth-node@0.6.9 + +## 0.3.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0-next.1 + - @backstage/plugin-auth-node@0.6.9-next.1 + +## 0.3.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.9-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + +## 0.3.8 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-auth-node@0.6.8 + +## 0.3.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + +## 0.3.7 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + +## 0.3.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + +## 0.3.6 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6 + - @backstage/backend-plugin-api@1.4.2 + +## 0.3.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + +## 0.3.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-auth-node@0.6.5 + +## 0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-auth-node@0.6.5-next.0 + +## 0.3.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4 + - @backstage/backend-plugin-api@1.4.0 + +## 0.3.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + +## 0.3.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + - @backstage/plugin-auth-node@0.6.4-next.0 + +## 0.3.3 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3 + - @backstage/backend-plugin-api@1.3.1 + +## 0.3.3-next.2 + +### Patch Changes + +- 5cc1f7f: Introduce `dangerouslyAllowSignInWithoutUserInCatalog` auth resolver config. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.2 + - @backstage/backend-plugin-api@1.3.1-next.2 + +## 0.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + +## 0.3.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/plugin-auth-node@0.6.3-next.0 + +## 0.3.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.0 + - @backstage/plugin-auth-node@0.6.2 + +## 0.3.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + +## 0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + +## 0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.0 + - @backstage/backend-plugin-api@1.2.1-next.0 + +## 0.3.0 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0 + - @backstage/plugin-auth-node@0.6.0 + +## 0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/plugin-auth-node@0.6.0-next.2 + +## 0.3.0-next.1 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/plugin-auth-node@0.6.0-next.1 + +## 0.2.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/plugin-auth-node@0.5.7-next.0 + +## 0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6 + - @backstage/backend-plugin-api@1.1.1 + +## 0.2.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/plugin-auth-node@0.5.6-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + +## 0.2.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-auth-node@0.5.5-next.2 + +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/plugin-auth-node@0.5.5-next.0 + +## 0.2.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4 + - @backstage/backend-plugin-api@1.0.2 + +## 0.2.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + +## 0.2.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/plugin-auth-node@0.5.4-next.1 + +## 0.2.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + +## 0.2.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3 + - @backstage/backend-plugin-api@1.0.1 + +## 0.2.1-next.1 + +### Patch Changes + +- 217458a: Updated configuration schema to include the new `allowedDomains` option for the `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + +## 0.2.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + +## 0.2.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-auth-node@0.5.2 + +## 0.2.0-next.2 + +### Patch Changes + +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + +## 0.2.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.2-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + +## 0.2.0-next.0 + +### Minor Changes + +- d425fc4: **BREAKING**: The return values from `createBackendPlugin`, `createBackendModule`, and `createServiceFactory` are now simply `BackendFeature` and `ServiceFactory`, instead of the previously deprecated form of a function that returns them. For this reason, `createServiceFactory` also no longer accepts the callback form where you provide direct options to the service. This also affects all `coreServices.*` service refs. + + This may in particular affect tests; if you were effectively doing `createBackendModule({...})()` (note the parentheses), you can now remove those extra parentheses at the end. You may encounter cases of this in your `packages/backend/src/index.ts` too, where you add plugins, modules, and services. If you were using `createServiceFactory` with a function as its argument for the purpose of passing in options, this pattern has been deprecated for a while and is no longer supported. You may want to explore the new multiton patterns to achieve your goals, or moving settings to app-config. + + As part of this change, the `IdentityFactoryOptions` type was removed, and can no longer be used to tweak that service. The identity service was also deprecated some time ago, and you will want to [migrate to the new auth system](https://backstage.io/docs/tutorials/auth-service-migration) if you still rely on it. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/plugin-auth-node@0.5.2-next.0 + +## 0.1.4 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0 + - @backstage/plugin-auth-node@0.5.0 + +## 0.1.4-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/plugin-auth-node@0.5.0-next.3 + +## 0.1.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/plugin-auth-node@0.5.0-next.2 + +## 0.1.4-next.1 + +### Patch Changes + +- c8f1cae: Add `signIn` to authentication provider configuration schema +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/plugin-auth-node@0.4.18-next.1 + +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/plugin-auth-node@0.4.18-next.0 + +## 0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/plugin-auth-node@0.4.17 + +## 0.1.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/plugin-auth-node@0.4.17-next.1 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/plugin-auth-node@0.4.16-next.0 + +## 0.1.0 + +### Minor Changes + +- 566d7cb: Separate out the OneLogin provider into its own module + +### Patch Changes + +- 78a0b08: Internal refactor to handle `BackendFeature` contract change. +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19 + - @backstage/plugin-auth-node@0.4.14 + +## 0.1.0-next.0 + +### Minor Changes + +- 566d7cb: Separate out the OneLogin provider into its own module + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/plugin-auth-node@0.4.14-next.3 + +## @backstage/plugin-auth-node@0.6.13-next.0 + +# @backstage/plugin-auth-node + +## 0.6.12-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## 0.6.11 + +### Patch Changes + +- 4eeba9e: Upgrade `zod-validation-error` to version 4 +- 872eb91: Upgrade `zod-to-json-schema` to latest version +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + +## 0.6.10 + +### Patch Changes + +- 2389358: remove leading dot in auth cookie cleanup call +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- b35f8b2: Fixed chunked cookie replacing edge case in OAuthCookieManager class where some of the old chunks would not get removed if new chunked cookie would have fewer chunks. +- e9dd634: fix flawed cookie removal logic with chunked tokens +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0 + +## 0.6.10-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- e9dd634: fix flawed cookie removal logic with chunked tokens +- Updated dependencies + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## 0.6.10-next.0 + +### Patch Changes + +- 2389358: remove leading dot in auth cookie cleanup call +- Updated dependencies + - @backstage/backend-plugin-api@1.5.1-next.0 + - @backstage/config@1.3.6 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## 0.6.9 + +### 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/backend-plugin-api@1.5.0 + - @backstage/config@1.3.6 + - @backstage/catalog-model@1.7.6 + - @backstage/catalog-client@1.12.1 + +## 0.6.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0-next.1 + +## 0.6.9-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/config@1.3.6-next.0 + - @backstage/catalog-model@1.7.6-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + - @backstage/catalog-client@1.12.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## 0.6.8 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.5 + - @backstage/backend-plugin-api@1.4.4 + +## 0.6.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/catalog-client@1.12.0 + +## 0.6.7 + +### Patch Changes + +- 54ddfef: Updating plugin metadata +- 3aff9e1: Changes OAuth cookies from domain-scoped to host-only by avoid setting the domain attribute in the default cookie configurer. +- Updated dependencies + - @backstage/catalog-client@1.12.0 + - @backstage/types@1.2.2 + - @backstage/backend-plugin-api@1.4.3 + +## 0.6.7-next.1 + +### Patch Changes + +- 54ddfef: Updating plugin metadata +- Updated dependencies + - @backstage/catalog-client@1.12.0-next.0 + +## 0.6.7-next.0 + +### Patch Changes + +- 3aff9e1: Changes OAuth cookies from domain-scoped to host-only by avoid setting the domain attribute in the default cookie configurer. +- Updated dependencies + - @backstage/backend-plugin-api@1.4.3-next.0 + +## 0.6.6 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.11.0 + - @backstage/backend-plugin-api@1.4.2 + +## 0.6.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.11.0-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + - @backstage/catalog-model@1.7.5 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.6.5 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.3 + - @backstage/catalog-model@1.7.5 + - @backstage/catalog-client@1.10.2 + - @backstage/backend-plugin-api@1.4.1 + +## 0.6.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.3-next.0 + - @backstage/catalog-model@1.7.5-next.0 + - @backstage/catalog-client@1.10.2-next.0 + - @backstage/backend-plugin-api@1.4.1-next.0 + +## 0.6.4 + +### Patch Changes + +- 0169b23: Internal tweak to avoid circular dependencies +- Updated dependencies + - @backstage/catalog-client@1.10.1 + - @backstage/backend-plugin-api@1.4.0 + - @backstage/catalog-model@1.7.4 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.6.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.10.1-next.0 + - @backstage/backend-plugin-api@1.4.0-next.1 + - @backstage/catalog-model@1.7.4 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.6.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + +## 0.6.3 + +### Patch Changes + +- 332e934: Added the `identity` property to `BackstageSignInResult`. + + The `prepareBackstageIdentityResponse` function will now also forward the `identity` to the response if present in the provided sign-in result. + +- ab53e6f: Added a new `dangerousEntityRefFallback` option to the `signInWithCatalogUser` method in `AuthResolverContext`. The option will cause the provided entity reference to be used as a fallback in case the user is not found in the catalog. It is up to the caller to provide the fallback entity reference. + + Auth providers that include pre-defined sign-in resolvers are encouraged to define a flag named `dangerouslyAllowSignInWithoutUserInCatalog` in their config, which in turn enables use of the `dangerousEntityRefFallback` option. For example: + + ```ts + export const usernameMatchingUserEntityName = createSignInResolverFactory({ + optionsSchema: z + .object({ + dangerouslyAllowSignInWithoutUserInCatalog: z.boolean().optional(), + }) + .optional(), + create(options = {}) { + return async ( + info: SignInInfo>, + ctx, + ) => { + const { username } = info.result.fullProfile; + if (!username) { + throw new Error('User profile does not contain a username'); + } + + return ctx.signInWithCatalogUser( + { entityRef: { name: username } }, + { + dangerousEntityRefFallback: + options?.dangerouslyAllowSignInWithoutUserInCatalog + ? { entityRef: { name: username } } + : undefined, + }, + ); + }; + }, + }); + ``` + +- Updated dependencies + - @backstage/catalog-model@1.7.4 + - @backstage/backend-plugin-api@1.3.1 + - @backstage/catalog-client@1.10.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.6.3-next.2 + +### Patch Changes + +- ab53e6f: Added a new `dangerousEntityRefFallback` option to the `signInWithCatalogUser` method in `AuthResolverContext`. The option will cause the provided entity reference to be used as a fallback in case the user is not found in the catalog. It is up to the caller to provide the fallback entity reference. + + Auth providers that include pre-defined sign-in resolvers are encouraged to define a flag named `dangerouslyAllowSignInWithoutUserInCatalog` in their config, which in turn enables use of the `dangerousEntityRefFallback` option. For example: + + ```ts + export const usernameMatchingUserEntityName = createSignInResolverFactory({ + optionsSchema: z + .object({ + dangerouslyAllowSignInWithoutUserInCatalog: z.boolean().optional(), + }) + .optional(), + create(options = {}) { + return async ( + info: SignInInfo>, + ctx, + ) => { + const { username } = info.result.fullProfile; + if (!username) { + throw new Error('User profile does not contain a username'); + } + + return ctx.signInWithCatalogUser( + { entityRef: { name: username } }, + { + dangerousEntityRefFallback: + options?.dangerouslyAllowSignInWithoutUserInCatalog + ? { entityRef: { name: username } } + : undefined, + }, + ); + }; + }, + }); + ``` + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.1-next.2 + - @backstage/catalog-client@1.10.0-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.6.3-next.1 + +### Patch Changes + +- 332e934: Added the `identity` property to `BackstageSignInResult`. + + The `prepareBackstageIdentityResponse` function will now also forward the `identity` to the response if present in the provided sign-in result. + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.1-next.1 + - @backstage/catalog-client@1.10.0-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.6.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.10.0-next.0 + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.6.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.6.1 + +### Patch Changes + +- b6702ea: Added `AuthResolverContext.resolveOwnershipEntityRefs` as a way of accessing the default ownership resolution logic in sign-in resolvers, replacing `getDefaultOwnershipEntityRefs` from `@backstage/plugin-auth-backend`. +- Updated dependencies + - @backstage/backend-plugin-api@1.2.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.6.1-next.1 + +### Patch Changes + +- b6702ea: Added `AuthResolverContext.resolveOwnershipEntityRefs` as a way of accessing the default ownership resolution logic in sign-in resolvers, replacing `getDefaultOwnershipEntityRefs` from `@backstage/plugin-auth-backend`. +- Updated dependencies + - @backstage/backend-plugin-api@1.2.1-next.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.6.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.1-next.0 + +## 0.6.0 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- 8699b79: Removed unused dependencies +- cb316fc: Add an `error` handler to the `strategy` to reject the `executeRedirectStrategy` +- ab9a6fb: Added `scopeAlreadyGranted` property to `OAuthAuthenticatorRefreshInput`, signaling to the provider whether the requested scope has already been granted when persisting session scope. +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.6.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.6.0-next.1 + +### Minor Changes + +- 61f464e: Added `auth.providers..sessionDuration` config for auth providers to allow the lifespan of user sessions to be configured. + +### Patch Changes + +- 8699b79: Removed unused dependencies +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.5.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.5.6 + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- 8379bf4: Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types +- Updated dependencies + - @backstage/types@1.2.1 + - @backstage/backend-plugin-api@1.1.1 + - @backstage/catalog-client@1.9.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.5.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/catalog-client@1.9.1-next.0 + +## 0.5.6-next.0 + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- 8379bf4: Remove usages of `PluginDatabaseManager` and `PluginEndpointDiscovery` and replace with their equivalent service types +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/catalog-client@1.9.0 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/types@1.2.0 + +## 0.5.5 + +### Patch Changes + +- c907440: Improved error forwarding for OAuth refresh endpoints +- 1e624ca: Restrict `@types/express` version range from `*` to `^4.17.6`. +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0 + - @backstage/catalog-client@1.9.0 + - @backstage/errors@1.2.6 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## 0.5.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/catalog-client@1.9.0-next.2 + - @backstage/catalog-model@1.7.2-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## 0.5.5-next.1 + +### Patch Changes + +- c907440: Improved error forwarding for OAuth refresh endpoints +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/catalog-client@1.9.0-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + - @backstage/catalog-model@1.7.1 + - @backstage/config@1.3.0 + - @backstage/errors@1.2.5 + - @backstage/types@1.2.0 + +## 0.5.5-next.0 + +### Patch Changes + +- 1e624ca: Restrict `@types/express` version range from `*` to `^4.17.6`. +- Updated dependencies + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/catalog-client@1.8.1-next.0 + - @backstage/catalog-model@1.7.1 + - @backstage/config@1.3.0 + - @backstage/errors@1.2.5 + - @backstage/types@1.2.0 + +## 0.5.4 + +### Patch Changes + +- a0a9a4a: Browsers silently drop cookies that exceed 4KB, which can be problematic for refresh tokens and other large cookies.This update ensures that large cookies, like refresh tokens, are not dropped by browsers, maintaining the integrity of the authentication process. The changes include both the implementation of the cookie splitting logic and corresponding tests to validate the new functionality. +- 4e58bc7: Upgrade to uuid v11 internally +- Updated dependencies + - @backstage/catalog-client@1.8.0 + - @backstage/config@1.3.0 + - @backstage/types@1.2.0 + - @backstage/backend-plugin-api@1.0.2 + - @backstage/catalog-model@1.7.1 + - @backstage/errors@1.2.5 + +## 0.5.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.8.0-next.1 + - @backstage/backend-plugin-api@1.0.2-next.2 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.5.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/catalog-client@1.8.0-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.5.4-next.0 + +### Patch Changes + +- a0a9a4a: Browsers silently drop cookies that exceed 4KB, which can be problematic for refresh tokens and other large cookies.This update ensures that large cookies, like refresh tokens, are not dropped by browsers, maintaining the integrity of the authentication process. The changes include both the implementation of the cookie splitting logic and corresponding tests to validate the new functionality. +- Updated dependencies + - @backstage/catalog-client@1.8.0-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.5.3 + +### Patch Changes + +- 217458a: Added a new `allowedDomains` option for the common `emailLocalPartMatchingUserEntityName` sign-in resolver. +- 094eaa3: Remove references to in-repo backend-common +- e4ad29a: Fix authentication error handling using redirect flow via `enableExperimentalRedirectFlow` config. If an error is caught during authentication, the user is redirected back to app origin with `error` query parameter containing the error message. +- Updated dependencies + - @backstage/catalog-client@1.7.1 + - @backstage/backend-plugin-api@1.0.1 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.5.3-next.1 + +### Patch Changes + +- 217458a: Added a new `allowedDomains` option for the common `emailLocalPartMatchingUserEntityName` sign-in resolver. +- Updated dependencies + - @backstage/catalog-client@1.7.1-next.0 + - @backstage/backend-plugin-api@1.0.1-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.5.3-next.0 + +### Patch Changes + +- 094eaa3: Remove references to in-repo backend-common +- Updated dependencies + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/catalog-client@1.7.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.5.2 + +### Patch Changes + +- c46eb0f: Extend the "unable to resolve user identity" message +- d908d8c: Accepts an optional options object in the `PassportOAuthAuthenticatorHelper.authenticate` method. +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- 6f409b7: The `emailMatchingUserEntityProfileEmail` sign-in resolver will now also try matching emails with plus addressing removed. +- Updated dependencies + - @backstage/backend-common@0.25.0 + - @backstage/backend-plugin-api@1.0.0 + - @backstage/catalog-model@1.7.0 + - @backstage/catalog-client@1.7.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.5.2-next.2 + +### Patch Changes + +- d908d8c: Accepts an optional options object in the `PassportOAuthAuthenticatorHelper.authenticate` method. +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-common@0.25.0-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + - @backstage/catalog-client@1.7.0-next.1 + - @backstage/catalog-model@1.6.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.5.2-next.1 + +### Patch Changes + +- c46eb0f: Extend the "unable to resolve user identity" message +- Updated dependencies + - @backstage/backend-common@0.25.0-next.1 + - @backstage/catalog-client@1.6.7-next.0 + - @backstage/backend-plugin-api@0.9.0-next.1 + - @backstage/catalog-model@1.6.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.5.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/backend-common@0.25.0-next.0 + - @backstage/catalog-client@1.6.6 + - @backstage/catalog-model@1.6.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.5.0 + +### Minor Changes + +- 579afd0: **BREAKING**: Sign-in resolvers configured via `.signIn.resolvers` now take precedence over sign-in resolvers passed to `signInResolver` option of `createOAuthProviderFactory`. This effectively makes sign-in resolvers passed via the `signInResolver` the default one, which you can then override through configuration. + +### Patch Changes + +- 93095ee: Make sure node-fetch is version 2.7.0 or greater +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0 + - @backstage/backend-common@0.24.0 + - @backstage/catalog-model@1.6.0 + - @backstage/catalog-client@1.6.6 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.5.0-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/backend-common@0.23.4-next.3 + - @backstage/catalog-model@1.6.0-next.0 + - @backstage/catalog-client@1.6.6-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.5.0-next.2 + +### Minor Changes + +- 579afd0: **BREAKING**: Sign-in resolvers configured via `.signIn.resolvers` now take precedence over sign-in resolvers passed to `signInResolver` option of `createOAuthProviderFactory`. This effectively makes sign-in resolvers passed via the `signInResolver` the default one, which you can then override through configuration. + +### Patch Changes + +- 93095ee: Make sure node-fetch is version 2.7.0 or greater +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/backend-common@0.23.4-next.2 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/backend-common@0.23.4-next.1 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.23.4-next.0 + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.17 + +### Patch Changes + +- 55c1a72: Fix issues with Atlassian OAuth provider: retrieve the email and photo that were not in arrays but rather in single props. +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/backend-common@0.23.3 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.23.3-next.1 + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/backend-common@0.23.2-next.0 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.14 + +### Patch Changes + +- 798ec37: Updated scope management for OAuth providers, where the `createOAuthAuthenticator` now accepts a new collection of `scopes` options: + + - `scopes.persist` - Whether scopes should be persisted, replaces the `shouldPersistScopes` option. + - `scopes.required` - A list of required scopes that will always be requested. + - `scopes.transform` - A function that can be used to transform the scopes before they are requested. + + The `createOAuthProviderFactory` has also received a new `additionalScopes` option, and will also read `additionalScopes` from the auth provider configuration. Both of these can be used to add additional scopes that should always be requested. + + A significant change under the hood that this new scope management brings is that providers that persist scopes will now always merge the already granted scopes with the requested ones. The previous behavior was that the full authorization flow would not include existing scopes, while the refresh flow would only include the existing scopes. + +- d44a20a: Added additional plugin metadata to `package.json`. + +- Updated dependencies + - @backstage/backend-common@0.23.0 + - @backstage/backend-plugin-api@0.6.19 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.14-next.3 + +### Patch Changes + +- 798ec37: Updated scope management for OAuth providers, where the `createOAuthAuthenticator` now accepts a new collection of `scopes` options: + + - `scopes.persist` - Whether scopes should be persisted, replaces the `shouldPersistScopes` option. + - `scopes.required` - A list of required scopes that will always be requested. + - `scopes.transform` - A function that can be used to transform the scopes before they are requested. + + The `createOAuthProviderFactory` has also received a new `additionalScopes` option, and will also read `additionalScopes` from the auth provider configuration. Both of these can be used to add additional scopes that should always be requested. + + A significant change under the hood that this new scope management brings is that providers that persist scopes will now always merge the already granted scopes with the requested ones. The previous behavior was that the full authorization flow would not include existing scopes, while the refresh flow would only include the existing scopes. + +- d44a20a: Added additional plugin metadata to `package.json`. + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/backend-common@0.23.0-next.3 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/backend-common@0.23.0-next.2 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.1 + - @backstage/backend-common@0.23.0-next.1 + +## 0.4.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.1-next.0 + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/catalog-client@1.6.5 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.13 + +### Patch Changes + +- ea9262b: Allow overriding default ownership resolving with the new `AuthOwnershipResolutionExtensionPoint` +- Updated dependencies + - @backstage/catalog-model@1.5.0 + - @backstage/backend-common@0.22.0 + - @backstage/backend-plugin-api@0.6.18 + - @backstage/catalog-client@1.6.5 + +## 0.4.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + +## 0.4.13-next.0 + +### Patch Changes + +- ea9262b: Allow overriding default ownership resolving with the new `AuthOwnershipResolutionExtensionPoint` +- Updated dependencies + - @backstage/catalog-model@1.5.0-next.0 + - @backstage/backend-common@0.21.8-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + - @backstage/catalog-client@1.6.5-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.12 + +### Patch Changes + +- d62bc51: Add `tokenTypes` export with constants for various Backstage token types. +- Updated dependencies + - @backstage/backend-common@0.21.7 + - @backstage/backend-plugin-api@0.6.17 + - @backstage/catalog-client@1.6.4 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.12-next.1 + +### Patch Changes + +- d62bc51: Add `tokenTypes` export with constants for various Backstage token types. +- Updated dependencies + - @backstage/backend-common@0.21.7-next.1 + - @backstage/backend-plugin-api@0.6.17-next.1 + - @backstage/catalog-client@1.6.4-next.0 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.7-next.0 + - @backstage/backend-plugin-api@0.6.17-next.0 + - @backstage/catalog-client@1.6.3 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.11 + +### Patch Changes + +- 038b2e6: Only consider entities of kind `User` when using `findCatalogUser` with a filter query, unless an explicit `kind` filter is provided. +- Updated dependencies + - @backstage/catalog-client@1.6.3 + - @backstage/backend-common@0.21.6 + - @backstage/backend-plugin-api@0.6.16 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.10 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.6.2 + - @backstage/backend-common@0.21.5 + - @backstage/backend-plugin-api@0.6.15 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.4.9 + +### Patch Changes + +- b4fc6e3: Deprecated the `getBearerTokenFromAuthorizationHeader` function, which is being replaced by the new `HttpAuthService`. +- 2af5354: Bump dependency `jose` to v5 +- 0fb419b: Updated dependency `uuid` to `^9.0.0`. + Updated dependency `@types/uuid` to `^9.0.0`. +- b1b012d: Fix issue with `providerInfo` not being set properly for some proxy providers, by making `providerInfo` an explicit optional return from `authenticate` +- Updated dependencies + - @backstage/backend-common@0.21.4 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/backend-plugin-api@0.6.14 + - @backstage/catalog-client@1.6.1 + - @backstage/catalog-model@1.4.5 + - @backstage/types@1.1.1 + +## 0.4.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.6.1-next.1 + - @backstage/backend-common@0.21.4-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 + - @backstage/catalog-model@1.4.5-next.0 + - @backstage/config@1.2.0-next.1 + - @backstage/errors@1.2.4-next.0 + - @backstage/types@1.1.1 + +## 0.4.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.2.0-next.1 + - @backstage/backend-common@0.21.4-next.1 + - @backstage/backend-plugin-api@0.6.14-next.1 + - @backstage/catalog-client@1.6.1-next.0 + - @backstage/catalog-model@1.4.5-next.0 + - @backstage/errors@1.2.4-next.0 + - @backstage/types@1.1.1 + +## 0.4.8-next.0 + +### Patch Changes + +- b4fc6e3: Deprecated the `getBearerTokenFromAuthorizationHeader` function, which is being replaced by the new `HttpAuthService`. +- 2af5354: Bump dependency `jose` to v5 +- 0fb419b: Updated dependency `uuid` to `^9.0.0`. + Updated dependency `@types/uuid` to `^9.0.0`. +- b1b012d: Fix issue with `providerInfo` not being set properly for some proxy providers, by making `providerInfo` an explicit optional return from `authenticate` +- Updated dependencies + - @backstage/backend-common@0.21.3-next.0 + - @backstage/errors@1.2.4-next.0 + - @backstage/backend-plugin-api@0.6.13-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/types@1.1.1 + +## 0.4.4 + +### Patch Changes + +- 71c3b7f: Fix error when Microsoft tokens (or any other using the `defaultProfileTransform`) are requested without the profile scope. +- d4cc552: The helper function `makeProfileInfo` and `PassportHelpers.transformProfile` + were refactored to use the `jose` library. +- Updated dependencies + - @backstage/backend-common@0.21.0 + - @backstage/backend-plugin-api@0.6.10 + - @backstage/catalog-model@1.4.4 + - @backstage/catalog-client@1.6.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.4.4-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0-next.3 + - @backstage/backend-plugin-api@0.6.10-next.3 + - @backstage/catalog-client@1.6.0-next.1 + - @backstage/catalog-model@1.4.4-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.4.4-next.2 + +### Patch Changes + +- d4cc552: The helper function `makeProfileInfo` and `PassportHelpers.transformProfile` + were refactored to use the `jose` library. +- Updated dependencies + - @backstage/backend-common@0.21.0-next.2 + - @backstage/backend-plugin-api@0.6.10-next.2 + - @backstage/config@1.1.1 + - @backstage/catalog-client@1.6.0-next.1 + - @backstage/catalog-model@1.4.4-next.0 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.4.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.4.4-next.0 + - @backstage/catalog-client@1.6.0-next.1 + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/backend-common@0.21.0-next.1 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.4.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0-next.0 + - @backstage/catalog-client@1.6.0-next.0 + - @backstage/backend-plugin-api@0.6.10-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.4.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/catalog-client@1.5.2 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.4.3-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + +## 0.4.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.1 + - @backstage/config@1.1.1 + - @backstage/backend-plugin-api@0.6.9-next.1 + - @backstage/catalog-client@1.5.2-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.4.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.0 + - @backstage/catalog-client@1.5.2-next.0 + - @backstage/backend-plugin-api@0.6.9-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.4.2 + +### Patch Changes + +- a62764b: Updated dependency `passport` to `^0.7.0`. +- 0cbb03b: Fixing regular expression ReDoS with zod packages. Upgrading to latest. ref: +- Updated dependencies + - @backstage/backend-common@0.20.0 + - @backstage/catalog-client@1.5.0 + - @backstage/backend-plugin-api@0.6.8 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.4.2-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.3 + - @backstage/backend-plugin-api@0.6.8-next.3 + - @backstage/catalog-client@1.5.0-next.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.4.2-next.2 + +### Patch Changes + +- a62764b: Updated dependency `passport` to `^0.7.0`. +- Updated dependencies + - @backstage/backend-common@0.20.0-next.2 + - @backstage/catalog-client@1.5.0-next.1 + - @backstage/backend-plugin-api@0.6.8-next.2 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.4.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.5.0-next.0 + - @backstage/backend-common@0.20.0-next.1 + - @backstage/backend-plugin-api@0.6.8-next.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.0 + - @backstage/backend-plugin-api@0.6.8-next.0 + - @backstage/catalog-client@1.4.6 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.4.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.9 + - @backstage/backend-plugin-api@0.6.7 + - @backstage/catalog-client@1.4.6 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.4.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.7-next.2 + - @backstage/backend-common@0.19.9-next.2 + +## 0.4.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.9-next.1 + - @backstage/backend-plugin-api@0.6.7-next.1 + - @backstage/catalog-client@1.4.5 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.4.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.9-next.0 + - @backstage/backend-plugin-api@0.6.7-next.0 + - @backstage/catalog-client@1.4.5 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.4.0 + +### Minor Changes + +- 6f142d5356: **BREAKING**: The recently introduced `ProxyAuthenticator.initialize()` method is no longer `async` to match the way the OAuth equivalent is implemented. + +### Patch Changes + +- 6c2b0793bf: Fix for persisted scopes not being properly restored on sign-in. +- 8b8b1d23ae: Fixed cookie persisted scope not returned in OAuth refresh handler response. +- ae34255836: Adding optional audience parameter to OAuthState type declaration +- Updated dependencies + - @backstage/backend-common@0.19.8 + - @backstage/catalog-model@1.4.3 + - @backstage/errors@1.2.3 + - @backstage/backend-plugin-api@0.6.6 + - @backstage/catalog-client@1.4.5 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + +## 0.4.0-next.2 + +### Minor Changes + +- 6f142d5356: **BREAKING**: The recently introduced `ProxyAuthenticator.initialize()` method is no longer `async` to match the way the OAuth equivalent is implemented. + +### Patch Changes + +- 8b8b1d23ae: Fixed cookie persisted scope not returned in OAuth refresh handler response. +- Updated dependencies + - @backstage/backend-common@0.19.8-next.2 + - @backstage/catalog-model@1.4.3-next.0 + - @backstage/errors@1.2.3-next.0 + - @backstage/backend-plugin-api@0.6.6-next.2 + - @backstage/catalog-client@1.4.5-next.0 + - @backstage/config@1.1.1-next.0 + - @backstage/types@1.1.1 + +## 0.3.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.1 + - @backstage/backend-plugin-api@0.6.5-next.1 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## 0.3.2-next.0 + +### Patch Changes + +- 6c2b0793bf: Fix for persisted scopes not being properly restored on sign-in. +- Updated dependencies + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## 0.3.0 + +### Minor Changes + +- 8513cd7d00e3: Introduced a new system for building auth providers for `@backstage/plugin-auth-backend`, which both increases the amount of code re-use across providers, and also works better with the new backend system. + + Many existing types have been moved from `@backstage/plugin-auth-backend` in order to avoid a direct dependency on the plugin from modules. + + Auth provider integrations are now primarily implemented through a pattern of creating "authenticators", which are in turn specific to each kind of integrations. Initially there are two types: `createOAuthAuthenticator` and `createProxyAuthenticator`. These come paired with functions that let you create the corresponding route handlers, `createOAuthRouteHandlers` and `createProxyAuthRouteHandlers`, as well as provider factories, `createOAuthProviderFactory` and `createProxyAuthProviderFactory`. This new authenticator pattern allows the sign-in logic to be separated from the auth integration logic, allowing it to be completely re-used across all providers of the same kind. + + The new provider factories also implement a new declarative way to configure sign-in resolvers, rather than configuration through code. Sign-in resolvers can now be configured through the `resolvers` configuration key, where the first resolver that provides an identity will be used, for example: + + ```yaml + auth: + providers: + google: + development: + clientId: ... + clientSecret: ... + signIn: + resolvers: + - resolver: emailMatchingUserEntityAnnotation + - resolver: emailLocalPartMatchingUserEntityName + ``` + + These configurable resolvers are created with a new `createSignInResolverFactory` function, which creates a sign-in resolver factory, optionally with an options schema that will be used both when configuring the sign-in resolver through configuration and code. + + The internal helpers from `@backstage/plugin-auth-backend` that were used to implement auth providers using passport strategies have now also been made available as public API, through `PassportHelpers` and `PassportOAuthAuthenticatorHelper`. + +### Patch Changes + +- 18619f793c94: The `BackstageIdentityResponse` interface now has an optional `expiresInSeconds` field that can be used to signal session expiration. The `prepareBackstageIdentityResponse` utility will now also read the expiration from the provided token, and include it in the response. +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/config@1.1.0 + - @backstage/catalog-client@1.4.4 + - @backstage/catalog-model@1.4.2 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + - @backstage/backend-plugin-api@0.6.3 + +## 0.3.0-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.4.4-next.2 + - @backstage/catalog-model@1.4.2-next.2 + - @backstage/config@1.1.0-next.2 + - @backstage/errors@1.2.2-next.0 + - @backstage/types@1.1.1-next.0 + - @backstage/backend-plugin-api@0.6.3-next.3 + - @backstage/backend-common@0.19.5-next.3 + +## 0.3.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0-next.1 + - @backstage/backend-common@0.19.5-next.2 + - @backstage/backend-plugin-api@0.6.3-next.2 + - @backstage/catalog-model@1.4.2-next.1 + - @backstage/catalog-client@1.4.4-next.1 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## 0.3.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0-next.0 + - @backstage/backend-common@0.19.5-next.1 + - @backstage/backend-plugin-api@0.6.3-next.1 + - @backstage/catalog-model@1.4.2-next.0 + - @backstage/catalog-client@1.4.4-next.0 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## 0.3.0-next.0 + +### Minor Changes + +- 8513cd7d00e3: Introduced a new system for building auth providers for `@backstage/plugin-auth-backend`, which both increases the amount of code re-use across providers, and also works better with the new backend system. + + Many existing types have been moved from `@backstage/plugin-auth-backend` in order to avoid a direct dependency on the plugin from modules. + + Auth provider integrations are now primarily implemented through a pattern of creating "authenticators", which are in turn specific to each kind of integrations. Initially there are two types: `createOAuthAuthenticator` and `createProxyAuthenticator`. These come paired with functions that let you create the corresponding route handlers, `createOAuthRouteHandlers` and `createProxyAuthRouteHandlers`, as well as provider factories, `createOAuthProviderFactory` and `createProxyAuthProviderFactory`. This new authenticator pattern allows the sign-in logic to be separated from the auth integration logic, allowing it to be completely re-used across all providers of the same kind. + + The new provider factories also implement a new declarative way to configure sign-in resolvers, rather than configuration through code. Sign-in resolvers can now be configured through the `resolvers` configuration key, where the first resolver that provides an identity will be used, for example: + + ```yaml + auth: + providers: + google: + development: + clientId: ... + clientSecret: ... + signIn: + resolvers: + - resolver: emailMatchingUserEntityAnnotation + - resolver: emailLocalPartMatchingUserEntityName + ``` + + These configurable resolvers are created with a new `createSignInResolverFactory` function, which creates a sign-in resolver factory, optionally with an options schema that will be used both when configuring the sign-in resolver through configuration and code. + + The internal helpers from `@backstage/plugin-auth-backend` that were used to implement auth providers using passport strategies have now also been made available as public API, through `PassportHelpers` and `PassportOAuthAuthenticatorHelper`. + +### Patch Changes + +- 18619f793c94: The `BackstageIdentityResponse` interface now has an optional `expiresInSeconds` field that can be used to signal session expiration. The `prepareBackstageIdentityResponse` utility will now also read the expiration from the provided token, and include it in the response. +- Updated dependencies + - @backstage/backend-common@0.19.4-next.0 + - @backstage/backend-plugin-api@0.6.2-next.0 + - @backstage/catalog-client@1.4.3 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## 0.2.17 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + +## 0.2.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.2 + +## 0.2.17-next.1 + +### Patch Changes + +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + +## 0.2.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.0 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + +## 0.2.16 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.1 + - @backstage/backend-common@0.19.1 + - @backstage/config@1.0.8 + +## 0.2.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.1-next.0 + - @backstage/backend-common@0.19.1-next.0 + - @backstage/config@1.0.8 + +## 0.2.15 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0 + - @backstage/errors@1.2.0 + - @backstage/config@1.0.8 + +## 0.2.15-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.2.0-next.0 + +## 0.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/config@1.0.7 + +## 0.2.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.6-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## 0.2.14 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.5 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## 0.2.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.5-next.1 + - @backstage/config@1.0.7 + +## 0.2.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.5-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## 0.2.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## 0.2.13-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## 0.2.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## 0.2.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## 0.2.12 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + +## 0.2.12-next.2 + +### Patch Changes + +- 65454876fb2: Minor API report tweaks +- Updated dependencies + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## 0.2.12-next.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/errors@1.1.5-next.0 + - @backstage/backend-common@0.18.3-next.1 + - @backstage/config@1.0.7-next.0 + +## 0.2.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## 0.2.11 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## 0.2.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## 0.2.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## 0.2.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + +## 0.2.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + +## 0.2.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + +## 0.2.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + +## 0.2.8 + +### Patch Changes + +- 3280711113: Updated dependency `msw` to `^0.49.0`. +- Updated dependencies + - @backstage/backend-common@0.17.0 + - @backstage/errors@1.1.4 + - @backstage/config@1.0.5 + +## 0.2.8-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.17.0-next.3 + - @backstage/config@1.0.5-next.1 + - @backstage/errors@1.1.4-next.1 + +## 0.2.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.17.0-next.2 + - @backstage/config@1.0.5-next.1 + - @backstage/errors@1.1.4-next.1 + +## 0.2.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.17.0-next.1 + - @backstage/config@1.0.5-next.1 + - @backstage/errors@1.1.4-next.1 + +## 0.2.8-next.0 + +### Patch Changes + +- 3280711113: Updated dependency `msw` to `^0.49.0`. +- Updated dependencies + - @backstage/backend-common@0.16.1-next.0 + - @backstage/config@1.0.5-next.0 + - @backstage/errors@1.1.4-next.0 + +## 0.2.7 + +### Patch Changes + +- 7573b65232: Internal refactor of imports to avoid circular dependencies +- Updated dependencies + - @backstage/backend-common@0.16.0 + - @backstage/config@1.0.4 + - @backstage/errors@1.1.3 + +## 0.2.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.16.0-next.1 + - @backstage/config@1.0.4-next.0 + - @backstage/errors@1.1.3-next.0 + +## 0.2.7-next.0 + +### Patch Changes + +- 7573b65232: Internal refactor of imports to avoid circular dependencies +- Updated dependencies + - @backstage/backend-common@0.16.0-next.0 + - @backstage/config@1.0.4-next.0 + - @backstage/errors@1.1.3-next.0 + +## 0.2.6 + +### Patch Changes + +- f3a3fefb96: Ensure `getIdentity` throws an `AuthenticationError` instead of a `NotAllowed` error when authentication fails +- Updated dependencies + - @backstage/backend-common@0.15.2 + - @backstage/config@1.0.3 + - @backstage/errors@1.1.2 + +## 0.2.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.2-next.2 + - @backstage/config@1.0.3-next.2 + - @backstage/errors@1.1.2-next.2 + +## 0.2.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.2-next.1 + - @backstage/config@1.0.3-next.1 + - @backstage/errors@1.1.2-next.1 + +## 0.2.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.2-next.0 + - @backstage/config@1.0.3-next.0 + - @backstage/errors@1.1.2-next.0 + +## 0.2.5 + +### Patch Changes + +- 9212439d15: Minor update to tests +- 2cbd533426: `IdentityClient` is now deprecated. Please migrate to `IdentityApi` and `DefaultIdentityClient` instead. The authenticate function on `DefaultIdentityClient` is also deprecated. Please use `getIdentity` instead. +- 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/backend-common@0.15.1 + - @backstage/config@1.0.2 + - @backstage/errors@1.1.1 + +## 0.2.5-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.2-next.0 + - @backstage/errors@1.1.1-next.0 + - @backstage/backend-common@0.15.1-next.3 + +## 0.2.5-next.2 + +### Patch Changes + +- 2cbd533426: `IdentityClient` is now deprecated. Please migrate to `IdentityApi` and `DefaultIdentityClient` instead. The authenticate function on `DefaultIdentityClient` is also deprecated. Please use `getIdentity` instead. +- 667d917488: Updated dependency `msw` to `^0.47.0`. +- 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`. +- Updated dependencies + - @backstage/backend-common@0.15.1-next.2 + +## 0.2.5-next.1 + +### Patch Changes + +- 9212439d15: Minor update to tests +- Updated dependencies + - @backstage/backend-common@0.15.1-next.1 + +## 0.2.5-next.0 + +### Patch Changes + +- bf5e9030eb: Updated dependency `msw` to `^0.45.0`. +- Updated dependencies + - @backstage/backend-common@0.15.1-next.0 + +## 0.2.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.0 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.0-next.0 + +## 0.2.3 + +### Patch Changes + +- a70869e775: Updated dependency `msw` to `^0.43.0`. +- 8006d0f9bf: Updated dependency `msw` to `^0.44.0`. +- Updated dependencies + - @backstage/backend-common@0.14.1 + - @backstage/errors@1.1.0 + +## 0.2.3-next.2 + +### Patch Changes + +- a70869e775: Updated dependency `msw` to `^0.43.0`. +- Updated dependencies + - @backstage/backend-common@0.14.1-next.3 + +## 0.2.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.1 + - @backstage/errors@1.1.0-next.0 + +## 0.2.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + +## 0.2.2 + +### Patch Changes + +- 5ca0b86b88: Address corner cases where the key store was not being created at startup +- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. +- 9079a78078: Added configurable algorithms array for IdentityClient +- Updated dependencies + - @backstage/backend-common@0.14.0 + +## 0.2.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.0-next.2 + +## 0.2.2-next.1 + +### Patch Changes + +- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. +- Updated dependencies + - @backstage/backend-common@0.13.6-next.1 + +## 0.2.2-next.0 + +### Patch Changes + +- 9079a78078: Added configurable algorithms array for IdentityClient +- Updated dependencies + - @backstage/backend-common@0.13.6-next.0 + +## 0.2.1 + +### Patch Changes + +- 9ec4e0613e: Update to `jose` 4.6.0 +- Updated dependencies + - @backstage/backend-common@0.13.3 + - @backstage/config@1.0.1 + +## 0.2.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + +## 0.2.1-next.0 + +### Patch Changes + +- 9ec4e0613e: Update to `jose` 4.6.0 +- Updated dependencies + - @backstage/backend-common@0.13.3-next.0 + +## 0.2.0 + +### Minor Changes + +- 15d3a3c39a: **BREAKING**: Removed the deprecated `id` and `entity` fields from `BackstageSignInResult`. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.2 + +## 0.2.0-next.0 + +### Minor Changes + +- 15d3a3c39a: **BREAKING**: Removed the deprecated `id` and `entity` fields from `BackstageSignInResult`. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.2-next.0 + +## 0.1.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.1 + - @backstage/catalog-model@1.0.0 + - @backstage/config@1.0.0 + - @backstage/errors@1.0.0 + +## 0.1.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.0 + - @backstage/catalog-model@0.13.0 + +## 0.1.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.0-next.0 + - @backstage/catalog-model@0.13.0-next.0 + +## 0.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@0.12.0 + - @backstage/backend-common@0.12.0 + +## 0.1.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.11.0 + - @backstage/catalog-model@0.11.0 + +## 0.1.2 + +### Patch Changes + +- Fix for the previous release with missing type declarations. +- Updated dependencies + - @backstage/backend-common@0.10.9 + - @backstage/catalog-model@0.10.1 + - @backstage/config@0.1.15 + - @backstage/errors@0.2.2 + +## 0.1.1 + +### 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` +- Updated dependencies + - @backstage/backend-common@0.10.8 + - @backstage/errors@0.2.1 + - @backstage/catalog-model@0.10.0 + - @backstage/config@0.1.14 + +## 0.1.0 + +### Minor Changes + +- 9058bb1b5e: Added this package, to hold shared types and functionality that other backend + packages need to import. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.10.7 + +## @backstage/plugin-catalog@1.33.0-next.1 + +### Minor Changes + +- 05aac34: Migrated `DeleteEntityDialog` and `EntityOrphanWarning` components to Backstage UI. + + The `deleteEntity.description` translation key no longer includes "Click here to delete" text. A new `deleteEntity.actionButtonTitle` key was added for the action button. + +### Patch Changes + +- 8d4c48b: Fixed vertical spacing between tags in the catalog table. +- e8258d0: The default entity content layout still supports rendering summary cards at runtime for backward compatibility, but logs a console warning when they are detected to help identify where migration is needed. +- Updated dependencies + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/ui@0.12.0-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/core-compat-api@0.5.8-next.1 + - @backstage/plugin-search-react@1.10.3-next.1 + - @backstage/core-components@0.18.7-next.1 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/integration-react@1.2.15-next.1 + - @backstage/plugin-scaffolder-common@1.7.6-next.1 + +## @backstage/plugin-catalog-backend-module-gitlab@0.8.0-next.1 + +### Minor Changes + +- 2f51676: allow entity discoverability via gitlab search API + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/backend-defaults@0.15.2-next.1 + +## @backstage/plugin-catalog-backend-module-msgraph@0.9.0-next.1 + +### Minor Changes + +- 8694561: Log group/user count, tenant ID, execution time as separate fields + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-react@1.22.0-next.1 + +### Minor Changes + +- 0e9578d: Migrated `UnregisterEntityDialog` from Material UI to Backstage UI components. +- e8258d0: **BREAKING**: Removed the 'summary' entity card type from `EntityCardType`. Users should migrate to using 'content' or 'info' card types instead. + + TypeScript will now show errors if you try to use `type: 'summary'` when creating entity cards. + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-test-utils@0.4.6-next.1 + - @backstage/ui@0.12.0-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/core-compat-api@0.5.8-next.1 + - @backstage/core-components@0.18.7-next.1 + - @backstage/integration-react@1.2.15-next.1 + +## @backstage/plugin-mcp-actions-backend@0.1.9-next.0 + +# @backstage/plugin-mcp-actions-backend + +## 0.1.8-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## 0.1.7 + +### Patch Changes + +- 4d82a35: build(deps): bump `@modelcontextprotocol/sdk` from 1.24.3 to 1.25.2 +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/backend-plugin-api@1.6.1 + +## 0.1.7-next.1 + +### Patch Changes + +- 4d82a35: build(deps): bump `@modelcontextprotocol/sdk` from 1.24.3 to 1.25.2 +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + +## 0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/catalog-client@1.12.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1 + +## 0.1.6 + +### Patch Changes + +- e83e038: Added `@cfworker/json-schema` as a dependency to this package part of the `@modelcontextprotocol/sdk` bump as it's required in the types +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- 79ef471: Clarify error handling in readme and update handleError.ts to include all backstage/errors +- Updated dependencies + - @backstage/backend-defaults@0.14.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/plugin-catalog-node@1.20.1 + +## 0.1.6-next.1 + +### Patch Changes + +- e83e038: Added `@cfworker/json-schema` as a dependency to this package part of the `@modelcontextprotocol/sdk` bump as it's required in the types +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/catalog-client@1.12.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1-next.1 + +## 0.1.6-next.0 + +### Patch Changes + +- 79ef471: Clarify error handling in readme and update handleError.ts to include all backstage/errors +- Updated dependencies + - @backstage/backend-defaults@0.14.0-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + - @backstage/plugin-catalog-node@1.20.1-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## 0.1.5 + +### 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/backend-defaults@0.13.1 + - @backstage/plugin-catalog-node@1.20.0 + - @backstage/backend-plugin-api@1.5.0 + - @backstage/catalog-client@1.12.1 + +## 0.1.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.20.0-next.1 + - @backstage/backend-defaults@0.13.1-next.1 + - @backstage/backend-plugin-api@1.5.0-next.1 + +## 0.1.5-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/backend-defaults@0.13.1-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + - @backstage/catalog-client@1.12.1-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.19.2-next.0 + +## 0.1.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0 + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-catalog-node@1.19.1 + +## 0.1.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.1 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-catalog-node@1.19.1-next.0 + - @backstage/catalog-client@1.12.0 + +## 0.1.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.13.0-next.0 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/catalog-client@1.12.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.19.0 + +## 0.1.3 + +### Patch Changes + +- 1d47bf3: Proxy `/.well-known/oauth-authorization-server` to `/.well-known/openid-configuration` on `auth-backend` when `auth.experimentalDynamicClientRegistration.enabled` is enabled. +- 7f2a4a0: Updating docs +- d08b0c9: The MCP backend will now convert known Backstage errors into textual responses with `isError: true`. + The error message can be useful for an LLM to understand and maybe give back to the user. + Previously all errors where thrown out to `@modelcontextprotocol/sdk` which causes a generic 500. +- Updated dependencies + - @backstage/backend-defaults@0.12.1 + - @backstage/plugin-catalog-node@1.19.0 + - @backstage/catalog-client@1.12.0 + - @backstage/types@1.2.2 + - @backstage/backend-plugin-api@1.4.3 + +## 0.1.3-next.1 + +### Patch Changes + +- 1d47bf3: Proxy `/.well-known/oauth-authorization-server` to `/.well-known/openid-configuration` on `auth-backend` when `auth.experimentalDynamicClientRegistration.enabled` is enabled. +- Updated dependencies + - @backstage/backend-defaults@0.12.1-next.1 + - @backstage/catalog-client@1.12.0-next.0 + - @backstage/plugin-catalog-node@1.19.0-next.1 + +## 0.1.3-next.0 + +### Patch Changes + +- d08b0c9: The MCP backend will now convert known Backstage errors into textual responses with `isError: true`. + The error message can be useful for an LLM to understand and maybe give back to the user. + Previously all errors where thrown out to `@modelcontextprotocol/sdk` which causes a generic 500. +- Updated dependencies + - @backstage/backend-defaults@0.12.1-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + - @backstage/plugin-catalog-node@1.18.1-next.0 + +## 0.1.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.12.0 + - @backstage/catalog-client@1.11.0 + - @backstage/plugin-catalog-node@1.18.0 + - @backstage/backend-plugin-api@1.4.2 + +## 0.1.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.11.2-next.0 + - @backstage/catalog-client@1.11.0-next.0 + - @backstage/plugin-catalog-node@1.18.0-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.1.1 + +### Patch Changes + +- 6bc0799: Fixed the example in the README for generating a static token by adding a subject field +- Updated dependencies + - @backstage/backend-defaults@0.11.1 + - @backstage/catalog-client@1.10.2 + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-catalog-node@1.17.2 + +## 0.1.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.10.2-next.0 + - @backstage/backend-defaults@0.11.1-next.1 + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-catalog-node@1.17.2-next.0 + +## 0.1.1-next.0 + +### Patch Changes + +- 6bc0799: Fixed the example in the README for generating a static token by adding a subject field +- Updated dependencies + - @backstage/backend-defaults@0.11.1-next.0 + - @backstage/backend-plugin-api@1.4.0 + - @backstage/plugin-catalog-node@1.17.1 + - @backstage/catalog-client@1.10.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.1.0 + +### Minor Changes + +- 4ed0fb6: Initial implementation of an `mcp-actions` backend + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.10.1 + - @backstage/backend-defaults@0.11.0 + - @backstage/plugin-catalog-node@1.17.1 + - @backstage/backend-plugin-api@1.4.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## @backstage/plugin-permission-backend@0.7.9-next.0 + +# @backstage/plugin-permission-backend + +## 0.7.8-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/plugin-permission-node@0.10.9-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## 0.7.7 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10 + - @backstage/plugin-permission-node@0.10.7 + - @backstage/backend-plugin-api@1.6.0 + +## 0.7.7-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/plugin-permission-node@0.10.7-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.3 + +## 0.7.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + - @backstage/plugin-permission-node@0.10.7-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.3 + +## 0.7.6 + +### Patch Changes + +- b2bef92: Convert all enums to erasable-syntax compliant patterns +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-auth-node@0.6.9 + - @backstage/config@1.3.6 + - @backstage/plugin-permission-node@0.10.6 + +## 0.7.6-next.1 + +### Patch Changes + +- b2bef92: Convert all enums to erasable-syntax compliant patterns +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0-next.1 + - @backstage/plugin-permission-common@0.9.3-next.1 + - @backstage/plugin-auth-node@0.6.9-next.1 + - @backstage/plugin-permission-node@0.10.6-next.1 + +## 0.7.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.9-next.0 + - @backstage/config@1.3.6-next.0 + - @backstage/plugin-permission-node@0.10.6-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.3-next.0 + +## 0.7.5 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.5 + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-auth-node@0.6.8 + - @backstage/plugin-permission-common@0.9.2 + - @backstage/plugin-permission-node@0.10.5 + +## 0.7.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + - @backstage/plugin-permission-node@0.10.5-next.0 + +## 0.7.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + - @backstage/plugin-permission-node@0.10.4 + +## 0.7.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + - @backstage/plugin-permission-node@0.10.4-next.0 + +## 0.7.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6 + - @backstage/plugin-permission-node@0.10.3 + - @backstage/backend-plugin-api@1.4.2 + +## 0.7.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6-next.0 + - @backstage/plugin-permission-node@0.10.3-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.1 + +## 0.7.2 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.3 + - @backstage/plugin-permission-common@0.9.1 + - @backstage/plugin-permission-node@0.10.2 + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-auth-node@0.6.5 + +## 0.7.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.3-next.0 + - @backstage/plugin-permission-common@0.9.1-next.0 + - @backstage/plugin-permission-node@0.10.2-next.0 + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-auth-node@0.6.5-next.0 + +## 0.7.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4 + - @backstage/backend-plugin-api@1.4.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.0 + - @backstage/plugin-permission-node@0.10.1 + +## 0.7.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.0 + - @backstage/plugin-permission-node@0.10.1-next.1 + +## 0.7.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + - @backstage/plugin-auth-node@0.6.4-next.0 + - @backstage/plugin-permission-node@0.10.1-next.0 + +## 0.7.0 + +### Minor Changes + +- 4da2965: Fixed an issue causing the `PermissionClient` to exhaust the request body size limit too quickly when making many requests. +- cf8fd51: **BREAKING** Removed support for the legacy backend system, please [migrate to the new backend system](https://backstage.io/docs/backend-system/building-backends/migrating) + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3 + - @backstage/backend-plugin-api@1.3.1 + - @backstage/plugin-permission-common@0.9.0 + - @backstage/plugin-permission-node@0.10.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.7.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.2 + - @backstage/backend-plugin-api@1.3.1-next.2 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.0-next.0 + - @backstage/plugin-permission-node@0.10.0-next.2 + +## 0.7.0-next.1 + +### Minor Changes + +- 4da2965: Fixed an issue causing the `PermissionClient` to exhaust the request body size limit too quickly when making many requests. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + - @backstage/plugin-permission-common@0.9.0-next.0 + - @backstage/plugin-permission-node@0.10.0-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.7.0-next.0 + +### Minor Changes + +- cf8fd51: **BREAKING** Removed support for the legacy backend system, please [migrate to the new backend system](https://backstage.io/docs/backend-system/building-backends/migrating) + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/plugin-auth-node@0.6.3-next.0 + - @backstage/plugin-permission-node@0.9.2-next.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.8.4 + +## 0.6.0 + +### Minor Changes + +- 78eaa50: Improved validation for the `/authorize` endpoint when a `resourceRef` is provided alongside a basic permission. Additionally, introduced a clearer error message for cases where users attempt to directly evaluate conditional permissions. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.0 + - @backstage/plugin-auth-node@0.6.2 + - @backstage/plugin-permission-node@0.9.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.8.4 + +## 0.5.55 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.9.0 + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.8.4 + +## 0.5.55-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-permission-node@0.8.9-next.1 + +## 0.5.55-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.8.9-next.0 + - @backstage/plugin-auth-node@0.6.1-next.0 + - @backstage/backend-plugin-api@1.2.1-next.0 + +## 0.5.54 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.8.8 + - @backstage/backend-plugin-api@1.2.0 + - @backstage/plugin-auth-node@0.6.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.8.4 + +## 0.5.54-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.8.8-next.2 + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/plugin-auth-node@0.6.0-next.2 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.8.4 + +## 0.5.54-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/plugin-auth-node@0.6.0-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.8.4 + - @backstage/plugin-permission-node@0.8.8-next.1 + +## 0.5.54-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-node@0.8.8-next.0 + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.5.7-next.0 + - @backstage/plugin-permission-common@0.8.4 + +## 0.5.53 + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- Updated dependencies + - @backstage/plugin-permission-node@0.8.7 + - @backstage/plugin-auth-node@0.5.6 + - @backstage/backend-plugin-api@1.1.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.8.4 + +## 0.5.53-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + - @backstage/plugin-permission-node@0.8.7-next.1 + +## 0.5.53-next.0 + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- Updated dependencies + - @backstage/plugin-permission-node@0.8.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/plugin-permission-common@0.8.3 + +## 0.5.52 + +### Patch Changes + +- 1e624ca: Restrict `@types/express` version range from `*` to `^4.17.6`. +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/plugin-permission-node@0.8.6 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/plugin-permission-common@0.8.3 + +## 0.5.52-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/plugin-permission-node@0.8.6-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## 0.5.52-next.1 + +### Patch Changes + +- 5c9cc05: Use native fetch instead of node-fetch +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + - @backstage/plugin-permission-node@0.8.6-next.1 + - @backstage/config@1.3.0 + - @backstage/errors@1.2.5 + - @backstage/plugin-permission-common@0.8.2 + +## 0.5.52-next.0 + +### Patch Changes + +- 1e624ca: Restrict `@types/express` version range from `*` to `^4.17.6`. +- Updated dependencies + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/plugin-auth-node@0.5.5-next.0 + - @backstage/config@1.3.0 + - @backstage/errors@1.2.5 + - @backstage/plugin-permission-common@0.8.2 + - @backstage/plugin-permission-node@0.8.6-next.0 + +## 0.5.51 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.0 + - @backstage/plugin-auth-node@0.5.4 + - @backstage/backend-plugin-api@1.0.2 + - @backstage/plugin-permission-common@0.8.2 + - @backstage/errors@1.2.5 + - @backstage/plugin-permission-node@0.8.5 + +## 0.5.51-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.5-next.2 + +## 0.5.51-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.5.4-next.1 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.5-next.1 + +## 0.5.51-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.5-next.0 + +## 0.5.50 + +### Patch Changes + +- 094eaa3: Remove references to in-repo backend-common +- 3109c24: The export for the new backend system at the `/alpha` export is now also available via the main entry point, which means that you can remove the `/alpha` suffix from the import. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3 + - @backstage/plugin-permission-node@0.8.4 + - @backstage/backend-plugin-api@1.0.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + +## 0.5.50-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.4-next.1 + +## 0.5.50-next.0 + +### Patch Changes + +- 094eaa3: Remove references to in-repo backend-common +- Updated dependencies + - @backstage/plugin-permission-node@0.8.4-next.0 + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + +## 0.5.49 + +### Patch Changes + +- d425fc4: Modules, plugins, and services are now `BackendFeature`, not a function that returns a feature. +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- fcb9356: Deprecated `createRouter` and its router options in favour of the new backend system. +- Updated dependencies + - @backstage/backend-common@0.25.0 + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-auth-node@0.5.2 + - @backstage/plugin-permission-node@0.8.3 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + +## 0.5.49-next.2 + +### Patch Changes + +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-common@0.25.0-next.2 + - @backstage/plugin-auth-node@0.5.2-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + - @backstage/plugin-permission-node@0.8.3-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + +## 0.5.49-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.25.0-next.1 + - @backstage/plugin-auth-node@0.5.2-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-permission-node@0.8.3-next.1 + +## 0.5.49-next.0 + +### Patch Changes + +- d425fc4: Modules, plugins, and services are now `BackendFeature`, not a function that returns a feature. +- fcb9356: Deprecated `createRouter` and its router options in favour of the new backend system. +- Updated dependencies + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/plugin-permission-node@0.8.3-next.0 + - @backstage/backend-common@0.25.0-next.0 + - @backstage/plugin-auth-node@0.5.2-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + +## 0.5.47 + +### Patch Changes + +- 93095ee: Make sure node-fetch is version 2.7.0 or greater +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0 + - @backstage/backend-common@0.24.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-auth-node@0.5.0 + - @backstage/plugin-permission-node@0.8.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.5.47-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/backend-common@0.23.4-next.3 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.5.0-next.3 + - @backstage/plugin-permission-common@0.8.1-next.1 + - @backstage/plugin-permission-node@0.8.1-next.3 + +## 0.5.47-next.2 + +### Patch Changes + +- 93095ee: Make sure node-fetch is version 2.7.0 or greater +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/plugin-permission-common@0.8.1-next.1 + - @backstage/backend-common@0.23.4-next.2 + - @backstage/plugin-auth-node@0.5.0-next.2 + - @backstage/plugin-permission-node@0.8.1-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.5.47-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.8.1-next.0 + - @backstage/plugin-permission-node@0.8.1-next.1 + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/backend-common@0.23.4-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.18-next.1 + +## 0.5.47-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.23.4-next.0 + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.18-next.0 + - @backstage/plugin-permission-common@0.8.0 + - @backstage/plugin-permission-node@0.8.1-next.0 + +## 0.5.46 + +### Patch Changes + +- ed10fd2: The `PermissionPolicy` interface has been updated to align with the recent changes to the Backstage auth system. The second argument to the `handle` method is now of the new `PolicyQueryUser` type. This type maintains the old fields from the `BackstageIdentityResponse`, which are now all deprecated. Instead, two new fields have been added, which allows access to the same information: + + - `credentials` - A `BackstageCredentials` object, which is useful for making requests to other services on behalf of the user as part of evaluating the policy. This replaces the deprecated `token` field. See the [Auth Service documentation](https://backstage.io/docs/backend-system/core-services/auth#creating-request-tokens) for information about how to create a token using these credentials. + - `info` - A `BackstageUserInfo` object, which contains the same information as the deprecated `identity`, except for the `type` field that was redundant. + + Most existing policies can be updated by replacing the `BackstageIdentityResponse` type with `PolicyQueryUser`, which is exported from `@backstage/plugin-permission-node`, as well as replacing any occurrences of `user?.identity` with `user?.info`. + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/backend-common@0.23.3 + - @backstage/plugin-permission-common@0.8.0 + - @backstage/plugin-permission-node@0.8.0 + - @backstage/plugin-auth-node@0.4.17 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.5.46-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.23.3-next.1 + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.17-next.1 + - @backstage/plugin-permission-common@0.7.14 + - @backstage/plugin-permission-node@0.7.33-next.1 + +## 0.5.45-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/backend-common@0.23.2-next.0 + - @backstage/plugin-auth-node@0.4.16-next.0 + - @backstage/plugin-permission-node@0.7.32-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.7.14 + +## 0.5.43 + +### Patch Changes + +- 78a0b08: Internal refactor to handle `BackendFeature` contract change. +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-common@0.23.0 + - @backstage/backend-plugin-api@0.6.19 + - @backstage/plugin-auth-node@0.4.14 + - @backstage/plugin-permission-node@0.7.30 + - @backstage/plugin-permission-common@0.7.14 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.5.43-next.3 + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/plugin-auth-node@0.4.14-next.3 + - @backstage/plugin-permission-common@0.7.14-next.0 + - @backstage/plugin-permission-node@0.7.30-next.3 + - @backstage/backend-common@0.23.0-next.3 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.5.43-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/backend-common@0.23.0-next.2 + - @backstage/plugin-permission-node@0.7.30-next.2 + - @backstage/plugin-auth-node@0.4.14-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.7.13 + +## 0.5.43-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.1 + - @backstage/plugin-permission-node@0.7.30-next.1 + - @backstage/backend-common@0.23.0-next.1 + - @backstage/plugin-auth-node@0.4.14-next.1 + +## 0.5.43-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.1-next.0 + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/plugin-auth-node@0.4.14-next.0 + - @backstage/plugin-permission-node@0.7.30-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.7.13 + +## 0.5.42 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0 + - @backstage/backend-plugin-api@0.6.18 + - @backstage/plugin-auth-node@0.4.13 + - @backstage/plugin-permission-node@0.7.29 + +## 0.5.42-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.1 + - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/plugin-permission-node@0.7.29-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + +## 0.5.42-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.0 + - @backstage/backend-common@0.21.8-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.7.13 + - @backstage/plugin-permission-node@0.7.29-next.0 + +## 0.5.41 + +### Patch Changes + +- d5a1fe1: Replaced winston logger with `LoggerService` +- Updated dependencies + - @backstage/backend-common@0.21.7 + - @backstage/plugin-permission-node@0.7.28 + - @backstage/backend-plugin-api@0.6.17 + - @backstage/plugin-auth-node@0.4.12 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.7.13 + +## 0.5.41-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.7-next.1 + - @backstage/backend-plugin-api@0.6.17-next.1 + - @backstage/plugin-auth-node@0.4.12-next.1 + - @backstage/plugin-permission-node@0.7.28-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.7.13 + +## 0.5.41-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.7-next.0 + - @backstage/backend-plugin-api@0.6.17-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.12-next.0 + - @backstage/plugin-permission-common@0.7.13 + - @backstage/plugin-permission-node@0.7.28-next.0 + +## 0.5.40 + +### Patch Changes + +- f3e2e86: Properly forward causes of errors from upstream backends in the `PermissionIntegrationClient` +- Updated dependencies + - @backstage/plugin-auth-node@0.4.11 + - @backstage/backend-common@0.21.6 + - @backstage/backend-plugin-api@0.6.16 + - @backstage/plugin-permission-node@0.7.27 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.7.13 + +## 0.5.39 + +### Patch Changes + +- f3e2e86: Properly forward causes of errors from upstream backends in the `PermissionIntegrationClient` +- Updated dependencies + - @backstage/backend-common@0.21.5 + - @backstage/plugin-auth-node@0.4.10 + - @backstage/plugin-permission-node@0.7.26 + - @backstage/backend-plugin-api@0.6.15 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.7.13 + +## 0.5.38 + +### Patch Changes + +- 9c7fb30: Properly forward causes of errors from upstream backends in the `PermissionIntegrationClient` + +## 0.5.37 + +### Patch Changes + +- 4467036: Allow unauthenticated access to health check endpoint. + +- 9802004: Migrated to use the new auth services introduced in [BEP-0003](https://github.com/backstage/backstage/blob/master/beps/0003-auth-architecture-evolution/README.md). + + The `createRouter` function now accepts `auth`, `httpAuth` and `userInfo` options. Theses are used internally to support the new backend system, and can be ignored. + +- Updated dependencies + - @backstage/backend-common@0.21.4 + - @backstage/plugin-auth-node@0.4.9 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/backend-plugin-api@0.6.14 + - @backstage/plugin-permission-common@0.7.13 + - @backstage/plugin-permission-node@0.7.25 + +## 0.5.37-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.4-next.2 + - @backstage/plugin-auth-node@0.4.9-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 + - @backstage/config@1.2.0-next.1 + - @backstage/errors@1.2.4-next.0 + - @backstage/plugin-permission-common@0.7.13-next.1 + - @backstage/plugin-permission-node@0.7.25-next.2 + +## 0.5.37-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.2.0-next.1 + - @backstage/backend-common@0.21.4-next.1 + - @backstage/backend-plugin-api@0.6.14-next.1 + - @backstage/plugin-auth-node@0.4.9-next.1 + - @backstage/plugin-permission-common@0.7.13-next.1 + - @backstage/plugin-permission-node@0.7.25-next.1 + - @backstage/errors@1.2.4-next.0 + +## 0.5.36-next.0 + +### Patch Changes + +- 9802004: Migrated to use the new auth services introduced in [BEP-0003](https://github.com/backstage/backstage/blob/master/beps/0003-auth-architecture-evolution/README.md). + + The `createRouter` function now accepts `auth`, `httpAuth` and `userInfo` options. Theses are used internally to support the new backend system, and can be ignored. + +- Updated dependencies + - @backstage/backend-common@0.21.3-next.0 + - @backstage/plugin-auth-node@0.4.8-next.0 + - @backstage/errors@1.2.4-next.0 + - @backstage/backend-plugin-api@0.6.13-next.0 + - @backstage/plugin-permission-common@0.7.13-next.0 + - @backstage/plugin-permission-node@0.7.24-next.0 + - @backstage/config@1.1.2-next.0 + +## 0.5.33 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0 + - @backstage/plugin-auth-node@0.4.4 + - @backstage/backend-plugin-api@0.6.10 + - @backstage/plugin-permission-node@0.7.21 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-permission-common@0.7.12 + +## 0.5.33-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0-next.3 + - @backstage/plugin-auth-node@0.4.4-next.3 + - @backstage/plugin-permission-node@0.7.21-next.3 + - @backstage/backend-plugin-api@0.6.10-next.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-permission-common@0.7.12 + +## 0.5.33-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0-next.2 + - @backstage/backend-plugin-api@0.6.10-next.2 + - @backstage/plugin-auth-node@0.4.4-next.2 + - @backstage/plugin-permission-node@0.7.21-next.2 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-permission-common@0.7.12 + +## 0.5.33-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/backend-common@0.21.0-next.1 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-auth-node@0.4.4-next.1 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.21-next.1 + +## 0.5.33-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0-next.0 + - @backstage/plugin-auth-node@0.4.4-next.0 + - @backstage/plugin-permission-node@0.7.21-next.0 + - @backstage/backend-plugin-api@0.6.10-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-permission-common@0.7.12 + +## 0.5.32 + +### Patch Changes + +- b1acd9b: Updated README +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-permission-node@0.7.20 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## 0.5.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + - @backstage/plugin-permission-node@0.7.20-next.2 + +## 0.5.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.1 + - @backstage/config@1.1.1 + - @backstage/plugin-auth-node@0.4.3-next.1 + - @backstage/plugin-permission-node@0.7.20-next.1 + - @backstage/backend-plugin-api@0.6.9-next.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-permission-common@0.7.11 + +## 0.5.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.0 + - @backstage/backend-plugin-api@0.6.9-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-auth-node@0.4.3-next.0 + - @backstage/plugin-permission-common@0.7.11 + - @backstage/plugin-permission-node@0.7.20-next.0 + +## 0.5.31 + +### Patch Changes + +- 0cbb03b: Fixing regular expression ReDoS with zod packages. Upgrading to latest. ref: +- Updated dependencies + - @backstage/backend-common@0.20.0 + - @backstage/plugin-auth-node@0.4.2 + - @backstage/plugin-permission-common@0.7.11 + - @backstage/plugin-permission-node@0.7.19 + - @backstage/backend-plugin-api@0.6.8 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## 0.5.31-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.3 + - @backstage/backend-plugin-api@0.6.8-next.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-auth-node@0.4.2-next.3 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/plugin-permission-node@0.7.19-next.3 + +## 0.5.31-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.2 + - @backstage/plugin-auth-node@0.4.2-next.2 + - @backstage/backend-plugin-api@0.6.8-next.2 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/plugin-permission-node@0.7.19-next.2 + +## 0.5.31-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.1 + - @backstage/backend-plugin-api@0.6.8-next.1 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-auth-node@0.4.2-next.1 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/plugin-permission-node@0.7.19-next.1 + +## 0.5.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.0 + - @backstage/plugin-auth-node@0.4.2-next.0 + - @backstage/plugin-permission-node@0.7.19-next.0 + - @backstage/backend-plugin-api@0.6.8-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-permission-common@0.7.10 + +## 0.5.30 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.9 + - @backstage/backend-plugin-api@0.6.7 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-auth-node@0.4.1 + - @backstage/plugin-permission-node@0.7.18 + +## 0.5.30-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.7-next.2 + - @backstage/backend-common@0.19.9-next.2 + - @backstage/plugin-auth-node@0.4.1-next.2 + - @backstage/plugin-permission-node@0.7.18-next.2 + +## 0.5.30-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.9-next.1 + - @backstage/plugin-auth-node@0.4.1-next.1 + - @backstage/plugin-permission-node@0.7.18-next.1 + - @backstage/backend-plugin-api@0.6.7-next.1 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-permission-common@0.7.9 + +## 0.5.30-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.9-next.0 + - @backstage/backend-plugin-api@0.6.7-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-auth-node@0.4.1-next.0 + - @backstage/plugin-permission-common@0.7.9 + - @backstage/plugin-permission-node@0.7.18-next.0 + +## 0.5.29 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.8 + - @backstage/plugin-auth-node@0.4.0 + - @backstage/errors@1.2.3 + - @backstage/backend-plugin-api@0.6.6 + - @backstage/plugin-permission-node@0.7.17 + - @backstage/config@1.1.1 + - @backstage/plugin-permission-common@0.7.9 + +## 0.5.29-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.8-next.2 + - @backstage/plugin-auth-node@0.4.0-next.2 + - @backstage/errors@1.2.3-next.0 + - @backstage/plugin-permission-node@0.7.17-next.2 + - @backstage/backend-plugin-api@0.6.6-next.2 + - @backstage/config@1.1.1-next.0 + - @backstage/plugin-permission-common@0.7.9-next.0 + +## 0.5.28-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.1 + - @backstage/backend-plugin-api@0.6.5-next.1 + - @backstage/plugin-auth-node@0.3.2-next.1 + - @backstage/plugin-permission-node@0.7.16-next.1 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + +## 0.5.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.16-next.0 + +## 0.5.26 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- a8a614ba0d07: Minor `package.json` update. + +- 84ad6fccd4d5: Moved `permissionModuleAllowAllPolicy` to `@backstage/plugin-permission-backend-module-allow-all-policy` + +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/plugin-permission-node@0.7.14 + - @backstage/backend-plugin-api@0.6.3 + +## 0.5.26-next.3 + +### Patch Changes + +- 71114ac50e02: The export for the new backend system has been moved to be the `default` export. + + For example, if you are currently importing the plugin using the following pattern: + + ```ts + import { examplePlugin } from '@backstage/plugin-example-backend'; + + backend.add(examplePlugin); + ``` + + It should be migrated to this: + + ```ts + backend.add(import('@backstage/plugin-example-backend')); + ``` + +- a8a614ba0d07: Minor `package.json` update. + +- Updated dependencies + - @backstage/config@1.1.0-next.2 + - @backstage/errors@1.2.2-next.0 + - @backstage/plugin-permission-common@0.7.8-next.2 + - @backstage/plugin-permission-node@0.7.14-next.3 + - @backstage/backend-plugin-api@0.6.3-next.3 + - @backstage/backend-common@0.19.5-next.3 + - @backstage/plugin-auth-node@0.3.0-next.3 + +## 0.5.26-next.2 + +### Patch Changes + +- 84ad6fccd4d5: Moved `permissionModuleAllowAllPolicy` to `@backstage/plugin-permission-backend-module-allow-all-policy` +- Updated dependencies + - @backstage/config@1.1.0-next.1 + - @backstage/backend-common@0.19.5-next.2 + - @backstage/plugin-auth-node@0.3.0-next.2 + - @backstage/plugin-permission-node@0.7.14-next.2 + - @backstage/backend-plugin-api@0.6.3-next.2 + - @backstage/plugin-permission-common@0.7.8-next.1 + - @backstage/errors@1.2.1 + +## 0.5.26-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0-next.0 + - @backstage/backend-common@0.19.5-next.1 + - @backstage/backend-plugin-api@0.6.3-next.1 + - @backstage/plugin-auth-node@0.3.0-next.1 + - @backstage/plugin-permission-common@0.7.8-next.0 + - @backstage/plugin-permission-node@0.7.14-next.1 + - @backstage/errors@1.2.1 + +## 0.5.25-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0-next.0 + - @backstage/backend-common@0.19.4-next.0 + - @backstage/backend-plugin-api@0.6.2-next.0 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-permission-node@0.7.13-next.0 + +## 0.5.23 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- 0d6ddc62d8da: Refactor backend plugin creation parameter from callback to object. +- Updated dependencies + - @backstage/backend-common@0.19.2 + - @backstage/backend-plugin-api@0.6.0 + - @backstage/plugin-auth-node@0.2.17 + - @backstage/plugin-permission-node@0.7.11 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-permission-common@0.7.7 + +## 0.5.23-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.0-next.2 + - @backstage/backend-common@0.19.2-next.2 + - @backstage/plugin-permission-node@0.7.11-next.2 + - @backstage/plugin-auth-node@0.2.17-next.2 + +## 0.5.23-next.1 + +### Patch Changes + +- 629cbd194a87: Use `coreServices.rootConfig` instead of `coreService.config` +- 12a8c94eda8d: Add package repository and homepage metadata +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/plugin-permission-node@0.7.11-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-permission-common@0.7.7 + +## 0.5.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.0 + - @backstage/backend-plugin-api@0.5.5-next.0 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-auth-node@0.2.17-next.0 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-permission-node@0.7.11-next.0 + +## 0.5.22 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.1 + - @backstage/backend-common@0.19.1 + - @backstage/backend-plugin-api@0.5.4 + - @backstage/config@1.0.8 + - @backstage/plugin-auth-node@0.2.16 + - @backstage/plugin-permission-common@0.7.7 + - @backstage/plugin-permission-node@0.7.10 + +## 0.5.22-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.1-next.0 + - @backstage/backend-common@0.19.1-next.0 + - @backstage/backend-plugin-api@0.5.4-next.0 + - @backstage/config@1.0.8 + - @backstage/plugin-auth-node@0.2.16-next.0 + - @backstage/plugin-permission-common@0.7.7-next.0 + - @backstage/plugin-permission-node@0.7.10-next.0 + +## 0.5.21 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0 + - @backstage/errors@1.2.0 + - @backstage/backend-plugin-api@0.5.3 + - @backstage/plugin-auth-node@0.2.15 + - @backstage/plugin-permission-node@0.7.9 + - @backstage/config@1.0.8 + - @backstage/plugin-permission-common@0.7.6 + +## 0.5.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.2 + - @backstage/backend-plugin-api@0.5.3-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-auth-node@0.2.15-next.2 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/plugin-permission-node@0.7.9-next.2 + +## 0.5.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-node@0.7.9-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + +## 0.5.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.6-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.3-next.0 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.15-next.0 + - @backstage/plugin-permission-common@0.7.5 + - @backstage/plugin-permission-node@0.7.9-next.0 + +## 0.5.20 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.5 + - @backstage/plugin-permission-node@0.7.8 + - @backstage/plugin-auth-node@0.2.14 + - @backstage/backend-plugin-api@0.5.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.5 + +## 0.5.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.5-next.1 + - @backstage/plugin-auth-node@0.2.14-next.1 + - @backstage/plugin-permission-node@0.7.8-next.1 + - @backstage/backend-plugin-api@0.5.2-next.1 + - @backstage/config@1.0.7 + +## 0.5.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.5-next.0 + - @backstage/plugin-permission-node@0.7.8-next.0 + - @backstage/plugin-auth-node@0.2.14-next.0 + - @backstage/backend-plugin-api@0.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.5 + +## 0.5.19 + +### Patch Changes + +- 84946a580c4: Introduced alpha export of the `permissionPlugin` for use in the new backend system, along with a `permissionModuleAllowAllPolicy` that can be used to allow all requests. +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/backend-common@0.18.4 + - @backstage/plugin-permission-node@0.7.7 + - @backstage/plugin-permission-common@0.7.5 + - @backstage/plugin-auth-node@0.2.13 + - @backstage/backend-plugin-api@0.5.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## 0.5.19-next.2 + +### Patch Changes + +- 84946a580c4: Introduced alpha export of the `permissionPlugin` for use in the new backend system, along with a `permissionModuleAllowAllPolicy` that can be used to allow all requests. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/plugin-permission-node@0.7.7-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + +## 0.5.19-next.1 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.7-next.1 + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.1 + +## 0.5.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/plugin-permission-node@0.7.7-next.0 + +## 0.5.18 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.6 + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + +## 0.5.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/plugin-permission-node@0.7.6-next.2 + - @backstage/config@1.0.7-next.0 + +## 0.5.18-next.1 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-permission-node@0.7.6-next.1 + - @backstage/errors@1.1.5-next.0 + - @backstage/backend-common@0.18.3-next.1 + - @backstage/plugin-auth-node@0.2.12-next.1 + - @backstage/plugin-permission-common@0.7.4-next.0 + - @backstage/config@1.0.7-next.0 + +## 0.5.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.12-next.0 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.6-next.0 + +## 0.5.17 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.11 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.5 + +## 0.5.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/plugin-permission-node@0.7.5-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3 + +## 0.5.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.5-next.1 + +## 0.5.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + - @backstage/plugin-permission-node@0.7.5-next.0 + +## 0.5.15 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.9 + - @backstage/plugin-permission-common@0.7.3 + - @backstage/plugin-permission-node@0.7.3 + +## 0.5.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/plugin-auth-node@0.2.9-next.1 + - @backstage/plugin-permission-node@0.7.3-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3-next.0 + +## 0.5.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.9-next.0 + - @backstage/plugin-permission-common@0.7.3-next.0 + - @backstage/plugin-permission-node@0.7.3-next.0 + +## 0.5.14 + +### Patch Changes + +- b05dcd5530: Move the `zod` dependency to a version that does not collide with other libraries +- 3280711113: Updated dependency `msw` to `^0.49.0`. +- Updated dependencies + - @backstage/backend-common@0.17.0 + - @backstage/plugin-permission-common@0.7.2 + - @backstage/plugin-permission-node@0.7.2 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.8 + - @backstage/config@1.0.5 + +## 0.5.14-next.3 + +### Patch Changes + +- b05dcd5530: Move the `zod` dependency to a version that does not collide with other libraries +- Updated dependencies + - @backstage/plugin-permission-common@0.7.2-next.2 + - @backstage/plugin-permission-node@0.7.2-next.3 + - @backstage/backend-common@0.17.0-next.3 + - @backstage/config@1.0.5-next.1 + - @backstage/errors@1.1.4-next.1 + - @backstage/plugin-auth-node@0.2.8-next.3 + +## 0.5.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.17.0-next.2 + - @backstage/plugin-auth-node@0.2.8-next.2 + - @backstage/plugin-permission-node@0.7.2-next.2 + - @backstage/config@1.0.5-next.1 + - @backstage/errors@1.1.4-next.1 + - @backstage/plugin-permission-common@0.7.2-next.1 + +## 0.5.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.17.0-next.1 + - @backstage/plugin-auth-node@0.2.8-next.1 + - @backstage/plugin-permission-node@0.7.2-next.1 + - @backstage/config@1.0.5-next.1 + - @backstage/errors@1.1.4-next.1 + - @backstage/plugin-permission-common@0.7.2-next.1 + +## 0.5.14-next.0 + +### Patch Changes + +- 3280711113: Updated dependency `msw` to `^0.49.0`. +- Updated dependencies + - @backstage/backend-common@0.16.1-next.0 + - @backstage/plugin-auth-node@0.2.8-next.0 + - @backstage/plugin-permission-common@0.7.2-next.0 + - @backstage/plugin-permission-node@0.7.2-next.0 + - @backstage/config@1.0.5-next.0 + - @backstage/errors@1.1.4-next.0 + +## 0.5.13 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.16.0 + - @backstage/plugin-auth-node@0.2.7 + - @backstage/plugin-permission-common@0.7.1 + - @backstage/plugin-permission-node@0.7.1 + - @backstage/config@1.0.4 + - @backstage/errors@1.1.3 + +## 0.5.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.16.0-next.1 + - @backstage/plugin-auth-node@0.2.7-next.1 + - @backstage/plugin-permission-node@0.7.1-next.1 + - @backstage/config@1.0.4-next.0 + - @backstage/errors@1.1.3-next.0 + - @backstage/plugin-permission-common@0.7.1-next.0 + +## 0.5.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.16.0-next.0 + - @backstage/plugin-auth-node@0.2.7-next.0 + - @backstage/plugin-permission-common@0.7.1-next.0 + - @backstage/plugin-permission-node@0.7.1-next.0 + - @backstage/config@1.0.4-next.0 + - @backstage/errors@1.1.3-next.0 + +## 0.5.12 + +### Patch Changes + +- 2d3a5f09ab: Use `response.json` rather than `response.send` where appropriate, as outlined in `SECURITY.md` +- Updated dependencies + - @backstage/backend-common@0.15.2 + - @backstage/plugin-auth-node@0.2.6 + - @backstage/plugin-permission-node@0.7.0 + - @backstage/plugin-permission-common@0.7.0 + - @backstage/config@1.0.3 + - @backstage/errors@1.1.2 + +## 0.5.12-next.2 + +### Patch Changes + +- 2d3a5f09ab: Use `response.json` rather than `response.send` where appropriate, as outlined in `SECURITY.md` +- Updated dependencies + - @backstage/backend-common@0.15.2-next.2 + - @backstage/plugin-permission-common@0.7.0-next.2 + - @backstage/plugin-permission-node@0.7.0-next.2 + - @backstage/plugin-auth-node@0.2.6-next.2 + - @backstage/config@1.0.3-next.2 + - @backstage/errors@1.1.2-next.2 + +## 0.5.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.2-next.1 + - @backstage/config@1.0.3-next.1 + - @backstage/errors@1.1.2-next.1 + - @backstage/plugin-auth-node@0.2.6-next.1 + - @backstage/plugin-permission-common@0.6.5-next.1 + - @backstage/plugin-permission-node@0.6.6-next.1 + +## 0.5.12-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.2-next.0 + - @backstage/plugin-auth-node@0.2.6-next.0 + - @backstage/plugin-permission-node@0.6.6-next.0 + - @backstage/config@1.0.3-next.0 + - @backstage/errors@1.1.2-next.0 + - @backstage/plugin-permission-common@0.6.5-next.0 + +## 0.5.11 + +### Patch Changes + +- 667d917488: Updated dependency `msw` to `^0.47.0`. +- 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`. +- bf5e9030eb: Updated dependency `msw` to `^0.45.0`. +- 2cbd533426: Uptake the `IdentityApi` change to use `getIdentity` instead of `authenticate` for retrieving the logged in users identity. +- Updated dependencies + - @backstage/backend-common@0.15.1 + - @backstage/plugin-auth-node@0.2.5 + - @backstage/plugin-permission-node@0.6.5 + - @backstage/config@1.0.2 + - @backstage/errors@1.1.1 + - @backstage/plugin-permission-common@0.6.4 + +## 0.5.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.2-next.0 + - @backstage/errors@1.1.1-next.0 + - @backstage/plugin-permission-common@0.6.4-next.2 + - @backstage/backend-common@0.15.1-next.3 + - @backstage/plugin-auth-node@0.2.5-next.3 + - @backstage/plugin-permission-node@0.6.5-next.3 + +## 0.5.11-next.1 + +### Patch Changes + +- 667d917488: Updated dependency `msw` to `^0.47.0`. +- 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`. +- 2cbd533426: Uptake the `IdentityApi` change to use `getIdentity` instead of `authenticate` for retrieving the logged in users identity. +- Updated dependencies + - @backstage/backend-common@0.15.1-next.2 + - @backstage/plugin-auth-node@0.2.5-next.2 + - @backstage/plugin-permission-common@0.6.4-next.1 + - @backstage/plugin-permission-node@0.6.5-next.2 + +## 0.5.11-next.0 + +### Patch Changes + +- bf5e9030eb: Updated dependency `msw` to `^0.45.0`. +- Updated dependencies + - @backstage/backend-common@0.15.1-next.0 + - @backstage/plugin-auth-node@0.2.5-next.0 + - @backstage/plugin-permission-common@0.6.4-next.0 + - @backstage/plugin-permission-node@0.6.5-next.0 + +## 0.5.10 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.0 + - @backstage/plugin-auth-node@0.2.4 + - @backstage/plugin-permission-node@0.6.4 + +## 0.5.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.0-next.0 + - @backstage/plugin-auth-node@0.2.4-next.0 + - @backstage/plugin-permission-node@0.6.4-next.0 + +## 0.5.9 + +### Patch Changes + +- a70869e775: Updated dependency `msw` to `^0.43.0`. +- 8006d0f9bf: Updated dependency `msw` to `^0.44.0`. +- Updated dependencies + - @backstage/backend-common@0.14.1 + - @backstage/plugin-auth-node@0.2.3 + - @backstage/plugin-permission-common@0.6.3 + - @backstage/plugin-permission-node@0.6.3 + - @backstage/errors@1.1.0 + +## 0.5.9-next.2 + +### Patch Changes + +- a70869e775: Updated dependency `msw` to `^0.43.0`. +- Updated dependencies + - @backstage/backend-common@0.14.1-next.3 + - @backstage/plugin-auth-node@0.2.3-next.2 + - @backstage/plugin-permission-common@0.6.3-next.1 + - @backstage/plugin-permission-node@0.6.3-next.2 + +## 0.5.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.1 + - @backstage/errors@1.1.0-next.0 + - @backstage/plugin-auth-node@0.2.3-next.1 + - @backstage/plugin-permission-common@0.6.3-next.0 + - @backstage/plugin-permission-node@0.6.3-next.1 + +## 0.5.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-auth-node@0.2.3-next.0 + - @backstage/plugin-permission-node@0.6.3-next.0 + +## 0.5.8 + +### Patch Changes + +- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. +- Updated dependencies + - @backstage/plugin-permission-node@0.6.2 + - @backstage/backend-common@0.14.0 + - @backstage/plugin-auth-node@0.2.2 + - @backstage/plugin-permission-common@0.6.2 + +## 0.5.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.0-next.2 + - @backstage/plugin-auth-node@0.2.2-next.2 + - @backstage/plugin-permission-node@0.6.2-next.2 + +## 0.5.8-next.1 + +### Patch Changes + +- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. +- Updated dependencies + - @backstage/backend-common@0.13.6-next.1 + - @backstage/plugin-auth-node@0.2.2-next.1 + - @backstage/plugin-permission-common@0.6.2-next.0 + - @backstage/plugin-permission-node@0.6.2-next.1 + +## 0.5.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.6-next.0 + - @backstage/plugin-auth-node@0.2.2-next.0 + - @backstage/plugin-permission-node@0.6.2-next.0 + +## 0.5.7 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3 + - @backstage/config@1.0.1 + - @backstage/plugin-auth-node@0.2.1 + - @backstage/plugin-permission-common@0.6.1 + - @backstage/plugin-permission-node@0.6.1 + +## 0.5.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-auth-node@0.2.1-next.1 + - @backstage/plugin-permission-common@0.6.1-next.0 + - @backstage/plugin-permission-node@0.6.1-next.1 + +## 0.5.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.0 + - @backstage/plugin-auth-node@0.2.1-next.0 + - @backstage/plugin-permission-node@0.6.1-next.0 + +## 0.5.6 + +### Patch Changes + +- c98d271466: Use updated types from `@backstage/plugin-permission-common` +- 95284162d6: - Add more specific check for policies which return conditional decisions for non-resource permissions. + - Refine permission validation in authorize endpoint to differentiate between `BasicPermission` and `ResourcePermission` instances. +- Updated dependencies + - @backstage/plugin-permission-common@0.6.0 + - @backstage/plugin-permission-node@0.6.0 + - @backstage/plugin-auth-node@0.2.0 + - @backstage/backend-common@0.13.2 + +## 0.5.6-next.1 + +### Patch Changes + +- c98d271466: Use updated types from `@backstage/plugin-permission-common` +- 95284162d6: - Add more specific check for policies which return conditional decisions for non-resource permissions. + - Refine permission validation in authorize endpoint to differentiate between `BasicPermission` and `ResourcePermission` instances. +- Updated dependencies + - @backstage/plugin-permission-common@0.6.0-next.0 + - @backstage/plugin-permission-node@0.6.0-next.1 + - @backstage/backend-common@0.13.2-next.1 + +## 0.5.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.0-next.0 + - @backstage/backend-common@0.13.2-next.0 + - @backstage/plugin-permission-node@0.5.6-next.0 + +## 0.5.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.1 + - @backstage/config@1.0.0 + - @backstage/errors@1.0.0 + - @backstage/plugin-permission-common@0.5.3 + - @backstage/plugin-auth-node@0.1.6 + - @backstage/plugin-permission-node@0.5.5 + +## 0.5.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.0 + - @backstage/plugin-auth-node@0.1.5 + - @backstage/plugin-permission-node@0.5.4 + +## 0.5.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.0-next.0 + - @backstage/plugin-auth-node@0.1.5-next.0 + - @backstage/plugin-permission-node@0.5.4-next.0 + +## 0.5.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.12.0 + - @backstage/plugin-permission-common@0.5.2 + - @backstage/plugin-permission-node@0.5.3 + - @backstage/plugin-auth-node@0.1.4 + +## 0.5.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.11.0 + - @backstage/plugin-permission-node@0.5.2 + - @backstage/plugin-auth-node@0.1.3 + +## 0.5.1 + +### Patch Changes + +- Fix for the previous release with missing type declarations. +- Updated dependencies + - @backstage/backend-common@0.10.9 + - @backstage/config@0.1.15 + - @backstage/errors@0.2.2 + - @backstage/plugin-auth-node@0.1.2 + - @backstage/plugin-permission-common@0.5.1 + - @backstage/plugin-permission-node@0.5.1 + +## 0.5.0 + +### Minor Changes + +- e2cf0662eb: Add a warning if the permission backend is used without setting `permission.enabled=true`. + + **BREAKING** Permission backend's `createRouter` now requires a `config` option. + + ```diff + // packages/backend/src/plugins/permission.ts + + ... + export default async function createPlugin({ + ... + + config, + }: PluginEnvironment) { + return createRouter({ + ... + + config, + }); + } + ``` + +### 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` +- Updated dependencies + - @backstage/backend-common@0.10.8 + - @backstage/errors@0.2.1 + - @backstage/plugin-auth-node@0.1.1 + - @backstage/plugin-permission-common@0.5.0 + - @backstage/config@0.1.14 + - @backstage/plugin-permission-node@0.5.0 + +## 0.4.3 + +### Patch Changes + +- b3f3e42036: Use `getBearerTokenFromAuthorizationHeader` from `@backstage/plugin-auth-node` instead of the deprecated `IdentityClient` method. +- Updated dependencies + - @backstage/backend-common@0.10.7 + - @backstage/plugin-auth-node@0.1.0 + - @backstage/plugin-permission-node@0.4.3 + +## 0.4.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.10.0-next.0 + - @backstage/backend-common@0.10.7-next.0 + - @backstage/plugin-permission-node@0.4.3-next.0 + +## 0.4.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.9.0 + - @backstage/backend-common@0.10.6 + - @backstage/plugin-permission-node@0.4.2 + +## 0.4.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.9.0-next.1 + - @backstage/backend-common@0.10.6-next.0 + - @backstage/plugin-permission-node@0.4.2-next.1 + +## 0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.9.0-next.0 + - @backstage/plugin-permission-node@0.4.2-next.0 + +## 0.4.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.8.0 + - @backstage/backend-common@0.10.5 + - @backstage/plugin-permission-node@0.4.1 + +## 0.4.0 + +### Minor Changes + +- b768259244: **BREAKING**: Wrap batched requests and responses to /authorize in an envelope object. The latest version of the PermissionClient in @backstage/permission-common uses the new format - as long as the permission-backend is consumed using this client, no other changes are necessary. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.7.0 + - @backstage/plugin-permission-common@0.4.0 + - @backstage/backend-common@0.10.4 + - @backstage/config@0.1.13 + - @backstage/plugin-permission-node@0.4.0 + +## 0.4.0-next.0 + +### Minor Changes + +- b768259244: **BREAKING**: Wrap batched requests and responses to /authorize in an envelope object. The latest version of the PermissionClient in @backstage/permission-common uses the new format - as long as the permission-backend is consumed using this client, no other changes are necessary. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.7.0-next.0 + - @backstage/plugin-permission-common@0.4.0-next.0 + - @backstage/backend-common@0.10.4-next.0 + - @backstage/config@0.1.13-next.0 + - @backstage/plugin-permission-node@0.4.0-next.0 + +## 0.3.0 + +### Minor Changes + +- 419ca637c0: Optimizations to the integration between the permission backend and plugin-backends using createPermissionIntegrationRouter: + + - The permission backend already supported batched requests to authorize, but would make calls to plugin backend to apply conditions serially. Now, after applying the policy for each authorization request, the permission backend makes a single batched /apply-conditions request to each plugin backend referenced in policy decisions. + - The `getResource` method accepted by `createPermissionIntegrationRouter` has been replaced with `getResources`, to allow consumers to make batch requests to upstream data stores. When /apply-conditions is called with a batch of requests, all required resources are requested in a single invocation of `getResources`. + + Plugin owners consuming `createPermissionIntegrationRouter` should replace the `getResource` method in the options with a `getResources` method, accepting an array of resourceRefs, and returning an array of the corresponding resources. + +### Patch Changes + +- Updated dependencies + - @backstage/config@0.1.12 + - @backstage/backend-common@0.10.3 + - @backstage/plugin-permission-node@0.3.0 + - @backstage/plugin-auth-backend@0.6.2 + - @backstage/errors@0.2.0 + - @backstage/plugin-permission-common@0.3.1 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.6.0 + - @backstage/backend-common@0.10.1 + - @backstage/plugin-permission-node@0.2.3 + +## 0.2.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.10.0 + - @backstage/plugin-auth-backend@0.5.2 + - @backstage/plugin-permission-common@0.3.0 + - @backstage/plugin-permission-node@0.2.2 + +## 0.2.1 + +### Patch Changes + +- a036b65c2f: Updated to use the new `BackstageIdentityResponse` type from `@backstage/plugin-auth-backend`. + + The `BackstageIdentityResponse` type is backwards compatible with the `BackstageIdentity`, and provides an additional `identity` field with the claims of the user. + +- Updated dependencies + - @backstage/plugin-auth-backend@0.5.0 + - @backstage/backend-common@0.9.13 + - @backstage/plugin-permission-node@0.2.1 + +## 0.2.0 + +### Minor Changes + +- 450ca92330: Change route used for integration between the authorization framework and other plugin backends to use the /.well-known prefix. + +### Patch Changes + +- e7851efa9e: Rename and adjust permission policy return type to reduce nesting +- Updated dependencies + - @backstage/plugin-auth-backend@0.4.10 + - @backstage/plugin-permission-node@0.2.0 + - @backstage/backend-common@0.9.12 + +## 0.1.0 + +### Minor Changes + +- 7a8312f126: New package containing the backend for authorization and permissions. For more information, see the [authorization PRFC](https://github.com/backstage/backstage/pull/7761). + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.4.9 + - @backstage/plugin-permission-node@0.1.0 + - @backstage/backend-common@0.9.11 + - @backstage/plugin-permission-common@0.2.0 + +## @backstage/plugin-permission-common@0.9.6-next.0 + +# @backstage/plugin-permission-common + +## 0.9.5-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## 0.9.4 + +### Patch Changes + +- 872eb91: Upgrade `zod-to-json-schema` to latest version + +## 0.9.3 + +### Patch Changes + +- b2bef92: Convert all enums to erasable-syntax compliant patterns +- Updated dependencies + - @backstage/config@1.3.6 + +## 0.9.3-next.1 + +### Patch Changes + +- b2bef92: Convert all enums to erasable-syntax compliant patterns + +## 0.9.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.6-next.0 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## 0.9.2 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.5 + +## 0.9.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + +## 0.9.1 + +### Patch Changes + +- 3507fcd: Just some more circular dep cleanup +- Updated dependencies + - @backstage/config@1.3.3 + +## 0.9.1-next.0 + +### Patch Changes + +- 3507fcd: Just some more circular dep cleanup +- Updated dependencies + - @backstage/config@1.3.3-next.0 + +## 0.9.0 + +### Minor Changes + +- 4da2965: Fixed an issue causing the `PermissionClient` to exhaust the request body size limit too quickly when making many requests. + +### Patch Changes + +- 37328b1: Fixed an issue causing `PermissionClient` to throw an error when authorizing basic permissions with the `permission.EXPERIMENTAL_enableBatchedRequests` config enabled. +- 72d019d: Removed various typos +- Updated dependencies + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.9.0-next.0 + +### Minor Changes + +- 4da2965: Fixed an issue causing the `PermissionClient` to exhaust the request body size limit too quickly when making many requests. + +### Patch Changes + +- 72d019d: Removed various typos +- Updated dependencies + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.1 + +## 0.8.4 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.8.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.2.1-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + +## 0.8.3 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/types@1.2.0 + +## 0.8.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.6-next.0 + - @backstage/config@1.3.1-next.0 + - @backstage/types@1.2.0 + +## 0.8.2 + +### Patch Changes + +- 4e58bc7: Upgrade to uuid v11 internally +- Updated dependencies + - @backstage/config@1.3.0 + - @backstage/types@1.2.0 + - @backstage/errors@1.2.5 + +## 0.8.1 + +### Patch Changes + +- df784fe: Add the MetadataResponse type from @backstage/plugin-permission-node, since this + type might be used in frontend code. +- 137fa34: Add the MetadataResponseSerializedRule type from @backstage/plugin-permission-node, since this type might be used in frontend code. +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.8.1-next.1 + +### Patch Changes + +- df784fe: Add the MetadataResponse type from @backstage/plugin-permission-node, since this + type might be used in frontend code. +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.8.1-next.0 + +### Patch Changes + +- 137fa34: Add the MetadataResponseSerializedRule type from @backstage/plugin-permission-node, since this type might be used in frontend code. +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.8.0 + +### Minor Changes + +- f4085b8: **BREAKING**: Removed the deprecated and unused `token` option from `EvaluatorRequestOptions`. The `PermissionsClient` now has its own `PermissionClientRequestOptions` type that declares the `token` option instead. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.7.14 + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.7.14-next.0 + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.7.13 + +### Patch Changes + +- 0502d82: The `token` option of the `PermissionEvaluator` methods is now deprecated. The options that only apply to backend implementations have been moved to `PermissionsService` from `@backstage/backend-plugin-api` instead. +- 0fb419b: Updated dependency `uuid` to `^9.0.0`. + Updated dependency `@types/uuid` to `^9.0.0`. +- Updated dependencies + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/types@1.1.1 + +## 0.7.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.2.0-next.1 + - @backstage/errors@1.2.4-next.0 + - @backstage/types@1.1.1 + +## 0.7.13-next.0 + +### Patch Changes + +- 0502d82: The `token` option of the `PermissionEvaluator` methods is now deprecated. The options that only apply to backend implementations have been moved to `PermissionsService` from `@backstage/backend-plugin-api` instead. +- 0fb419b: Updated dependency `uuid` to `^9.0.0`. + Updated dependency `@types/uuid` to `^9.0.0`. +- Updated dependencies + - @backstage/errors@1.2.4-next.0 + - @backstage/config@1.1.2-next.0 + - @backstage/types@1.1.1 + +## 0.7.12 + +### Patch Changes + +- b1acd9b: Updated README +- Updated dependencies + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.7.11 + +### Patch Changes + +- 0cbb03b: Fixing regular expression ReDoS with zod packages. Upgrading to latest. ref: +- Updated dependencies + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.7.10 + +### Patch Changes + +- 4aa43f62aa: Updated dependency `cross-fetch` to `^4.0.0`. +- Updated dependencies + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/types@1.1.1 + +## 0.7.9 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.3 + - @backstage/config@1.1.1 + - @backstage/types@1.1.1 + +## 0.7.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.3-next.0 + - @backstage/config@1.1.1-next.0 + - @backstage/types@1.1.1 + +## 0.7.8 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/types@1.1.1 + +## 0.7.8-next.2 + +### Patch Changes + +- 406b786a2a2c: Mark package as being free of side effects, allowing more optimized Webpack builds. +- Updated dependencies + - @backstage/config@1.1.0-next.2 + - @backstage/errors@1.2.2-next.0 + - @backstage/types@1.1.1-next.0 + +## 0.7.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0-next.1 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## 0.7.8-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0-next.0 + - @backstage/errors@1.2.1 + - @backstage/types@1.1.0 + +## 0.7.7 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.1 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + +## 0.7.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.1-next.0 + - @backstage/config@1.0.8 + - @backstage/types@1.1.0 + +## 0.7.6 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.1.0 + - @backstage/errors@1.2.0 + - @backstage/config@1.0.8 + +## 0.7.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.0-next.0 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## 0.7.5 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## 0.7.5-next.0 + +### Patch Changes + +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/types@1.0.2 + +## 0.7.4 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/errors@1.1.5 + - @backstage/config@1.0.7 + - @backstage/types@1.0.2 + +## 0.7.4-next.0 + +### Patch Changes + +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/errors@1.1.5-next.0 + - @backstage/config@1.0.7-next.0 + - @backstage/types@1.0.2 + +## 0.7.3 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + +## 0.7.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + +## 0.7.2 + +### Patch Changes + +- b05dcd5530: Move the `zod` dependency to a version that does not collide with other libraries +- 3280711113: Updated dependency `msw` to `^0.49.0`. +- Updated dependencies + - @backstage/errors@1.1.4 + - @backstage/types@1.0.2 + - @backstage/config@1.0.5 + +## 0.7.2-next.2 + +### Patch Changes + +- b05dcd5530: Move the `zod` dependency to a version that does not collide with other libraries +- Updated dependencies + - @backstage/config@1.0.5-next.1 + - @backstage/errors@1.1.4-next.1 + - @backstage/types@1.0.2-next.1 + +## 0.7.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/types@1.0.2-next.1 + - @backstage/config@1.0.5-next.1 + - @backstage/errors@1.1.4-next.1 + +## 0.7.2-next.0 + +### Patch Changes + +- 3280711113: Updated dependency `msw` to `^0.49.0`. +- Updated dependencies + - @backstage/types@1.0.2-next.0 + - @backstage/config@1.0.5-next.0 + - @backstage/errors@1.1.4-next.0 + +## 0.7.1 + +### Patch Changes + +- 7573b65232: Internal refactor of imports to avoid circular dependencies +- 64848c963c: Properly handle rules that have no parameters in `PermissionClient` +- Updated dependencies + - @backstage/types@1.0.1 + - @backstage/config@1.0.4 + - @backstage/errors@1.1.3 + +## 0.7.1-next.0 + +### Patch Changes + +- 7573b65232: Internal refactor of imports to avoid circular dependencies +- 64848c963c: Properly handle rules that have no parameters in `PermissionClient` +- Updated dependencies + - @backstage/types@1.0.1-next.0 + - @backstage/config@1.0.4-next.0 + - @backstage/errors@1.1.3-next.0 + +## 0.7.0 + +### Minor Changes + +- 46b4a72cee: **BREAKING**: When defining permission rules, it's now necessary to provide a [ZodSchema](https://github.com/colinhacks/zod) that specifies the parameters the rule expects. This has been added to help better describe the parameters in the response of the metadata endpoint and to validate the parameters before a rule is executed. + + To help with this, we have also made a change to the API of permission rules. Before, the permission rules `toQuery` and `apply` signature expected parameters to be separate arguments, like so... + + ```ts + createPermissionRule({ + apply: (resource, foo, bar) => true, + toQuery: (foo, bar) => {}, + }); + ``` + + The API has now changed to expect the parameters as a single object + + ```ts + createPermissionRule({ + paramSchema: z.object({ + foo: z.string().describe('Foo value to match'), + bar: z.string().describe('Bar value to match'), + }), + apply: (resource, { foo, bar }) => true, + toQuery: ({ foo, bar }) => {}, + }); + ``` + + One final change made is to limit the possible values for a parameter to primitives and arrays of primitives. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.3 + - @backstage/errors@1.1.2 + - @backstage/types@1.0.0 + +## 0.7.0-next.2 + +### Minor Changes + +- 46b4a72cee: **BREAKING**: When defining permission rules, it's now necessary to provide a [ZodSchema](https://github.com/colinhacks/zod) that specifies the parameters the rule expects. This has been added to help better describe the parameters in the response of the metadata endpoint and to validate the parameters before a rule is executed. + + To help with this, we have also made a change to the API of permission rules. Before, the permission rules `toQuery` and `apply` signature expected parameters to be separate arguments, like so... + + ```ts + createPermissionRule({ + apply: (resource, foo, bar) => true, + toQuery: (foo, bar) => {}, + }); + ``` + + The API has now changed to expect the parameters as a single object + + ```ts + createPermissionRule({ + paramSchema: z.object({ + foo: z.string().describe('Foo value to match'), + bar: z.string().describe('Bar value to match'), + }), + apply: (resource, { foo, bar }) => true, + toQuery: ({ foo, bar }) => {}, + }); + ``` + + One final change made is to limit the possible values for a parameter to primitives and arrays of primitives. + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.3-next.2 + - @backstage/errors@1.1.2-next.2 + - @backstage/types@1.0.0 + +## 0.6.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.3-next.1 + - @backstage/errors@1.1.2-next.1 + +## 0.6.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.3-next.0 + - @backstage/errors@1.1.2-next.0 + +## 0.6.4 + +### Patch Changes + +- 7d47def9c4: Removed dependency on `@types/jest`. +- 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/config@1.0.2 + - @backstage/errors@1.1.1 + +## 0.6.4-next.2 + +### Patch Changes + +- 7d47def9c4: Removed dependency on `@types/jest`. +- Updated dependencies + - @backstage/config@1.0.2-next.0 + - @backstage/errors@1.1.1-next.0 + +## 0.6.4-next.1 + +### Patch Changes + +- 667d917488: Updated dependency `msw` to `^0.47.0`. +- 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`. + +## 0.6.4-next.0 + +### Patch Changes + +- bf5e9030eb: Updated dependency `msw` to `^0.45.0`. + +## 0.6.3 + +### Patch Changes + +- a70869e775: Updated dependency `msw` to `^0.43.0`. +- 8006d0f9bf: Updated dependency `msw` to `^0.44.0`. +- Updated dependencies + - @backstage/errors@1.1.0 + +## 0.6.3-next.1 + +### Patch Changes + +- a70869e775: Updated dependency `msw` to `^0.43.0`. + +## 0.6.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.1.0-next.0 + +## 0.6.2 + +### Patch Changes + +- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. + +## 0.6.2-next.0 + +### Patch Changes + +- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. + +## 0.6.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.1 + +## 0.6.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.1-next.0 + +## 0.6.0 + +### Minor Changes + +- 8012ac46a0: Add `resourceType` property to `PermissionCondition` type to allow matching them with `ResourcePermission` instances. +- c98d271466: Refactor api types into more specific, decoupled names. + + - **BREAKING:** + - Renamed `AuthorizeDecision` to `EvaluatePermissionResponse` + - Renamed `AuthorizeQuery` to `EvaluatePermissionRequest` + - Renamed `AuthorizeRequest` to `EvaluatePermissionRequestBatch` + - Renamed `AuthorizeResponse` to `EvaluatePermissionResponseBatch` + - Renamed `Identified` to `IdentifiedPermissionMessage` + - Add `PermissionMessageBatch` helper type + - Add `ConditionalPolicyDecision`, `DefinitivePolicyDecision`, and `PolicyDecision` types from `@backstage/plugin-permission-node` + +### Patch Changes + +- 90754d4fa9: Removed [strict](https://github.com/colinhacks/zod#strict) validation from `PermissionCriteria` schemas to support backward-compatible changes. + +- 2b07063d77: Added `PermissionEvaluator`, which will replace the existing `PermissionAuthorizer` interface. This new interface provides stronger type safety and validation by splitting `PermissionAuthorizer.authorize()` into two methods: + + - `authorize()`: Used when the caller requires a definitive decision. + - `authorizeConditional()`: Used when the caller can optimize the evaluation of any conditional decisions. For example, a plugin backend may want to use conditions in a database query instead of evaluating each resource in memory. + +- 8012ac46a0: Add `isPermission` helper method. + +- 95284162d6: - Add more specific `Permission` types. + - Add `createPermission` helper to infer the appropriate type for some permission input. + - Add `isResourcePermission` helper to refine Permissions to ResourcePermissions. + +## 0.6.0-next.1 + +### Patch Changes + +- 2b07063d77: Added `PermissionEvaluator`, which will replace the existing `PermissionAuthorizer` interface. This new interface provides stronger type safety and validation by splitting `PermissionAuthorizer.authorize()` into two methods: + + - `authorize()`: Used when the caller requires a definitive decision. + - `authorizeConditional()`: Used when the caller can optimize the evaluation of any conditional decisions. For example, a plugin backend may want to use conditions in a database query instead of evaluating each resource in memory. + +## 0.6.0-next.0 + +### Minor Changes + +- 8012ac46a0: Add `resourceType` property to `PermissionCondition` type to allow matching them with `ResourcePermission` instances. +- c98d271466: Refactor api types into more specific, decoupled names. + + - **BREAKING:** + - Renamed `AuthorizeDecision` to `EvaluatePermissionResponse` + - Renamed `AuthorizeQuery` to `EvaluatePermissionRequest` + - Renamed `AuthorizeRequest` to `EvaluatePermissionRequestBatch` + - Renamed `AuthorizeResponse` to `EvaluatePermissionResponseBatch` + - Renamed `Identified` to `IdentifiedPermissionMessage` + - Add `PermissionMessageBatch` helper type + - Add `ConditionalPolicyDecision`, `DefinitivePolicyDecision`, and `PolicyDecision` types from `@backstage/plugin-permission-node` + +### Patch Changes + +- 8012ac46a0: Add `isPermission` helper method. +- 95284162d6: - Add more specific `Permission` types. + - Add `createPermission` helper to infer the appropriate type for some permission input. + - Add `isResourcePermission` helper to refine Permissions to ResourcePermissions. + +## 0.5.3 + +### Patch Changes + +- f24ef7864e: Minor typo fixes +- Updated dependencies + - @backstage/config@1.0.0 + - @backstage/errors@1.0.0 + +## 0.5.2 + +### Patch Changes + +- 79b9d8a861: Add api doc comments to `Permission` type properties. + +## 0.5.1 + +### Patch Changes + +- Fix for the previous release with missing type declarations. +- Updated dependencies + - @backstage/config@0.1.15 + - @backstage/errors@0.2.2 + +## 0.5.0 + +### Minor Changes + +- 8c646beb24: **BREAKING** `PermissionCriteria` now requires at least one condition in `anyOf` and `allOf` arrays. This addresses some ambiguous behavior outlined in #9280. + +### 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` +- Updated dependencies + - @backstage/errors@0.2.1 + - @backstage/config@0.1.14 + +## 0.4.0 + +### Minor Changes + +- b768259244: **BREAKING**: Authorize API request and response types have been updated. The existing `AuthorizeRequest` and `AuthorizeResponse` types now match the entire request and response objects for the /authorize endpoint, and new types `AuthorizeQuery` and `AuthorizeDecision` have been introduced for individual items in the request and response batches respectively. + + **BREAKING**: PermissionClient has been updated to use the new request and response format in the latest version of @backstage/plugin-permission-backend. + +### Patch Changes + +- Updated dependencies + - @backstage/config@0.1.13 + +## 0.4.0-next.0 + +### Minor Changes + +- b768259244: **BREAKING**: Authorize API request and response types have been updated. The existing `AuthorizeRequest` and `AuthorizeResponse` types now match the entire request and response objects for the /authorize endpoint, and new types `AuthorizeQuery` and `AuthorizeDecision` have been introduced for individual items in the request and response batches respectively. + + **BREAKING**: PermissionClient has been updated to use the new request and response format in the latest version of @backstage/plugin-permission-backend. + +### Patch Changes + +- Updated dependencies + - @backstage/config@0.1.13-next.0 + +## 0.3.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@0.1.12 + - @backstage/errors@0.2.0 + +## 0.3.0 + +### Minor Changes + +- 0e8ec6d974: - Add `PermissionAuthorizer` interface matching `PermissionClient` to allow alternative implementations like the `ServerPermissionClient` in @backstage/plugin-permission-node. + + Breaking Changes: + + - Remove "api" suffixes from constructor parameters in PermissionClient + + ```diff + const { config, discovery } = options; + - const permissionClient = new PermissionClient({ discoveryApi: discovery, configApi: config }); + + const permissionClient = new PermissionClient({ discovery, config }); + ``` + +## 0.2.0 + +### Minor Changes + +- 92439056fb: Accept configApi rather than enabled flag in PermissionClient constructor. + +### Patch Changes + +- Updated dependencies + - @backstage/errors@0.1.5 + +## @backstage/plugin-permission-node@0.10.10-next.0 + +# @backstage/plugin-permission-node + +## 0.10.9-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-auth-node@0.6.12-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## 0.10.8 + +### Patch Changes + +- 872eb91: Upgrade `zod-to-json-schema` to latest version +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/plugin-auth-node@0.6.11 + - @backstage/plugin-permission-common@0.9.4 + +## 0.10.7 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10 + - @backstage/backend-plugin-api@1.6.0 + +## 0.10.7-next.1 + +### Patch Changes + +- de96a60: chore(deps): bump `express` from 4.21.2 to 4.22.0 +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.1 + - @backstage/backend-plugin-api@1.6.0-next.1 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.3 + +## 0.10.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.10-next.0 + - @backstage/backend-plugin-api@1.5.1-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.3 + +## 0.10.6 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0 + - @backstage/plugin-permission-common@0.9.3 + - @backstage/plugin-auth-node@0.6.9 + - @backstage/config@1.3.6 + +## 0.10.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.5.0-next.1 + - @backstage/plugin-permission-common@0.9.3-next.1 + - @backstage/plugin-auth-node@0.6.9-next.1 + +## 0.10.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.9-next.0 + - @backstage/config@1.3.6-next.0 + - @backstage/backend-plugin-api@1.4.5-next.0 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.3-next.0 + +## 0.10.5 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.5 + - @backstage/backend-plugin-api@1.4.4 + - @backstage/plugin-auth-node@0.6.8 + - @backstage/plugin-permission-common@0.9.2 + +## 0.10.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/backend-plugin-api@1.4.4-next.0 + - @backstage/plugin-auth-node@0.6.8-next.0 + - @backstage/plugin-permission-common@0.9.2-next.0 + +## 0.10.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7 + - @backstage/backend-plugin-api@1.4.3 + +## 0.10.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.7-next.0 + - @backstage/backend-plugin-api@1.4.3-next.0 + +## 0.10.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6 + - @backstage/backend-plugin-api@1.4.2 + +## 0.10.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.6-next.0 + - @backstage/backend-plugin-api@1.4.2-next.0 + - @backstage/config@1.3.3 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.1 + +## 0.10.2 + +### Patch Changes + +- 3507fcd: Just some more circular dep cleanup +- Updated dependencies + - @backstage/config@1.3.3 + - @backstage/plugin-permission-common@0.9.1 + - @backstage/backend-plugin-api@1.4.1 + - @backstage/plugin-auth-node@0.6.5 + +## 0.10.2-next.0 + +### Patch Changes + +- 3507fcd: Just some more circular dep cleanup +- Updated dependencies + - @backstage/config@1.3.3-next.0 + - @backstage/plugin-permission-common@0.9.1-next.0 + - @backstage/backend-plugin-api@1.4.1-next.0 + - @backstage/plugin-auth-node@0.6.5-next.0 + +## 0.10.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4 + - @backstage/backend-plugin-api@1.4.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.0 + +## 0.10.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.4-next.1 + - @backstage/backend-plugin-api@1.4.0-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.0 + +## 0.10.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.4.0-next.0 + - @backstage/plugin-auth-node@0.6.4-next.0 + +## 0.10.0 + +### Minor Changes + +- 4da2965: Fixed an issue causing the `PermissionClient` to exhaust the request body size limit too quickly when making many requests. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3 + - @backstage/backend-plugin-api@1.3.1 + - @backstage/plugin-permission-common@0.9.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.10.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.2 + - @backstage/backend-plugin-api@1.3.1-next.2 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.9.0-next.0 + +## 0.10.0-next.1 + +### Minor Changes + +- 4da2965: Fixed an issue causing the `PermissionClient` to exhaust the request body size limit too quickly when making many requests. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.3-next.1 + - @backstage/backend-plugin-api@1.3.1-next.1 + - @backstage/plugin-permission-common@0.9.0-next.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + +## 0.9.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.1-next.0 + - @backstage/plugin-auth-node@0.6.3-next.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.8.4 + +## 0.9.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.3.0 + - @backstage/plugin-auth-node@0.6.2 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.8.4 + +## 0.9.0 + +### Minor Changes + +- 22ace13: **BREAKING** The `ServerPermissionClient` can no longer be instantiated with a `tokenManager` and must instead be instantiated with an `auth` service. If you are still on the legacy backend system, use `createLegacyAuthAdapters()` from `@backstage/backend-common` to create a compatible `auth` service. + +### Patch Changes + +- 728e3e1: Improved type inference when passing a `PermissionResourceRef` to `createPermissionRule`. +- 876f2e1: Deprecated `createPermissionIntegrationRouter` and related types, which has been replaced by `PermissionRegistryService`. For more information, including how to migrate existing plugins, see the [service docs](https://backstage.io/docs/backend-system/core-services/permissions-registry). +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1 + - @backstage/backend-plugin-api@1.2.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.8.4 + +## 0.8.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.1 + - @backstage/backend-plugin-api@1.2.1-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.8.4 + +## 0.8.9-next.0 + +### Patch Changes + +- 728e3e1: Improved type inference when passing a `PermissionResourceRef` to `createPermissionRule`. +- Updated dependencies + - @backstage/plugin-auth-node@0.6.1-next.0 + - @backstage/backend-plugin-api@1.2.1-next.0 + +## 0.8.8 + +### Patch Changes + +- 049d5d4: The returned router from `createPermissionIntegrationRouter` is now mutable, allowing for permissions and resources to be added after creation of the router. +- b71f634: Added a new `PermissionRuleset` type that encapsulates a lookup function for permission rules, which can be created by the new `PermissionsRegistryService` via the `getPermissionRuleset` method. The `createConditionTransformer` and `createConditionAuthorizer` functions have been adapted to receive these accessors as arguments, with their older counterparts being deprecated. +- a9621de: Added a new `createPermissionResourceRef` utility that encapsulates the constants and types related to a permission resource types. The `createConditionExports` and `createPermissionRule` functions have also been adapted to accept these references as arguments, deprecating their older counterparts. +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0 + - @backstage/plugin-auth-node@0.6.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.8.4 + +## 0.8.8-next.2 + +### Patch Changes + +- b71f634: Added a new `PermissionRuleset` type that encapsulates a lookup function for permission rules, which can be created by the new `PermissionsRegistryService` via the `getPermissionRuleset` method. The `createConditionTransformer` and `createConditionAuthorizer` functions have been adapted to receive these accessors as arguments, with their older counterparts being deprecated. +- a9621de: Added a new `createPermissionResourceRef` utility that encapsulates the constants and types related to a permission resource types. The `createConditionExports` and `createPermissionRule` functions have also been adapted to accept these references as arguments, deprecating their older counterparts. +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.2 + - @backstage/plugin-auth-node@0.6.0-next.2 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.8.4 + +## 0.8.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.1 + - @backstage/plugin-auth-node@0.6.0-next.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.8.4 + +## 0.8.8-next.0 + +### Patch Changes + +- 049d5d4: The returned router from `createPermissionIntegrationRouter` is now mutable, allowing for permissions and resources to be added after creation of the router. +- Updated dependencies + - @backstage/backend-plugin-api@1.2.0-next.0 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-auth-node@0.5.7-next.0 + - @backstage/plugin-permission-common@0.8.4 + +## 0.8.7 + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6 + - @backstage/backend-plugin-api@1.1.1 + - @backstage/config@1.3.2 + - @backstage/errors@1.2.7 + - @backstage/plugin-permission-common@0.8.4 + +## 0.8.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.1.1-next.1 + - @backstage/config@1.3.2-next.0 + - @backstage/errors@1.2.7-next.0 + - @backstage/plugin-auth-node@0.5.6-next.1 + - @backstage/plugin-permission-common@0.8.4-next.0 + +## 0.8.7-next.0 + +### Patch Changes + +- d9d62ef: Remove some internal usages of the backend-common package +- Updated dependencies + - @backstage/plugin-auth-node@0.5.6-next.0 + - @backstage/backend-plugin-api@1.1.1-next.0 + - @backstage/config@1.3.1 + - @backstage/errors@1.2.6 + - @backstage/plugin-permission-common@0.8.3 + +## 0.8.6 + +### Patch Changes + +- b149e2a: The `createPermissionIntegrationRouter` function now detects and prevents the exposure of duplicate permissions. +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5 + - @backstage/backend-plugin-api@1.1.0 + - @backstage/errors@1.2.6 + - @backstage/config@1.3.1 + - @backstage/plugin-permission-common@0.8.3 + +## 0.8.6-next.2 + +### Patch Changes + +- b149e2a: The `createPermissionIntegrationRouter` function now detects and prevents the exposure of duplicate permissions. +- Updated dependencies + - @backstage/backend-plugin-api@1.1.0-next.2 + - @backstage/errors@1.2.6-next.0 + - @backstage/plugin-auth-node@0.5.5-next.2 + - @backstage/config@1.3.1-next.0 + - @backstage/plugin-permission-common@0.8.3-next.0 + +## 0.8.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.5-next.1 + - @backstage/backend-plugin-api@1.1.0-next.1 + - @backstage/config@1.3.0 + - @backstage/errors@1.2.5 + - @backstage/plugin-permission-common@0.8.2 + +## 0.8.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.3-next.0 + - @backstage/plugin-auth-node@0.5.5-next.0 + - @backstage/config@1.3.0 + - @backstage/errors@1.2.5 + - @backstage/plugin-permission-common@0.8.2 + +## 0.8.5 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.0 + - @backstage/plugin-auth-node@0.5.4 + - @backstage/backend-plugin-api@1.0.2 + - @backstage/plugin-permission-common@0.8.2 + - @backstage/errors@1.2.5 + +## 0.8.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.2 + - @backstage/backend-plugin-api@1.0.2-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + +## 0.8.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.0.2-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.5.4-next.1 + - @backstage/plugin-permission-common@0.8.1 + +## 0.8.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.4-next.0 + - @backstage/backend-plugin-api@1.0.2-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + +## 0.8.4 + +### Patch Changes + +- 094eaa3: Remove references to in-repo backend-common +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3 + - @backstage/backend-plugin-api@1.0.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + +## 0.8.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.1 + - @backstage/backend-plugin-api@1.0.1-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + +## 0.8.4-next.0 + +### Patch Changes + +- 094eaa3: Remove references to in-repo backend-common +- Updated dependencies + - @backstage/plugin-auth-node@0.5.3-next.0 + - @backstage/backend-plugin-api@1.0.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + +## 0.8.3 + +### Patch Changes + +- 19ff127: Internal refactor to remove dependencies on the identity and token manager services, which have been removed. Public APIs no longer require the identity service or token manager to be provided. +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-common@0.25.0 + - @backstage/backend-plugin-api@1.0.0 + - @backstage/plugin-auth-node@0.5.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + +## 0.8.3-next.2 + +### Patch Changes + +- c2b63ab: Updated dependency `supertest` to `^7.0.0`. +- Updated dependencies + - @backstage/backend-common@0.25.0-next.2 + - @backstage/plugin-auth-node@0.5.2-next.2 + - @backstage/backend-plugin-api@1.0.0-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + +## 0.8.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.25.0-next.1 + - @backstage/plugin-auth-node@0.5.2-next.1 + - @backstage/backend-plugin-api@0.9.0-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + +## 0.8.3-next.0 + +### Patch Changes + +- 19ff127: Internal refactor to remove dependencies on the identity and token manager services, which have been removed. Public APIs no longer require the identity service or token manager to be provided. +- Updated dependencies + - @backstage/backend-plugin-api@0.9.0-next.0 + - @backstage/backend-common@0.25.0-next.0 + - @backstage/plugin-auth-node@0.5.2-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.8.1 + +## 0.8.1 + +### Patch Changes + +- df784fe: The MetadataResponse type has been moved to @backstage/plugin-permission-common + to match the recent move of MetadataResponseSerializedRule, and should be + imported from there going forward. To avoid an immediate breaking change, this + type is still re-exported from this package, but is marked as deprecated and + will be removed in a future release. +- 5cd9878: The MetadataResponseSerializedRule type has been moved to @backstage/plugin-permission-common, and should be imported from there going forward. To avoid an immediate breaking change, this type is still re-exported from this package, but is marked as deprecated and will be removed in a future release. +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0 + - @backstage/backend-common@0.24.0 + - @backstage/plugin-permission-common@0.8.1 + - @backstage/plugin-auth-node@0.5.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.8.1-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.3 + - @backstage/backend-common@0.23.4-next.3 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.5.0-next.3 + - @backstage/plugin-permission-common@0.8.1-next.1 + +## 0.8.1-next.2 + +### Patch Changes + +- df784fe: The MetadataResponse type has been moved to @backstage/plugin-permission-common + to match the recent move of MetadataResponseSerializedRule, and should be + imported from there going forward. To avoid an immediate breaking change, this + type is still re-exported from this package, but is marked as deprecated and + will be removed in a future release. +- Updated dependencies + - @backstage/backend-plugin-api@0.8.0-next.2 + - @backstage/plugin-permission-common@0.8.1-next.1 + - @backstage/backend-common@0.23.4-next.2 + - @backstage/plugin-auth-node@0.5.0-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.8.1-next.1 + +### Patch Changes + +- 5cd9878: The MetadataResponseSerializedRule type has been moved to @backstage/plugin-permission-common, and should be imported from there going forward. To avoid an immediate breaking change, this type is still re-exported from this package, but is marked as deprecated and will be removed in a future release. +- Updated dependencies + - @backstage/plugin-permission-common@0.8.1-next.0 + - @backstage/backend-plugin-api@0.7.1-next.1 + - @backstage/backend-common@0.23.4-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.18-next.1 + +## 0.8.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.23.4-next.0 + - @backstage/backend-plugin-api@0.7.1-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.18-next.0 + - @backstage/plugin-permission-common@0.8.0 + +## 0.8.0 + +### Minor Changes + +- 36f91e8: **BREAKING**: Updated the `ServerPermissionClient` to match the new `PermissionsService` interface, where the deprecated `token` option has been removed and the options are now required. + +### Patch Changes + +- ed10fd2: The `PermissionPolicy` interface has been updated to align with the recent changes to the Backstage auth system. The second argument to the `handle` method is now of the new `PolicyQueryUser` type. This type maintains the old fields from the `BackstageIdentityResponse`, which are now all deprecated. Instead, two new fields have been added, which allows access to the same information: + + - `credentials` - A `BackstageCredentials` object, which is useful for making requests to other services on behalf of the user as part of evaluating the policy. This replaces the deprecated `token` field. See the [Auth Service documentation](https://backstage.io/docs/backend-system/core-services/auth#creating-request-tokens) for information about how to create a token using these credentials. + - `info` - A `BackstageUserInfo` object, which contains the same information as the deprecated `identity`, except for the `type` field that was redundant. + + Most existing policies can be updated by replacing the `BackstageIdentityResponse` type with `PolicyQueryUser`, which is exported from `@backstage/plugin-permission-node`, as well as replacing any occurrences of `user?.identity` with `user?.info`. + +- 28b2cfb: Fix invalid cross-reference in API Reference docs + +- Updated dependencies + - @backstage/backend-plugin-api@0.7.0 + - @backstage/backend-common@0.23.3 + - @backstage/plugin-permission-common@0.8.0 + - @backstage/plugin-auth-node@0.4.17 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.7.33-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.23.3-next.1 + - @backstage/backend-plugin-api@0.6.22-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.17-next.1 + - @backstage/plugin-permission-common@0.7.14 + +## 0.7.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.21-next.0 + - @backstage/backend-common@0.23.2-next.0 + - @backstage/plugin-auth-node@0.4.16-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.7.14 + +## 0.7.30 + +### Patch Changes + +- 9e63318: Ensure that service token access restrictions, when present, are taken into account +- d44a20a: Added additional plugin metadata to `package.json`. +- c7b0dd1: Import `tokenManager` definition from `@backstage/backend-plugin-api` +- Updated dependencies + - @backstage/backend-common@0.23.0 + - @backstage/backend-plugin-api@0.6.19 + - @backstage/plugin-auth-node@0.4.14 + - @backstage/plugin-permission-common@0.7.14 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.7.30-next.3 + +### Patch Changes + +- d44a20a: Added additional plugin metadata to `package.json`. +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.3 + - @backstage/plugin-auth-node@0.4.14-next.3 + - @backstage/plugin-permission-common@0.7.14-next.0 + - @backstage/backend-common@0.23.0-next.3 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + +## 0.7.30-next.2 + +### Patch Changes + +- c7b0dd1: Import `tokenManager` definition from `@backstage/backend-plugin-api` +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.2 + - @backstage/backend-common@0.23.0-next.2 + - @backstage/plugin-auth-node@0.4.14-next.2 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.7.13 + +## 0.7.30-next.1 + +### Patch Changes + +- 9e63318: Ensure that service token access restrictions, when present, are taken into account +- Updated dependencies + - @backstage/backend-plugin-api@0.6.19-next.1 + - @backstage/backend-common@0.23.0-next.1 + - @backstage/plugin-auth-node@0.4.14-next.1 + +## 0.7.30-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.1-next.0 + - @backstage/backend-plugin-api@0.6.19-next.0 + - @backstage/plugin-auth-node@0.4.14-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.7.13 + +## 0.7.29 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0 + - @backstage/backend-plugin-api@0.6.18 + - @backstage/plugin-auth-node@0.4.13 + +## 0.7.29-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.22.0-next.1 + - @backstage/plugin-auth-node@0.4.13-next.1 + - @backstage/backend-plugin-api@0.6.18-next.1 + +## 0.7.29-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.13-next.0 + - @backstage/backend-common@0.21.8-next.0 + - @backstage/backend-plugin-api@0.6.18-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.7.13 + +## 0.7.28 + +### Patch Changes + +- 29fa05b: Fixed an issue causing `ServerPermissionClient` to generate an invalid token for authorizing permissions against the permission backend. +- Updated dependencies + - @backstage/backend-common@0.21.7 + - @backstage/backend-plugin-api@0.6.17 + - @backstage/plugin-auth-node@0.4.12 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.7.13 + +## 0.7.28-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.7-next.1 + - @backstage/backend-plugin-api@0.6.17-next.1 + - @backstage/plugin-auth-node@0.4.12-next.1 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.7.13 + +## 0.7.28-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.7-next.0 + - @backstage/backend-plugin-api@0.6.17-next.0 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-auth-node@0.4.12-next.0 + - @backstage/plugin-permission-common@0.7.13 + +## 0.7.27 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.4.11 + - @backstage/backend-common@0.21.6 + - @backstage/backend-plugin-api@0.6.16 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.7.13 + +## 0.7.26 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.5 + - @backstage/plugin-auth-node@0.4.10 + - @backstage/backend-plugin-api@0.6.15 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/plugin-permission-common@0.7.13 + +## 0.7.25 + +### Patch Changes + +- 0502d82: The `ServerPermissionClient` has been migrated to implement the `PermissionsService` interface, now accepting the new `BackstageCredentials` object in addition to the `token` option, which is now deprecated. It now also optionally depends on the new `AuthService`. +- Updated dependencies + - @backstage/backend-common@0.21.4 + - @backstage/plugin-auth-node@0.4.9 + - @backstage/config@1.2.0 + - @backstage/errors@1.2.4 + - @backstage/backend-plugin-api@0.6.14 + - @backstage/plugin-permission-common@0.7.13 + +## 0.7.25-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.4-next.2 + - @backstage/plugin-auth-node@0.4.9-next.2 + - @backstage/backend-plugin-api@0.6.14-next.2 + - @backstage/config@1.2.0-next.1 + - @backstage/errors@1.2.4-next.0 + - @backstage/plugin-permission-common@0.7.13-next.1 + +## 0.7.25-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.2.0-next.1 + - @backstage/backend-common@0.21.4-next.1 + - @backstage/backend-plugin-api@0.6.14-next.1 + - @backstage/plugin-auth-node@0.4.9-next.1 + - @backstage/plugin-permission-common@0.7.13-next.1 + - @backstage/errors@1.2.4-next.0 + +## 0.7.24-next.0 + +### Patch Changes + +- 0502d82: The `ServerPermissionClient` has been migrated to implement the `PermissionsService` interface, now accepting the new `BackstageCredentials` object in addition to the `token` option, which is now deprecated. It now also optionally depends on the new `AuthService`. +- Updated dependencies + - @backstage/backend-common@0.21.3-next.0 + - @backstage/plugin-auth-node@0.4.8-next.0 + - @backstage/errors@1.2.4-next.0 + - @backstage/backend-plugin-api@0.6.13-next.0 + - @backstage/plugin-permission-common@0.7.13-next.0 + - @backstage/config@1.1.2-next.0 + +## 0.7.21 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0 + - @backstage/plugin-auth-node@0.4.4 + - @backstage/backend-plugin-api@0.6.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-permission-common@0.7.12 + +## 0.7.21-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0-next.3 + - @backstage/plugin-auth-node@0.4.4-next.3 + - @backstage/backend-plugin-api@0.6.10-next.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-permission-common@0.7.12 + +## 0.7.21-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0-next.2 + - @backstage/backend-plugin-api@0.6.10-next.2 + - @backstage/plugin-auth-node@0.4.4-next.2 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-permission-common@0.7.12 + +## 0.7.21-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.10-next.1 + - @backstage/backend-common@0.21.0-next.1 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-auth-node@0.4.4-next.1 + - @backstage/plugin-permission-common@0.7.12 + +## 0.7.21-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.21.0-next.0 + - @backstage/plugin-auth-node@0.4.4-next.0 + - @backstage/backend-plugin-api@0.6.10-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-permission-common@0.7.12 + +## 0.7.20 + +### Patch Changes + +- b1acd9b: Updated README +- Updated dependencies + - @backstage/backend-common@0.20.1 + - @backstage/backend-plugin-api@0.6.9 + - @backstage/plugin-permission-common@0.7.12 + - @backstage/plugin-auth-node@0.4.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## 0.7.20-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.9-next.2 + - @backstage/backend-common@0.20.1-next.2 + - @backstage/plugin-auth-node@0.4.3-next.2 + +## 0.7.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.1 + - @backstage/config@1.1.1 + - @backstage/plugin-auth-node@0.4.3-next.1 + - @backstage/backend-plugin-api@0.6.9-next.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-permission-common@0.7.11 + +## 0.7.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.1-next.0 + - @backstage/backend-plugin-api@0.6.9-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-auth-node@0.4.3-next.0 + - @backstage/plugin-permission-common@0.7.11 + +## 0.7.19 + +### Patch Changes + +- 0cbb03b: Fixing regular expression ReDoS with zod packages. Upgrading to latest. ref: +- Updated dependencies + - @backstage/backend-common@0.20.0 + - @backstage/plugin-auth-node@0.4.2 + - @backstage/plugin-permission-common@0.7.11 + - @backstage/backend-plugin-api@0.6.8 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + +## 0.7.19-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.3 + - @backstage/backend-plugin-api@0.6.8-next.3 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-auth-node@0.4.2-next.3 + - @backstage/plugin-permission-common@0.7.10 + +## 0.7.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.2 + - @backstage/plugin-auth-node@0.4.2-next.2 + - @backstage/backend-plugin-api@0.6.8-next.2 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-permission-common@0.7.10 + +## 0.7.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.1 + - @backstage/backend-plugin-api@0.6.8-next.1 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-auth-node@0.4.2-next.1 + - @backstage/plugin-permission-common@0.7.10 + +## 0.7.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.20.0-next.0 + - @backstage/plugin-auth-node@0.4.2-next.0 + - @backstage/backend-plugin-api@0.6.8-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-permission-common@0.7.10 + +## 0.7.18 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.9 + - @backstage/backend-plugin-api@0.6.7 + - @backstage/plugin-permission-common@0.7.10 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-auth-node@0.4.1 + +## 0.7.18-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.7-next.2 + - @backstage/backend-common@0.19.9-next.2 + - @backstage/plugin-auth-node@0.4.1-next.2 + +## 0.7.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.9-next.1 + - @backstage/plugin-auth-node@0.4.1-next.1 + - @backstage/backend-plugin-api@0.6.7-next.1 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-permission-common@0.7.9 + +## 0.7.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.9-next.0 + - @backstage/backend-plugin-api@0.6.7-next.0 + - @backstage/config@1.1.1 + - @backstage/errors@1.2.3 + - @backstage/plugin-auth-node@0.4.1-next.0 + - @backstage/plugin-permission-common@0.7.9 + +## 0.7.17 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.8 + - @backstage/plugin-auth-node@0.4.0 + - @backstage/errors@1.2.3 + - @backstage/backend-plugin-api@0.6.6 + - @backstage/config@1.1.1 + - @backstage/plugin-permission-common@0.7.9 + +## 0.7.17-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.8-next.2 + - @backstage/plugin-auth-node@0.4.0-next.2 + - @backstage/errors@1.2.3-next.0 + - @backstage/backend-plugin-api@0.6.6-next.2 + - @backstage/config@1.1.1-next.0 + - @backstage/plugin-permission-common@0.7.9-next.0 + +## 0.7.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.7-next.1 + - @backstage/backend-plugin-api@0.6.5-next.1 + - @backstage/plugin-auth-node@0.3.2-next.1 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + +## 0.7.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.2-next.0 + - @backstage/backend-common@0.19.7-next.0 + - @backstage/config@1.1.0 + - @backstage/backend-plugin-api@0.6.5-next.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + +## 0.7.14 + +### Patch Changes + +- a8a614ba0d07: Minor `package.json` update. +- Updated dependencies + - @backstage/backend-common@0.19.5 + - @backstage/plugin-auth-node@0.3.0 + - @backstage/config@1.1.0 + - @backstage/errors@1.2.2 + - @backstage/plugin-permission-common@0.7.8 + - @backstage/backend-plugin-api@0.6.3 + +## 0.7.14-next.3 + +### Patch Changes + +- a8a614ba0d07: Minor `package.json` update. +- Updated dependencies + - @backstage/config@1.1.0-next.2 + - @backstage/errors@1.2.2-next.0 + - @backstage/plugin-permission-common@0.7.8-next.2 + - @backstage/backend-plugin-api@0.6.3-next.3 + - @backstage/backend-common@0.19.5-next.3 + - @backstage/plugin-auth-node@0.3.0-next.3 + +## 0.7.14-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0-next.1 + - @backstage/backend-common@0.19.5-next.2 + - @backstage/plugin-auth-node@0.3.0-next.2 + - @backstage/backend-plugin-api@0.6.3-next.2 + - @backstage/plugin-permission-common@0.7.8-next.1 + - @backstage/errors@1.2.1 + +## 0.7.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.1.0-next.0 + - @backstage/backend-common@0.19.5-next.1 + - @backstage/backend-plugin-api@0.6.3-next.1 + - @backstage/plugin-auth-node@0.3.0-next.1 + - @backstage/plugin-permission-common@0.7.8-next.0 + - @backstage/errors@1.2.1 + +## 0.7.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.3.0-next.0 + - @backstage/backend-common@0.19.4-next.0 + - @backstage/backend-plugin-api@0.6.2-next.0 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-permission-common@0.7.7 + +## 0.7.11 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2 + - @backstage/backend-plugin-api@0.6.0 + - @backstage/plugin-auth-node@0.2.17 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-permission-common@0.7.7 + +## 0.7.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@0.6.0-next.2 + - @backstage/backend-common@0.19.2-next.2 + - @backstage/plugin-auth-node@0.2.17-next.2 + +## 0.7.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.1 + - @backstage/plugin-auth-node@0.2.17-next.1 + - @backstage/backend-plugin-api@0.6.0-next.1 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-permission-common@0.7.7 + +## 0.7.11-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.2-next.0 + - @backstage/backend-plugin-api@0.5.5-next.0 + - @backstage/config@1.0.8 + - @backstage/errors@1.2.1 + - @backstage/plugin-auth-node@0.2.17-next.0 + - @backstage/plugin-permission-common@0.7.7 + +## 0.7.10 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.1 + - @backstage/backend-common@0.19.1 + - @backstage/backend-plugin-api@0.5.4 + - @backstage/config@1.0.8 + - @backstage/plugin-auth-node@0.2.16 + - @backstage/plugin-permission-common@0.7.7 + +## 0.7.10-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@1.2.1-next.0 + - @backstage/backend-common@0.19.1-next.0 + - @backstage/backend-plugin-api@0.5.4-next.0 + - @backstage/config@1.0.8 + - @backstage/plugin-auth-node@0.2.16-next.0 + - @backstage/plugin-permission-common@0.7.7-next.0 + +## 0.7.9 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0 + - @backstage/errors@1.2.0 + - @backstage/backend-plugin-api@0.5.3 + - @backstage/plugin-auth-node@0.2.15 + - @backstage/config@1.0.8 + - @backstage/plugin-permission-common@0.7.6 + +## 0.7.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.2 + - @backstage/backend-plugin-api@0.5.3-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.2.0-next.0 + - @backstage/plugin-auth-node@0.2.15-next.2 + - @backstage/plugin-permission-common@0.7.6-next.0 + +## 0.7.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.19.0-next.1 + - @backstage/errors@1.2.0-next.0 + - @backstage/backend-plugin-api@0.5.3-next.1 + - @backstage/plugin-auth-node@0.2.15-next.1 + - @backstage/plugin-permission-common@0.7.6-next.0 + - @backstage/config@1.0.7 + +## 0.7.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.6-next.0 + - @backstage/config@1.0.7 + - @backstage/backend-plugin-api@0.5.3-next.0 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.15-next.0 + - @backstage/plugin-permission-common@0.7.5 + +## 0.7.8 + +### Patch Changes + +- a788e715cfc: `createPermissionIntegrationRouter` now accepts rules and permissions for multiple resource types. Example: + + ```typescript + createPermissionIntegrationRouter({ + resources: [ + { + resourceType: 'resourceType-1', + permissions: permissionsResourceType1, + rules: rulesResourceType1, + }, + { + resourceType: 'resourceType-2', + permissions: permissionsResourceType2, + rules: rulesResourceType2, + }, + ], + }); + ``` + +- Updated dependencies + - @backstage/backend-common@0.18.5 + - @backstage/plugin-auth-node@0.2.14 + - @backstage/backend-plugin-api@0.5.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.5 + +## 0.7.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.5-next.1 + - @backstage/plugin-auth-node@0.2.14-next.1 + - @backstage/backend-plugin-api@0.5.2-next.1 + - @backstage/config@1.0.7 + +## 0.7.8-next.0 + +### Patch Changes + +- a788e715cfc: `createPermissionIntegrationRouter` now accepts rules and permissions for multiple resource types. Example: + + ```typescript + createPermissionIntegrationRouter({ + resources: [ + { + resourceType: 'resourceType-1', + permissions: permissionsResourceType1, + rules: rulesResourceType1, + }, + { + resourceType: 'resourceType-2', + permissions: permissionsResourceType2, + rules: rulesResourceType2, + }, + ], + }); + ``` + +- Updated dependencies + - @backstage/backend-common@0.18.5-next.0 + - @backstage/plugin-auth-node@0.2.14-next.0 + - @backstage/backend-plugin-api@0.5.2-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.5 + +## 0.7.7 + +### Patch Changes + +- 788f0f5a152: Introduced alpha export of the `policyExtensionPoint` for use in the new backend system. +- 71fd0966d10: Added createConditionAuthorizer utility function, which takes some permission conditions and returns a function that returns a definitive authorization result given a decision and a resource. +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/backend-common@0.18.4 + - @backstage/plugin-permission-common@0.7.5 + - @backstage/plugin-auth-node@0.2.13 + - @backstage/backend-plugin-api@0.5.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + +## 0.7.7-next.2 + +### Patch Changes + +- 788f0f5a152: Introduced alpha export of the `policyExtensionPoint` for use in the new backend system. +- Updated dependencies + - @backstage/backend-common@0.18.4-next.2 + - @backstage/backend-plugin-api@0.5.1-next.2 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.2 + - @backstage/plugin-permission-common@0.7.5-next.0 + +## 0.7.7-next.1 + +### Patch Changes + +- 71fd0966d10: Added createConditionAuthorizer utility function, which takes some permission conditions and returns a function that returns a definitive authorization result given a decision and a resource. +- 1e4f5e91b8e: Bump `zod` and `zod-to-json-schema` dependencies. +- Updated dependencies + - @backstage/plugin-permission-common@0.7.5-next.0 + - @backstage/backend-common@0.18.4-next.1 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.1 + +## 0.7.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.4-next.0 + - @backstage/config@1.0.7 + - @backstage/errors@1.1.5 + - @backstage/plugin-auth-node@0.2.13-next.0 + - @backstage/plugin-permission-common@0.7.4 + +## 0.7.6 + +### Patch Changes + +- 27a103ca07b: Changed the `createPermissionIntegrationRouter` API to allow `getResources`, `resourceType` and `rules` to be optional +- 37e9215c793: Update the service-to-service auth docs URL in error message. + \`\` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12 + - @backstage/backend-common@0.18.3 + - @backstage/errors@1.1.5 + - @backstage/plugin-permission-common@0.7.4 + - @backstage/config@1.0.7 + +## 0.7.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.12-next.2 + - @backstage/backend-common@0.18.3-next.2 + - @backstage/config@1.0.7-next.0 + +## 0.7.6-next.1 + +### Patch Changes + +- 27a103ca07b: Changed the `createPermissionIntegrationRouter` API to allow `getResources`, `resourceType` and `rules` to be optional +- 37e9215c793: Update the service-to-service auth docs URL in error message. + \`\` +- 52b0022dab7: Updated dependency `msw` to `^1.0.0`. +- Updated dependencies + - @backstage/errors@1.1.5-next.0 + - @backstage/backend-common@0.18.3-next.1 + - @backstage/plugin-auth-node@0.2.12-next.1 + - @backstage/plugin-permission-common@0.7.4-next.0 + - @backstage/config@1.0.7-next.0 + +## 0.7.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.3-next.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.12-next.0 + - @backstage/plugin-permission-common@0.7.3 + +## 0.7.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.11 + - @backstage/plugin-permission-common@0.7.3 + +## 0.7.5-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.2 + - @backstage/plugin-auth-node@0.2.11-next.2 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3 + +## 0.7.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.1 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.11-next.1 + - @backstage/plugin-permission-common@0.7.3 + +## 0.7.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.2-next.0 + - @backstage/plugin-auth-node@0.2.11-next.0 + +## 0.7.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0 + - @backstage/config@1.0.6 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.9 + - @backstage/plugin-permission-common@0.7.3 + +## 0.7.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.1 + - @backstage/plugin-auth-node@0.2.9-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-permission-common@0.7.3-next.0 + +## 0.7.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.18.0-next.0 + - @backstage/config@1.0.6-next.0 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.9-next.0 + - @backstage/plugin-permission-common@0.7.3-next.0 + +## 0.7.2 + +### Patch Changes + +- b05dcd5530: Move the `zod` dependency to a version that does not collide with other libraries +- 3280711113: Updated dependency `msw` to `^0.49.0`. +- Updated dependencies + - @backstage/backend-common@0.17.0 + - @backstage/plugin-permission-common@0.7.2 + - @backstage/errors@1.1.4 + - @backstage/plugin-auth-node@0.2.8 + - @backstage/config@1.0.5 + +## 0.7.2-next.3 + +### Patch Changes + +- b05dcd5530: Move the `zod` dependency to a version that does not collide with other libraries +- Updated dependencies + - @backstage/plugin-permission-common@0.7.2-next.2 + - @backstage/backend-common@0.17.0-next.3 + - @backstage/config@1.0.5-next.1 + - @backstage/errors@1.1.4-next.1 + - @backstage/plugin-auth-node@0.2.8-next.3 + +## 0.7.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.17.0-next.2 + - @backstage/plugin-auth-node@0.2.8-next.2 + - @backstage/config@1.0.5-next.1 + - @backstage/errors@1.1.4-next.1 + - @backstage/plugin-permission-common@0.7.2-next.1 + +## 0.7.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.17.0-next.1 + - @backstage/plugin-auth-node@0.2.8-next.1 + - @backstage/config@1.0.5-next.1 + - @backstage/errors@1.1.4-next.1 + - @backstage/plugin-permission-common@0.7.2-next.1 + +## 0.7.2-next.0 + +### Patch Changes + +- 3280711113: Updated dependency `msw` to `^0.49.0`. +- Updated dependencies + - @backstage/backend-common@0.16.1-next.0 + - @backstage/plugin-auth-node@0.2.8-next.0 + - @backstage/plugin-permission-common@0.7.2-next.0 + - @backstage/config@1.0.5-next.0 + - @backstage/errors@1.1.4-next.0 + +## 0.7.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.16.0 + - @backstage/plugin-auth-node@0.2.7 + - @backstage/plugin-permission-common@0.7.1 + - @backstage/config@1.0.4 + - @backstage/errors@1.1.3 + +## 0.7.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.16.0-next.1 + - @backstage/plugin-auth-node@0.2.7-next.1 + - @backstage/config@1.0.4-next.0 + - @backstage/errors@1.1.3-next.0 + - @backstage/plugin-permission-common@0.7.1-next.0 + +## 0.7.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.16.0-next.0 + - @backstage/plugin-auth-node@0.2.7-next.0 + - @backstage/plugin-permission-common@0.7.1-next.0 + - @backstage/config@1.0.4-next.0 + - @backstage/errors@1.1.3-next.0 + +## 0.7.0 + +### Minor Changes + +- 46b4a72cee: **BREAKING**: When defining permission rules, it's now necessary to provide a [ZodSchema](https://github.com/colinhacks/zod) that specifies the parameters the rule expects. This has been added to help better describe the parameters in the response of the metadata endpoint and to validate the parameters before a rule is executed. + + To help with this, we have also made a change to the API of permission rules. Before, the permission rules `toQuery` and `apply` signature expected parameters to be separate arguments, like so... + + ```ts + createPermissionRule({ + apply: (resource, foo, bar) => true, + toQuery: (foo, bar) => {}, + }); + ``` + + The API has now changed to expect the parameters as a single object + + ```ts + createPermissionRule({ + paramSchema: z.object({ + foo: z.string().describe('Foo value to match'), + bar: z.string().describe('Bar value to match'), + }), + apply: (resource, { foo, bar }) => true, + toQuery: ({ foo, bar }) => {}, + }); + ``` + + One final change made is to limit the possible values for a parameter to primitives and arrays of primitives. + +### Patch Changes + +- 9335ad115e: Exported types for the .metadata endpoint of the permission router +- Updated dependencies + - @backstage/backend-common@0.15.2 + - @backstage/plugin-auth-node@0.2.6 + - @backstage/plugin-permission-common@0.7.0 + - @backstage/config@1.0.3 + - @backstage/errors@1.1.2 + +## 0.7.0-next.2 + +### Minor Changes + +- 46b4a72cee: **BREAKING**: When defining permission rules, it's now necessary to provide a [ZodSchema](https://github.com/colinhacks/zod) that specifies the parameters the rule expects. This has been added to help better describe the parameters in the response of the metadata endpoint and to validate the parameters before a rule is executed. + + To help with this, we have also made a change to the API of permission rules. Before, the permission rules `toQuery` and `apply` signature expected parameters to be separate arguments, like so... + + ```ts + createPermissionRule({ + apply: (resource, foo, bar) => true, + toQuery: (foo, bar) => {}, + }); + ``` + + The API has now changed to expect the parameters as a single object + + ```ts + createPermissionRule({ + paramSchema: z.object({ + foo: z.string().describe('Foo value to match'), + bar: z.string().describe('Bar value to match'), + }), + apply: (resource, { foo, bar }) => true, + toQuery: ({ foo, bar }) => {}, + }); + ``` + + One final change made is to limit the possible values for a parameter to primitives and arrays of primitives. + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.2-next.2 + - @backstage/plugin-permission-common@0.7.0-next.2 + - @backstage/plugin-auth-node@0.2.6-next.2 + - @backstage/config@1.0.3-next.2 + - @backstage/errors@1.1.2-next.2 + +## 0.6.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.2-next.1 + - @backstage/config@1.0.3-next.1 + - @backstage/errors@1.1.2-next.1 + - @backstage/plugin-auth-node@0.2.6-next.1 + - @backstage/plugin-permission-common@0.6.5-next.1 + +## 0.6.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.2-next.0 + - @backstage/plugin-auth-node@0.2.6-next.0 + - @backstage/config@1.0.3-next.0 + - @backstage/errors@1.1.2-next.0 + - @backstage/plugin-permission-common@0.6.5-next.0 + +## 0.6.5 + +### Patch Changes + +- 9212439d15: Minor update to tests +- 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/backend-common@0.15.1 + - @backstage/plugin-auth-node@0.2.5 + - @backstage/config@1.0.2 + - @backstage/errors@1.1.1 + - @backstage/plugin-permission-common@0.6.4 + +## 0.6.5-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.0.2-next.0 + - @backstage/errors@1.1.1-next.0 + - @backstage/plugin-permission-common@0.6.4-next.2 + - @backstage/backend-common@0.15.1-next.3 + - @backstage/plugin-auth-node@0.2.5-next.3 + +## 0.6.5-next.2 + +### Patch Changes + +- 667d917488: Updated dependency `msw` to `^0.47.0`. +- 87ec2ba4d6: Updated dependency `msw` to `^0.46.0`. +- Updated dependencies + - @backstage/backend-common@0.15.1-next.2 + - @backstage/plugin-auth-node@0.2.5-next.2 + - @backstage/plugin-permission-common@0.6.4-next.1 + +## 0.6.5-next.1 + +### Patch Changes + +- 9212439d15: Minor update to tests +- Updated dependencies + - @backstage/plugin-auth-node@0.2.5-next.1 + - @backstage/backend-common@0.15.1-next.1 + +## 0.6.5-next.0 + +### Patch Changes + +- bf5e9030eb: Updated dependency `msw` to `^0.45.0`. +- Updated dependencies + - @backstage/backend-common@0.15.1-next.0 + - @backstage/plugin-auth-node@0.2.5-next.0 + - @backstage/plugin-permission-common@0.6.4-next.0 + +## 0.6.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.0 + - @backstage/plugin-auth-node@0.2.4 + +## 0.6.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.15.0-next.0 + - @backstage/plugin-auth-node@0.2.4-next.0 + +## 0.6.3 + +### Patch Changes + +- a70869e775: Updated dependency `msw` to `^0.43.0`. +- 8006d0f9bf: Updated dependency `msw` to `^0.44.0`. +- Updated dependencies + - @backstage/backend-common@0.14.1 + - @backstage/plugin-auth-node@0.2.3 + - @backstage/plugin-permission-common@0.6.3 + - @backstage/errors@1.1.0 + +## 0.6.3-next.2 + +### Patch Changes + +- a70869e775: Updated dependency `msw` to `^0.43.0`. +- Updated dependencies + - @backstage/backend-common@0.14.1-next.3 + - @backstage/plugin-auth-node@0.2.3-next.2 + - @backstage/plugin-permission-common@0.6.3-next.1 + +## 0.6.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.1 + - @backstage/errors@1.1.0-next.0 + - @backstage/plugin-auth-node@0.2.3-next.1 + - @backstage/plugin-permission-common@0.6.3-next.0 + +## 0.6.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.1-next.0 + - @backstage/plugin-auth-node@0.2.3-next.0 + +## 0.6.2 + +### Patch Changes + +- 58426f9c0f: Added a new endpoint for aggregating permission metadata from a plugin backend: `/.well-known/backstage/permissions/metadata` + + By default, the metadata endpoint will return information about the permission rules supported by the plugin. Plugin authors can also provide an optional `permissions` parameter to `createPermissionIntegrationRouter`. If provided, these `Permission` objects will be included in the metadata returned by this endpoint. The `permissions` parameter will eventually be required in a future breaking change. + +- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. + +- Updated dependencies + - @backstage/backend-common@0.14.0 + - @backstage/plugin-auth-node@0.2.2 + - @backstage/plugin-permission-common@0.6.2 + +## 0.6.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.14.0-next.2 + - @backstage/plugin-auth-node@0.2.2-next.2 + +## 0.6.2-next.1 + +### Patch Changes + +- 8f7b1835df: Updated dependency `msw` to `^0.41.0`. +- Updated dependencies + - @backstage/backend-common@0.13.6-next.1 + - @backstage/plugin-auth-node@0.2.2-next.1 + - @backstage/plugin-permission-common@0.6.2-next.0 + +## 0.6.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.6-next.0 + - @backstage/plugin-auth-node@0.2.2-next.0 + +## 0.6.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3 + - @backstage/config@1.0.1 + - @backstage/plugin-auth-node@0.2.1 + - @backstage/plugin-permission-common@0.6.1 + +## 0.6.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.2 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-auth-node@0.2.1-next.1 + - @backstage/plugin-permission-common@0.6.1-next.0 + +## 0.6.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.3-next.0 + - @backstage/plugin-auth-node@0.2.1-next.0 + +## 0.6.0 + +### Minor Changes + +- 8012ac46a0: **BREAKING**: Stronger typing in `PermissionPolicy` 🎉. + + Previously, it was entirely the responsibility of the `PermissionPolicy` author to only return `CONDITIONAL` decisions for permissions that are associated with a resource, and to return the correct kind of `PermissionCondition` instances inside the decision. Now, the policy authoring helpers provided in this package now ensure that the decision and permission match. + + **For policy authors**: rename and adjust api of `createConditionExports`. Previously, the function returned a factory for creating conditional decisions named `createPolicyDecision`, which had a couple of drawbacks: + + 1. The function always creates a _conditional_ policy decision, but this was not reflected in the name. + 2. Conditional decisions should only ever be returned from `PermissionPolicy#handle` for resource permissions, but there was nothing in the API that encoded this constraint. + + This change addresses the drawbacks above by making the following changes for policy authors: + + - The `createPolicyDecision` method has been renamed to `createConditionalDecision`. + - Along with conditions, the method now accepts a permission, which must be a `ResourcePermission`. This is expected to be the handled permission in `PermissionPolicy#handle`, whose type must first be narrowed using methods like `isPermission` and `isResourcePermission`: + + ```typescript + class TestPermissionPolicy implements PermissionPolicy { + async handle( + request: PolicyQuery, + _user?: BackstageIdentityResponse, + ): Promise { + if ( + // Narrow type of `request.permission` to `ResourcePermission<'catalog-entity'> + isResourcePermission(request.permission, RESOURCE_TYPE_CATALOG_ENTITY) + ) { + return createCatalogConditionalDecision( + request.permission, + catalogConditions.isEntityOwner( + _user?.identity.ownershipEntityRefs ?? [], + ), + ); + } + + return { + result: AuthorizeResult.ALLOW, + }; + ``` + + **BREAKING**: when creating `PermissionRule`s, provide a `resourceType`. + + ```diff + export const isEntityOwner = createCatalogPermissionRule({ + name: 'IS_ENTITY_OWNER', + description: 'Allow entities owned by the current user', + + resourceType: RESOURCE_TYPE_CATALOG_ENTITY, + apply: (resource: Entity, claims: string[]) => { + if (!resource.relations) { + return false; + } + + return resource.relations + .filter(relation => relation.type === RELATION_OWNED_BY) + .some(relation => claims.includes(relation.targetRef)); + }, + toQuery: (claims: string[]) => ({ + key: 'relations.ownedBy', + values: claims, + }), + }); + ``` + +- c98d271466: **BREAKING:** + + - Rename `PolicyAuthorizeQuery` to `PolicyQuery` + - Remove `PolicyDecision`, `DefinitivePolicyDecision`, and `ConditionalPolicyDecision`. These types are now exported from `@backstage/plugin-permission-common` + +- 322b69e46a: **BREAKING:** `ServerPermissionClient` now implements `PermissionEvaluator`, which moves out the capabilities for evaluating conditional decisions from `authorize()` to `authorizeConditional()` method. + +### Patch Changes + +- 90754d4fa9: Removed [strict](https://github.com/colinhacks/zod#strict) validation from `PermissionCriteria` schemas to support backward-compatible changes. +- 8012ac46a0: Fix signature of permission rule in test suites +- Updated dependencies + - @backstage/plugin-permission-common@0.6.0 + - @backstage/plugin-auth-node@0.2.0 + - @backstage/backend-common@0.13.2 + +## 0.6.0-next.2 + +### Minor Changes + +- 322b69e46a: **BREAKING:** `ServerPermissionClient` now implements `PermissionEvaluator`, which moves out the capabilities for evaluating conditional decisions from `authorize()` to `authorizeConditional()` method. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-common@0.6.0-next.1 + - @backstage/backend-common@0.13.2-next.2 + +## 0.6.0-next.1 + +### Minor Changes + +- 8012ac46a0: **BREAKING**: Stronger typing in `PermissionPolicy` 🎉. + + Previously, it was entirely the responsibility of the `PermissionPolicy` author to only return `CONDITIONAL` decisions for permissions that are associated with a resource, and to return the correct kind of `PermissionCondition` instances inside the decision. Now, the policy authoring helpers provided in this package now ensure that the decision and permission match. + + **For policy authors**: rename and adjust api of `createConditionExports`. Previously, the function returned a factory for creating conditional decisions named `createPolicyDecision`, which had a couple of drawbacks: + + 1. The function always creates a _conditional_ policy decision, but this was not reflected in the name. + 2. Conditional decisions should only ever be returned from `PermissionPolicy#handle` for resource permissions, but there was nothing in the API that encoded this constraint. + + This change addresses the drawbacks above by making the following changes for policy authors: + + - The `createPolicyDecision` method has been renamed to `createConditionalDecision`. + - Along with conditions, the method now accepts a permission, which must be a `ResourcePermission`. This is expected to be the handled permission in `PermissionPolicy#handle`, whose type must first be narrowed using methods like `isPermission` and `isResourcePermission`: + + ```typescript + class TestPermissionPolicy implements PermissionPolicy { + async handle( + request: PolicyQuery, + _user?: BackstageIdentityResponse, + ): Promise { + if ( + // Narrow type of `request.permission` to `ResourcePermission<'catalog-entity'> + isResourcePermission(request.permission, RESOURCE_TYPE_CATALOG_ENTITY) + ) { + return createCatalogConditionalDecision( + request.permission, + catalogConditions.isEntityOwner( + _user?.identity.ownershipEntityRefs ?? [], + ), + ); + } + + return { + result: AuthorizeResult.ALLOW, + }; + ``` + + **BREAKING**: when creating `PermissionRule`s, provide a `resourceType`. + + ```diff + export const isEntityOwner = createCatalogPermissionRule({ + name: 'IS_ENTITY_OWNER', + description: 'Allow entities owned by the current user', + + resourceType: RESOURCE_TYPE_CATALOG_ENTITY, + apply: (resource: Entity, claims: string[]) => { + if (!resource.relations) { + return false; + } + + return resource.relations + .filter(relation => relation.type === RELATION_OWNED_BY) + .some(relation => claims.includes(relation.targetRef)); + }, + toQuery: (claims: string[]) => ({ + key: 'relations.ownedBy', + values: claims, + }), + }); + ``` + +- c98d271466: **BREAKING:** + + - Rename `PolicyAuthorizeQuery` to `PolicyQuery` + - Remove `PolicyDecision`, `DefinitivePolicyDecision`, and `ConditionalPolicyDecision`. These types are now exported from `@backstage/plugin-permission-common` + +### Patch Changes + +- 8012ac46a0: Fix signature of permission rule in test suites +- Updated dependencies + - @backstage/plugin-permission-common@0.6.0-next.0 + - @backstage/backend-common@0.13.2-next.1 + +## 0.5.6-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-node@0.2.0-next.0 + - @backstage/backend-common@0.13.2-next.0 + +## 0.5.5 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.1 + - @backstage/config@1.0.0 + - @backstage/errors@1.0.0 + - @backstage/plugin-permission-common@0.5.3 + - @backstage/plugin-auth-node@0.1.6 + +## 0.5.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.0 + - @backstage/plugin-auth-node@0.1.5 + +## 0.5.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.13.0-next.0 + - @backstage/plugin-auth-node@0.1.5-next.0 + +## 0.5.3 + +### Patch Changes + +- 580f4e1df8: Export some utility functions for parsing PermissionCriteria + + `isAndCriteria`, `isOrCriteria`, `isNotCriteria` are now exported. + +- Updated dependencies + - @backstage/backend-common@0.12.0 + - @backstage/plugin-permission-common@0.5.2 + - @backstage/plugin-auth-node@0.1.4 + +## 0.5.2 + +### Patch Changes + +- 0816f8237a: Improved error message shown when permissions are enabled without backend-to-backend authentication. +- Updated dependencies + - @backstage/backend-common@0.11.0 + - @backstage/plugin-auth-node@0.1.3 + +## 0.5.1 + +### Patch Changes + +- Fix for the previous release with missing type declarations. +- Updated dependencies + - @backstage/backend-common@0.10.9 + - @backstage/config@0.1.15 + - @backstage/errors@0.2.2 + - @backstage/plugin-auth-node@0.1.2 + - @backstage/plugin-permission-common@0.5.1 + +## 0.5.0 + +### Minor Changes + +- 8c646beb24: **BREAKING** `PermissionCriteria` now requires at least one condition in `anyOf` and `allOf` arrays. This addresses some ambiguous behavior outlined in #9280. + +### Patch Changes + +- c77c5c7eb6: Added `backstage.role` to `package.json` +- Updated dependencies + - @backstage/backend-common@0.10.8 + - @backstage/errors@0.2.1 + - @backstage/plugin-auth-node@0.1.1 + - @backstage/plugin-permission-common@0.5.0 + - @backstage/config@0.1.14 + +## 0.4.3 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-common@0.10.7 + - @backstage/plugin-auth-node@0.1.0 + +## 0.4.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.10.0-next.0 + - @backstage/backend-common@0.10.7-next.0 + +## 0.4.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.9.0 + - @backstage/backend-common@0.10.6 + +## 0.4.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.9.0-next.1 + - @backstage/backend-common@0.10.6-next.0 + +## 0.4.2-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.9.0-next.0 + +## 0.4.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.8.0 + - @backstage/backend-common@0.10.5 + +## 0.4.0 + +### Minor Changes + +- 0ae4f4cc82: **BREAKING**: `PolicyAuthorizeRequest` type has been renamed to `PolicyAuthorizeQuery`. + **BREAKING**: Update to use renamed request and response types from @backstage/plugin-permission-common. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.7.0 + - @backstage/plugin-permission-common@0.4.0 + - @backstage/backend-common@0.10.4 + - @backstage/config@0.1.13 + +## 0.4.0-next.0 + +### Minor Changes + +- 0ae4f4cc82: **BREAKING**: `PolicyAuthorizeRequest` type has been renamed to `PolicyAuthorizeQuery`. + **BREAKING**: Update to use renamed request and response types from @backstage/plugin-permission-common. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.7.0-next.0 + - @backstage/plugin-permission-common@0.4.0-next.0 + - @backstage/backend-common@0.10.4-next.0 + - @backstage/config@0.1.13-next.0 + +## 0.3.0 + +### Minor Changes + +- 419ca637c0: Optimizations to the integration between the permission backend and plugin-backends using createPermissionIntegrationRouter: + + - The permission backend already supported batched requests to authorize, but would make calls to plugin backend to apply conditions serially. Now, after applying the policy for each authorization request, the permission backend makes a single batched /apply-conditions request to each plugin backend referenced in policy decisions. + - The `getResource` method accepted by `createPermissionIntegrationRouter` has been replaced with `getResources`, to allow consumers to make batch requests to upstream data stores. When /apply-conditions is called with a batch of requests, all required resources are requested in a single invocation of `getResources`. + + Plugin owners consuming `createPermissionIntegrationRouter` should replace the `getResource` method in the options with a `getResources` method, accepting an array of resourceRefs, and returning an array of the corresponding resources. + +### Patch Changes + +- 9db1b86f32: Add helpers for creating PermissionRules with inferred types +- Updated dependencies + - @backstage/config@0.1.12 + - @backstage/backend-common@0.10.3 + - @backstage/plugin-auth-backend@0.6.2 + - @backstage/errors@0.2.0 + - @backstage/plugin-permission-common@0.3.1 + +## 0.2.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.6.0 + - @backstage/backend-common@0.10.1 + +## 0.2.2 + +### Patch Changes + +- 2f8a9b665f: Add `ServerPermissionClient`, which implements `PermissionAuthorizer` from @backstage/plugin-permission-common. This implementation skips authorization entirely when the supplied token is a valid backend-to-backend token, thereby allowing backend-to-backend systems to communicate without authorization. + + The `ServerPermissionClient` should always be used over the standard `PermissionClient` in plugin backends. + +- Updated dependencies + - @backstage/backend-common@0.10.0 + - @backstage/plugin-auth-backend@0.5.2 + - @backstage/plugin-permission-common@0.3.0 + +## 0.2.1 + +### Patch Changes + +- dcd1a0c3f4: Minor improvement to the API reports, by not unpacking arguments directly + +- a036b65c2f: Updated to use the new `BackstageIdentityResponse` type from `@backstage/plugin-auth-backend`. + + The `BackstageIdentityResponse` type is backwards compatible with the `BackstageIdentity`, and provides an additional `identity` field with the claims of the user. + +- Updated dependencies + - @backstage/plugin-auth-backend@0.5.0 + +## 0.2.0 + +### Minor Changes + +- e7851efa9e: Rename and adjust permission policy return type to reduce nesting +- 450ca92330: Change route used for integration between the authorization framework and other plugin backends to use the /.well-known prefix. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.4.10 + +## 0.1.0 + +### Minor Changes + +- 44b46644d9: New package containing common permission and authorization utilities for backend plugins. For more information, see the [authorization PRFC](https://github.com/backstage/backstage/pull/7761). + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.4.9 + - @backstage/plugin-permission-common@0.2.0 + +## @backstage/plugin-search@1.6.0-next.1 + +### Minor Changes + +- feef8d9: Added support for configuring the default search type in the search page via the `search.defaultType` option in `app-config.yaml`. This applies to both the legacy and new frontend systems. If not set, the default is empty, which means searching for "all" types. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/plugin-search-react@1.10.3-next.1 + - @backstage/core-components@0.18.7-next.1 + +## @backstage/plugin-search-backend-module-elasticsearch@1.8.0-next.1 + +### Minor Changes + +- 583bd3a: Added `elasticsearchAuthExtensionPoint` to enable dynamic authentication mechanisms such as bearer tokens with automatic rotation. + +### Patch Changes + +- 7021165: Fixed bulk indexing to refresh only the target index instead of all indexes, improving performance in multi-index deployments. +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/app-defaults@1.7.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.7.2-next.0 + - @backstage/core-components@0.18.7-next.1 + +## @backstage/backend-defaults@0.15.2-next.1 + +### Patch Changes + +- 8dd518a: Support `connection.type: azure` in database client to use Microsoft Entra authentication with Azure database for PostgreSQL +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/cli-node@0.2.18-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/backend-dynamic-feature-service@0.7.9-next.1 + +### Patch Changes + +- 9b4c414: Updated README for backend-dynamic-feature-service +- Updated dependencies + - @backstage/cli-node@0.2.18-next.1 + - @backstage/plugin-catalog-backend@3.4.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/backend-defaults@0.15.2-next.1 + - @backstage/plugin-scaffolder-node@0.12.5-next.1 + +## @backstage/cli@0.35.4-next.1 + +### Patch Changes + +- 5e3ef57: Added support for the new `peerModules` metadata field in `package.json`. This field allows plugin packages to declare modules that should be installed alongside them for cross-plugin integrations. The field is validated by `backstage-cli repo fix --publish`. +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/cli-node@0.2.18-next.1 + +## @backstage/cli-node@0.2.18-next.1 + +### Patch Changes + +- 5e3ef57: Added support for the new `peerModules` metadata field in `package.json`. This field allows plugin packages to declare modules that should be installed alongside them for cross-plugin integrations. The field is validated by `backstage-cli repo fix --publish`. + +## @backstage/core-compat-api@0.5.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + +## @backstage/core-components@0.18.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.7.2-next.0 + +## @backstage/create-app@0.7.9-next.1 + +### Patch Changes + +- Bumped create-app version. + +## @backstage/dev-utils@1.1.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/ui@0.12.0-next.1 + - @backstage/theme@0.7.2-next.0 + - @backstage/app-defaults@1.7.5-next.1 + - @backstage/core-components@0.18.7-next.1 + - @backstage/integration-react@1.2.15-next.1 + +## @backstage/frontend-test-utils@0.4.6-next.1 + +### Patch Changes + +- 22864b7: Added an `apis` option to `createExtensionTester`, `renderInTestApp`, and `renderTestApp` to override APIs when testing extensions. Use the `mockApis` helpers to create mock implementations: + + ```typescript + import { identityApiRef } from '@backstage/frontend-plugin-api'; + import { mockApis } from '@backstage/frontend-test-utils'; + + // Override APIs in createExtensionTester + const tester = createExtensionTester(myExtension, { + apis: [ + [ + identityApiRef, + mockApis.identity({ userEntityRef: 'user:default/guest' }), + ], + ], + }); + + // Override APIs in renderInTestApp + renderInTestApp(, { + apis: [ + [ + identityApiRef, + mockApis.identity({ userEntityRef: 'user:default/guest' }), + ], + ], + }); + + // Override APIs in renderTestApp + renderTestApp({ + extensions: [myExtension], + apis: [ + [ + identityApiRef, + mockApis.identity({ userEntityRef: 'user:default/guest' }), + ], + ], + }); + ``` + +- Updated dependencies + - @backstage/frontend-app-api@0.15.0-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/plugin-app@0.4.0-next.1 + - @backstage/test-utils@1.7.15-next.1 + +## @backstage/integration-react@1.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + +## @backstage/repo-tools@0.16.4-next.1 + +### Patch Changes + +- 6523040: Support Prettier v3 for api-reports +- Updated dependencies + - @backstage/cli-node@0.2.18-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/test-utils@1.7.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.7.2-next.0 + +## @backstage/theme@0.7.2-next.0 + +### Patch Changes + +- 1c52dcc: add square shape + +## @backstage/plugin-api-docs@0.13.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/plugin-catalog@1.33.0-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/core-components@0.18.7-next.1 + +## @backstage/plugin-app@0.4.0-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.7.2-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/core-components@0.18.7-next.1 + - @backstage/integration-react@1.2.15-next.1 + +## @backstage/plugin-auth@0.1.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.7.2-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/core-components@0.18.7-next.1 + +## @backstage/plugin-bitbucket-cloud-common@0.3.7-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + +## @backstage/plugin-catalog-backend@3.4.0-next.1 + +### Patch Changes + +- 5e3ef57: Added `peerModules` metadata declaring recommended modules for cross-plugin integrations. +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-backend-module-aws@0.4.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.9.10-next.1 + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/backend-defaults@0.15.2-next.1 + +## @backstage/plugin-catalog-backend-module-azure@0.3.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.5.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.3.7-next.1 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.5.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-backend-module-gerrit@0.3.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-backend-module-gitea@0.1.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-backend-module-github@0.12.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-backend-module-openapi@0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-graph@0.5.7-next.1 + +### Patch Changes + +- 8dd27c4: Fix large icon rendering in catalog graph nodes +- Updated dependencies + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/core-components@0.18.7-next.1 + +## @backstage/plugin-catalog-import@0.13.10-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/integration@1.20.0-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/core-components@0.18.7-next.1 + - @backstage/integration-react@1.2.15-next.1 + +## @backstage/plugin-events-backend-module-github@0.4.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-home@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 + +## @backstage/plugin-kubernetes@0.12.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/plugin-kubernetes-common@0.9.10-next.1 + - @backstage/plugin-kubernetes-react@0.5.16-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/core-components@0.18.7-next.1 + +## @backstage/plugin-kubernetes-backend@0.21.1-next.1 + +### Patch Changes + +- ce3639c: Add PersistentVolume and PersistentVolumeClaims Rendering +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.9.10-next.1 + - @backstage/plugin-kubernetes-node@0.4.1-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-kubernetes-cluster@0.0.34-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/plugin-kubernetes-common@0.9.10-next.1 + - @backstage/plugin-kubernetes-react@0.5.16-next.1 + - @backstage/core-components@0.18.7-next.1 + +## @backstage/plugin-kubernetes-common@0.9.10-next.1 + +### Patch Changes + +- ce3639c: Add PersistentVolume and PersistentVolumeClaims Rendering + +## @backstage/plugin-kubernetes-node@0.4.1-next.1 + +### Patch Changes + +- ce3639c: Add PersistentVolume and PersistentVolumeClaims Rendering +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.9.10-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-kubernetes-react@0.5.16-next.1 + +### Patch Changes + +- ce3639c: Add PersistentVolume and PersistentVolumeClaims Rendering +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.9.10-next.1 + - @backstage/core-components@0.18.7-next.1 + +## @backstage/plugin-mui-to-bui@0.2.4-next.1 + +### Patch Changes + +- a88c437: Updated MUI to BUI theme converter to align with latest token changes + + **Changes:** + + - Removed generation of deprecated tokens: `--bui-fg-link`, `--bui-fg-link-hover`, `--bui-fg-tint`, `--bui-fg-tint-disabled`, `--bui-bg-tint` and all its variants + - Added generation of new `info` status tokens: `--bui-fg-info`, `--bui-fg-info-on-bg`, `--bui-bg-info`, `--bui-border-info` + - Updated status color mapping to generate both standalone and `-on-bg` variants for danger, warning, success, and info + - Status colors now use `.main` for standalone variants and `.dark` for `-on-bg` variants, providing better visual hierarchy + + The converter now generates tokens that match the updated BUI design system structure, with clear distinction between status colors for standalone use vs. use on colored backgrounds. + +- Updated dependencies + - @backstage/ui@0.12.0-next.1 + - @backstage/theme@0.7.2-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.1 + +## @backstage/plugin-notifications@0.5.14-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.7.2-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/core-components@0.18.7-next.1 + +## @backstage/plugin-notifications-backend@0.6.2-next.1 + +### Patch Changes + +- 5e3ef57: Added `peerModules` metadata declaring recommended modules for cross-plugin integrations. +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-org@0.6.49-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/core-components@0.18.7-next.1 + +## @backstage/plugin-org-react@0.1.47-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/core-components@0.18.7-next.1 + +## @backstage/plugin-scaffolder@1.35.3-next.1 + +### Patch Changes + +- 4e581a6: Updated the browser tab title on the template wizard page to display the specific template title instead of the generic "Create a new component" text. +- Updated dependencies + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/integration@1.20.0-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/plugin-scaffolder-react@1.19.7-next.1 + - @backstage/core-components@0.18.7-next.1 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/integration-react@1.2.15-next.1 + - @backstage/plugin-scaffolder-common@1.7.6-next.1 + +## @backstage/plugin-scaffolder-backend@3.1.3-next.1 + +### Patch Changes + +- 5e3ef57: Added `peerModules` metadata declaring recommended modules for cross-plugin integrations. +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/plugin-scaffolder-backend-module-gitlab@0.11.3-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/backend-defaults@0.15.2-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.3.7-next.1 + - @backstage/plugin-scaffolder-backend-module-azure@0.2.18-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.19-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.3-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.18-next.1 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.18-next.1 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.18-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.9.6-next.1 + - @backstage/plugin-scaffolder-common@1.7.6-next.1 + - @backstage/plugin-scaffolder-node@0.12.5-next.1 + +## @backstage/plugin-scaffolder-backend-module-azure@0.2.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-scaffolder-node@0.12.5-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.3-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.18-next.1 + - @backstage/plugin-scaffolder-node@0.12.5-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-bitbucket-cloud-common@0.3.7-next.1 + - @backstage/plugin-scaffolder-node@0.12.5-next.1 + +## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-scaffolder-node@0.12.5-next.1 + +## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-scaffolder-node@0.12.5-next.1 + +## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/backend-defaults@0.15.2-next.1 + - @backstage/plugin-scaffolder-node@0.12.5-next.1 + +## @backstage/plugin-scaffolder-backend-module-gcp@0.2.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-scaffolder-node@0.12.5-next.1 + +## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-scaffolder-node@0.12.5-next.1 + +## @backstage/plugin-scaffolder-backend-module-gitea@0.2.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-scaffolder-node@0.12.5-next.1 + +## @backstage/plugin-scaffolder-backend-module-github@0.9.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-scaffolder-node@0.12.5-next.1 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.11.3-next.1 + +### Patch Changes + +- 32c51c0: Added new `gitlab:user:info` scaffolder action that retrieves information about a GitLab user. The action can fetch either the current authenticated user or a specific user by ID. +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-scaffolder-node@0.12.5-next.1 + +## @backstage/plugin-scaffolder-backend-module-rails@0.5.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-scaffolder-node@0.12.5-next.1 + +## @backstage/plugin-scaffolder-common@1.7.6-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + +## @backstage/plugin-scaffolder-node@0.12.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-scaffolder-common@1.7.6-next.1 + +## @backstage/plugin-scaffolder-react@1.19.7-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 + - @backstage/plugin-scaffolder-common@1.7.6-next.1 + +## @backstage/plugin-search-backend-module-pg@0.5.52-next.1 + +### Patch Changes + +- 2ee354a: Return `numberOfResults` count with search query responses +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-search-react@1.10.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.7.2-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/core-components@0.18.7-next.1 + +## @backstage/plugin-signals@0.0.28-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.7.2-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/core-components@0.18.7-next.1 + +## @backstage/plugin-techdocs@1.16.3-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/theme@0.7.2-next.0 + - @backstage/integration@1.20.0-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/plugin-search-react@1.10.3-next.1 + - @backstage/core-components@0.18.7-next.1 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/integration-react@1.2.15-next.1 + +## @backstage/plugin-techdocs-addons-test-utils@2.0.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/plugin-catalog@1.33.0-next.1 + - @backstage/plugin-search-react@1.10.3-next.1 + - @backstage/plugin-techdocs@1.16.3-next.1 + - @backstage/test-utils@1.7.15-next.1 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/integration-react@1.2.15-next.1 + +## @backstage/plugin-techdocs-backend@2.1.5-next.1 + +### Patch Changes + +- 5e3ef57: Added `peerModules` metadata declaring recommended modules for cross-plugin integrations. +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/plugin-techdocs-node@1.14.2-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/backend-defaults@0.15.2-next.1 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.33-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/core-components@0.18.7-next.1 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/integration-react@1.2.15-next.1 + +## @backstage/plugin-techdocs-node@1.14.2-next.1 + +### Patch Changes + +- 3c455d4: Some security fixes +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-user-settings@0.8.32-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 + +## example-app@0.2.118-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-app-api@0.15.0-next.1 + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/plugin-scaffolder@1.35.3-next.1 + - @backstage/plugin-catalog-graph@0.5.7-next.1 + - @backstage/plugin-catalog@1.33.0-next.1 + - @backstage/ui@0.12.0-next.1 + - @backstage/theme@0.7.2-next.0 + - @backstage/cli@0.35.4-next.1 + - @backstage/plugin-mui-to-bui@0.2.4-next.1 + - @backstage/plugin-search@1.6.0-next.1 + - @backstage/plugin-search-react@1.10.3-next.1 + - @backstage/plugin-api-docs@0.13.4-next.1 + - @backstage/plugin-catalog-import@0.13.10-next.1 + - @backstage/plugin-home@0.9.2-next.1 + - @backstage/plugin-kubernetes@0.12.16-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.34-next.1 + - @backstage/plugin-org@0.6.49-next.1 + - @backstage/plugin-scaffolder-react@1.19.7-next.1 + - @backstage/plugin-techdocs@1.16.3-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.33-next.1 + - @backstage/plugin-user-settings@0.8.32-next.1 + - @backstage/app-defaults@1.7.5-next.1 + - @backstage/core-components@0.18.7-next.1 + - @backstage/plugin-notifications@0.5.14-next.1 + - @backstage/plugin-signals@0.0.28-next.1 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/integration-react@1.2.15-next.1 + +## example-app-next@0.0.32-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-defaults@0.4.0-next.1 + - @backstage/frontend-app-api@0.15.0-next.1 + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/plugin-scaffolder@1.35.3-next.1 + - @backstage/plugin-catalog-graph@0.5.7-next.1 + - @backstage/plugin-catalog@1.33.0-next.1 + - @backstage/ui@0.12.0-next.1 + - @backstage/theme@0.7.2-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/cli@0.35.4-next.1 + - @backstage/plugin-search@1.6.0-next.1 + - @backstage/plugin-app@0.4.0-next.1 + - @backstage/plugin-app-visualizer@0.1.28-next.0 + - @backstage/plugin-auth@0.1.5-next.1 + - @backstage/core-compat-api@0.5.8-next.1 + - @backstage/plugin-search-react@1.10.3-next.1 + - @backstage/plugin-api-docs@0.13.4-next.1 + - @backstage/plugin-catalog-import@0.13.10-next.1 + - @backstage/plugin-home@0.9.2-next.1 + - @backstage/plugin-kubernetes@0.12.16-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.34-next.1 + - @backstage/plugin-org@0.6.49-next.1 + - @backstage/plugin-scaffolder-react@1.19.7-next.1 + - @backstage/plugin-techdocs@1.16.3-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.33-next.1 + - @backstage/plugin-user-settings@0.8.32-next.1 + - @backstage/app-defaults@1.7.5-next.1 + - @backstage/core-components@0.18.7-next.1 + - @backstage/plugin-notifications@0.5.14-next.1 + - @backstage/plugin-signals@0.0.28-next.1 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/integration-react@1.2.15-next.1 + +## example-backend@0.0.47-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-backend-module-elasticsearch@1.8.0-next.1 + - @backstage/plugin-kubernetes-backend@0.21.1-next.1 + - @backstage/plugin-scaffolder-backend@3.1.3-next.1 + - @backstage/plugin-notifications-backend@0.6.2-next.1 + - @backstage/plugin-catalog-backend@3.4.0-next.1 + - @backstage/plugin-techdocs-backend@2.1.5-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/backend-defaults@0.15.2-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.2.19-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.9.6-next.1 + +## techdocs-cli-embedded-app@0.2.117-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.33.0-next.1 + - @backstage/ui@0.12.0-next.1 + - @backstage/theme@0.7.2-next.0 + - @backstage/cli@0.35.4-next.1 + - @backstage/plugin-techdocs@1.16.3-next.1 + - @backstage/app-defaults@1.7.5-next.1 + - @backstage/core-components@0.18.7-next.1 + - @backstage/test-utils@1.7.15-next.1 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/integration-react@1.2.15-next.1 diff --git a/docs/releases/v1.48.0-next.2-changelog.md b/docs/releases/v1.48.0-next.2-changelog.md new file mode 100644 index 0000000000..5d041b559c --- /dev/null +++ b/docs/releases/v1.48.0-next.2-changelog.md @@ -0,0 +1,1438 @@ +# Release v1.48.0-next.2 + +Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.48.0-next.2](https://backstage.github.io/upgrade-helper/?to=1.48.0-next.2) + +## @backstage/backend-test-utils@1.11.0-next.1 + +### Minor Changes + +- 42abfb1: Added `createServiceMock`, a public utility for creating `ServiceMock` instances for custom service refs. This allows plugin authors to define mock creators for their own services following the same pattern as the built-in `mockServices` mocks. + +### Patch Changes + +- 68eb322: Added `@types/jest` as an optional peer dependency, since jest types are exposed in the public API surface. +- Updated dependencies + - @backstage/backend-app-api@1.5.0-next.1 + - @backstage/backend-defaults@0.15.2-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-auth-node@0.6.13-next.1 + - @backstage/plugin-events-node@0.4.19-next.0 + +## @backstage/filter-predicates@0.1.0-next.0 + +### Minor Changes + +- 7feb83b: Introduced package, basically as the extracted predicate types from `@backstage/plugin-catalog-react/alpha` + +## @backstage/frontend-test-utils@0.5.0-next.2 + +### Minor Changes + +- 09a6aad: **BREAKING**: Removed the `TestApiRegistry` class, use `TestApiProvider` directly instead, storing reused APIs in a variable, e.g. `const apis = [...] as const`. +- d2ac2ec: Added `MockAlertApi` and `MockFeatureFlagsApi` implementations to the `mockApis` namespace. The mock implementations include useful testing methods like `clearAlerts()`, `waitForAlert()`, `getState()`, `setState()`, and `clearState()` for better test ergonomics. +- 09a6aad: **BREAKING**: The `mockApis` namespace is no longer a re-export from `@backstage/test-utils`. It's now a standalone namespace with mock implementations of most core APIs. Mock API instances can be passed directly to `TestApiProvider`, `renderInTestApp`, and `renderTestApp` without needing `[apiRef, impl]` tuples. As part of this change, the `.factory()` method on some mocks has been removed, since it's now redundant. + + ```tsx + // Before + import { mockApis } from '@backstage/frontend-test-utils'; + + renderInTestApp(, { + apis: [[identityApiRef, mockApis.identity()]], + }); + + // After - mock APIs can be passed directly + renderInTestApp(, { + apis: [mockApis.identity()], + }); + ``` + + This change also adds `createApiMock`, a public utility for creating mock API factories, intended for plugin authors to create their own `.mock()` variants. + +### Patch Changes + +- 15ed3f9: Added `snapshot()` method to `ExtensionTester`, which returns a tree-shaped representation of the resolved extension hierarchy. Convenient to use with `toMatchInlineSnapshot()`. + +- 013ec22: Added `mountedRoutes` option to `renderTestApp` for binding route refs to paths, matching the existing option in `renderInTestApp`: + + ```typescript + renderTestApp({ + extensions: [...], + mountedRoutes: { + '/my-path': myRouteRef, + }, + }); + ``` + +- 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/core-app-api@1.19.5-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/frontend-app-api@0.15.0-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-permission-react@0.4.40-next.1 + - @backstage/version-bridge@1.0.12-next.0 + - @backstage/test-utils@1.7.15-next.2 + - @backstage/plugin-app@0.4.0-next.2 + - @backstage/plugin-app-react@0.1.1-next.0 + +## @backstage/ui@0.12.0-next.2 + +### Minor Changes + +- b63c25b: **BREAKING**: Removed gray scale tokens and renamed background surface tokens to neutral tokens + + The `--bui-gray-1` through `--bui-gray-8` tokens have been removed. The `--bui-bg-surface-*` and `--bui-bg-neutral-on-surface-*` tokens have been replaced by a unified `--bui-bg-neutral-*` scale. + + **Migration:** + + Replace surface tokens directly: + + ```diff + - background: var(--bui-bg-surface-0); + + background: var(--bui-bg-app); + ``` + + Replace on-surface tokens shifted by +1: + + ```diff + - background: var(--bui-bg-neutral-on-surface-0); + + background: var(--bui-bg-neutral-1); + ``` + + Replace gray tokens 1-4 with neutral equivalents (`--bui-gray-5` through `--bui-gray-8` have no direct replacement): + + ```diff + - background: var(--bui-gray-1); + + background: var(--bui-bg-neutral-1); + ``` + +### Patch Changes + +- c8ae765: Fixed nested Accordion icon state issue where the inner accordion's arrow icon would incorrectly show as expanded when only the outer accordion was expanded. The CSS selector now uses a direct parent selector to ensure the icon only responds to its own accordion's expanded state. + + Affected components: Accordion + +- 5c76d13: Allow `ref` as a prop on the `Tag` component + + Affected components: Tag + +- 741a98d: Allow data to be passed directly to the `useTable` hook using the property `data` instead of `getData()` for mode `"complete"`. + + This simplifies usage as data changes, rather than having to perform a `useEffect` when data changes, and then reloading the data. It also happens immediately, so stale data won't remain until a rerender (with an internal async state change), so less flickering. + + Affected components: Table + +- a0fe1b2: Fixed changing columns after first render from crashing. It now renders the table with the new column layout as columns change. + + Affected components: Table + +- becf851: export PasswordField component + +- 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. + +- 8c39412: The Table component now wraps the react-aria-components `Table` with a `ResizableTableContainer` only if any column has a width property set. This means that column widths can adapt to the content otherwise (if no width is explicitly set). + + Affected components: Table + +- 20131c5: Migrated to use the standard `backstage-cli package build` for CSS bundling instead of a custom build script. + +- Updated dependencies + - @backstage/version-bridge@1.0.12-next.0 + +## @backstage/plugin-auth-backend@0.27.0-next.1 + +### Minor Changes + +- d0786b9: Added experimental support for refresh tokens via the `auth.experimentalRefreshToken.enabled` configuration option. When enabled, clients can request the `offline_access` scope to receive refresh tokens that can be used to obtain new access tokens without re-authentication. + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-auth-node@0.6.13-next.1 + +## @backstage/plugin-catalog@1.33.0-next.2 + +### Minor Changes + +- 491a06c: Add the ability to show icons for the tabs on the entity page (new frontend) + +### Patch Changes + +- 220d6c3: Add missing translation entries for catalog UI text. + + This change adds translation keys and updates relevant UI components to use the correct localized labels and text in the catalog plugin. It ensures that catalog screens such as entity layout, tabs, search result items, table labels, and other UI elements correctly reference the i18n system for translation. + + No functional behavior is changed aside from the improved internationalization support. + +- 7feb83b: Adjusted to use the new `@backstage/filter-predicates` types for predicate expressions. + +- 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. + +- 75ac651: Migrated `EntityRelationWarning` and `EntityProcessingErrorsPanel` components from Material UI to Backstage UI. + +- Updated dependencies + - @backstage/ui@0.12.0-next.2 + - @backstage/plugin-catalog-react@2.0.0-next.2 + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/integration-react@1.2.15-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/plugin-permission-react@0.4.40-next.1 + - @backstage/version-bridge@1.0.12-next.0 + - @backstage/plugin-techdocs-react@1.3.8-next.1 + - @backstage/plugin-search-react@1.10.3-next.2 + +## @backstage/plugin-catalog-react@2.0.0-next.2 + +### Minor Changes + +- 491a06c: Add the ability to show icons for the tabs on the entity page (new frontend) + +- 7feb83b: **BREAKING ALPHA**: All of the predicate types and functions have been moved to the `@backstage/filter-predicates` package. + + When moving into the more general package, they were renamed as follows: + + - `EntityPredicate` -> `FilterPredicate` + - `EntityPredicateExpression` -> `FilterPredicateExpression` + - `EntityPredicatePrimitive` -> `FilterPredicatePrimitive` + - `entityPredicateToFilterFunction` -> `filterPredicateToFilterFunction` + - `EntityPredicateValue` -> `FilterPredicateValue` + +- ac9bead: Added `createTestEntityPage` test utility for testing entity cards and content extensions in the new frontend system. This utility creates a test page extension that provides `EntityProvider` context and accepts entity extensions through input redirects: + + ```typescript + import { renderTestApp } from '@backstage/frontend-test-utils'; + import { createTestEntityPage } from '@backstage/plugin-catalog-react/testUtils'; + + renderTestApp({ + extensions: [createTestEntityPage({ entity: myEntity }), myEntityCard], + }); + ``` + +### Patch Changes + +- 09a6aad: The `catalogApiMock` test utility now returns a `MockWithApiFactory`, allowing it to be passed directly to test utilities like `renderTestApp` and `TestApiProvider` without needing the `[catalogApiRef, catalogApiMock()]` tuple. +- 88dbd5e: fixed bug in `UserListPicker` by getting the `kindParamater` from the `filters` rather than from the `queryParameters` +- 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/ui@0.12.0-next.2 + - @backstage/frontend-test-utils@0.5.0-next.2 + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/integration-react@1.2.15-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/plugin-permission-react@0.4.40-next.1 + - @backstage/version-bridge@1.0.12-next.0 + - @backstage/filter-predicates@0.1.0-next.0 + +## @backstage/plugin-user-settings@0.9.0-next.2 + +### Minor Changes + +- 104ca74: User-settings will now use DataLoader to batch consecutive calls into one API call to improve performance + +### 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-catalog-react@2.0.0-next.2 + - @backstage/core-app-api@1.19.5-next.1 + - @backstage/plugin-user-settings-common@0.1.0-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-signals-react@0.0.19-next.1 + - @backstage/theme@0.7.2-next.1 + +## @backstage/plugin-user-settings-backend@0.4.0-next.1 + +### Minor Changes + +- 104ca74: User-settings will now use DataLoader to batch consecutive calls into one API call to improve performance + +### Patch Changes + +- 8148621: Moved `@backstage/backend-defaults` from `dependencies` to `devDependencies`. +- Updated dependencies + - @backstage/plugin-user-settings-common@0.1.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-auth-node@0.6.13-next.1 + +## @backstage/plugin-user-settings-common@0.1.0-next.0 + +### Minor Changes + +- 104ca74: User-settings will now use DataLoader to batch consecutive calls into one API call to improve performance + +## @backstage/app-defaults@1.7.5-next.2 + +### 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/core-app-api@1.19.5-next.1 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-permission-react@0.4.40-next.1 + - @backstage/theme@0.7.2-next.1 + +## @backstage/backend-app-api@1.5.0-next.1 + +### Patch Changes + +- 6bb2f21: Fixed memory leak by properly cleaning up process event listeners on backend shutdown. +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/catalog-client@1.12.2-next.0 + +### Patch Changes + +- 9cf6762: Improved the `InMemoryCatalogClient` test utility to support ordering, pagination, full-text search, and field projection for entity query methods. Also fixed `getEntityFacets` to correctly handle multi-valued fields. + +## @backstage/cli@0.35.4-next.2 + +### Patch Changes + +- 20131c5: Added support for CSS exports in package builds. When a package declares a CSS file in its `exports` field (e.g., `"./styles.css": "./src/styles.css"`), the CLI will automatically bundle it during `backstage-cli package build`, resolving any `@import` statements. The export path is rewritten from `src/` to `dist/` at publish time. + + Fixed `backstage-cli repo fix` to not add `typesVersions` entries for non-script exports like CSS files. + +- 6ce4a13: Removed `/alpha` from `scaffolderActionsExtensionPoint` import + +- 73351c2: Updated dependency `webpack` to `~5.104.0`. + +- Updated dependencies + - @backstage/integration@1.20.0-next.2 + - @backstage/cli-node@0.2.18-next.1 + - @backstage/config-loader@1.10.8-next.0 + +## @backstage/core-app-api@1.19.5-next.1 + +### Patch Changes + +- 5a71e7a: Fixed memory leak caused by duplicate `AppThemeSelector` instances and missing cleanup in `AppThemeSelector` and `AppLanguageSelector`. Added `dispose()` method to both selectors for proper resource cleanup. +- 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/core-plugin-api@1.12.3-next.1 + - @backstage/version-bridge@1.0.12-next.0 + +## @backstage/core-compat-api@0.5.8-next.2 + +### 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-catalog-react@2.0.0-next.2 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/version-bridge@1.0.12-next.0 + - @backstage/plugin-app-react@0.1.1-next.0 + +## @backstage/core-components@0.18.7-next.2 + +### 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/core-plugin-api@1.12.3-next.1 + - @backstage/version-bridge@1.0.12-next.0 + - @backstage/theme@0.7.2-next.1 + +## @backstage/core-plugin-api@1.12.3-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/frontend-plugin-api@0.14.0-next.2 + - @backstage/version-bridge@1.0.12-next.0 + +## @backstage/create-app@0.7.9-next.2 + +### Patch Changes + +- Bumped create-app version. + +## @backstage/dev-utils@1.1.20-next.2 + +### 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/ui@0.12.0-next.2 + - @backstage/plugin-catalog-react@2.0.0-next.2 + - @backstage/core-app-api@1.19.5-next.1 + - @backstage/integration-react@1.2.15-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/app-defaults@1.7.5-next.2 + - @backstage/theme@0.7.2-next.1 + +## @backstage/e2e-test-utils@0.1.2-next.1 + +### Patch Changes + +- b96c20e: Added optional `channel` option to `generateProjects()` to allow customizing the Playwright browser channel for testing against different browsers variants. When not provided, the function defaults to 'chrome' to maintain backward compatibility. + + Example usage: + + ```ts + import { generateProjects } from '@backstage/e2e-test-utils'; + + export default defineConfig({ + projects: generateProjects({ channel: 'msedge' }), + }); + ``` + +## @backstage/frontend-app-api@0.15.0-next.2 + +### 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/core-app-api@1.19.5-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/frontend-defaults@0.4.0-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/version-bridge@1.0.12-next.0 + +## @backstage/frontend-defaults@0.4.0-next.2 + +### 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/frontend-plugin-api@0.14.0-next.2 + - @backstage/frontend-app-api@0.15.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/plugin-app@0.4.0-next.2 + +## @backstage/frontend-dynamic-feature-loader@0.1.9-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/frontend-plugin-api@0.14.0-next.2 + +## @backstage/frontend-plugin-api@0.14.0-next.2 + +### 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/version-bridge@1.0.12-next.0 + +## @backstage/integration@1.20.0-next.2 + +### Patch Changes + +- cc6206e: Added support for `{org}.visualstudio.com` domains used by Azure DevOps + +## @backstage/integration-react@1.2.15-next.2 + +### 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/integration@1.20.0-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + +## @backstage/repo-tools@0.16.4-next.2 + +### Patch Changes + +- be7ebad: Updated package-docs exclude list to reflect renamed example app packages. +- df59ee6: The `type-deps` command now follows relative imports and re-exports into declaration chunk files, and detects ambient global types such as the `jest` namespace. +- 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/backend-plugin-api@1.7.0-next.1 + - @backstage/cli-node@0.2.18-next.1 + - @backstage/config-loader@1.10.8-next.0 + +## @techdocs/cli@1.10.5-next.1 + +### Patch Changes + +- 508d127: Updated dependency `find-process` to `^2.0.0`. +- Updated dependencies + - @backstage/backend-defaults@0.15.2-next.1 + - @backstage/plugin-techdocs-node@1.14.2-next.1 + +## @backstage/test-utils@1.7.15-next.2 + +### 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. +- 68eb322: Added `@types/jest` as an optional peer dependency, since jest types are exposed in the public API surface. +- Updated dependencies + - @backstage/core-app-api@1.19.5-next.1 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-permission-react@0.4.40-next.1 + - @backstage/theme@0.7.2-next.1 + +## @backstage/theme@0.7.2-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. + +## @backstage/version-bridge@1.0.12-next.0 + +### 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. + +## @backstage/plugin-api-docs@0.13.4-next.2 + +### Patch Changes + +- ac9bead: Added `@backstage/frontend-test-utils` dev dependency. +- 7feb83b: Adjusted to use the new `@backstage/filter-predicates` types for predicate expressions. +- 491a06c: Add the ability to show icons for the tabs on the entity page (new frontend) +- 4183614: Updated usage of deprecated APIs in the new frontend system. +- 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/plugin-catalog@1.33.0-next.2 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-permission-react@0.4.40-next.1 + +## @backstage/plugin-api-docs-module-protoc-gen-doc@0.1.11-next.0 + +### 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. + +## @backstage/plugin-app@0.4.0-next.2 + +### 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/frontend-plugin-api@0.14.0-next.2 + - @backstage/integration-react@1.2.15-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-permission-react@0.4.40-next.1 + - @backstage/version-bridge@1.0.12-next.0 + - @backstage/theme@0.7.2-next.1 + - @backstage/plugin-app-react@0.1.1-next.0 + +## @backstage/plugin-app-visualizer@0.1.28-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/ui@0.12.0-next.2 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + +## @backstage/plugin-auth@0.1.5-next.2 + +### 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/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/theme@0.7.2-next.1 + +## @backstage/plugin-auth-backend-module-auth0-provider@0.3.0-next.1 + +### Patch Changes + +- 867c905: Add support for organizational invites in auth0 strategy +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-auth-node@0.6.13-next.1 + +## @backstage/plugin-auth-backend-module-aws-alb-provider@0.4.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.27.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-auth-node@0.6.13-next.1 + +## @backstage/plugin-auth-backend-module-oidc-provider@0.4.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.27.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-auth-node@0.6.13-next.1 + +## @backstage/plugin-auth-node@0.6.13-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-auth-react@0.1.24-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/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + +## @backstage/plugin-catalog-backend@3.4.0-next.2 + +### Patch Changes + +- 08a5813: Fixed O(n²) performance bottleneck in `buildEntitySearch` `traverse()` by replacing `Array.some()` linear scan with a `Set` for O(1) duplicate path key detection. +- Updated dependencies + - @backstage/integration@1.20.0-next.2 + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/plugin-permission-node@0.10.10-next.0 + +## @backstage/plugin-catalog-backend-module-aws@0.4.20-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.2 + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-defaults@0.15.2-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-backend-module-azure@0.3.14-next.2 + +### Patch Changes + +- cc6206e: Added support for `{org}.visualstudio.com` domains used by Azure DevOps +- Updated dependencies + - @backstage/integration@1.20.0-next.2 + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.5.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.2 + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-events-node@0.4.19-next.0 + +## @backstage/plugin-catalog-backend-module-bitbucket-server@0.5.8-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.2 + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-events-node@0.4.19-next.0 + +## @backstage/plugin-catalog-backend-module-gcp@0.3.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-backend-module-gerrit@0.3.11-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.2 + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-backend-module-gitea@0.1.9-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.2 + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-backend-module-github@0.12.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.2 + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-events-node@0.4.19-next.0 + +## @backstage/plugin-catalog-backend-module-github-org@0.3.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-catalog-backend-module-github@0.12.2-next.2 + - @backstage/plugin-events-node@0.4.19-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab@0.8.0-next.2 + +### Patch Changes + +- 7e6b5e5: Fixed GitLab search API scope parameter from `'blob'` to `'blobs'`, resolving 400 errors in discovery provider. +- Updated dependencies + - @backstage/integration@1.20.0-next.2 + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-defaults@0.15.2-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-events-node@0.4.19-next.0 + +## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/plugin-catalog-backend-module-gitlab@0.8.0-next.2 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-events-node@0.4.19-next.0 + +## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.7.9-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/plugin-catalog-backend@3.4.0-next.2 + - @backstage/backend-defaults@0.15.2-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-events-node@0.4.19-next.0 + +## @backstage/plugin-catalog-backend-module-ldap@0.12.2-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-backend-module-msgraph@0.9.0-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-backend-module-openapi@0.2.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.2 + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-backend-module-puppetdb@0.2.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-catalog-backend-module-unprocessed@0.6.8-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-auth-node@0.6.13-next.1 + +## @backstage/plugin-catalog-graph@0.5.7-next.2 + +### Patch Changes + +- ac9bead: Added `@backstage/frontend-test-utils` dev dependency. +- 7feb83b: Adjusted to use the new `@backstage/filter-predicates` types for predicate expressions. +- 4183614: Updated usage of deprecated APIs in the new frontend system. +- 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/catalog-client@1.12.2-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + +## @backstage/plugin-catalog-import@0.13.10-next.2 + +### 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/integration@1.20.0-next.2 + - @backstage/plugin-catalog-react@2.0.0-next.2 + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/integration-react@1.2.15-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-permission-react@0.4.40-next.1 + +## @backstage/plugin-catalog-node@2.0.0-next.1 + +### Patch Changes + +- 42abfb1: Updated `catalogServiceMock.mock` to use `createServiceMock` from `@backstage/backend-test-utils`, replacing the internal copy of `simpleMock`. Added `@backstage/backend-test-utils` as an optional peer dependency. +- Updated dependencies + - @backstage/backend-test-utils@1.11.0-next.1 + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-permission-node@0.10.10-next.0 + +## @backstage/plugin-catalog-unprocessed-entities@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 + +## @backstage/plugin-config-schema@0.1.77-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/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + +## @backstage/plugin-devtools@0.1.36-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 + - @backstage/plugin-permission-react@0.4.40-next.1 + +## @backstage/plugin-devtools-backend@0.5.14-next.1 + +### Patch Changes + +- 8148621: Moved `@backstage/backend-defaults` from `dependencies` to `devDependencies`. +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/config-loader@1.10.8-next.0 + - @backstage/plugin-permission-node@0.10.10-next.0 + +## @backstage/plugin-devtools-react@0.1.1-next.1 + +### Patch Changes + +- 9fbb270: Updated dependency `@testing-library/react` to `^16.0.0`. +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + +## @backstage/plugin-home@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 + +## @backstage/plugin-home-react@0.1.35-next.1 + +### 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/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/plugin-kubernetes@0.12.16-next.2 + +### Patch Changes + +- 7feb83b: Adjusted to use the new `@backstage/filter-predicates` types for predicate expressions. +- 491a06c: Add the ability to show icons for the tabs on the entity page (new frontend) +- 4183614: Updated usage of deprecated APIs in the new frontend system. +- 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/plugin-kubernetes-react@0.5.16-next.2 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-permission-react@0.4.40-next.1 + +## @backstage/plugin-kubernetes-backend@0.21.1-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-kubernetes-node@0.4.1-next.1 + - @backstage/plugin-permission-node@0.10.10-next.0 + +## @backstage/plugin-kubernetes-cluster@0.0.34-next.2 + +### 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-catalog-react@2.0.0-next.2 + - @backstage/plugin-kubernetes-react@0.5.16-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-permission-react@0.4.40-next.1 + +## @backstage/plugin-kubernetes-react@0.5.16-next.2 + +### Patch Changes + +- d56542c: Updated dependency `@xterm/addon-attach` to `^0.12.0`. + Updated dependency `@xterm/addon-fit` to `^0.11.0`. +- 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/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + +## @backstage/plugin-mcp-actions-backend@0.1.9-next.1 + +### Patch Changes + +- 8148621: Moved `@backstage/backend-defaults` from `dependencies` to `devDependencies`. +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-mui-to-bui@0.2.4-next.2 + +### 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/ui@0.12.0-next.2 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/theme@0.7.2-next.1 + +## @backstage/plugin-notifications@0.5.14-next.2 + +### 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/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-signals-react@0.0.19-next.1 + - @backstage/theme@0.7.2-next.1 + +## @backstage/plugin-notifications-backend@0.6.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-notifications-node@0.2.23-next.1 + +## @backstage/plugin-notifications-backend-module-email@0.3.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-notifications-node@0.2.23-next.1 + +## @backstage/plugin-notifications-backend-module-slack@0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-notifications-node@0.2.23-next.1 + +## @backstage/plugin-notifications-node@0.2.23-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## @backstage/plugin-org@0.6.49-next.2 + +### Patch Changes + +- ac9bead: Added `@backstage/frontend-test-utils` dev dependency. +- 7feb83b: Adjusted to use the new `@backstage/filter-predicates` types for predicate expressions. +- 4183614: Updated usage of deprecated APIs in the new frontend system. +- 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/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + +## @backstage/plugin-org-react@0.1.47-next.2 + +### 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-catalog-react@2.0.0-next.2 + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + +## @backstage/plugin-permission-react@0.4.40-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/core-plugin-api@1.12.3-next.1 + +## @backstage/plugin-scaffolder@1.35.3-next.2 + +### Patch Changes + +- 7feb83b: Adjusted to use the new `@backstage/filter-predicates` types for predicate expressions. +- b9d90a7: Added `@backstage/frontend-test-utils` as a dev dependency for mock API usage in tests. +- 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/integration@1.20.0-next.2 + - @backstage/plugin-catalog-react@2.0.0-next.2 + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/plugin-scaffolder-react@1.19.7-next.2 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/integration-react@1.2.15-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-permission-react@0.4.40-next.1 + - @backstage/plugin-techdocs-react@1.3.8-next.1 + +## @backstage/plugin-scaffolder-backend@3.1.3-next.2 + +### Patch Changes + +- 8148621: Moved `@backstage/backend-defaults` from `dependencies` to `devDependencies`. +- Updated dependencies + - @backstage/plugin-scaffolder-backend-module-gitlab@0.11.3-next.2 + - @backstage/integration@1.20.0-next.2 + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-auth-node@0.6.13-next.1 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.17-next.1 + - @backstage/plugin-events-node@0.4.19-next.0 + - @backstage/plugin-permission-node@0.10.10-next.0 + - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.19-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.3.3-next.1 + - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.18-next.1 + - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.18-next.1 + - @backstage/plugin-scaffolder-backend-module-gitea@0.2.18-next.1 + - @backstage/plugin-scaffolder-backend-module-github@0.9.6-next.2 + - @backstage/plugin-scaffolder-node@0.12.5-next.1 + +## @backstage/plugin-scaffolder-backend-module-github@0.9.6-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.2 + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-scaffolder-node@0.12.5-next.1 + +## @backstage/plugin-scaffolder-backend-module-gitlab@0.11.3-next.2 + +### Patch Changes + +- 6b5e7d9: Allow setting optional description on group creation +- f0f9403: Changed `gitlab:group:ensureExists` action to use `Groups.show` API instead of `Groups.search` for checking if a group path exists. This is more efficient as it directly retrieves the group by path rather than searching and filtering results. +- Updated dependencies + - @backstage/integration@1.20.0-next.2 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-scaffolder-node@0.12.5-next.1 + +## @backstage/plugin-scaffolder-node-test-utils@0.3.8-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/backend-test-utils@1.11.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-scaffolder-node@0.12.5-next.1 + +## @backstage/plugin-scaffolder-react@1.19.7-next.2 + +### Patch Changes + +- b9d90a7: Added `@backstage/frontend-test-utils` as a dev dependency for mock API usage in tests. +- 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/catalog-client@1.12.2-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-permission-react@0.4.40-next.1 + - @backstage/version-bridge@1.0.12-next.0 + - @backstage/theme@0.7.2-next.1 + +## @backstage/plugin-search@1.6.0-next.2 + +### 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-catalog-react@2.0.0-next.2 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/version-bridge@1.0.12-next.0 + - @backstage/plugin-search-react@1.10.3-next.2 + +## @backstage/plugin-search-backend@2.0.12-next.1 + +### Patch Changes + +- 8148621: Moved `@backstage/backend-defaults` from `dependencies` to `devDependencies`. +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-permission-node@0.10.10-next.0 + - @backstage/plugin-search-backend-node@1.4.1-next.0 + +## @backstage/plugin-search-backend-module-catalog@0.3.12-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-search-backend-node@1.4.1-next.0 + +## @backstage/plugin-search-backend-module-explore@0.3.11-next.1 + +### Patch Changes + +- df27350: Updated dependency `@backstage-community/plugin-explore-common` to `^0.12.0`. +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-search-backend-node@1.4.1-next.0 + +## @backstage/plugin-search-backend-module-techdocs@0.4.11-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-search-backend-node@1.4.1-next.0 + - @backstage/plugin-techdocs-node@1.14.2-next.1 + +## @backstage/plugin-search-react@1.10.3-next.2 + +### 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/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/version-bridge@1.0.12-next.0 + - @backstage/theme@0.7.2-next.1 + +## @backstage/plugin-signals@0.0.28-next.2 + +### 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/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-signals-react@0.0.19-next.1 + - @backstage/theme@0.7.2-next.1 + +## @backstage/plugin-signals-react@0.0.19-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/core-plugin-api@1.12.3-next.1 + +## @backstage/plugin-techdocs@1.16.3-next.2 + +### Patch Changes + +- 7feb83b: Adjusted to use the new `@backstage/filter-predicates` types for predicate expressions. +- 491a06c: Add the ability to show icons for the tabs on the entity page (new frontend) +- 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/integration@1.20.0-next.2 + - @backstage/plugin-catalog-react@2.0.0-next.2 + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/integration-react@1.2.15-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-techdocs-react@1.3.8-next.1 + - @backstage/plugin-search-react@1.10.3-next.2 + - @backstage/plugin-auth-react@0.1.24-next.1 + - @backstage/theme@0.7.2-next.1 + +## @backstage/plugin-techdocs-addons-test-utils@2.0.2-next.2 + +### 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-catalog-react@2.0.0-next.2 + - @backstage/plugin-catalog@1.33.0-next.2 + - @backstage/core-app-api@1.19.5-next.1 + - @backstage/plugin-techdocs@1.16.3-next.2 + - @backstage/integration-react@1.2.15-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-techdocs-react@1.3.8-next.1 + - @backstage/plugin-search-react@1.10.3-next.2 + - @backstage/test-utils@1.7.15-next.2 + +## @backstage/plugin-techdocs-backend@2.1.5-next.2 + +### Patch Changes + +- 8148621: Moved `@backstage/backend-defaults` from `dependencies` to `devDependencies`. +- Updated dependencies + - @backstage/integration@1.20.0-next.2 + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-techdocs-node@1.14.2-next.1 + +## @backstage/plugin-techdocs-module-addons-contrib@1.1.33-next.2 + +### 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/integration@1.20.0-next.2 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/integration-react@1.2.15-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-techdocs-react@1.3.8-next.1 + +## @backstage/plugin-techdocs-react@1.3.8-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/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/version-bridge@1.0.12-next.0 + +## example-app@0.0.32-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.0-next.2 + - @backstage/plugin-api-docs@0.13.4-next.2 + - @backstage/plugin-catalog-graph@0.5.7-next.2 + - @backstage/plugin-org@0.6.49-next.2 + - @backstage/plugin-catalog-react@2.0.0-next.2 + - @backstage/cli@0.35.4-next.2 + - @backstage/plugin-catalog@1.33.0-next.2 + - @backstage/core-app-api@1.19.5-next.1 + - @backstage/plugin-kubernetes@0.12.16-next.2 + - @backstage/plugin-scaffolder@1.35.3-next.2 + - @backstage/plugin-techdocs@1.16.3-next.2 + - @backstage/plugin-scaffolder-react@1.19.7-next.2 + - @backstage/plugin-user-settings@0.9.0-next.2 + - @backstage/plugin-home-react@0.1.35-next.1 + - @backstage/plugin-home@0.9.2-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.33-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.26-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/frontend-defaults@0.4.0-next.2 + - @backstage/integration-react@1.2.15-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.34-next.2 + - @backstage/frontend-app-api@0.15.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/plugin-permission-react@0.4.40-next.1 + - @backstage/plugin-app-visualizer@0.1.28-next.1 + - @backstage/plugin-catalog-import@0.13.10-next.2 + - @backstage/plugin-techdocs-react@1.3.8-next.1 + - @backstage/app-defaults@1.7.5-next.2 + - @backstage/plugin-notifications@0.5.14-next.2 + - @backstage/plugin-search-react@1.10.3-next.2 + - @backstage/plugin-auth-react@0.1.24-next.1 + - @backstage/plugin-devtools@0.1.36-next.1 + - @backstage/plugin-signals@0.0.28-next.2 + - @backstage/theme@0.7.2-next.1 + - @backstage/plugin-search@1.6.0-next.2 + - @backstage/plugin-auth@0.1.5-next.2 + - @backstage/plugin-app@0.4.0-next.2 + - @backstage/plugin-app-react@0.1.1-next.0 + +## example-app-legacy@0.2.118-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.0-next.2 + - @backstage/plugin-api-docs@0.13.4-next.2 + - @backstage/plugin-catalog-graph@0.5.7-next.2 + - @backstage/plugin-org@0.6.49-next.2 + - @backstage/plugin-catalog-react@2.0.0-next.2 + - @backstage/cli@0.35.4-next.2 + - @backstage/plugin-catalog@1.33.0-next.2 + - @backstage/core-app-api@1.19.5-next.1 + - @backstage/plugin-kubernetes@0.12.16-next.2 + - @backstage/plugin-scaffolder@1.35.3-next.2 + - @backstage/plugin-techdocs@1.16.3-next.2 + - @backstage/plugin-scaffolder-react@1.19.7-next.2 + - @backstage/plugin-user-settings@0.9.0-next.2 + - @backstage/plugin-home-react@0.1.35-next.1 + - @backstage/plugin-home@0.9.2-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.33-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.26-next.1 + - @backstage/integration-react@1.2.15-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.34-next.2 + - @backstage/frontend-app-api@0.15.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-permission-react@0.4.40-next.1 + - @backstage/plugin-catalog-import@0.13.10-next.2 + - @backstage/plugin-techdocs-react@1.3.8-next.1 + - @backstage/app-defaults@1.7.5-next.2 + - @backstage/plugin-notifications@0.5.14-next.2 + - @backstage/plugin-search-react@1.10.3-next.2 + - @backstage/plugin-auth-react@0.1.24-next.1 + - @backstage/plugin-mui-to-bui@0.2.4-next.2 + - @backstage/plugin-devtools@0.1.36-next.1 + - @backstage/plugin-signals@0.0.28-next.2 + - @backstage/theme@0.7.2-next.1 + - @backstage/plugin-search@1.6.0-next.2 + +## example-backend@0.0.47-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.27.0-next.1 + - @backstage/plugin-devtools-backend@0.5.14-next.1 + - @backstage/plugin-mcp-actions-backend@0.1.9-next.1 + - @backstage/plugin-scaffolder-backend@3.1.3-next.2 + - @backstage/plugin-search-backend@2.0.12-next.1 + - @backstage/plugin-techdocs-backend@2.1.5-next.2 + - @backstage/plugin-search-backend-module-explore@0.3.11-next.1 + - @backstage/plugin-catalog-backend@3.4.0-next.2 + - @backstage/backend-defaults@0.15.2-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-app-backend@0.5.11-next.0 + - @backstage/plugin-auth-backend-module-github-provider@0.5.0-next.0 + - @backstage/plugin-auth-backend-module-guest-provider@0.2.16-next.0 + - @backstage/plugin-auth-backend-module-openshift-provider@0.1.4-next.0 + - @backstage/plugin-auth-node@0.6.13-next.1 + - @backstage/plugin-catalog-backend-module-openapi@0.2.19-next.2 + - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.17-next.1 + - @backstage/plugin-events-backend@0.5.11-next.0 + - @backstage/plugin-events-backend-module-google-pubsub@0.1.8-next.0 + - @backstage/plugin-kubernetes-backend@0.21.1-next.2 + - @backstage/plugin-notifications-backend@0.6.2-next.2 + - @backstage/plugin-permission-backend@0.7.9-next.0 + - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.16-next.0 + - @backstage/plugin-permission-node@0.10.10-next.0 + - @backstage/plugin-proxy-backend@0.6.10-next.0 + - @backstage/plugin-scaffolder-backend-module-github@0.9.6-next.2 + - @backstage/plugin-search-backend-module-catalog@0.3.12-next.1 + - @backstage/plugin-search-backend-module-elasticsearch@1.8.0-next.1 + - @backstage/plugin-search-backend-module-techdocs@0.4.11-next.1 + - @backstage/plugin-search-backend-node@1.4.1-next.0 + - @backstage/plugin-signals-backend@0.3.12-next.0 + - @backstage/plugin-catalog-backend-module-backstage-openapi@0.5.11-next.1 + - @backstage/plugin-catalog-backend-module-unprocessed@0.6.8-next.1 + +## @internal/frontend@0.0.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/version-bridge@1.0.12-next.0 diff --git a/docs/releases/v1.5.0.md b/docs/releases/v1.5.0.md index 325bee378d..58a9b42b75 100644 --- a/docs/releases/v1.5.0.md +++ b/docs/releases/v1.5.0.md @@ -57,4 +57,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.5.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.6.0.md b/docs/releases/v1.6.0.md index 417491c1e4..96d6fa2eb7 100644 --- a/docs/releases/v1.6.0.md +++ b/docs/releases/v1.6.0.md @@ -57,4 +57,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.6.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.7.0.md b/docs/releases/v1.7.0.md index edd5cbb591..b6d842672f 100644 --- a/docs/releases/v1.7.0.md +++ b/docs/releases/v1.7.0.md @@ -113,5 +113,5 @@ start using this new release. [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.8.0.md b/docs/releases/v1.8.0.md index eb7857dc6c..b2ca7f2e7f 100644 --- a/docs/releases/v1.8.0.md +++ b/docs/releases/v1.8.0.md @@ -75,4 +75,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.8.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/releases/v1.9.0.md b/docs/releases/v1.9.0.md index a677acb643..3d6d57ca48 100644 --- a/docs/releases/v1.9.0.md +++ b/docs/releases/v1.9.0.md @@ -82,4 +82,4 @@ Below you can find a list of links and references to help you learn about and st - [Changelog](https://github.com/backstage/backstage/tree/master/docs/releases/v1.9.0-changelog.md) - Backstage [Demos](https://backstage.io/demos), [Blog](https://backstage.io/blog), [Roadmap](https://backstage.io/docs/overview/roadmap) and [Plugins](https://backstage.io/plugins) -Sign up for our [newsletter](https://mailchi.mp/spotify/backstage-community) if you want to be informed about what is happening in the world of Backstage. +Sign up for our [newsletter](https://spoti.fi/backstagenewsletter) if you want to be informed about what is happening in the world of Backstage. diff --git a/docs/tooling/cli/02-build-system.md b/docs/tooling/cli/02-build-system.md index 6f1b7fd54a..2c7826a149 100644 --- a/docs/tooling/cli/02-build-system.md +++ b/docs/tooling/cli/02-build-system.md @@ -270,6 +270,12 @@ that are exported from the package, leaving a much cleaner type definition file and making sure that the type definitions are in sync with the generated JavaScript. +### Building Module Federation Remotes + +Frontend plugin packages can be built as module federation remotes, which allows them to be loaded dynamically at runtime by a module federation host (typically your main frontend app). To build a package as a module federation remote, use the `--module-federation` option with the `package build` command. + +More details are given in the [Module Federation](../../frontend-system/building-apps/07-module-federation.md#building-module-federation-remotes) documentation. + ## Bundling The goal of the bundling process is to combine multiple packages together into a @@ -417,7 +423,7 @@ The following is an example of a `Dockerfile` that can be used to package the output of building a package with role `'backend'` into an image: ```Dockerfile -FROM node:20-bookworm-slim +FROM node:24-trixie-slim WORKDIR /app COPY yarn.lock package.json packages/backend/dist/skeleton.tar.gz ./ diff --git a/docs/tooling/cli/03-commands.md b/docs/tooling/cli/03-commands.md index ce8f862c98..2a09cb1b11 100644 --- a/docs/tooling/cli/03-commands.md +++ b/docs/tooling/cli/03-commands.md @@ -200,6 +200,7 @@ Options: --skip-build-dependencies Skip the automatic building of local dependencies. Applies to backend packages only. --stats If bundle stats are available, write them to the output directory. Applies to app packages only. --config Config files to load instead of app-config.yaml. Applies to app packages only. (default: []) + --module-federation Build a package as a module federation remote. Applies to frontend plugin packages only. ``` ## package lint @@ -286,7 +287,7 @@ it is possible to pre-select what you want to create using the `--select` flag, and provide options using `--option`, for example: ```bash -backstage-cli new --select plugin --option pluginId=foo +backstage-cli new --select frontend-plugin --option pluginId=foo ``` This command is typically added as script in the root `package.json` to be @@ -432,8 +433,79 @@ Usage: backstage-cli create-github-app Outputs debug information which is useful when opening an issue. Outputs system information, node.js and npm versions, CLI version and type (inside backstage -repo or a created app), all `@backstage/*` package dependency versions. +repo or a created app), all `@backstage/*` package dependency versions, and any +packages that contain a `backstage` field in their `package.json`. + +The command distinguishes between installed packages (from npm) and local +workspace packages, making it easier to understand your Backstage setup. ```text -Usage: backstage-cli info +Usage: backstage-cli info [options] + +Options: + --include Glob patterns for additional packages to include + (e.g., @mycompany/backstage-*) + --format Output format (default: text) + -h, --help display help for command +``` + +### Examples + +Output debug information to the console: + +```bash +yarn backstage-cli info +``` + +Include additional packages matching a glob pattern: + +```bash +yarn backstage-cli info --include "@mycompany/*" +``` + +Output as JSON: + +```bash +yarn backstage-cli info --format json +``` + +Export JSON to a file for further processing: + +```bash +yarn backstage-cli info --format json > backstage-info.json +``` + +Combine options to include custom packages and export to JSON: + +```bash +yarn backstage-cli info --include "@mycompany/backstage-*" --include "@internal/*" --format json > debug-info.json +``` + +Export text output to a file: + +```bash +yarn backstage-cli info --format text > backstage-info.txt +``` + +### JSON Output Format + +When using `--format json`, the output is structured as follows: + +```json +{ + "system": { + "os": "Darwin 23.0.0 - darwin/arm64", + "node": "v18.17.0", + "yarn": "3.6.0", + "cli": { "version": "0.27.0", "local": false }, + "backstage": "1.20.0" + }, + "dependencies": { + "@backstage/core-plugin-api": "1.8.0", + "@backstage/plugin-catalog": "1.15.0" + }, + "local": { + "@mycompany/backstage-plugin-custom": "0.1.0" + } +} ``` diff --git a/docs/tooling/package-metadata.md b/docs/tooling/package-metadata.md index 3911ada413..e817c989e7 100644 --- a/docs/tooling/package-metadata.md +++ b/docs/tooling/package-metadata.md @@ -48,11 +48,11 @@ The main entry point of the package, as defined by [NPM](https://docs.npmjs.com/ The exports of the package, as defined by [Node.js](https://nodejs.org/api/packages.html#exports). This field is used to define the entry points of the package. As with other entry point fields, the exports should point to entry points for local development. They will the be rewritten when packaging the package for distribution. You can read more about this in the [sub-path exports](./cli/02-build-system.md#subpath-exports) section. -### `typeVersions` +### `typesVersions` This field is used to specify versioned type entry points for the package, as defined by [TypeScript](https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html#version-selection-with-typesversions), and is used as the equivalent of the `exports` field. TypeScript does support type declarations in the `exports` field, but that requires that the `moduleResolution` option in `tsconfig.json` is set to `node16` or `bundler`, which the Backstage ecosystem currently does not support. -This field can be generated by the `backstage-cli repo fix` command. First fill out the `exports` field to point to source fields, which will then be used to generate `typeVersions`. +This field can be generated by the `backstage-cli repo fix` command. First fill out the `exports` field to point to source fields, which will then be used to generate `typesVersions`. ### `sideEffects` @@ -168,6 +168,45 @@ The presence of this field is checked by the `backstage-cli package prepack` com } ``` +### `backstage.peerModules` + +For plugin packages, this optional field declares modules that should be installed alongside this plugin for cross-plugin integrations. If the peer module's target plugin is present in the Backstage installation, you should typically have the peer module installed as well. + +For example, if you use `@backstage/plugin-scaffolder-backend`, you should also install `@backstage/plugin-catalog-backend-module-scaffolder-entity-model` to enable catalog support for scaffolder entity templates. The scaffolder plugin declares this relationship through `peerModules`. + +The field uses full package names to allow precise targeting of specific modules. This field can only be used on plugin packages (`backend-plugin` or `frontend-plugin` roles). + +```js title="Example usage of the backstage.peerModules field" +{ + "name": "@backstage/plugin-scaffolder-backend", + "backstage": { + "role": "backend-plugin", + "pluginId": "scaffolder", + "peerModules": [ + "@backstage/plugin-catalog-backend-module-scaffolder-entity-model" + ] + } + ... +} +``` + +A plugin can declare multiple peer modules: + +```js title="Example of multiple peer modules" +{ + "name": "@example/plugin-catalog-backend", + "backstage": { + "role": "backend-plugin", + "pluginId": "catalog", + "peerModules": [ + "@example/plugin-search-backend-module-catalog", + "@example/plugin-explore-backend-module-catalog" + ] + } + ... +} +``` + ### `backstage.moved` This field indicates that a package has been renamed and moved to a new location. This field is recognized by the Backstage CLI, where the version bump command will automatically switch to using the new package instead. The value of this field should be the new package name. diff --git a/docs/tutorials/jest30-migration.md b/docs/tutorials/jest30-migration.md index 8d5f803fb5..ea79b03009 100644 --- a/docs/tutorials/jest30-migration.md +++ b/docs/tutorials/jest30-migration.md @@ -8,8 +8,27 @@ Starting with a recent version of `@backstage/cli`, `jest` is a peer dependency. You can choose to install either Jest 29 or Jest 30. The built-in Jest version before this change was Jest 29, however, we recommend that you switch to Jest 30. Upgrading will solve the `Could not parse CSS stylesheet` errors, allow you to use MSW v2 in web packages, and ensure that you remain compatible with future versions of the Backstage CLI. Support for Jest 29 is temporary, with the purpose of allowing you to upgrade at your own pace, but it will eventually be removed. -- **Jest 29**: Install `jest@^29` and `jest-environment-jsdom@^29`. No migration needed, but you may see `Could not parse CSS stylesheet` warnings/errors when testing components from `@backstage/ui` or other packages using CSS `@layer` declarations. -- **Jest 30**: Install `jest@^30`, `@jest/environment-jsdom-abstract@^30`, and `jsdom@^27`. Fixes the stylesheet parsing warnings/errors, but requires the migration steps below. +- **Jest 29**: + + ```bash + # in your repository root, run: + yarn add --dev jest@^29 @types/jest@^29 jest-environment-jsdom@^29 + ``` + + Pros: No migration needed + + Cons: You may see `Could not parse CSS stylesheet` warnings/errors when testing components from `@backstage/ui` or other packages using CSS `@layer` declarations + +- **Jest 30**: + + ```bash + # in your repository root, run: + yarn add --dev jest@^30 @types/jest@^30 @jest/environment-jsdom-abstract@^30 jsdom@^27 + ``` + + Pros: Fixes the stylesheet parsing warnings/errors + + Cons: Requires migration steps (see below) in your tests ## Migration Guide diff --git a/docs/tutorials/quickstart-app-plugin.md b/docs/tutorials/quickstart-app-plugin.md index e9821f3f70..1f460173cd 100644 --- a/docs/tutorials/quickstart-app-plugin.md +++ b/docs/tutorials/quickstart-app-plugin.md @@ -27,7 +27,7 @@ title: Adding Custom Plugin to Existing Monorepo App > here > > [simple-backstage-app-plugin](https://github.com/johnson-jesse/simple-backstage-app-plugin). -# The Skeleton Plugin +## The Skeleton Plugin 1. Start by using the built-in creator. From the terminal and root of your project run: `yarn new` and select `frontend-plugin`. @@ -45,7 +45,7 @@ title: Adding Custom Plugin to Existing Monorepo App 1. You should see successful verbiage for this endpoint, `Welcome to github-playground!` -# The Shortcut +## The Shortcut Let's add a shortcut. @@ -62,7 +62,7 @@ Simple! The App will reload with your changes automatically. You should now see a GitHub icon displayed in the sidebar. Clicking that will link to our new plugin. And now, the API fun begins. -# The Identity +## The Identity Our first modification will be to extract information from the Identity API. @@ -124,7 +124,7 @@ https://github.com/backstage/backstage/tree/master/contrib 6. Here is the entire file for reference [ExampleComponent.tsx](https://github.com/backstage/backstage/tree/master/contrib/docs/tutorials/quickstart-app-plugin/ExampleComponent.md) -# The Wipe +## The Wipe The last file we will touch is ExampleFetchComponent. Because of the number of changes, let's start by wiping this component clean. @@ -150,7 +150,7 @@ export const ExampleFetchComponent = () => { ###### We will add a lot to this file for the sake of ease. Please don't do this in productional code! -# The Graph Model +## The Graph Model GitHub has a GraphQL API available for interacting. Let's start by adding our basic repository query @@ -202,7 +202,7 @@ type Viewer = { }; ``` -# The Table Model +## The Table Model Using Backstage's own component library, let's define a custom table. This component will get used if we have data to display. @@ -234,7 +234,7 @@ export const DenseTable = ({ viewer }: DenseTableProps) => { }; ``` -# The Fetch +## The Fetch We're ready to flush out our fetch component @@ -299,11 +299,10 @@ return ( that backs this document, [simple-backstage-app-plugin](https://github.com/johnson-jesse/simple-backstage-app-plugin) -# Where to go from here +## Where to go from here > Break apart ExampleFetchComponent into smaller logical parts contained in > their own files. Rename your components to something other than ExampleXxx. > -> You might be really proud of a plugin you develop. Follow this next tutorial -> for an in-depth look at publishing and including that for the entire Backstage -> community. [TODO](#). +> You might be really proud of a plugin you develop. Consider sharing it with +> the Backstage community by contributing to the [community-plugins repository](https://github.com/backstage/community-plugins). diff --git a/docs/tutorials/using-backstage-proxy-within-plugin.md b/docs/tutorials/using-backstage-proxy-within-plugin.md index 237a7207a1..bb416bf731 100644 --- a/docs/tutorials/using-backstage-proxy-within-plugin.md +++ b/docs/tutorials/using-backstage-proxy-within-plugin.md @@ -94,15 +94,15 @@ export const AwesomeUsersTable = () => { This section describes the steps to wrap your API client in a [Utility API](../api/utility-apis.md), which are: -- use [`createApiRef`](../reference/frontend-plugin-api.createapiref.md) to create a - new [`ApiRef`](../reference/frontend-plugin-api.apiref.md) -- register an [`ApiFactory`](../reference/frontend-plugin-api.apifactory.md) with +- use [`createApiRef`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.createApiRef.html) to create a + new [`ApiRef`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiRef.html) +- register an [`ApiFactory`](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.ApiFactory.html) with your plugin using - [`createApiFactory`](../reference/frontend-plugin-api.createapifactory.md). This + [`createApiFactory`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.createApiFactory.html). This will wrap your API implementation, associate your `ApiRef` with your implementation and tell backstage how to instantiate it - finally, you can use your API in your components by calling - [`useApi`](../reference/frontend-plugin-api.useapi.md) + [`useApi`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.useApi.html) ### Defining the API client interface @@ -187,8 +187,8 @@ export class MyAwesomeApiClient implements MyAwesomeApi { ``` > Check out the docs for more information on the -> [DiscoveryApi](../reference/frontend-plugin-api.discoveryapi.md) or the -> [FetchApi](../reference/frontend-plugin-api.fetchapi.md) +> [DiscoveryApi](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.DiscoveryApi.html) or the +> [FetchApi](https://backstage.io/api/stable/types/_backstage_frontend-plugin-api.FetchApi.html) ### Bundling your ApiRef with your plugin @@ -233,7 +233,7 @@ export const myCustomPlugin = createPlugin({ ### Using the API in your components Now you should be able to access your API using the backstage hook -[`useApi`](../reference/frontend-plugin-api.useapi.md) from within your plugin code. +[`useApi`](https://backstage.io/api/stable/functions/_backstage_frontend-plugin-api.useApi.html) from within your plugin code. ```ts title="plugins/my-awesome-plugin/src/components/AwesomeUsersTable.tsx" import { useApi } from '@backstage/core-plugin-api'; diff --git a/microsite/blog/2020-05-22-phase-2-service-catalog.mdx b/microsite/blog/2020-05-22-phase-2-service-catalog.mdx index 9e681b9da3..550485ba60 100644 --- a/microsite/blog/2020-05-22-phase-2-service-catalog.mdx +++ b/microsite/blog/2020-05-22-phase-2-service-catalog.mdx @@ -39,7 +39,7 @@ On top of that, we have found that the service catalog is a great way to organis ![img](assets/20-05-20/tabs.png) -More concretely, having this structure in place will allow plugins such as [CircleCI](https://github.com/backstage/backstage/tree/master/plugins/circleci) to show only the builds for the specific service you are viewing, or a [Spinnaker](https://github.com/backstage/backstage/issues/631) plugin to show running deployments, or an Open API plugin to [show documentation](https://github.com/backstage/backstage/issues/627) for endpoints exposed by the service, or the [Lighthouse](https://github.com/backstage/community-plugins/tree/main/workspaces/lighthouse/plugins/lighthouse) plugin to show audit reports for your website. You get the point. +More concretely, having this structure in place will allow plugins such as [CircleCI](https://github.com/CircleCI-Public/backstage-plugin/tree/main/plugins/circleci) to show only the builds for the specific service you are viewing, or a [Spinnaker](https://github.com/backstage/backstage/issues/631) plugin to show running deployments, or an Open API plugin to [show documentation](https://github.com/backstage/backstage/issues/627) for endpoints exposed by the service, or the [Lighthouse](https://github.com/backstage/community-plugins/tree/main/workspaces/lighthouse/plugins/lighthouse) plugin to show audit reports for your website. You get the point. ## Timeline diff --git a/microsite/blog/2020-06-22-backstage-service-catalog-alpha.mdx b/microsite/blog/2020-06-22-backstage-service-catalog-alpha.mdx index 98f4aa15e1..ee17adfc12 100644 --- a/microsite/blog/2020-06-22-backstage-service-catalog-alpha.mdx +++ b/microsite/blog/2020-06-22-backstage-service-catalog-alpha.mdx @@ -51,4 +51,4 @@ As with most alpha releases, you should expect things to change quite a lot unti If you have feedback or questions, please open a [GitHub issue](https://github.com/backstage/backstage/issues), ping us on [Discord chat](https://discord.gg/backstage-687207715902193673) or send us an email at [backstage-interest@spotify.com](mailto:backstage-interest@spotify.com) 🙏 -To get regular product updates and news about the Backstage community, sign up for the [Backstage newsletter](https://info.backstage.spotify.com/newsletter_subscribe). +To get regular product updates and news about the Backstage community, sign up for the [Backstage newsletter](https://spoti.fi/backstagenewsletter). diff --git a/microsite/blog/2020-08-05-announcing-backstage-software-templates.mdx b/microsite/blog/2020-08-05-announcing-backstage-software-templates.mdx index af606dc8da..5f3313ed5b 100644 --- a/microsite/blog/2020-08-05-announcing-backstage-software-templates.mdx +++ b/microsite/blog/2020-08-05-announcing-backstage-software-templates.mdx @@ -75,4 +75,4 @@ We have learned that one of the keys to getting these standards adopted is to ke If you have feedback or questions, please open a [GitHub issue](https://github.com/backstage/backstage/issues), ping us on [Discord chat](https://discord.gg/backstage-687207715902193673) or send us an email at [backstage-interest@spotify.com](mailto:backstage-interest@spotify.com) 🙏 -To get regular product updates and news about the Backstage community, sign up for the [Backstage newsletter](https://info.backstage.spotify.com/newsletter_subscribe). +To get regular product updates and news about the Backstage community, sign up for the [Backstage newsletter](https://spoti.fi/backstagenewsletter). diff --git a/microsite/blog/2020-09-23-backstage-cncf-sandbox.mdx b/microsite/blog/2020-09-23-backstage-cncf-sandbox.mdx index b11b0ff18b..78be28b55d 100644 --- a/microsite/blog/2020-09-23-backstage-cncf-sandbox.mdx +++ b/microsite/blog/2020-09-23-backstage-cncf-sandbox.mdx @@ -18,4 +18,4 @@ The Backstage community is healthy and growing quickly. Over [130 people](https: We’re excited to embark on this journey with the CNCF community. There’s so much great tech being built here, and it’s about time we share it to build even greater products, together. Entering into the CNCF Sandbox is just the first step. We are committed to working with the community to bring Backstage through the Incubation step, and finally all the way to becoming a Graduated, top-level project. -Thanks to everyone for your support so far. We hope you [join us](https://info.backstage.spotify.com/newsletter_subscribe) in this next chapter of Backstage's journey. If you have questions or feedback, feel free to [email](mailto:backstage-interest@spotify.com) me directly. +Thanks to everyone for your support so far. We hope you [join us](https://spoti.fi/backstagenewsletter) in this next chapter of Backstage's journey. If you have questions or feedback, feel free to [email](mailto:backstage-interest@spotify.com) me directly. diff --git a/microsite/blog/2021-06-22-spotify-backstage-is-growing.mdx b/microsite/blog/2021-06-22-spotify-backstage-is-growing.mdx index 8c6ee78671..092c4b80f6 100644 --- a/microsite/blog/2021-06-22-spotify-backstage-is-growing.mdx +++ b/microsite/blog/2021-06-22-spotify-backstage-is-growing.mdx @@ -49,7 +49,7 @@ We’ve launched a new website at: [backstage.spotify.com](https://backstage.spo You’ll find a high-level introduction to the platform, tips and tricks tested by Spotify to accelerate developer effectiveness, and access to a group of partners that have scaled Backstage for numerous adopters. You can also use the site to book product overviews, demos, and technical deep dives with members of the Spotify team. -We will continue to post important product announcements, technical documentation, feature demos, and community news here on Backstage.io. ([Subscribe to the newsletter](https://info.backstage.spotify.com/newsletter_subscribe) to stay up to date.) And both contributors and adopting companies can continue to find around-the-clock/around-the-world technical support on [GitHub](https://github.com/backstage/backstage) and [Discord](https://discord.gg/backstage-687207715902193673). +We will continue to post important product announcements, technical documentation, feature demos, and community news here on Backstage.io. ([Subscribe to the newsletter](https://spoti.fi/backstagenewsletter) to stay up to date.) And both contributors and adopting companies can continue to find around-the-clock/around-the-world technical support on [GitHub](https://github.com/backstage/backstage) and [Discord](https://discord.gg/backstage-687207715902193673). ## Separate community sessions for adopters and contributors diff --git a/microsite/blog/2021-09-30-50-public-adopters.mdx b/microsite/blog/2021-09-30-50-public-adopters.mdx index e8f6c58160..40905850ec 100644 --- a/microsite/blog/2021-09-30-50-public-adopters.mdx +++ b/microsite/blog/2021-09-30-50-public-adopters.mdx @@ -41,5 +41,5 @@ If you are a Backstage enthusiast, please [join me][news] and the entire Backsta [da]: https://medium.com/dazn-tech/developer-experience-dx-at-dazn-e6de9a0208d2 [ex]: https://backstage.spotify.com/blog/community-session/firehydrant-expedia-loblaw/ [plugins]: https://backstage.io/plugins -[news]: https://info.backstage.spotify.com/newsletter_subscribe +[news]: https://spoti.fi/backstagenewsletter [gh]: https://github.com/backstage/backstage/blob/master/ADOPTERS.md diff --git a/microsite/blog/2023-01-31-incremental-entity-provider.mdx b/microsite/blog/2023-01-31-incremental-entity-provider.mdx index 8138b8a39a..2121c3f950 100644 --- a/microsite/blog/2023-01-31-incremental-entity-provider.mdx +++ b/microsite/blog/2023-01-31-incremental-entity-provider.mdx @@ -16,7 +16,7 @@ Data is transformed into entities via what is known as the ingestion and process ## Entity Providers -Backstage offers what are known as [entity providers](https://backstage.io/docs/features/software-catalog/life-of-an-entity) as a means for ingesting the raw data into the pipeline and transforming them into Backstage entities. For example, Backstage comes with a [GitHub Entity Provider](https://backstage.io/docs/reference/plugin-catalog-backend-module-github) that finds all catalog-info.yaml files in GitHub repositories. The processing loop transforms them into Backstage entities and subsequently persists them to the software catalog. +Backstage offers what are known as [entity providers](https://backstage.io/docs/features/software-catalog/life-of-an-entity) as a means for ingesting the raw data into the pipeline and transforming them into Backstage entities. For example, Backstage comes with a [GitHub Entity Provider](https://backstage.io/api/stable/modules/_backstage_plugin-catalog-backend-module-github.html) that finds all catalog-info.yaml files in GitHub repositories. The processing loop transforms them into Backstage entities and subsequently persists them to the software catalog. Entity providers are a relatively new abstraction and the recommended way to ingest data into the catalog. The Backstage catalog engine starts each registered entity provider, which connects to its data source (e.g., the GitHub Entity Provider connects to GitHub). The entity provider will query the external data source and convert the data into the entity format. Finally, the entity provider issues what is known as a mutation to the catalog engine. A mutation is a signal from the entity provider to the catalog engine that entities are available to be processed and stored. diff --git a/microsite/blog/2024-06-27-backstage-engineer-journey.mdx b/microsite/blog/2024-06-27-backstage-engineer-journey.mdx index 9180a4b6d7..d0aea4ca50 100644 --- a/microsite/blog/2024-06-27-backstage-engineer-journey.mdx +++ b/microsite/blog/2024-06-27-backstage-engineer-journey.mdx @@ -61,7 +61,7 @@ My goal has changed from being a contributor to being the driver, i.e., from doi At Spotify, we expect engineers to use technologies approved by our [Tech Radar](https://backstage.io/blog/2020/05/14/tech-radar-plugin/#what-is-tech-radar) and follow the best quality standards. -To do so, we use a plugin called [Scaffolder](https://backstage.io/docs/reference/plugin-scaffolder) (aka Software Templates), which allows engineers to create templates for setting up new projects. Templates automate actions such as creating repositories, allocating resources, registering in the catalog, configuring deployments, and connecting to other internal systems. +To do so, we use a plugin called [Scaffolder](https://backstage.io/api/stable/modules/_backstage_plugin-scaffolder.html) (aka Software Templates), which allows engineers to create templates for setting up new projects. Templates automate actions such as creating repositories, allocating resources, registering in the catalog, configuring deployments, and connecting to other internal systems. > **Reflection:**
    _“Do you need to create a ticket to get these things done before you even start coding? And is there a lot of time spent looking for boilerplate code to start a new project and connecting it to other internal systems?"_ diff --git a/microsite/blog/2025-08-08-migrating-legacy-services-to-a-modern-developer-portal.mdx b/microsite/blog/2025-08-08-migrating-legacy-services-to-a-modern-developer-portal.mdx index 268fd4933b..788d7b4d37 100644 --- a/microsite/blog/2025-08-08-migrating-legacy-services-to-a-modern-developer-portal.mdx +++ b/microsite/blog/2025-08-08-migrating-legacy-services-to-a-modern-developer-portal.mdx @@ -1,6 +1,6 @@ --- title: 'Migrating legacy services to a modern developer portal: A technical guide to Backstage integration' -author: Damola Obaleke +author: Damola Obaleke, The New York Times authorURL: https://github.com/damolaobaleke authorImageURL: https://avatars.githubusercontent.com/u/45045727?v=4 --- diff --git a/microsite/blog/2025-12-30-backstage-wrapped-2025.mdx b/microsite/blog/2025-12-30-backstage-wrapped-2025.mdx new file mode 100644 index 0000000000..0f8bdd21cf --- /dev/null +++ b/microsite/blog/2025-12-30-backstage-wrapped-2025.mdx @@ -0,0 +1,115 @@ +--- +title: 'Backstage Wrapped 2025: Celebrating a mature framework with modern foundations' +author: Vincenzo Scamporlino, Spotify +authorURL: https://github.com/vinzscam +authorImageURL: https://avatars.githubusercontent.com/u/8433119?v=8 +--- + +![Let's blast into the New Year with a quick look back at all the big hits — backend, frontend, AI, UI, and more! See how today's Backstage is ready to build the future of developer experience.](assets/2025-12-30/wrapped2025.png) + +This year was another big one for Backstage and our worldwide community of adopters, contributors, and partners. Backstage turned five, the New Frontend System became adoption-ready, and your favorite platform for developer experience gained AI superpowers with the introduction of the Actions Registry and MCP server support. Let's blast into the New Year with a quick look back, along with a peek around the corner at what's coming next. + +{/* truncate */} + +--- + +## Busy beavers here, there, and everywhere + +As in years past, we've visualized how our vibrant global community lights up the Backstage open source repo with enthusiasm, creativity, and commits. This year, we're visualizing contributions to the Community Plugins repo, too. Can you spot your name in the videos below? + + + +_All 7.7k commits to `backstage/backstage` in 2025_ + + + +_All 3.3k commits to `backstage/community-plugins` in 2025_ + +Couldn't spot your name in the videos? Here's one more chance — every contributor who helped shape Backstage in 2025, all in one picture. + +![Backstage 2025 contributors](assets/2025-12-30/contributors-wrapped-2025.png) + +## Mature for a five-year-old + +![Backstage community stats: 3.4k+ adopters, 1,8k contributors, 15k Discord members, 7k project forks, 68k total contributions, 250+ open source plugins, 31k stars](assets/2025-12-30/wrapped2025-stats.png) +_The growing Backstage ecosystem, by the numbers_ + +Earlier this year, the Backstage project [celebrated its 5th birthday][bday] on the main stage at [KubeCon + CloudNativeCon in London][kcon-eu]. + +While the framework still isn't old enough to shave, it's matured into the industry standard for internal developer portals (IDPs). According to [this DX survey][dx] released in March: + +> Backstage is dominating the IDP market, holding an impressive 89% market share compared to SaaS competitors and achieving a remarkable 67% overall market penetration. These percentages are even higher for enterprise companies. + +As you can see above in the [latest project stats][video], the Backstage ecosystem continues to expand, growing in adopters and contributors, as well as plugins and third-party service providers. + +Want to dive into more Backstage stats? Check out the project's health scores and more on the relaunched [LFX Insights][lfx] site. + +[bday]: https://www.youtube.com/watch?v=JqG1wey7-Ao&t=563s&list=PL8iP9yIjU0Q3K8LV_a9CcFmhvvNTAUzL1 +[kcon-eu]: https://backstage.io/blog/2025/04/29/backstagecon-kubecon-25-london#big-birthday-energy-on-the-big-stage +[dx]: https://newsletter.getdx.com/p/backstage-and-the-developer-portal-market +[video]: https://www.youtube.com/watch?v=Wih0a1v1Et0&list=PL8iP9yIjU0Q33vpSaBlAvIhgDb-9smXUU +[lfx]: https://insights.linuxfoundation.org/project/backstage + +## Building the future on modern foundations + +Just because Backstage has cemented its place as the standard for IDPs doesn't mean it's sitting still. From backend to frontend, from AI to UI, the technical foundations of the platform have been modernized, updated, and revamped — this is why today's Backstage is ready to build the future of developer experience. + +Top 2025 highlights: + +- Goodbye to the old backend system +- New Frontend System is adoption-ready +- Hello to the Actions Registry + MCP server support +- Introducing a new design system with Backstage UI + +With the [New Backend System][backend] released as a stable 1.0 last year and the [New Frontend System][frontend] becoming [adoption-ready][1-42] this year, Backstage is easier than ever to use, maintain, and build on — making it both more accessible and more capable for adopters, old and new. + +This year also saw the debut of the [Actions Registry][actions] and MCP server support — so now Backstage can empower both your human developers and their AI helpers. + +And [Backstage UI][ui] is coming! The alpha release of the upcoming design system made huge strides in 2025, preparing the way for a new level of usability throughout the Backstage experience. + +Catch up on a whole year's worth of improvements — and see where Backstage is heading next — in the recordings below. + +[backend]: https://backstage.io/docs/backend-system/ +[frontend]: https://backstage.io/docs/frontend-system/ +[1-42]: https://backstage.io/docs/releases/v1.42.0 +[actions]: https://backstage.io/docs/backend-system/core-services/actions-registry +[ui]: https://ui.backstage.io/ + + + +_Watch the Backstage maintainers' talk at [KubeCon in London][lon], where they demoed the New Frontend System and introduced the Actions Registry._ + + +_Watch the maintainers' talk at [KubeCon in Atlanta][atl], where they shared +work towards an AI-Native Backstage, progress on Backstage UI, and more._ + +[lon]: https://backstage.io/blog/2025/04/29/backstagecon-kubecon-25-london +[atl]: https://backstage.io/blog/2025/11/25/backstagecon-kubecon-25-atlanta + +## See you in 2026! + +Happy New Year, Backstage Community! See you in the repos! diff --git a/microsite/blog/assets/2024-06-27/backstage-engineer-journey.svg b/microsite/blog/assets/2024-06-27/backstage-engineer-journey.svg index 1e302206a5..bd5a73c14d 100644 --- a/microsite/blog/assets/2024-06-27/backstage-engineer-journey.svg +++ b/microsite/blog/assets/2024-06-27/backstage-engineer-journey.svg @@ -1,362 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/microsite/blog/assets/2025-12-30/contributors-wrapped-2025.png b/microsite/blog/assets/2025-12-30/contributors-wrapped-2025.png new file mode 100644 index 0000000000..7aa16f106e Binary files /dev/null and b/microsite/blog/assets/2025-12-30/contributors-wrapped-2025.png differ diff --git a/microsite/blog/assets/2025-12-30/wrapped2025-stats.png b/microsite/blog/assets/2025-12-30/wrapped2025-stats.png new file mode 100644 index 0000000000..59d31f142c Binary files /dev/null and b/microsite/blog/assets/2025-12-30/wrapped2025-stats.png differ diff --git a/microsite/blog/assets/2025-12-30/wrapped2025.png b/microsite/blog/assets/2025-12-30/wrapped2025.png new file mode 100644 index 0000000000..b99768dfda Binary files /dev/null and b/microsite/blog/assets/2025-12-30/wrapped2025.png differ diff --git a/microsite/data/plugins/analytics-module-generic.yaml b/microsite/data/plugins/analytics-module-generic.yaml index 260319aca6..6772ee6d2d 100644 --- a/microsite/data/plugins/analytics-module-generic.yaml +++ b/microsite/data/plugins/analytics-module-generic.yaml @@ -5,5 +5,6 @@ authorUrl: https://josie.lol category: Monitoring description: Track usage of your Backstage instance using generic POST endpoints. documentation: https://github.com/pfeifferj/backstage-plugin-analytics-generic/blob/main/README.md +iconUrl: '/img/logo-gradient-on-dark.svg' npmPackageName: '@pfeifferj/backstage-plugin-analytics-generic' addedDate: '2024-08-23' diff --git a/microsite/data/plugins/api-linter.yaml b/microsite/data/plugins/api-linter.yaml index a68da228eb..837efdffc0 100644 --- a/microsite/data/plugins/api-linter.yaml +++ b/microsite/data/plugins/api-linter.yaml @@ -7,3 +7,4 @@ description: API Linter is a quality assurance tool that checks the compliance o documentation: https://github.com/zalando/backstage-plugin-api-linter iconUrl: https://raw.githubusercontent.com/zalando/zally/main/logo.png npmPackageName: backstage-plugin-api-linter +addedDate: '2022-07-22' diff --git a/microsite/data/plugins/apiiro.yaml b/microsite/data/plugins/apiiro.yaml new file mode 100644 index 0000000000..ce3db54565 --- /dev/null +++ b/microsite/data/plugins/apiiro.yaml @@ -0,0 +1,10 @@ +--- +title: Apiiro +author: Apiiro +authorUrl: https://apiiro.com/ +category: Security +description: View your Apiiro Repository Risk Profile in Backstage +documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/apiiro/plugins/apiiro/README.md +iconUrl: https://avatars.githubusercontent.com/u/48519090 +npmPackageName: '@backstage-community/plugin-apiiro' +addedDate: '2026-01-27' diff --git a/microsite/data/plugins/argo-cd.yaml b/microsite/data/plugins/argo-cd.yaml index daac6dabd1..f183ad9ffd 100644 --- a/microsite/data/plugins/argo-cd.yaml +++ b/microsite/data/plugins/argo-cd.yaml @@ -7,7 +7,4 @@ description: View Argo CD status for your projects in Backstage. documentation: https://roadie.io/backstage/plugins/argo-cd/?utm_source=backstage.io&utm_medium=marketplace&utm_campaign=argo-cd iconUrl: https://roadie.io/images/logos/argo.png npmPackageName: '@roadiehq/backstage-plugin-argo-cd' -tags: - - cd - - ci addedDate: '2021-04-20' diff --git a/microsite/data/plugins/aws-app-development.yaml b/microsite/data/plugins/aws-app-development.yaml deleted file mode 100644 index 5df0598c5e..0000000000 --- a/microsite/data/plugins/aws-app-development.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Harmonix on AWS -author: Amazon Web Services -authorUrl: https://aws.amazon.com/ -category: Infrastructure -description: Harmonix allows customers to build and manage AWS Apps & Environments within Backstage -documentation: https://harmonixonaws.io -iconUrl: https://github.com/awslabs/harmonix/blob/main/docs/images/harmonix-white.png?raw=true -npmPackageName: '@aws/plugin-aws-apps-for-backstage' -addedDate: '2023-05-10' diff --git a/microsite/data/plugins/azure-resources.yaml b/microsite/data/plugins/azure-resources.yaml index a6cb389b0a..1c5264e3f7 100644 --- a/microsite/data/plugins/azure-resources.yaml +++ b/microsite/data/plugins/azure-resources.yaml @@ -5,5 +5,6 @@ authorUrl: https://vipps.no category: Infrastructure description: A plugin showing Azure resource groups and security recommendations in relation to an entity in the catalog. documentation: https://github.com/vippsas/backstage-azure-resource-frontend +iconUrl: '/img/logo-gradient-on-dark.svg' npmPackageName: '@vippsno/plugin-azure-resources' addedDate: '2022-09-05' diff --git a/microsite/data/plugins/azure-sites.yaml b/microsite/data/plugins/azure-sites.yaml index 03b61b9614..8d473bdb4f 100644 --- a/microsite/data/plugins/azure-sites.yaml +++ b/microsite/data/plugins/azure-sites.yaml @@ -5,5 +5,6 @@ authorUrl: https://friss.com category: Infrastructure description: Azure Sites (Apps & Functions) support for a given entity. View the current status of the site, quickly jump to site's Overview page, or Log Stream page. documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/azure-sites/plugins/azure-sites +iconUrl: '/img/logo-gradient-on-dark.svg' npmPackageName: '@backstage-community/plugin-azure-sites' addedDate: '2022-10-18' diff --git a/microsite/data/plugins/azure-spring-apps.yml b/microsite/data/plugins/azure-spring-apps.yaml similarity index 100% rename from microsite/data/plugins/azure-spring-apps.yml rename to microsite/data/plugins/azure-spring-apps.yaml diff --git a/microsite/data/plugins/azure-storage.yaml b/microsite/data/plugins/azure-storage.yaml index 6e723c0eeb..e8fbc0fa10 100644 --- a/microsite/data/plugins/azure-storage.yaml +++ b/microsite/data/plugins/azure-storage.yaml @@ -7,8 +7,4 @@ description: Explore Azure Storage Blobs in Backstage. documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/azure-storage-explorer/plugins/azure-storage iconUrl: /img/azure-storage-folder.png npmPackageName: '@backstage-community/plugin-azure-storage-explorer' -tags: - - Azure - - Azure Storage - - Infrastructure addedDate: '2023-12-01' diff --git a/microsite/data/plugins/blackduck.yaml b/microsite/data/plugins/blackduck.yaml index 7a7858fff2..73b319b0ce 100644 --- a/microsite/data/plugins/blackduck.yaml +++ b/microsite/data/plugins/blackduck.yaml @@ -7,6 +7,4 @@ description: BlackDuck scanned vulnerabilities in Backstage. documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/blackduck/plugins/blackduck iconUrl: https://avatars.githubusercontent.com/u/431461?s=200&v=4 npmPackageName: '@backstage-community/plugin-blackduck' -tags: - - security addedDate: '2022-12-03' diff --git a/microsite/data/plugins/blockchain-radar.yaml b/microsite/data/plugins/blockchain-radar.yaml index 0aacd19ab6..e122d376ce 100644 --- a/microsite/data/plugins/blockchain-radar.yaml +++ b/microsite/data/plugins/blockchain-radar.yaml @@ -7,9 +7,4 @@ description: Discover and manage contracts, multisigs and their access control p documentation: https://github.com/aurora-is-near/backstage-plugin-blockchainradar iconUrl: https://raw.githubusercontent.com/aurora-is-near/backstage-plugin-blockchainradar/main/docs/imgs/signs/sign-green.svg npmPackageName: '@aurora-is-near/backstage-plugin-blockchainradar-backend' -tags: - - security - - monitoring - - blockchain - - alerting addedDate: '2023-08-31' diff --git a/microsite/data/plugins/catalog-backend-module-gcp.yaml b/microsite/data/plugins/catalog-backend-module-gcp.yaml index b5df858862..6fde9134a9 100644 --- a/microsite/data/plugins/catalog-backend-module-gcp.yaml +++ b/microsite/data/plugins/catalog-backend-module-gcp.yaml @@ -7,10 +7,4 @@ description: Import your Infrastructure from GCP into Backstage as Resource Enti documentation: https://github.com/backtostage/backstage-plugins/blob/main/plugins/catalog-backend-module-gcp/README.md iconUrl: https://avatars1.githubusercontent.com/u/2810941?s=280&v=4 npmPackageName: '@backtostage/plugin-catalog-backend-module-gcp' -tags: - - cloud - - project - - resources - - gcp - - cloudsql addedDate: '2024-08-01' diff --git a/microsite/data/plugins/catalog-backend-module-puppetdb.yaml b/microsite/data/plugins/catalog-backend-module-puppetdb.yaml index e7a15ecd4a..e68a423633 100644 --- a/microsite/data/plugins/catalog-backend-module-puppetdb.yaml +++ b/microsite/data/plugins/catalog-backend-module-puppetdb.yaml @@ -7,7 +7,4 @@ description: Import nodes from PuppetDB into Backstage as Resource Entities documentation: https://github.com/backstage/backstage/blob/master/plugins/catalog-backend-module-puppetdb/README.md iconUrl: /img/puppet.png npmPackageName: '@backstage/plugin-catalog-backend-module-puppetdb' -tags: - - puppet - - puppetdb addedDate: '2023-02-06' diff --git a/microsite/data/plugins/cicd-statistics.yaml b/microsite/data/plugins/cicd-statistics.yaml index ea745b1129..61d083b19a 100644 --- a/microsite/data/plugins/cicd-statistics.yaml +++ b/microsite/data/plugins/cicd-statistics.yaml @@ -7,7 +7,4 @@ description: Visualize CI/CD pipeline statistics such as build time or success a documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/cicd-statistics/plugins/cicd-statistics iconUrl: /img/cicd-statistics.svg npmPackageName: '@backstage-community/plugin-cicd-statistics' -tags: - - ci - - cd addedDate: '2022-01-13' diff --git a/microsite/data/plugins/circleci.yaml b/microsite/data/plugins/circleci.yaml index 5980f8cf45..ba68fe838d 100644 --- a/microsite/data/plugins/circleci.yaml +++ b/microsite/data/plugins/circleci.yaml @@ -7,7 +7,4 @@ description: Automate your development process with CI hosted in the cloud or on documentation: https://github.com/CircleCI-Public/backstage-plugin/tree/main/plugins/circleci iconUrl: /img/circleci.png npmPackageName: '@circleci/backstage-plugin' -tags: - - ci - - cd addedDate: '2021-04-28' diff --git a/microsite/data/plugins/cloud-build.yaml b/microsite/data/plugins/cloud-build.yaml index b63b29a559..e3e23b429f 100644 --- a/microsite/data/plugins/cloud-build.yaml +++ b/microsite/data/plugins/cloud-build.yaml @@ -7,8 +7,4 @@ description: Build, test, and deploy on Google's serverless CI/CD platform. documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/cloudbuild/plugins/cloudbuild iconUrl: https://avatars2.githubusercontent.com/u/38220399?s=400&v=4 npmPackageName: '@backstage-community/plugin-cloudbuild' -tags: - - ci - - cd - - test addedDate: '2021-01-20' diff --git a/microsite/data/plugins/cloud-carbon-footprint.yaml b/microsite/data/plugins/cloud-carbon-footprint.yaml index 2a213644ad..6a318eb55d 100644 --- a/microsite/data/plugins/cloud-carbon-footprint.yaml +++ b/microsite/data/plugins/cloud-carbon-footprint.yaml @@ -7,10 +7,4 @@ description: View your cloud carbon footprint by estimating energy use (kilowatt documentation: https://github.com/cloud-carbon-footprint/ccf-backstage-plugin/blob/trunk/README.md iconUrl: https://www.cloudcarbonfootprint.org/img/logo.png npmPackageName: '@cloud-carbon-footprint/backstage-plugin-frontend' -tags: - - sustainability - - cloud - - climate - - carbon-emissions - - carbon-footprint addedDate: '2022-05-03' diff --git a/microsite/data/plugins/cloudsmith.yaml b/microsite/data/plugins/cloudsmith.yaml index 4a07318a67..b9d8c0ffbf 100644 --- a/microsite/data/plugins/cloudsmith.yaml +++ b/microsite/data/plugins/cloudsmith.yaml @@ -7,10 +7,4 @@ description: Show Cloudsmith Repository stats, Quota, Audit logs and Security sc documentation: https://github.com/RoadieHQ/roadie-backstage-plugins/tree/main/plugins/frontend/backstage-plugin-cloudsmith iconUrl: https://cloudsmith.com/img/cloudsmith-mini-dark.svg npmPackageName: '@roadiehq/backstage-plugin-cloudsmith' -tags: - - dashboards - - monitoring - - audit logs - - security scanning - - usage addedDate: '2022-11-18' diff --git a/microsite/data/plugins/cortex.yaml b/microsite/data/plugins/cortex.yaml index 77b01ddceb..09c904b6f3 100644 --- a/microsite/data/plugins/cortex.yaml +++ b/microsite/data/plugins/cortex.yaml @@ -7,8 +7,4 @@ description: Grade the quality of your Backstage services using Scorecards. Auto documentation: https://github.com/cortexapps/backstage-plugin iconUrl: /img/cortex.png npmPackageName: '@cortexapps/backstage-plugin' -tags: - - web - - monitoring - - sre addedDate: '2021-06-03' diff --git a/microsite/data/plugins/cost-insights.yaml b/microsite/data/plugins/cost-insights.yaml index 625b3f1c2c..b43f6b1af1 100644 --- a/microsite/data/plugins/cost-insights.yaml +++ b/microsite/data/plugins/cost-insights.yaml @@ -7,6 +7,4 @@ description: Visualize, understand and optimize your team's cloud costs. documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/cost-insights/plugins/cost-insights iconUrl: /img/cost-insights.png npmPackageName: '@backstage-community/plugin-cost-insights' -tags: - - web addedDate: '2021-04-28' diff --git a/microsite/data/plugins/cyclops-modules.yaml b/microsite/data/plugins/cyclops-modules.yaml index f2c083295e..2abc9145ff 100644 --- a/microsite/data/plugins/cyclops-modules.yaml +++ b/microsite/data/plugins/cyclops-modules.yaml @@ -7,8 +7,4 @@ description: Manage Cyclops Modules through Backstage catalog documentation: https://github.com/cyclops-ui/backstage-plugins#readme iconUrl: /img/cyclops.svg npmPackageName: '@cyclopsui/backstage-plugin-cyclops-modules' -tags: - - Kubernetes - - Productivity - - Delivery addedDate: '2024-01-02' diff --git a/microsite/data/plugins/daytona.yaml b/microsite/data/plugins/daytona.yaml index cf3baaaa92..3c009df586 100644 --- a/microsite/data/plugins/daytona.yaml +++ b/microsite/data/plugins/daytona.yaml @@ -7,8 +7,4 @@ description: Open Source Development Environment Manager documentation: https://github.com/daytonaio/backstage-plugins/tree/main/plugins/daytona iconUrl: /img/daytona.svg npmPackageName: '@daytonaio/backstage-plugin-daytona' -tags: - - Development - - Tools - - Productivity addedDate: '2024-11-02' diff --git a/microsite/data/plugins/dbt.yaml b/microsite/data/plugins/dbt.yaml index e287da7752..d3947fd4a0 100644 --- a/microsite/data/plugins/dbt.yaml +++ b/microsite/data/plugins/dbt.yaml @@ -5,8 +5,6 @@ authorUrl: https://github.com/IIBenII category: Discovery description: View dbt models and tests documentation. documentation: https://github.com/IIBenII/backstage-plugin-dbt +iconUrl: '/img/logo-gradient-on-dark.svg' npmPackageName: '@iiben_orgii/backstage-plugin-dbt' -tags: - - dbt - - doc addedDate: '2023-04-27' diff --git a/microsite/data/plugins/dependencytrack.yaml b/microsite/data/plugins/dependencytrack.yaml index abf1014be6..1d32550016 100644 --- a/microsite/data/plugins/dependencytrack.yaml +++ b/microsite/data/plugins/dependencytrack.yaml @@ -7,3 +7,4 @@ description: Plugin for extracting metrics and findings from OWASP's Dependencyt documentation: https://github.com/TRIMM/plugin-dependencytrack/blob/main/README.md iconUrl: https://avatars.githubusercontent.com/u/40258585?s=200&v=4 npmPackageName: '@trimm/plugin-dependencytrack' +addedDate: '2022-09-06' diff --git a/microsite/data/plugins/digital.ai-deploy.yaml b/microsite/data/plugins/digital.ai-deploy.yaml index 62203a99ea..bdff429c3d 100644 --- a/microsite/data/plugins/digital.ai-deploy.yaml +++ b/microsite/data/plugins/digital.ai-deploy.yaml @@ -7,7 +7,4 @@ description: The plugin offers integration with Digital.ai Deploy and backstage documentation: https://docs.digital.ai/deploy/docs/concept/xl-deploy-backstage-overview iconUrl: /img/digital.ai-deploy.svg npmPackageName: '@digital-ai/plugin-dai-deploy' -tags: - - ci - - cd addedDate: '2024-05-06' diff --git a/microsite/data/plugins/digital.ai-release.yaml b/microsite/data/plugins/digital.ai-release.yaml index 4407b26ac7..8b46a2000f 100644 --- a/microsite/data/plugins/digital.ai-release.yaml +++ b/microsite/data/plugins/digital.ai-release.yaml @@ -7,12 +7,4 @@ description: The plugin offers integration with Digital.ai Release and backstage documentation: https://docs.digital.ai/release/docs/concept/release-backstage-overview iconUrl: /img/digital.ai-release.svg npmPackageName: '@digital-ai/plugin-dai-release' -tags: - - ci - - cd - - release - - orchestration - - devops - - pipeline - - automation addedDate: '2024-05-28' diff --git a/microsite/data/plugins/docker-tags.yaml b/microsite/data/plugins/docker-tags.yaml index c6528cae24..88157e1caf 100644 --- a/microsite/data/plugins/docker-tags.yaml +++ b/microsite/data/plugins/docker-tags.yaml @@ -7,4 +7,4 @@ description: 'Creates a list of docker tags based on hub.docker.com' documentation: 'https://github.com/Work-m8/backstage-docker-plugin/blob/main/README.md' iconUrl: 'https://raw.githubusercontent.com/Work-m8/.github/main/profile/wm_logo.png' npmPackageName: '@workm8/backstage-docker-tags' -addedDate: '2023-24-10' +addedDate: '2023-10-24' diff --git a/microsite/data/plugins/dora-scorecard.yaml b/microsite/data/plugins/dora-scorecard.yaml new file mode 100644 index 0000000000..4c5b39bef5 --- /dev/null +++ b/microsite/data/plugins/dora-scorecard.yaml @@ -0,0 +1,9 @@ +--- +title: DORA Metrics Scorecard +author: zc149 +authorUrl: https://github.com/zc149 +category: Monitoring +description: Track and visualize DORA (DevOps Research and Assessment) metrics with automated data collection from GitHub. Displays Deployment Frequency, Lead Time, Change Failure Rate, and MTTR with performance tier classification. +documentation: https://github.com/zc149/backstage-plugin-dora-scorecard +npmPackageName: '@jikwan/backstage-plugin-dora-scorecard' +addedDate: '2025-12-29' diff --git a/microsite/data/plugins/dynatrace-managed.yaml b/microsite/data/plugins/dynatrace-managed.yaml index 94793e254d..11ae546d3d 100644 --- a/microsite/data/plugins/dynatrace-managed.yaml +++ b/microsite/data/plugins/dynatrace-managed.yaml @@ -7,10 +7,4 @@ description: View problem and synthetic information for services in your softwar documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/dynatrace/plugins/dynatrace iconUrl: /img/dynatrace.svg npmPackageName: '@backstage-community/plugin-dynatrace' -tags: - - monitoring - - observability - - alerting - - problem - - synthetic addedDate: '2022-06-23' diff --git a/microsite/data/plugins/dynatrace.yaml b/microsite/data/plugins/dynatrace.yaml index 15331bb08a..995e21b8ff 100644 --- a/microsite/data/plugins/dynatrace.yaml +++ b/microsite/data/plugins/dynatrace.yaml @@ -7,9 +7,4 @@ description: Provide customizable context-rich observability and security insigh documentation: https://github.com/Dynatrace/backstage-plugin iconUrl: /img/dynatrace.svg npmPackageName: '@dynatrace/backstage-plugin-dql' -tags: - - monitoring - - observability - - security - - problem addedDate: '2024-03-22' diff --git a/microsite/data/plugins/gcp-projects.yaml b/microsite/data/plugins/gcp-projects.yaml index 7902724c96..202f5b6e29 100644 --- a/microsite/data/plugins/gcp-projects.yaml +++ b/microsite/data/plugins/gcp-projects.yaml @@ -7,8 +7,4 @@ description: Create, list and manage your Google Cloud Projects. documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/gcp-projects/plugins/gcp-projects iconUrl: https://avatars1.githubusercontent.com/u/2810941?s=280&v=4 npmPackageName: '@backstage-community/plugin-gcp-projects' -tags: - - cloud - - project - - resources addedDate: '2021-01-20' diff --git a/microsite/data/plugins/github-actions.yaml b/microsite/data/plugins/github-actions.yaml index f496e7c15d..58e5d49051 100644 --- a/microsite/data/plugins/github-actions.yaml +++ b/microsite/data/plugins/github-actions.yaml @@ -7,8 +7,4 @@ description: GitHub Actions makes it easy to automate all your software workflow documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/github-actions/plugins/github-actions iconUrl: https://avatars2.githubusercontent.com/u/44036562?s=400&v=4 npmPackageName: '@backstage-community/plugin-github-actions' -tags: - - ci - - cd - - github addedDate: '2021-01-20' diff --git a/microsite/data/plugins/github-codespaces.yaml b/microsite/data/plugins/github-codespaces.yaml index 90f90d778c..243e7e5249 100644 --- a/microsite/data/plugins/github-codespaces.yaml +++ b/microsite/data/plugins/github-codespaces.yaml @@ -7,9 +7,4 @@ description: Integrates GitHub Codespaces for a Backstage component with the Aut documentation: https://github.com/adityasinghal26/backstage-plugins/tree/main/plugins/github-codespaces iconUrl: https://avatars.githubusercontent.com/u/9919?s=200&v=4 npmPackageName: '@adityasinghal26/plugin-github-codespaces' -tags: - - github - - codespaces - - development - - devcontainers addedDate: '2023-12-30' diff --git a/microsite/data/plugins/github-workflows.yaml b/microsite/data/plugins/github-workflows.yaml index f80e6f3f29..4fb5d95c71 100644 --- a/microsite/data/plugins/github-workflows.yaml +++ b/microsite/data/plugins/github-workflows.yaml @@ -7,9 +7,4 @@ description: The Github Workflows plugin provides an alternative for manually tr documentation: https://platform.vee.codes/plugin/github-workflows/ iconUrl: https://veecode-platform.github.io/support/imgs/logo_2.svg npmPackageName: '@veecode-platform/backstage-plugin-github-workflows' -tags: - - ci - - cd - - github - - workflows addedDate: '2023-09-12' diff --git a/microsite/data/plugins/gitlab-pipelines.yaml b/microsite/data/plugins/gitlab-pipelines.yaml index 4b77d67e07..df2ea745bd 100644 --- a/microsite/data/plugins/gitlab-pipelines.yaml +++ b/microsite/data/plugins/gitlab-pipelines.yaml @@ -7,10 +7,4 @@ description: The Gitlab pipelines plugin integrates GitlabCi with its backstage documentation: https://platform.vee.codes/plugin/gitlab-pipelines/ iconUrl: https://veecode-platform.github.io/support/imgs/logo_1.svg npmPackageName: '@veecode-platform/backstage-plugin-gitlab-pipelines' -tags: - - ci - - cd - - gitlabCi - - pipelines - - jobs addedDate: '2023-09-27' diff --git a/microsite/data/plugins/gitlab.yaml b/microsite/data/plugins/gitlab.yaml index ff815956b5..356875cdd0 100644 --- a/microsite/data/plugins/gitlab.yaml +++ b/microsite/data/plugins/gitlab.yaml @@ -7,8 +7,4 @@ description: View GitLab pipelines, merge requests, languages and contributors. documentation: https://github.com/immobiliare/backstage-plugin-gitlab iconUrl: https://about.gitlab.com/images/press/logo/png/gitlab-icon-rgb.png npmPackageName: '@immobiliarelabs/backstage-plugin-gitlab' -tags: - - ci - - cd - - gitlab addedDate: '2021-08-17' diff --git a/microsite/data/plugins/gitops-cluster.yaml b/microsite/data/plugins/gitops-cluster.yaml index 395ab8ec75..acfb79a4e3 100644 --- a/microsite/data/plugins/gitops-cluster.yaml +++ b/microsite/data/plugins/gitops-cluster.yaml @@ -5,10 +5,6 @@ authorUrl: https://www.weave.works/ category: Kubernetes description: Create GitOps-managed Kubernetes clusters. Currently, it supports provisioning EKS clusters on GitHub via GitHub Actions. documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/gitops-profiles/plugins/gitops-profiles +iconUrl: '/img/logo-gradient-on-dark.svg' npmPackageName: '@backstage-community/plugin-gitops-profiles' -tags: - - kubernetes - - gitops - - github - - eks addedDate: '2020-11-03' diff --git a/microsite/data/plugins/gocd.yaml b/microsite/data/plugins/gocd.yaml index 2924ef9b41..34b9931242 100644 --- a/microsite/data/plugins/gocd.yaml +++ b/microsite/data/plugins/gocd.yaml @@ -7,7 +7,4 @@ description: GoCD is an open-source tool which is used in software development t documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/gocd/plugins/gocd iconUrl: https://www.gocd.org/assets/images/go_logo-5b5ca9e1.svg npmPackageName: '@backstage-community/plugin-gocd' -tags: - - ci - - cd addedDate: '2022-01-15' diff --git a/microsite/data/plugins/grafana.yaml b/microsite/data/plugins/grafana.yaml index 0637717466..62e287fb94 100644 --- a/microsite/data/plugins/grafana.yaml +++ b/microsite/data/plugins/grafana.yaml @@ -7,8 +7,4 @@ description: Associate alerts and dashboards to components. documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/grafana/plugins/grafana/docs/index.md iconUrl: https://avatars.githubusercontent.com/u/7195757?s=200&v=4 npmPackageName: '@backstage-community/plugin-grafana' -tags: - - dashboards - - monitoring - - alerting addedDate: '2021-10-11' diff --git a/microsite/data/plugins/graphiql.yaml b/microsite/data/plugins/graphiql.yaml index 4b5aee5161..2eff5588df 100644 --- a/microsite/data/plugins/graphiql.yaml +++ b/microsite/data/plugins/graphiql.yaml @@ -7,7 +7,4 @@ description: Integrates GraphiQL as a tool to browse GraphQL API endpoints insid documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/graphiql/plugins/graphiql iconUrl: https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/GraphQL_Logo.svg/1024px-GraphQL_Logo.svg.png npmPackageName: '@backstage-community/plugin-graphiql' -tags: - - graphql - - graphiql addedDate: '2020-11-03' diff --git a/microsite/data/plugins/graphql-catalog.yaml b/microsite/data/plugins/graphql-catalog.yaml index 9255f475e7..2b428429b8 100644 --- a/microsite/data/plugins/graphql-catalog.yaml +++ b/microsite/data/plugins/graphql-catalog.yaml @@ -7,8 +7,4 @@ description: Adds the GraphQL Endpoint to Backstage Catalog as a plugin. documentation: https://github.com/thefrontside/playhouse/blob/main/plugins/graphql-backend/README.md iconUrl: https://raw.githubusercontent.com/thefrontside/frontside.com/production/legacy/src/img/frontside-logo.png npmPackageName: '@frontside/backstage-plugin-graphql-backend' -tags: - - graphql - - catalog - - graphql-catalog addedDate: '2024-05-01' diff --git a/microsite/data/plugins/graphql-voyager.yaml b/microsite/data/plugins/graphql-voyager.yaml index e9c5a95e45..ec3cbe9113 100644 --- a/microsite/data/plugins/graphql-voyager.yaml +++ b/microsite/data/plugins/graphql-voyager.yaml @@ -7,7 +7,4 @@ description: Integrates the GraphQL Voyager tool inside Backstage as a plugin. documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/graphql-voyager/plugins/graphql-voyager iconUrl: https://res.cloudinary.com/apideck/image/upload/v1612724234/icons/graphql-voyager.png npmPackageName: '@backstage-community/plugin-graphql-voyager' -tags: - - graphql - - graphql-voyager addedDate: '2023-01-27' diff --git a/microsite/data/plugins/gravatar.yaml b/microsite/data/plugins/gravatar.yaml index d31c16a155..e32369fa54 100644 --- a/microsite/data/plugins/gravatar.yaml +++ b/microsite/data/plugins/gravatar.yaml @@ -7,8 +7,4 @@ description: The processor generates a Gravatar URL for each user based on their documentation: https://github.com/RoadieHQ/roadie-backstage-plugins/blob/main/plugins/backend/catalog-backend-module-gravatar/README.md iconUrl: https://gravatar.com/avatar/gravatar npmPackageName: '@roadiehq/catalog-backend-module-gravatar' -tags: - - gravatar - - catalog - - processor addedDate: '2024-08-26' diff --git a/microsite/data/plugins/harbor.yaml b/microsite/data/plugins/harbor.yaml index 5a142b46fa..344c4524c9 100644 --- a/microsite/data/plugins/harbor.yaml +++ b/microsite/data/plugins/harbor.yaml @@ -7,8 +7,4 @@ description: This plugin will show you information about Docker images within th documentation: https://github.com/BESTSELLER/backstage-plugin-harbor/blob/master/README.md iconUrl: https://raw.githubusercontent.com/cncf/artwork/master/projects/harbor/icon/color/harbor-icon-color.svg npmPackageName: '@bestsellerit/backstage-plugin-harbor' -tags: - - goharbor - - harbor - - docker addedDate: '2022-06-23' diff --git a/microsite/data/plugins/harness-ccm.yaml b/microsite/data/plugins/harness-ccm.yaml index e696fdca4b..a7bafb6cc7 100644 --- a/microsite/data/plugins/harness-ccm.yaml +++ b/microsite/data/plugins/harness-ccm.yaml @@ -6,6 +6,4 @@ description: This plugin helps you to manage and optimize cloud costs using Harn documentation: https://github.com/harness/backstage-plugins/tree/main/plugins/harness-ccm iconUrl: https://static.harness.io/ng-static/images/favicon.png npmPackageName: '@harnessio/backstage-plugin-harness-ccm' -tags: - - finops addedDate: '2024-09-27' diff --git a/microsite/data/plugins/harness-chaos.yaml b/microsite/data/plugins/harness-chaos.yaml index e089b3d86b..047b8d246f 100644 --- a/microsite/data/plugins/harness-chaos.yaml +++ b/microsite/data/plugins/harness-chaos.yaml @@ -6,6 +6,4 @@ description: This plugin lets you view the status of Harness Chaos Engineering R documentation: https://github.com/harness/backstage-plugins/tree/main/plugins/harness-chaos iconUrl: https://static.harness.io/ng-static/images/favicon.png npmPackageName: '@harnessio/backstage-plugin-harness-chaos' -tags: - - resiliency addedDate: '2024-06-25' diff --git a/microsite/data/plugins/harness-ci-cd.yaml b/microsite/data/plugins/harness-ci-cd.yaml index 97d2340dfa..e72e91e80f 100644 --- a/microsite/data/plugins/harness-ci-cd.yaml +++ b/microsite/data/plugins/harness-ci-cd.yaml @@ -7,7 +7,4 @@ description: This plugin lets you view Harness pipeline execution details inside documentation: https://github.com/harness/backstage-plugins/tree/main/plugins/harness-ci-cd iconUrl: https://static.harness.io/ng-static/images/favicon.png npmPackageName: '@harnessio/backstage-plugin-ci-cd' -tags: - - ci - - cd addedDate: '2022-12-08' diff --git a/microsite/data/plugins/harness-feature-flags.yaml b/microsite/data/plugins/harness-feature-flags.yaml index ac085d901a..4a38a5e6ae 100644 --- a/microsite/data/plugins/harness-feature-flags.yaml +++ b/microsite/data/plugins/harness-feature-flags.yaml @@ -7,6 +7,4 @@ description: This plugin lets you view Harness Feature Flags created in your pro documentation: https://github.com/harness/backstage-plugins/tree/main/plugins/harness-feature-flags iconUrl: https://static.harness.io/ng-static/images/favicon.png npmPackageName: '@harnessio/backstage-plugin-feature-flags' -tags: - - feature-flags addedDate: '2023-03-01' diff --git a/microsite/data/plugins/harness-iacm.yaml b/microsite/data/plugins/harness-iacm.yaml index b9aa3b8ab4..97c9d19fda 100644 --- a/microsite/data/plugins/harness-iacm.yaml +++ b/microsite/data/plugins/harness-iacm.yaml @@ -7,7 +7,4 @@ description: This plugin provides an overview of all the resources provisioned t documentation: https://github.com/harness/backstage-plugins/tree/main/plugins/harness-iacm#harness-iacm-plugin iconUrl: https://static.harness.io/ng-static/images/favicon.png npmPackageName: '@harnessio/backstage-plugin-harness-iacm' -tags: - - infrastructure-as-code - - resource-management addedDate: '2024-07-03' diff --git a/microsite/data/plugins/harness-srm.yaml b/microsite/data/plugins/harness-srm.yaml index d55c60ea04..9153b56ea5 100644 --- a/microsite/data/plugins/harness-srm.yaml +++ b/microsite/data/plugins/harness-srm.yaml @@ -7,8 +7,4 @@ description: This plugin tracks the defined SLOs and Error Budgets for your Moni documentation: https://github.com/harness/backstage-plugins/tree/main/plugins/harness-srm iconUrl: https://static.harness.io/ng-static/images/favicon.png npmPackageName: '@harnessio/backstage-plugin-harness-srm' -tags: - - service-reliability-management - - slo - - sli addedDate: '2023-11-17' diff --git a/microsite/data/plugins/hoop.yaml b/microsite/data/plugins/hoop.yaml index 9e41502807..0e9b4c8aa3 100644 --- a/microsite/data/plugins/hoop.yaml +++ b/microsite/data/plugins/hoop.yaml @@ -7,8 +7,4 @@ description: hoop.dev is a cloud-native ssh implementation that lets you edit co documentation: https://github.com/hoophq/backstage-plugin iconUrl: https://avatars.githubusercontent.com/u/113131551?s=200&v=4 npmPackageName: '@hoophq/backstage-plugin' -tags: - - cloud-native ssh - - monitoring - - redact addedDate: '2022-12-20' diff --git a/microsite/data/plugins/ibm-apic-backend.yaml b/microsite/data/plugins/ibm-apic-backend.yaml index dcb41a1cef..a048f68f4e 100644 --- a/microsite/data/plugins/ibm-apic-backend.yaml +++ b/microsite/data/plugins/ibm-apic-backend.yaml @@ -7,6 +7,4 @@ description: Bring IBM APIC to Backstage. documentation: https://github.com/croz-ltd/apic-backend-plugin?utm_source=backstage.io&utm_medium=marketplace&utm_campaign=backstage-ibm-apic-backend iconUrl: https://croz.net/app/uploads/2024/05/apple-touch-icon.png npmPackageName: '@croz/plugin-ibm-apic-backend' -tags: - - openapic addedDate: '2024-03-01' diff --git a/microsite/data/plugins/ilert.yaml b/microsite/data/plugins/ilert.yaml index c410084e8c..38cfc69acf 100644 --- a/microsite/data/plugins/ilert.yaml +++ b/microsite/data/plugins/ilert.yaml @@ -7,10 +7,4 @@ description: iLert is a platform for alerting, on-call management and uptime mon documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/ilert/plugins/ilert iconUrl: https://avatars.githubusercontent.com/u/13230510?s=200&v=4 npmPackageName: '@backstage-community/plugin-ilert' -tags: - - monitoring - - errors - - alerting - - uptime - - on-call addedDate: '2021-04-20' diff --git a/microsite/data/plugins/infracost.yaml b/microsite/data/plugins/infracost.yaml index b6ead655d5..80d9c9f545 100644 --- a/microsite/data/plugins/infracost.yaml +++ b/microsite/data/plugins/infracost.yaml @@ -7,9 +7,4 @@ description: The Infracost plug-in works in conjunction with terraform and provi documentation: https://platform.vee.codes/plugin/Infracost iconUrl: https://veecode-platform.github.io/support/imgs/logo_5.svg npmPackageName: '@veecode-platform/backstage-plugin-infracost' -tags: - - finops - - infracost - - estimate - - terraform addedDate: '2024-07-25' diff --git a/microsite/data/plugins/infrawallet.yaml b/microsite/data/plugins/infrawallet.yaml index bb6c3de7cf..ee553e4283 100644 --- a/microsite/data/plugins/infrawallet.yaml +++ b/microsite/data/plugins/infrawallet.yaml @@ -7,8 +7,4 @@ description: Control your cloud costs just in the way how you control your bank documentation: https://github.com/electrolux-oss/infrawallet/blob/main/README.md iconUrl: /img/infrawallet-logo.png npmPackageName: '@electrolux-oss/plugin-infrawallet' -tags: - - finops - - cost - - infrastructure addedDate: '2024-06-03' diff --git a/microsite/data/plugins/jaegertracing.yaml b/microsite/data/plugins/jaegertracing.yaml index dc93193ddb..ae423995e8 100644 --- a/microsite/data/plugins/jaegertracing.yaml +++ b/microsite/data/plugins/jaegertracing.yaml @@ -7,8 +7,4 @@ description: View Jaeger traces and trace details in Backstage components. documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/jaeger/plugins/jaeger/README.md iconUrl: https://avatars.githubusercontent.com/u/28545596?s=200&v=4 npmPackageName: '@backstage-community/plugin-jaeger' -tags: - - monitoring - - tracing - - observability addedDate: '2024-12-21' diff --git a/microsite/data/plugins/jenkins-actions.yaml b/microsite/data/plugins/jenkins-actions.yaml index 4fccdcf0b6..97546a3e1f 100644 --- a/microsite/data/plugins/jenkins-actions.yaml +++ b/microsite/data/plugins/jenkins-actions.yaml @@ -8,5 +8,3 @@ documentation: https://github.com/backstage/community-plugins/tree/main/workspac iconUrl: /img/jenkins.png npmPackageName: '@backstage-community/plugin-scaffolder-backend-module-jenkins' addedDate: '2024-12-06' -tags: - - Scaffolder diff --git a/microsite/data/plugins/jenkins.yaml b/microsite/data/plugins/jenkins.yaml index e57a7e9e7b..b347f67d26 100644 --- a/microsite/data/plugins/jenkins.yaml +++ b/microsite/data/plugins/jenkins.yaml @@ -7,7 +7,4 @@ description: Jenkins offers a simple way to set up a continuous integration and documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/jenkins/plugins/jenkins iconUrl: https://img.icons8.com/color/1600/jenkins.png npmPackageName: '@backstage-community/plugin-jenkins' -tags: - - ci - - cd addedDate: '2021-01-20' diff --git a/microsite/data/plugins/kafka.yaml b/microsite/data/plugins/kafka.yaml index 7529add2ee..b3adecc623 100644 --- a/microsite/data/plugins/kafka.yaml +++ b/microsite/data/plugins/kafka.yaml @@ -7,6 +7,4 @@ description: Observability for Apache Kafka clusters and async API of components documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/kafka/plugins/kafka iconUrl: https://kafka.apache.org/images/apache-kafka.png npmPackageName: '@backstage-community/plugin-kafka' -tags: - - monitoring addedDate: '2021-01-21' diff --git a/microsite/data/plugins/kong-service-manager.yaml b/microsite/data/plugins/kong-service-manager.yaml index 2b5f444479..078621112f 100644 --- a/microsite/data/plugins/kong-service-manager.yaml +++ b/microsite/data/plugins/kong-service-manager.yaml @@ -7,10 +7,4 @@ description: The Kong Service Manager plugin provides information about the kong documentation: https://platform.vee.codes/plugin/kong-service-manager/ iconUrl: https://veecode-platform.github.io/support/imgs/logo_3.svg npmPackageName: '@veecode-platform/plugin-kong-service-manager' -tags: - - kong - - api-manager - - services - - routes - - plugins addedDate: '2024-05-27' diff --git a/microsite/data/plugins/kubelog.yaml b/microsite/data/plugins/kubelog.yaml index fcadba2978..0cad3e993b 100644 --- a/microsite/data/plugins/kubelog.yaml +++ b/microsite/data/plugins/kubelog.yaml @@ -7,4 +7,4 @@ description: Kubelog provides your Backstage users the ability to view logs of y documentation: https://github.com/jfvilas/kubelog iconUrl: https://raw.githubusercontent.com/jfvilas/kubelog/master/src/assets/kubelog-logo.png npmPackageName: '@jfvilas/plugin-kubelog' -addedDate: 2024-08-25 +addedDate: '2024-08-25' diff --git a/microsite/data/plugins/kubernetes-gpt-analyzer.yaml b/microsite/data/plugins/kubernetes-gpt-analyzer.yaml index e5de961869..fd44a11ad0 100644 --- a/microsite/data/plugins/kubernetes-gpt-analyzer.yaml +++ b/microsite/data/plugins/kubernetes-gpt-analyzer.yaml @@ -7,10 +7,4 @@ description: The Kubernetes GPT Analyzer plug-in uses artificial intelligence wi documentation: https://platform.vee.codes/plugin/kubernetes-gpt-analyzer/ iconUrl: https://veecode-platform.github.io/support/imgs/logo_4.svg npmPackageName: '@veecode-platform/backstage-plugin-kubernetes-gpt-analyzer' -tags: - - monitor - - ai - - kubernetes - - k8soperator - - gpt addedDate: '2024-07-31' diff --git a/microsite/data/plugins/kubevela.yaml b/microsite/data/plugins/kubevela.yaml index 524a046025..7baf6c668b 100644 --- a/microsite/data/plugins/kubevela.yaml +++ b/microsite/data/plugins/kubevela.yaml @@ -7,9 +7,4 @@ description: KubeVela is a modern software delivery platform that makes deployin documentation: https://github.com/kubevela-contrib/backstage-plugin-kubevela iconUrl: https://kubevela.io/img/logo.svg npmPackageName: '@oamdev/plugin-kubevela-backend' -tags: - - cd - - delivery - - multi-cluster - - deployment as code addedDate: '2023-02-12' diff --git a/microsite/data/plugins/launchdarkly.yaml b/microsite/data/plugins/launchdarkly.yaml index 30e4cab685..0a3415d736 100644 --- a/microsite/data/plugins/launchdarkly.yaml +++ b/microsite/data/plugins/launchdarkly.yaml @@ -5,5 +5,6 @@ authorUrl: https://roadie.io category: CI/CD description: View LaunchDarkly feature flags for your entities in Backstage. documentation: https://github.com/RoadieHQ/roadie-backstage-plugins/blob/launchdarkly/plugins/frontend/backstage-plugin-launchdarkly/README.md +iconUrl: '/img/logo-gradient-on-dark.svg' npmPackageName: '@roadiehq/backstage-plugin-launchdarkly' addedDate: '2024-07-27' diff --git a/microsite/data/plugins/ldap-auth.yml b/microsite/data/plugins/ldap-auth.yaml similarity index 94% rename from microsite/data/plugins/ldap-auth.yml rename to microsite/data/plugins/ldap-auth.yaml index 7446f28f6f..e3c917d427 100644 --- a/microsite/data/plugins/ldap-auth.yml +++ b/microsite/data/plugins/ldap-auth.yaml @@ -7,3 +7,4 @@ description: Authenticate users to an external LDAP server documentation: https://github.com/immobiliare/backstage-plugin-ldap-auth/blob/main/README.md iconUrl: https://avatars.githubusercontent.com/u/10090828 npmPackageName: '@immobiliarelabs/backstage-plugin-ldap-auth' +addedDate: '2022-09-05' diff --git a/microsite/data/plugins/lighthouse.yaml b/microsite/data/plugins/lighthouse.yaml index a29e48406a..860efb729d 100644 --- a/microsite/data/plugins/lighthouse.yaml +++ b/microsite/data/plugins/lighthouse.yaml @@ -7,9 +7,4 @@ description: Google's Lighthouse tool is a great resource for benchmarking and i documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/lighthouse/plugins/lighthouse iconUrl: https://seeklogo.com/images/G/google-lighthouse-logo-1C7FA08580-seeklogo.com.png npmPackageName: '@backstage-community/plugin-lighthouse' -tags: - - web - - seo - - accessibility - - performance addedDate: '2021-01-20' diff --git a/microsite/data/plugins/mend.yaml b/microsite/data/plugins/mend.yaml index 8c18c6b71f..f7cf12e374 100644 --- a/microsite/data/plugins/mend.yaml +++ b/microsite/data/plugins/mend.yaml @@ -7,6 +7,4 @@ description: Proactive application risk management for developer and security te documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/mend/plugins/mend iconUrl: https://avatars.githubusercontent.com/u/105765982?s=200&v=4 npmPackageName: '@backstage-community/plugin-mend' -tags: - - security addedDate: '2024-10-15' diff --git a/microsite/data/plugins/mia-platform.yaml b/microsite/data/plugins/mia-platform.yaml index d4a7b692cd..629b2d5ce4 100644 --- a/microsite/data/plugins/mia-platform.yaml +++ b/microsite/data/plugins/mia-platform.yaml @@ -7,7 +7,4 @@ description: Elevate your workflow with our plugin that seamlessly integrates yo documentation: https://github.com/mia-platform/backstage-plugin/blob/main/README.md iconUrl: /img/mia-platform.png npmPackageName: '@mia-platform/backstage-plugin-frontend' -tags: - - platform - - discovery addedDate: '2024-04-12' diff --git a/microsite/data/plugins/microcks.yaml b/microsite/data/plugins/microcks.yaml index 0ac7a0c00a..9effacda74 100644 --- a/microsite/data/plugins/microcks.yaml +++ b/microsite/data/plugins/microcks.yaml @@ -7,6 +7,4 @@ description: Import API definitions (OpenAPI, AsyncAPI, gRPC) from Microcks inst documentation: https://github.com/microcks/microcks-backstage-provider iconUrl: https://raw.githubusercontent.com/microcks/.github/refs/heads/main/assets/microcks-logo-blue.png npmPackageName: '@microcks/microcks-backstage-provider' -tags: - - mock addedDate: '2023-04-06' diff --git a/microsite/data/plugins/microsoft-calendar.yaml b/microsite/data/plugins/microsoft-calendar.yaml index b09493a865..1a0a203420 100644 --- a/microsite/data/plugins/microsoft-calendar.yaml +++ b/microsite/data/plugins/microsoft-calendar.yaml @@ -6,9 +6,6 @@ description: | The plugin integrates with your Microsoft Calendar. It displays all your calendars and events in it. documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/microsoft-calendar/plugins/microsoft-calendar +iconUrl: '/img/logo-gradient-on-dark.svg' npmPackageName: '@backstage-community/plugin-microsoft-calendar' -tags: - - Microsoft - - calendar - - Management addedDate: '2023-03-15' diff --git a/microsite/data/plugins/microsoft-forms.yaml b/microsite/data/plugins/microsoft-forms.yaml index 7b36fe2ad6..91be292ccd 100644 --- a/microsite/data/plugins/microsoft-forms.yaml +++ b/microsite/data/plugins/microsoft-forms.yaml @@ -6,7 +6,4 @@ description: Embed a form into the entity page with ease! documentation: https://github.com/zcmander/backstage-plugin-msforms iconUrl: /img/microsoft-forms.png npmPackageName: '@zcmander/backstage-plugin-msforms' -tags: - - Microsoft - - forms addedDate: '2023-04-11' diff --git a/microsite/data/plugins/new-relic.yaml b/microsite/data/plugins/new-relic.yaml index 57b2db00ec..a2defdd007 100644 --- a/microsite/data/plugins/new-relic.yaml +++ b/microsite/data/plugins/new-relic.yaml @@ -7,9 +7,4 @@ description: Observability platform built to help engineers create and monitor t documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/newrelic/plugins/newrelic iconUrl: https://www.mulesoft.com/sites/default/files/2018-10/New_relic.png npmPackageName: '@backstage-community/plugin-newrelic' -tags: - - performance - - monitoring - - errors - - alerting addedDate: '2020-11-03' diff --git a/microsite/data/plugins/newrelic-dashboard.yaml b/microsite/data/plugins/newrelic-dashboard.yaml index e53285cca7..2b0aeb1261 100644 --- a/microsite/data/plugins/newrelic-dashboard.yaml +++ b/microsite/data/plugins/newrelic-dashboard.yaml @@ -7,10 +7,4 @@ description: Easily view your New Relic Dashboards in Backstage, via real-time s documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/newrelic/plugins/newrelic-dashboard/README.md iconUrl: https://newrelic.com/themes/custom/erno/assets/mediakit/new_relic_logo_vertical_white.svg npmPackageName: '@backstage-community/plugin-newrelic-dashboard' -tags: - - performance - - monitoring - - errors - - alerting - - dashboards addedDate: '2021-12-23' diff --git a/microsite/data/plugins/npm.yaml b/microsite/data/plugins/npm.yaml index 67f3de976f..74b543ccc1 100644 --- a/microsite/data/plugins/npm.yaml +++ b/microsite/data/plugins/npm.yaml @@ -5,5 +5,6 @@ authorUrl: https://github.com/christoph-jerolimov category: Artifacts description: A plugin that shows meta info and latest versions from a npm registry. documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/npm/plugins/npm/README.md +iconUrl: '/img/logo-gradient-on-dark.svg' npmPackageName: '@backstage-community/plugin-npm' addedDate: '2024-11-29' diff --git a/microsite/data/plugins/opsgenie.yaml b/microsite/data/plugins/opsgenie.yaml index 2a7818f7da..8dfe697ff7 100644 --- a/microsite/data/plugins/opsgenie.yaml +++ b/microsite/data/plugins/opsgenie.yaml @@ -7,8 +7,4 @@ description: Opsgenie offers a simple way to associate alerts to components and documentation: https://github.com/K-Phoen/backstage-plugin-opsgenie/ iconUrl: https://avatars.githubusercontent.com/u/1818843?s=200&v=4 npmPackageName: '@k-phoen/backstage-plugin-opsgenie' -tags: - - monitoring - - errors - - alerting addedDate: '2022-03-13' diff --git a/microsite/data/plugins/opslevel-maturity.yaml b/microsite/data/plugins/opslevel-maturity.yaml index 724f46ae17..b9aa00bfb2 100644 --- a/microsite/data/plugins/opslevel-maturity.yaml +++ b/microsite/data/plugins/opslevel-maturity.yaml @@ -7,8 +7,4 @@ description: Integrate with OpsLevel to track performance against your engineeri documentation: https://github.com/OpsLevel/backstage-plugin iconUrl: https://avatars.githubusercontent.com/u/44910550?s=200&v=4 npmPackageName: backstage-plugin-opslevel-maturity -tags: - - service maturity - - service quality - - maturity score addedDate: '2022-12-07' diff --git a/microsite/data/plugins/pager-duty.yaml b/microsite/data/plugins/pager-duty.yaml index 7d603a37c1..448c60f1f7 100644 --- a/microsite/data/plugins/pager-duty.yaml +++ b/microsite/data/plugins/pager-duty.yaml @@ -7,8 +7,4 @@ description: Bring the power of PagerDuty to Backstage, reduce cognitive load, i documentation: https://pagerduty.github.io/backstage-plugin-docs/index.html iconUrl: https://avatars2.githubusercontent.com/u/766800?s=200&v=4 npmPackageName: '@pagerduty/backstage-plugin' -tags: - - monitoring - - errors - - alerting addedDate: '2020-12-22' diff --git a/microsite/data/plugins/parseable-dataset.yaml b/microsite/data/plugins/parseable-dataset.yaml index 4624d3429f..743de4e68b 100644 --- a/microsite/data/plugins/parseable-dataset.yaml +++ b/microsite/data/plugins/parseable-dataset.yaml @@ -6,6 +6,4 @@ description: View and explore telemetry datasets from Parseable directly inside documentation: https://github.com/parseablehq/backstage-plugin/blob/main/parseable-backstage-plugin/plugins/parseable-logstream/README.md iconUrl: https://raw.githubusercontent.com/parseablehq/.github/main/images/logo.svg npmPackageName: '@parseable/backstage-plugin-logstream' -tags: - - monitoring addedDate: '2025-07-14' diff --git a/microsite/data/plugins/prometheus.yaml b/microsite/data/plugins/prometheus.yaml index f7a079d44c..3160f5046f 100644 --- a/microsite/data/plugins/prometheus.yaml +++ b/microsite/data/plugins/prometheus.yaml @@ -7,8 +7,4 @@ description: Prometheus plugin provides visualization of Prometheus metrics and documentation: https://roadie.io/backstage/plugins/prometheus/?utm_source=backstage.io&utm_medium=marketplace&utm_campaign=prometheus iconUrl: https://avatars.githubusercontent.com/u/3380462?s=200&v=4 npmPackageName: '@roadiehq/backstage-plugin-prometheus' -tags: - - monitoring - - graphs - - alerting addedDate: '2021-10-06' diff --git a/microsite/data/plugins/puppetdb.yaml b/microsite/data/plugins/puppetdb.yaml index 26e8bbd3ef..916d42e8ff 100644 --- a/microsite/data/plugins/puppetdb.yaml +++ b/microsite/data/plugins/puppetdb.yaml @@ -7,7 +7,4 @@ description: Visualize resource information and Puppet facts from PuppetDB. documentation: https://github.com/backstage/community-plugins/blob/main/workspaces/puppetdb/plugins/puppetdb/README.md iconUrl: /img/puppet.png npmPackageName: '@backstage-community/plugin-puppetdb' -tags: - - puppet - - puppetdb addedDate: '2023-04-06' diff --git a/microsite/data/plugins/renovate-hoster.yaml b/microsite/data/plugins/renovate-hoster.yaml index 06187581bf..76e655b467 100644 --- a/microsite/data/plugins/renovate-hoster.yaml +++ b/microsite/data/plugins/renovate-hoster.yaml @@ -5,5 +5,6 @@ authorUrl: https://github.com/secustor category: Quality description: This plugin enables you to host Renovate CLI yourself inside of Backstage and extract data from it. documentation: https://github.com/secustor/backstage-plugins/tree/main/plugins/renovate +iconUrl: '/img/logo-gradient-on-dark.svg' npmPackageName: '@secustor/backstage-plugin-renovate' addedDate: '2025-03-31' diff --git a/microsite/data/plugins/s3-viewer.yaml b/microsite/data/plugins/s3-viewer.yaml index 57d5b22ba1..e454819957 100644 --- a/microsite/data/plugins/s3-viewer.yaml +++ b/microsite/data/plugins/s3-viewer.yaml @@ -7,6 +7,4 @@ description: Visualization of S3 buckets and their contents in file explorer sty documentation: https://github.com/spreadshirt/backstage-plugin-s3/ iconUrl: /img/s3-bucket.svg npmPackageName: '@spreadshirt/backstage-plugin-s3-viewer' -tags: - - s3 addedDate: '2023-01-18' diff --git a/microsite/data/plugins/scaffolder-backend-module-webex.yaml b/microsite/data/plugins/scaffolder-backend-module-webex.yaml index f2113b2a8d..b0df907966 100644 --- a/microsite/data/plugins/scaffolder-backend-module-webex.yaml +++ b/microsite/data/plugins/scaffolder-backend-module-webex.yaml @@ -7,5 +7,6 @@ description: >- A Backstage.io plugin that enables sending Webex messages via Incoming Webhooks within scaffolder templates. documentation: https://github.com/Coderrob/backstage-plugin-scaffolder-backend-module-webex +iconUrl: '/img/logo-gradient-on-dark.svg' npmPackageName: '@coderrob/backstage-plugin-scaffolder-backend-module-webex' addedDate: '2024-09-04' diff --git a/microsite/data/plugins/scaffolder-backend-ms-teams.yaml b/microsite/data/plugins/scaffolder-backend-ms-teams.yaml index 6d16b1300b..a8f5cd11a2 100644 --- a/microsite/data/plugins/scaffolder-backend-ms-teams.yaml +++ b/microsite/data/plugins/scaffolder-backend-ms-teams.yaml @@ -5,5 +5,6 @@ authorUrl: https://github.com/grvpandey11 category: Scaffolder description: Interact with Microsoft Teams from Scaffolder templates documentation: https://github.com/grvpandey11/backstage-plugin-scaffolder-backend-module-ms-teams/tree/main#readme +iconUrl: '/img/logo-gradient-on-dark.svg' npmPackageName: '@grvpandey11/backstage-plugin-scaffolder-backend-module-ms-teams' addedDate: '2023-08-11' diff --git a/microsite/data/plugins/search-backend-module-cognitive-search.yaml b/microsite/data/plugins/search-backend-module-cognitive-search.yaml index 128e5d9167..f8f01720ac 100644 --- a/microsite/data/plugins/search-backend-module-cognitive-search.yaml +++ b/microsite/data/plugins/search-backend-module-cognitive-search.yaml @@ -5,5 +5,6 @@ authorUrl: https://www.ap-com.co.jp/en/ category: Search description: Search extension plugin to create backstage search indexes into Azure Cognitive Search. documentation: https://github.com/ap-communications/platt-backstage-plugin/tree/main/plugins/search-backend-module-cognitive-search +iconUrl: '/img/logo-gradient-on-dark.svg' npmPackageName: '@platt/plugin-search-backend-module-cognitive-search' addedDate: '2023-09-13' diff --git a/microsite/data/plugins/sendgrid.yaml b/microsite/data/plugins/sendgrid.yaml index 11706dd9ed..fbe9baac05 100644 --- a/microsite/data/plugins/sendgrid.yaml +++ b/microsite/data/plugins/sendgrid.yaml @@ -5,5 +5,6 @@ authorUrl: https://github.com/CodeVerse-GP category: Scaffolder description: A Backstage scaffolder action to send emails using SendGrid. documentation: https://github.com/CodeVerse-GP/scaffolder-backend-module-sendgrid#readme +iconUrl: '/img/logo-gradient-on-dark.svg' npmPackageName: '@codeverse-gp/scaffolder-backend-module-sendgrid' addedDate: '2025-04-18' diff --git a/microsite/data/plugins/splunk-on-call.yaml b/microsite/data/plugins/splunk-on-call.yaml index 0eb0ad14da..01c114731e 100644 --- a/microsite/data/plugins/splunk-on-call.yaml +++ b/microsite/data/plugins/splunk-on-call.yaml @@ -7,9 +7,4 @@ description: Splunk On-Call offers a simple way to identify incidents and escala documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/splunk/plugins/splunk-on-call iconUrl: /img/splunk-black-white-bg.png npmPackageName: '@backstage-community/plugin-splunk-on-call' -tags: - - monitoring - - errors - - alerting - - splunk addedDate: '2021-11-17' diff --git a/microsite/data/plugins/stackstorm.yaml b/microsite/data/plugins/stackstorm.yaml index d264f530f9..ae65e56d5d 100644 --- a/microsite/data/plugins/stackstorm.yaml +++ b/microsite/data/plugins/stackstorm.yaml @@ -7,8 +7,4 @@ description: Manage StackStorm workflow executions from within Backstage. documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/stackstorm/plugins/stackstorm iconUrl: /img/stackstorm.png npmPackageName: '@backstage-community/plugin-stackstorm' -tags: - - stackstorm - - st2 - - automation - - workflow +addedDate: '2023-02-02' diff --git a/microsite/data/plugins/statusneo-github-plugin.yaml b/microsite/data/plugins/statusneo-github-plugin.yaml index 2497a99c1b..6ecc50b4f1 100644 --- a/microsite/data/plugins/statusneo-github-plugin.yaml +++ b/microsite/data/plugins/statusneo-github-plugin.yaml @@ -6,8 +6,4 @@ description: Provides status cards GitHub pull requests and GitHub actions. documentation: https://github.com/StatusNeo/backstage-plugin-github iconUrl: /img/github-statusneo.png npmPackageName: '@statusneo/backstage-plugin-github' -tags: - - GitHub - - Monitoring - - Productivity addedDate: '2023-02-15' diff --git a/microsite/data/plugins/tech-insights.yaml b/microsite/data/plugins/tech-insights.yaml index 3bd40d576a..f1697467b0 100644 --- a/microsite/data/plugins/tech-insights.yaml +++ b/microsite/data/plugins/tech-insights.yaml @@ -7,9 +7,4 @@ description: Visualize, understand and optimize your team's tech health. documentation: https://roadie.io/backstage/plugins/tech-insights/ iconUrl: https://roadie.io/images/logos/tech-insights.png npmPackageName: '@backstage-community/plugin-tech-insights' -tags: - - tech-insights - - reporting - - tech health - - migrations addedDate: '2022-03-31' diff --git a/microsite/data/plugins/template-designer.yaml b/microsite/data/plugins/template-designer.yaml index 86aa8a97f0..cf1e2ed7aa 100644 --- a/microsite/data/plugins/template-designer.yaml +++ b/microsite/data/plugins/template-designer.yaml @@ -7,4 +7,4 @@ description: Template Designer turns blank Backstage YAML into a storyboard-like documentation: https://github.com/tduniec/template-designer-plugin/blob/main/README.md iconUrl: https://raw.githubusercontent.com/tduniec/template-designer-plugin/main/img/logo/templateDesignerLogo.png npmPackageName: '@tduniec/plugin-template-designer' -addedDate: 2025-11-19 +addedDate: '2025-11-19' diff --git a/microsite/data/plugins/time-saver.yaml b/microsite/data/plugins/time-saver.yaml index 02f088ffa1..6637eddb44 100644 --- a/microsite/data/plugins/time-saver.yaml +++ b/microsite/data/plugins/time-saver.yaml @@ -7,4 +7,4 @@ description: Visualise your time saved using Backstage Scaffolder templates documentation: https://github.com/tduniec/backstage-timesaver-plugin/blob/main/README.md iconUrl: https://raw.githubusercontent.com/tduniec/backstage-timesaver-plugin/main/img/tsLogo.png npmPackageName: '@tduniec/backstage-plugin-time-saver' -addedDate: 2024-01-30 +addedDate: '2024-01-30' diff --git a/microsite/data/plugins/usage-statistics.yaml b/microsite/data/plugins/usage-statistics.yaml index d32fb54ac4..a6722f7dd9 100644 --- a/microsite/data/plugins/usage-statistics.yaml +++ b/microsite/data/plugins/usage-statistics.yaml @@ -5,5 +5,6 @@ authorUrl: https://github.com/CodeVerse-GP category: Monitoring description: Shows usage statistics for scaffolder templates documentation: https://github.com/CodeVerse-GP/usage-statistics/blob/main/README.md +iconUrl: '/img/logo-gradient-on-dark.svg' npmPackageName: '@codeverse-gp/plugin-usage-statistics' addedDate: '2025-11-05' diff --git a/microsite/data/plugins/vault.yaml b/microsite/data/plugins/vault.yaml index 1ee14c4bd3..cec13cc63b 100644 --- a/microsite/data/plugins/vault.yaml +++ b/microsite/data/plugins/vault.yaml @@ -7,6 +7,4 @@ description: Visualize a list of the secrets stored in your HashiCorp Vault inst documentation: https://github.com/backstage/community-plugins/tree/main/workspaces/vault/plugins/vault iconUrl: /img/vault.png npmPackageName: '@backstage-community/plugin-vault' -tags: - - vault addedDate: '2022-06-03' diff --git a/microsite/docusaurus.config.ts b/microsite/docusaurus.config.ts index 850e6058af..f591bb24d1 100644 --- a/microsite/docusaurus.config.ts +++ b/microsite/docusaurus.config.ts @@ -28,7 +28,7 @@ import type * as OpenApiPlugin from 'docusaurus-plugin-openapi-docs'; const backstageTheme = themes.vsDark; backstageTheme.plain.backgroundColor = '#232323'; -const useVersionedDocs = require('fs').existsSync('versions.json'); +const useVersionedDocs = require('node:fs').existsSync('versions.json'); // This patches the redirect plugin to ignore the error when it tries to override existing fields. // This lets us add redirects that only apply to the next docs, while the stable docs still contain the source path. @@ -87,6 +87,23 @@ const config: Config = { }, onBrokenLinks: 'log', onBrokenMarkdownLinks: 'log', + future: { + v4: { + removeLegacyPostBuildHeadAttribute: true, + }, + experimental_faster: { + swcJsLoader: true, + swcJsMinimizer: true, + lightningCssMinimizer: true, + rspackBundler: true, + mdxCrossCompilerCache: true, + rspackPersistentCache: true, + // TODO: React has an issue with server rendering here. + // ssgWorkerThreads: true, + // TODO: This prints extra warnings in the console, add back when we have a fix. + // swcHtmlMinimizer: true, + }, + }, presets: [ [ '@docusaurus/preset-classic', @@ -153,25 +170,20 @@ const config: Config = { }, format: 'detect', }, - webpack: { - jsLoader: isServer => ({ - loader: require.resolve('swc-loader'), - options: { - jsc: { - parser: { - syntax: 'typescript', - tsx: true, - }, - target: 'es2017', - }, - module: { - type: isServer ? 'commonjs' : 'es6', - }, - }, - }), - }, plugins: [ 'docusaurus-plugin-sass', + function disableExpensiveBundlerOptimizationPlugin() { + return { + name: 'disable-expensive-bundler-optimizations', + configureWebpack(_config) { + return { + optimization: { + concatenateModules: false, + }, + }; + }, + }; + }, () => ({ name: 'yaml-loader', configureWebpack() { @@ -273,6 +285,10 @@ const config: Config = { from: '/docs/getting-started/app-custom-theme', to: '/docs/conf/user-interface', }, + { + from: '/docs/plugins/existing-plugins', + to: '/docs/plugins/', + }, ], }), [ @@ -362,16 +378,6 @@ const config: Config = { srcDark: 'img/logo.svg', }, items: [ - { - href: 'https://github.com/backstage/backstage', - label: 'GitHub', - position: 'left', - }, - { - href: 'https://discord.gg/backstage-687207715902193673', - label: 'Discord', - position: 'left', - }, { to: 'docs/overview/what-is-backstage', label: 'Docs', @@ -383,15 +389,32 @@ const config: Config = { position: 'left', }, { - to: '/blog', - label: 'Blog', + type: 'dropdown', + label: 'Reference', position: 'left', + items: [ + { + label: `Stable (${releases[0]})`, + href: 'https://backstage.io/api/stable', + target: '_self', + }, + { + label: 'Next', + href: 'https://backstage.io/api/next', + target: '_self', + }, + ], }, { to: `docs/releases/${releases[0]}`, label: 'Releases', position: 'left', }, + { + to: '/blog', + label: 'Blog', + position: 'left', + }, { to: '/demos', label: 'Demos', @@ -402,6 +425,18 @@ const config: Config = { label: 'Community', position: 'left', }, + { + href: 'https://github.com/backstage/backstage', + position: 'right', + className: 'header-github-link', + 'aria-label': 'GitHub repository', + }, + { + href: 'https://discord.gg/backstage-687207715902193673', + position: 'right', + className: 'header-discord-link', + 'aria-label': 'Discord community', + }, ...(useVersionedDocs ? [ { @@ -467,7 +502,7 @@ const config: Config = { }, { label: 'Subscribe to our newsletter', - to: 'https://info.backstage.spotify.com/newsletter_subscribe', + to: 'https://spoti.fi/backstagenewsletter', }, { label: 'CNCF Incubation', diff --git a/microsite/package.json b/microsite/package.json index 5da01d358e..0da6c2c8be 100644 --- a/microsite/package.json +++ b/microsite/package.json @@ -4,7 +4,7 @@ "private": true, "license": "Apache-2.0", "scripts": { - "build": "node scripts/pre-build.js && docusaurus build", + "build": "docusaurus build", "deploy": "docusaurus deploy", "docusaurus": "docusaurus", "generate-openapi-docs": "yarn docusaurus clean-api-docs all && yarn docusaurus gen-api-docs all", @@ -12,7 +12,7 @@ "prettier:fix": "prettier --write .", "publish-gh-pages": "docusaurus-publish", "rename-version": "docusaurus-rename-version", - "start": "node scripts/pre-build.js && docusaurus start", + "start": "docusaurus start", "swizzle": "docusaurus swizzle", "verify:sidebars": "node ./scripts/verify-sidebars", "version": "docusaurus-version", @@ -20,15 +20,18 @@ }, "prettier": "@backstage/cli/config/prettier", "resolutions": { + "@swc/core": "1.15.3", + "@swc/html": "1.15.3", "node-polyfill-webpack-plugin": "^3.0.0" }, "dependencies": { - "@docusaurus/core": "^3.1.1", - "@docusaurus/plugin-client-redirects": "^3.1.1", - "@docusaurus/preset-classic": "^3.1.1", - "@docusaurus/types": "^3.1.1", + "@docusaurus/core": "^3.9.0", + "@docusaurus/faster": "^3.9.0", + "@docusaurus/plugin-client-redirects": "^3.9.0", + "@docusaurus/preset-classic": "^3.9.0", + "@docusaurus/types": "^3.9.0", "@mdx-js/react": "^3.0.0", - "@swc/core": "1.15.3", + "@swc/core": "^1.15.6", "clsx": "^2.0.0", "docusaurus-plugin-openapi-docs": "^4.3.0", "docusaurus-plugin-sass": "^0.2.3", @@ -48,6 +51,6 @@ "js-yaml": "^4.1.1", "prettier": "^2.6.2", "typescript": "~5.7.0", - "yaml-loader": "^0.8.0" + "yaml-loader": "^0.9.0" } } diff --git a/microsite/releases.js b/microsite/releases.js index 4136b0edad..89fe79522c 100644 --- a/microsite/releases.js +++ b/microsite/releases.js @@ -1,5 +1,5 @@ -const fs = require('fs'); -const path = require('path'); +const fs = require('node:fs'); +const path = require('node:path'); const docsDir = path.resolve(__dirname, '../docs'); diff --git a/microsite/scripts/pre-build.js b/microsite/scripts/pre-build.js deleted file mode 100644 index 3b5bd4fb0b..0000000000 --- a/microsite/scripts/pre-build.js +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2022 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. - */ - -const { existsSync, writeFileSync, mkdirSync } = require('fs'); -const path = require('path'); - -const PLACEHOLDER = `--- -id: "index" -title: "Package Index" -description: "Index of all Backstage Packages" ---- -Run \`yarn build:api-docs\` to generate the API docs. -`; - -async function main() { - const referencesDir = '../docs/reference'; - if (!existsSync(referencesDir)) { - mkdirSync(referencesDir); - writeFileSync(path.join(referencesDir, 'index.md'), PLACEHOLDER); - } -} - -main().catch(error => { - console.error(error.stack); - process.exit(1); -}); diff --git a/microsite/sidebars.ts b/microsite/sidebars.ts index d2f6891323..b3053e3953 100644 --- a/microsite/sidebars.ts +++ b/microsite/sidebars.ts @@ -18,667 +18,749 @@ const scaffolderSidebar = tryToLoadCustomSidebar( '../docs/features/software-templates/api/sidebar.ts', ); +function sidebarElementWithIndex( + element: { + description?: string; + differentiator?: string; + label: string; + docId?: string; + }, + children: Array, +) { + const { label, description, differentiator = '' } = element; + return { + type: 'category', + label, + description, + link: { + type: 'generated-index', + title: label, + slug: `/${differentiator}${label + .toLowerCase() + .replace(/[^a-z0-9]/g, '-')}/generated-index`, + }, + items: children, + }; +} + export default { - docs: { - Overview: [ + docs: [ + sidebarElementWithIndex({ label: 'Overview' }, [ 'overview/what-is-backstage', 'overview/technical-overview', 'overview/architecture-overview', 'overview/roadmap', 'overview/threat-model', 'overview/versioning-policy', - ], - 'Getting Started': [ + ]), + sidebarElementWithIndex({ label: 'Getting Started' }, [ 'getting-started/index', - { - type: 'category', - label: 'Configuring Backstage', - items: [ - 'getting-started/config/database', - 'getting-started/config/authentication', - 'getting-started/configure-app-with-plugins', - 'getting-started/homepage', - ], - }, - { - type: 'category', - label: 'Deploying Backstage', - items: [ - 'deployment/index', - 'deployment/scaling', - 'deployment/docker', - 'deployment/k8s', - ], - }, - { - type: 'category', - label: 'Using Backstage', - items: [ - 'getting-started/logging-in', - 'getting-started/register-a-component', - 'getting-started/create-a-component', - ], - }, + sidebarElementWithIndex({ label: 'Configuring Backstage' }, [ + 'getting-started/config/database', + 'getting-started/config/authentication', + 'getting-started/configure-app-with-plugins', + 'getting-started/homepage', + ]), + sidebarElementWithIndex({ label: 'Deploying Backstage' }, [ + 'deployment/index', + 'deployment/scaling', + 'deployment/docker', + 'deployment/k8s', + ]), + sidebarElementWithIndex({ label: 'Using Backstage' }, [ + 'getting-started/logging-in', + 'getting-started/register-a-component', + 'getting-started/create-a-component', + ]), 'overview/support', 'getting-started/keeping-backstage-updated', - ], + ]), ...(process.env.GOLDEN_PATH - ? { - 'Golden Paths': [ + ? [ + sidebarElementWithIndex({ label: 'Golden Paths' }, [ + sidebarElementWithIndex({ label: '001 - Create an App' }, [ + 'golden-path/create-app/index', + 'golden-path/create-app/npx-create-app', + 'golden-path/create-app/local-development', + 'golden-path/create-app/installing-plugins', + 'golden-path/create-app/logging-in', + 'golden-path/create-app/custom-theme', + 'golden-path/create-app/keeping-backstage-updated', + ]), + sidebarElementWithIndex({ label: '002 - Plugins' }, [ + 'golden-path/plugins/index', + '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', + ]), + ]), + ]), + ] + : []), + sidebarElementWithIndex( + { + label: 'Core Features', + description: 'Features powering the core of Backstage.', + }, + [ + sidebarElementWithIndex( + { + label: 'Auth and Identity', + description: 'Authentication and identity management features.', + }, + [ + 'auth/index', + sidebarElementWithIndex( + { + label: 'Included providers', + description: + 'Pre-configured authentication providers included with Backstage.', + }, + [ + 'auth/auth0/provider', + 'auth/atlassian/provider', + 'auth/aws-alb/provider', + 'auth/microsoft/provider', + 'auth/microsoft/easy-auth', + 'auth/bitbucket/provider', + 'auth/bitbucketServer/provider', + 'auth/cloudflare/provider', + 'auth/github/provider', + 'auth/gitlab/provider', + 'auth/google/provider', + 'auth/google/gcp-iap-auth', + 'auth/guest/provider', + 'auth/okta/provider', + 'auth/oauth2-proxy/provider', + 'auth/onelogin/provider', + 'auth/vmware-cloud/provider', + ], + ), + 'auth/identity-resolver', + 'auth/oauth', + 'auth/oidc', + 'auth/add-auth-provider', + 'auth/service-to-service-auth', + 'auth/autologout', + 'auth/troubleshooting', + ], + ), + sidebarElementWithIndex( + { + label: 'Kubernetes', + description: 'Use Kubernetes right from Backstage.', + }, + [ + 'features/kubernetes/overview', + 'features/kubernetes/installation', + 'features/kubernetes/configuration', + 'features/kubernetes/authentication', + 'features/kubernetes/authentication-strategies', + 'features/kubernetes/troubleshooting', + 'features/kubernetes/proxy', + ], + ), + sidebarElementWithIndex( + { + label: 'Notifications', + description: 'Know when important events happen in Backstage.', + }, + [ + 'notifications/index', + 'notifications/processors', + 'notifications/usage', + ], + ), + sidebarElementWithIndex( + { + label: 'Permissions', + description: 'Access control for your Backstage instance.', + }, + [ + 'permissions/overview', + 'permissions/concepts', + 'permissions/getting-started', + 'permissions/writing-a-policy', + 'permissions/frontend-integration', + 'permissions/custom-rules', + sidebarElementWithIndex( + { + label: 'Tutorial: using Permissions in your plugin', + description: + 'Step-by-step guide for plugin authors on using Permissions.', + }, + [ + 'permissions/plugin-authors/01-setup', + 'permissions/plugin-authors/02-adding-a-basic-permission-check', + 'permissions/plugin-authors/03-adding-a-resource-permission-check', + 'permissions/plugin-authors/04-authorizing-access-to-paginated-data', + 'permissions/plugin-authors/05-frontend-authorization', + ], + ), + ], + ), + sidebarElementWithIndex( + { label: 'Search', description: 'Using Search within Backstage.' }, + [ + 'features/search/search-overview', + 'features/search/getting-started', + 'features/search/concepts', { type: 'category', - label: '001 - create-app', - items: [ - 'golden-path/create-app/index', - 'golden-path/create-app/npx-create-app', - 'golden-path/create-app/local-development', - 'golden-path/create-app/installing-plugins', - 'golden-path/create-app/logging-in', - 'golden-path/create-app/custom-theme', - 'golden-path/create-app/keeping-backstage-updated', - ], + label: 'API', + link: + searchSidebar.length > 0 + ? { + type: 'generated-index', + title: 'Search API', + slug: '/category/search-api', + } + : { + type: 'doc', + id: 'openapi/generated-docs/404', + }, + items: searchSidebar, }, + 'features/search/architecture', + 'features/search/search-engines', + 'features/search/collators', + 'features/search/how-to-guides', + ], + ), + sidebarElementWithIndex( + { + label: 'Software Catalog', + description: 'Manage and explore your software components.', + }, + [ + 'features/software-catalog/software-catalog-overview', + 'features/software-catalog/life-of-an-entity', + 'features/software-catalog/configuration', + 'features/software-catalog/system-model', + 'features/software-catalog/descriptor-format', + 'features/software-catalog/references', + 'features/software-catalog/well-known-annotations', + 'features/software-catalog/well-known-relations', + 'features/software-catalog/well-known-statuses', + 'features/software-catalog/extending-the-model', + 'features/software-catalog/external-integrations', + 'features/software-catalog/catalog-customization', + 'features/software-catalog/audit-events', { type: 'category', - label: '002 - Plugins', - items: [ - 'golden-path/plugins/index', - 'golden-path/plugins/why-build-plugins', - 'golden-path/plugins/sustainable-plugin-development', - { - type: 'category', - label: 'Backend Plugins', - items: [ - 'golden-path/plugins/backend/001-first-steps', - 'golden-path/plugins/backend/002-poking-around', - ], - }, - ], + label: 'API', + link: + catalogSidebar.length > 0 + ? { + type: 'generated-index', + title: 'Catalog API', + slug: '/category/catalog-api', + } + : { + type: 'doc', + id: 'openapi/generated-docs/404', + }, + items: catalogSidebar, + }, + 'features/software-catalog/creating-the-catalog-graph', + 'features/software-catalog/faq', + ], + ), + sidebarElementWithIndex( + { + label: 'Software Templates', + description: 'Create and manage software templates.', + }, + [ + 'features/software-templates/software-templates-index', + 'features/software-templates/configuration', + 'features/software-templates/adding-templates', + 'features/software-templates/writing-templates', + 'features/software-templates/input-examples', + 'features/software-templates/ui-options-examples', + 'features/software-templates/builtin-actions', + 'features/software-templates/writing-custom-actions', + 'features/software-templates/writing-tests-for-actions', + 'features/software-templates/writing-custom-field-extensions', + 'features/software-templates/writing-custom-step-layouts', + 'features/software-templates/authorizing-scaffolder-template-details', + 'features/software-templates/migrating-to-rjsf-v5', + 'features/software-templates/migrating-from-v1beta2-to-v1beta3', + 'features/software-templates/dry-run-testing', + 'features/software-templates/experimental', + 'features/software-templates/templating-extensions', + 'features/software-templates/audit-events', + { + type: 'category', + label: 'API', + link: + scaffolderSidebar.length > 0 + ? { + type: 'generated-index', + title: 'Scaffolder API', + slug: '/category/scaffolder-api', + } + : { + type: 'doc', + id: 'openapi/generated-docs/404', + }, + items: scaffolderSidebar, }, ], - } - : {}), - 'Core Features': [ - { - type: 'category', - label: 'Auth and Identity', - items: [ - 'auth/index', + ), + sidebarElementWithIndex( { - type: 'category', - label: 'Included providers', - items: [ - 'auth/auth0/provider', - 'auth/atlassian/provider', - 'auth/aws-alb/provider', - 'auth/microsoft/provider', - 'auth/microsoft/easy-auth', - 'auth/bitbucket/provider', - 'auth/bitbucketServer/provider', - 'auth/cloudflare/provider', - 'auth/github/provider', - 'auth/gitlab/provider', - 'auth/google/provider', - 'auth/google/gcp-iap-auth', - 'auth/guest/provider', - 'auth/okta/provider', - 'auth/oauth2-proxy/provider', - 'auth/onelogin/provider', - 'auth/vmware-cloud/provider', - ], + label: 'TechDocs', + description: 'Documentation as code for your software.', }, - 'auth/identity-resolver', - 'auth/oauth', - 'auth/oidc', - 'auth/add-auth-provider', - 'auth/service-to-service-auth', - 'auth/autologout', - 'auth/troubleshooting', - ], - }, + [ + 'features/techdocs/techdocs-overview', + 'features/techdocs/getting-started', + 'features/techdocs/concepts', + 'features/techdocs/addons', + 'features/techdocs/architecture', + 'features/techdocs/extensions', + 'features/techdocs/creating-and-publishing', + 'features/techdocs/configuration', + 'features/techdocs/using-cloud-storage', + 'features/techdocs/configuring-ci-cd', + 'features/techdocs/cli', + 'features/techdocs/how-to-guides', + 'features/techdocs/troubleshooting', + 'features/techdocs/faqs', + ], + ), + ], + ), + sidebarElementWithIndex( { - type: 'category', - label: 'Kubernetes', - items: [ - 'features/kubernetes/overview', - 'features/kubernetes/installation', - 'features/kubernetes/configuration', - 'features/kubernetes/authentication', - 'features/kubernetes/authentication-strategies', - 'features/kubernetes/troubleshooting', - 'features/kubernetes/proxy', - ], + label: 'Integrations', + description: 'Connect and integrate with external services.', }, - { - type: 'category', - label: 'Notifications', - items: [ - 'notifications/index', - 'notifications/processors', - 'notifications/usage', - ], - }, - { - type: 'category', - label: 'Permissions', - items: [ - 'permissions/overview', - 'permissions/concepts', - 'permissions/getting-started', - 'permissions/writing-a-policy', - 'permissions/frontend-integration', - 'permissions/custom-rules', - { - type: 'category', - label: 'Tutorial: using Permissions in your plugin', - items: [ - 'permissions/plugin-authors/01-setup', - 'permissions/plugin-authors/02-adding-a-basic-permission-check', - 'permissions/plugin-authors/03-adding-a-resource-permission-check', - 'permissions/plugin-authors/04-authorizing-access-to-paginated-data', - 'permissions/plugin-authors/05-frontend-authorization', - ], - }, - ], - }, - { - type: 'category', - label: 'Search', - items: [ - 'features/search/search-overview', - 'features/search/getting-started', - 'features/search/concepts', - { - type: 'category', - label: 'API', - link: - searchSidebar.length > 0 - ? { - type: 'generated-index', - title: 'Search API', - slug: '/category/search-api', - } - : { - type: 'doc', - id: 'openapi/generated-docs/404', - }, - items: searchSidebar, - }, - 'features/search/architecture', - 'features/search/search-engines', - 'features/search/collators', - 'features/search/how-to-guides', - ], - }, - { - type: 'category', - label: 'Software Catalog', - items: [ - 'features/software-catalog/software-catalog-overview', - 'features/software-catalog/life-of-an-entity', - 'features/software-catalog/configuration', - 'features/software-catalog/system-model', - 'features/software-catalog/descriptor-format', - 'features/software-catalog/references', - 'features/software-catalog/well-known-annotations', - 'features/software-catalog/well-known-relations', - 'features/software-catalog/well-known-statuses', - 'features/software-catalog/extending-the-model', - 'features/software-catalog/external-integrations', - 'features/software-catalog/catalog-customization', - { - type: 'category', - label: 'API', - link: - catalogSidebar.length > 0 - ? { - type: 'generated-index', - title: 'Catalog API', - slug: '/category/catalog-api', - } - : { - type: 'doc', - id: 'openapi/generated-docs/404', - }, - items: catalogSidebar, - }, - 'features/software-catalog/creating-the-catalog-graph', - 'features/software-catalog/faq', - ], - }, - { - type: 'category', - label: 'Software Templates', - items: [ - 'features/software-templates/software-templates-index', - 'features/software-templates/configuration', - 'features/software-templates/adding-templates', - 'features/software-templates/writing-templates', - 'features/software-templates/input-examples', - 'features/software-templates/builtin-actions', - 'features/software-templates/writing-custom-actions', - 'features/software-templates/writing-tests-for-actions', - 'features/software-templates/writing-custom-field-extensions', - 'features/software-templates/writing-custom-step-layouts', - 'features/software-templates/authorizing-scaffolder-template-details', - 'features/software-templates/migrating-to-rjsf-v5', - 'features/software-templates/migrating-from-v1beta2-to-v1beta3', - 'features/software-templates/dry-run-testing', - 'features/software-templates/experimental', - 'features/software-templates/templating-extensions', - { - type: 'category', - label: 'API', - link: - scaffolderSidebar.length > 0 - ? { - type: 'generated-index', - title: 'Scaffolder API', - slug: '/category/scaffolder-api', - } - : { - type: 'doc', - id: 'openapi/generated-docs/404', - }, - items: scaffolderSidebar, - }, - ], - }, - { - type: 'category', - label: 'TechDocs', - items: [ - 'features/techdocs/techdocs-overview', - 'features/techdocs/getting-started', - 'features/techdocs/concepts', - 'features/techdocs/addons', - 'features/techdocs/architecture', - 'features/techdocs/extensions', - 'features/techdocs/creating-and-publishing', - 'features/techdocs/configuration', - 'features/techdocs/using-cloud-storage', - 'features/techdocs/configuring-ci-cd', - 'features/techdocs/cli', - 'features/techdocs/how-to-guides', - 'features/techdocs/troubleshooting', - 'features/techdocs/faqs', - ], - }, - ], - Integrations: [ - 'integrations/index', - { - type: 'category', - label: 'AWS S3', - items: [ + [ + 'integrations/index', + sidebarElementWithIndex({ label: 'AWS S3' }, [ 'integrations/aws-s3/locations', 'integrations/aws-s3/discovery', - ], - }, - { - type: 'category', - label: 'Azure Blob Storage', - items: [ + ]), + sidebarElementWithIndex({ label: 'Azure Blob Storage' }, [ 'integrations/azure-blobStorage/locations', 'integrations/azure-blobStorage/discovery', - ], - }, - { - type: 'category', - label: 'Azure', - items: [ + ]), + sidebarElementWithIndex({ label: 'Azure' }, [ 'integrations/azure/locations', 'integrations/azure/discovery', 'integrations/azure/org', - ], - }, - { - type: 'category', - label: 'Bitbucket Cloud', - items: [ + ]), + sidebarElementWithIndex({ label: 'Bitbucket Cloud' }, [ 'integrations/bitbucketCloud/locations', 'integrations/bitbucketCloud/discovery', - ], - }, - { - type: 'category', - label: 'Bitbucket Server', - items: [ + ]), + sidebarElementWithIndex({ label: 'Bitbucket Server' }, [ 'integrations/bitbucketServer/locations', 'integrations/bitbucketServer/discovery', - ], - }, - { - type: 'category', - label: 'Datadog', - items: ['integrations/datadog-rum/installation'], - }, - { - type: 'category', - label: 'Gerrit', - items: [ + ]), + sidebarElementWithIndex({ label: 'Datadog' }, [ + 'integrations/datadog-rum/installation', + ]), + sidebarElementWithIndex({ label: 'Gerrit' }, [ 'integrations/gerrit/locations', 'integrations/gerrit/discovery', - ], - }, - { - type: 'category', - label: 'GitHub', - items: [ + ]), + sidebarElementWithIndex({ label: 'Github' }, [ 'integrations/github/locations', 'integrations/github/discovery', 'integrations/github/org', 'integrations/github/github-apps', - ], - }, - { - type: 'category', - label: 'GitLab', - items: [ + ]), + sidebarElementWithIndex({ label: 'GitLab' }, [ 'integrations/gitlab/locations', 'integrations/gitlab/discovery', 'integrations/gitlab/org', - ], - }, + ]), + sidebarElementWithIndex({ label: 'Gitea' }, [ + 'integrations/gitea/locations', + 'integrations/gitea/discovery', + ]), + sidebarElementWithIndex({ label: 'Harness' }, [ + 'integrations/harness/locations', + ]), + sidebarElementWithIndex({ label: 'Google GCS' }, [ + 'integrations/google-cloud-storage/locations', + ]), + sidebarElementWithIndex({ label: 'LDAP' }, ['integrations/ldap/org']), + ], + ), + sidebarElementWithIndex( { - type: 'category', - label: 'Gitea', - items: ['integrations/gitea/locations', 'integrations/gitea/discovery'], + label: 'Plugins', + description: 'Extend Backstage with custom functionality.', }, - { - type: 'category', - label: 'Harness', - items: ['integrations/harness/locations'], - }, - { - type: 'category', - label: 'Google GCS', - items: ['integrations/google-cloud-storage/locations'], - }, - { - type: 'category', - label: 'LDAP', - items: ['integrations/ldap/org'], - }, - ], - Plugins: [ - 'plugins/index', - 'plugins/existing-plugins', - 'plugins/create-a-plugin', - 'plugins/plugin-development', - 'plugins/structure-of-a-plugin', - 'plugins/integrating-plugin-into-software-catalog', - 'plugins/integrating-search-into-plugins', - 'plugins/composability', - 'plugins/internationalization', - 'plugins/analytics', - 'plugins/feature-flags', - { - type: 'category', - label: 'OpenAPI', - items: [ - 'openapi/01-getting-started', - 'openapi/generate-client', - 'openapi/test-case-validation', - ], - }, - { - type: 'category', - label: 'Backends and APIs', - items: [ - 'plugins/proxying', - 'plugins/backend-plugin', - 'plugins/call-existing-api', - ], - }, - { - type: 'category', - label: 'Testing', - items: ['plugins/testing'], - }, - { - type: 'category', - label: 'Publishing', - items: [ - 'plugins/publish-private', - 'plugins/add-to-directory', - 'plugins/observability', - ], - }, - ], - Configuration: [ - 'conf/index', - 'conf/reading', - 'conf/writing', - 'conf/defining', - ], - Framework: [ - { - type: 'category', - label: 'Backend System', - items: [ - 'backend-system/index', + [ + 'plugins/index', + 'plugins/create-a-plugin', + 'plugins/plugin-development', + 'plugins/structure-of-a-plugin', + 'plugins/integrating-plugin-into-software-catalog', + 'plugins/integrating-search-into-plugins', + 'plugins/composability', + 'plugins/internationalization', + 'plugins/analytics', + 'plugins/feature-flags', + sidebarElementWithIndex( { - type: 'category', - label: 'Architecture', - items: [ - 'backend-system/architecture/index', - 'backend-system/architecture/services', - 'backend-system/architecture/plugins', - 'backend-system/architecture/extension-points', - 'backend-system/architecture/modules', - 'backend-system/architecture/feature-loaders', - 'backend-system/architecture/naming-patterns', - ], + label: 'OpenAPI', + description: + 'Work with OpenAPI specifications and generate clients.', }, + [ + 'openapi/01-getting-started', + 'openapi/generate-client', + 'openapi/test-case-validation', + ], + ), + sidebarElementWithIndex( { - type: 'category', - label: 'Building Backends', - items: [ - 'backend-system/building-backends/index', - 'backend-system/building-backends/migrating', - ], + label: 'Backends and APIs', + description: 'Build and manage backend services and APIs.', }, - { - type: 'category', - label: 'Building Plugins & Modules', - items: [ - 'backend-system/building-plugins-and-modules/index', - 'backend-system/building-plugins-and-modules/testing', - 'backend-system/building-plugins-and-modules/migrating', - ], - }, - { - type: 'category', - label: 'Core Services', - items: [ - 'backend-system/core-services/index', - 'backend-system/core-services/auditor', - 'backend-system/core-services/auth', - 'backend-system/core-services/cache', - 'backend-system/core-services/database', - 'backend-system/core-services/discovery', - 'backend-system/core-services/http-auth', - 'backend-system/core-services/http-router', - 'backend-system/core-services/identity', - 'backend-system/core-services/lifecycle', - 'backend-system/core-services/logger', - 'backend-system/core-services/permissions', - 'backend-system/core-services/permissions-registry', - 'backend-system/core-services/plugin-metadata', - 'backend-system/core-services/root-config', - 'backend-system/core-services/root-health', - 'backend-system/core-services/root-instance-metadata', - 'backend-system/core-services/root-http-router', - 'backend-system/core-services/root-lifecycle', - 'backend-system/core-services/root-logger', - 'backend-system/core-services/scheduler', - 'backend-system/core-services/token-manager', - 'backend-system/core-services/url-reader', - 'backend-system/core-services/user-info', - 'backend-system/core-services/actions-registry', - 'backend-system/core-services/actions', - ], - }, - ], - }, + [ + 'plugins/proxying', + 'plugins/backend-plugin', + 'plugins/call-existing-api', + ], + ), + sidebarElementWithIndex( + { label: 'Testing', description: 'Testing plugins and modules.' }, + ['plugins/testing'], + ), + sidebarElementWithIndex( + { label: 'Publishing', description: 'Publishing your plugins.' }, + ['plugins/publish-private', 'plugins/add-to-directory'], + ), + 'plugins/observability', + ], + ), + sidebarElementWithIndex( { - type: 'category', - label: 'New Frontend System', - items: [ - 'frontend-system/index', + label: 'Configuration', + description: 'Manage static configuration files and settings.', + }, + ['conf/index', 'conf/reading', 'conf/writing', 'conf/defining'], + ), + sidebarElementWithIndex( + { + label: 'Framework', + description: 'Core framework concepts and architecture.', + }, + [ + sidebarElementWithIndex( { - type: 'category', - label: 'Architecture', - items: [ - 'frontend-system/architecture/index', - 'frontend-system/architecture/app', - 'frontend-system/architecture/plugins', - 'frontend-system/architecture/extensions', - 'frontend-system/architecture/extension-blueprints', - 'frontend-system/architecture/extension-overrides', - 'frontend-system/architecture/references', - 'frontend-system/architecture/utility-apis', - 'frontend-system/architecture/routes', - 'frontend-system/architecture/naming-patterns', - 'frontend-system/architecture/migrations', - ], + label: 'Backend System', + description: 'Backend system components and architecture.', }, + [ + 'backend-system/index', + sidebarElementWithIndex( + { + label: 'Architecture', + description: 'Architecture of the backend system.', + differentiator: 'backend-system/', + }, + [ + 'backend-system/architecture/index', + 'backend-system/architecture/services', + 'backend-system/architecture/plugins', + 'backend-system/architecture/extension-points', + 'backend-system/architecture/modules', + 'backend-system/architecture/feature-loaders', + 'backend-system/architecture/naming-patterns', + ], + ), + sidebarElementWithIndex( + { + label: 'Building Backends', + description: 'Guides on building backend systems.', + }, + [ + 'backend-system/building-backends/index', + 'backend-system/building-backends/migrating', + ], + ), + sidebarElementWithIndex( + { + label: 'Building Plugins & Modules', + description: 'Guides on building plugins and modules.', + }, + [ + 'backend-system/building-plugins-and-modules/index', + 'backend-system/building-plugins-and-modules/testing', + 'backend-system/building-plugins-and-modules/migrating', + ], + ), + sidebarElementWithIndex( + { + label: 'Core Services', + description: 'Core services of the backend system.', + }, + [ + 'backend-system/core-services/index', + 'backend-system/core-services/auditor', + 'backend-system/core-services/auth', + 'backend-system/core-services/cache', + 'backend-system/core-services/database', + 'backend-system/core-services/discovery', + 'backend-system/core-services/http-auth', + 'backend-system/core-services/http-router', + 'backend-system/core-services/identity', + 'backend-system/core-services/lifecycle', + 'backend-system/core-services/logger', + 'backend-system/core-services/permissions', + 'backend-system/core-services/permissions-registry', + 'backend-system/core-services/plugin-metadata', + 'backend-system/core-services/root-config', + 'backend-system/core-services/root-health', + 'backend-system/core-services/root-http-router', + 'backend-system/core-services/root-instance-metadata', + 'backend-system/core-services/root-lifecycle', + 'backend-system/core-services/root-logger', + 'backend-system/core-services/scheduler', + 'backend-system/core-services/token-manager', + 'backend-system/core-services/url-reader', + 'backend-system/core-services/user-info', + 'backend-system/core-services/actions-registry', + 'backend-system/core-services/actions', + ], + ), + ], + ), + sidebarElementWithIndex( { - type: 'category', - label: 'Building Plugins', - items: [ - 'frontend-system/building-plugins/index', - 'frontend-system/building-plugins/testing', - 'frontend-system/building-plugins/common-extension-blueprints', - 'frontend-system/building-plugins/built-in-data-refs', - 'frontend-system/building-plugins/migrating', - ], + label: 'New Frontend System', + description: 'New frontend system components and architecture.', }, + [ + 'frontend-system/index', + sidebarElementWithIndex( + { + label: 'Architecture', + description: 'Architecture of the new frontend system.', + differentiator: 'frontend-system/', + }, + [ + 'frontend-system/architecture/index', + 'frontend-system/architecture/app', + 'frontend-system/architecture/plugins', + 'frontend-system/architecture/extensions', + 'frontend-system/architecture/extension-blueprints', + 'frontend-system/architecture/extension-overrides', + 'frontend-system/architecture/references', + 'frontend-system/architecture/utility-apis', + 'frontend-system/architecture/routes', + 'frontend-system/architecture/naming-patterns', + 'frontend-system/architecture/migrations', + ], + ), + sidebarElementWithIndex( + { + label: 'Building Plugins', + description: 'Guides on building frontend plugins.', + }, + [ + 'frontend-system/building-plugins/index', + 'frontend-system/building-plugins/testing', + 'frontend-system/building-plugins/common-extension-blueprints', + 'frontend-system/building-plugins/built-in-data-refs', + 'frontend-system/building-plugins/migrating', + ], + ), + sidebarElementWithIndex( + { + label: 'Building Apps', + description: 'Guides on building frontend applications.', + }, + [ + 'frontend-system/building-apps/index', + 'frontend-system/building-apps/configuring-extensions', + 'frontend-system/building-apps/built-in-extensions', + 'frontend-system/building-apps/plugin-conversion', + 'frontend-system/building-apps/module-federation', + 'frontend-system/building-apps/migrating', + ], + ), + sidebarElementWithIndex( + { + label: 'Utility APIs', + description: 'Utility APIs for the frontend system.', + }, + [ + 'frontend-system/utility-apis/index', + 'frontend-system/utility-apis/creating', + 'frontend-system/utility-apis/consuming', + 'frontend-system/utility-apis/configuring', + 'frontend-system/utility-apis/testing', + ], + ), + ], + ), + sidebarElementWithIndex( { - type: 'category', - label: 'Building Apps', - items: [ - 'frontend-system/building-apps/index', - 'frontend-system/building-apps/configuring-extensions', - 'frontend-system/building-apps/built-in-extensions', - 'frontend-system/building-apps/plugin-conversion', - 'frontend-system/building-apps/migrating', - ], + label: 'Backstage CLI', + description: 'Command-line interface for Backstage.', }, + [ + 'tooling/cli/overview', + 'tooling/cli/build-system', + 'tooling/cli/commands', + 'tooling/cli/templates', + sidebarElementWithIndex( + { + label: 'Local Development', + description: + 'Guides for local development using Backstage CLI.', + }, + [ + 'tooling/local-dev/linking-local-packages', + 'tooling/local-dev/debugging', + 'tooling/local-dev/profiling', + ], + ), + 'tooling/package-metadata', + ], + ), + sidebarElementWithIndex( { - type: 'category', - label: 'Utility APIs', - items: [ - 'frontend-system/utility-apis/index', - 'frontend-system/utility-apis/creating', - 'frontend-system/utility-apis/consuming', - 'frontend-system/utility-apis/configuring', - ], + label: 'User Interface', + description: 'User interface customization and configuration.', }, - ], - }, + [ + 'conf/user-interface/index', + 'conf/user-interface/logo', + 'conf/user-interface/icons', + 'conf/user-interface/sidebar', + ], + ), + ], + ), + sidebarElementWithIndex( { - 'Backstage CLI': [ - 'tooling/cli/overview', - 'tooling/cli/build-system', - 'tooling/cli/commands', - 'tooling/cli/templates', + label: 'Tutorials', + description: + 'Step-by-step tutorials for various Backstage features and use cases.', + }, + [ + sidebarElementWithIndex( { - type: 'category', - label: 'Local Development', - items: [ - 'tooling/local-dev/linking-local-packages', - 'tooling/local-dev/debugging', - 'tooling/local-dev/profiling', - ], + label: 'Non-technical', + description: 'Non-technical tutorials and guides.', }, - 'tooling/package-metadata', - ], - }, + ['overview/adopting'], + ), + sidebarElementWithIndex( + { + label: 'Technical', + description: 'Technical tutorials and guides.', + }, + [ + 'tutorials/quickstart-app-plugin', + 'tutorials/configuring-plugin-databases', + 'tutorials/manual-knex-rollback', + 'tutorials/switching-sqlite-postgres', + 'tutorials/using-backstage-proxy-within-plugin', + 'tutorials/enable-public-entry', + 'tutorials/setup-opentelemetry', + 'tutorials/integrating-event-driven-updates-with-entity-providers', + 'accessibility/index', + ], + ), + sidebarElementWithIndex( + { + label: 'Migrations', + description: + 'Guides for migrating between different versions and systems.', + }, + [ + 'tutorials/jest30-migration', + 'tutorials/react-router-stable-migration', + 'tutorials/react18-migration', + 'tutorials/package-role-migration', + 'tutorials/migrating-away-from-core', + 'tutorials/yarn-migration', + 'tutorials/migrate-to-mui5', + 'tutorials/auth-service-migration', + 'tutorials/jsx-transform-migration', + ], + ), + ], + ), + sidebarElementWithIndex( + { label: 'FAQ', description: 'Frequently asked questions and answers.' }, + ['faq/index', 'faq/product', 'faq/technical'], + ), + sidebarElementWithIndex( { - type: 'category', - label: 'User Interface', - items: [ - 'conf/user-interface/index', - 'conf/user-interface/logo', - 'conf/user-interface/icons', - 'conf/user-interface/sidebar', - ], + label: 'Contribute', + description: 'Information on contributing to Backstage.', }, - ], - Tutorials: [ - { 'Non-technical': ['overview/adopting'] }, + [ + 'contribute/index', + 'contribute/getting-involved', + 'contribute/project-structure', + ], + ), + sidebarElementWithIndex( { - Technical: [ - 'tutorials/quickstart-app-plugin', - 'tutorials/configuring-plugin-databases', - 'tutorials/manual-knex-rollback', - 'tutorials/switching-sqlite-postgres', - 'tutorials/using-backstage-proxy-within-plugin', - 'tutorials/enable-public-entry', - 'tutorials/setup-opentelemetry', - 'tutorials/integrating-event-driven-updates-with-entity-providers', - 'accessibility/index', - ], + label: 'References', + description: 'Reference materials and documentation.', }, - { - Migrations: [ - 'tutorials/jest30-migration', - 'tutorials/react-router-stable-migration', - 'tutorials/react18-migration', - 'tutorials/package-role-migration', - 'tutorials/migrating-away-from-core', - 'tutorials/yarn-migration', - 'tutorials/migrate-to-mui5', - 'tutorials/auth-service-migration', - 'tutorials/jsx-transform-migration', - ], - }, - ], - FAQ: ['faq/index', 'faq/product', 'faq/technical'], - Contribute: [ - 'contribute/index', - 'contribute/getting-involved', - 'contribute/project-structure', - ], - References: [ - { - 'Designing for Backstage': [ - 'dls/design', - 'dls/component-design-guidelines', - 'dls/contributing-to-storybook', - 'dls/figma', - ], - }, - { - type: 'category', - label: 'Architecture Decision Records (ADRs)', - items: [ - 'architecture-decisions/adrs-overview', - 'architecture-decisions/adrs-adr001', - 'architecture-decisions/adrs-adr002', - 'architecture-decisions/adrs-adr003', - 'architecture-decisions/adrs-adr004', - 'architecture-decisions/adrs-adr005', - 'architecture-decisions/adrs-adr006', - 'architecture-decisions/adrs-adr007', - 'architecture-decisions/adrs-adr008', - 'architecture-decisions/adrs-adr009', - 'architecture-decisions/adrs-adr010', - 'architecture-decisions/adrs-adr011', - 'architecture-decisions/adrs-adr012', - 'architecture-decisions/adrs-adr013', - 'architecture-decisions/adrs-adr014', - 'architecture-decisions/adrs-adr015', - ], - }, - 'api/deprecations', - 'references/glossary', - 'api/utility-apis', - 'reference/index', - ], - }, + [ + sidebarElementWithIndex( + { + label: 'Designing for Backstage', + description: + 'Guidelines and resources for designing Backstage components.', + }, + [ + 'dls/design', + 'dls/component-design-guidelines', + 'dls/contributing-to-storybook', + 'dls/figma', + ], + ), + sidebarElementWithIndex( + { + label: 'Architecture Decision Records (ADRs)', + description: + 'Documentation of architectural decisions made in Backstage.', + }, + [ + 'architecture-decisions/adrs-overview', + 'architecture-decisions/adrs-adr001', + 'architecture-decisions/adrs-adr002', + 'architecture-decisions/adrs-adr003', + 'architecture-decisions/adrs-adr004', + 'architecture-decisions/adrs-adr005', + 'architecture-decisions/adrs-adr006', + 'architecture-decisions/adrs-adr007', + 'architecture-decisions/adrs-adr008', + 'architecture-decisions/adrs-adr009', + 'architecture-decisions/adrs-adr010', + 'architecture-decisions/adrs-adr011', + 'architecture-decisions/adrs-adr012', + 'architecture-decisions/adrs-adr013', + 'architecture-decisions/adrs-adr014', + 'architecture-decisions/adrs-adr015', + ], + ), + 'api/deprecations', + 'references/glossary', + 'api/utility-apis', + 'references/index', + ], + ), + ], releases: { 'Release Notes': releases.map(release => `releases/${release}`), }, diff --git a/microsite/src/pages/community/index.tsx b/microsite/src/pages/community/index.tsx index 9770c91e8e..20013a9638 100644 --- a/microsite/src/pages/community/index.tsx +++ b/microsite/src/pages/community/index.tsx @@ -36,7 +36,7 @@ const Community = () => { { content: 'Subscribe to the', label: 'Community Newsletter', - link: 'https://info.backstage.spotify.com/newsletter_subscribe', + link: 'https://spoti.fi/backstagenewsletter', }, ]; @@ -52,7 +52,7 @@ const Community = () => { title: 'Newsletter', content: "The official monthly Backstage newsletter. Don't miss the latest news from your favorite project!", - link: 'https://info.backstage.spotify.com/newsletter_subscribe', + link: 'https://spoti.fi/backstagenewsletter', label: 'Subscribe', }, ]; diff --git a/microsite/src/pages/home/_home.tsx b/microsite/src/pages/home/_home.tsx index 00691e8a75..d4e66b6729 100644 --- a/microsite/src/pages/home/_home.tsx +++ b/microsite/src/pages/home/_home.tsx @@ -44,7 +44,7 @@ const HomePage = () => {
    🗞️ Want to stay up to date with Backstage? Sign up for our{' '} Newsletter diff --git a/microsite/src/theme/customTheme.scss b/microsite/src/theme/customTheme.scss index 823327b28f..db903ebdd7 100644 --- a/microsite/src/theme/customTheme.scss +++ b/microsite/src/theme/customTheme.scss @@ -200,3 +200,37 @@ feedback-button { html.plugin-docs feedback-button { display: initial; } + +/* Navbar icon links */ +.header-github-link:hover, +.header-discord-link:hover { + opacity: 0.6; +} + +.header-github-link::before, +.header-discord-link::before { + content: ''; + width: 24px; + height: 24px; + display: flex; +} + +.header-github-link::before { + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23fff' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") + no-repeat; +} + +html[data-theme='light'] .header-github-link::before { + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23000' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") + no-repeat; +} + +.header-discord-link::before { + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23fff' d='M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z'/%3E%3C/svg%3E") + no-repeat; +} + +html[data-theme='light'] .header-discord-link::before { + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%235865F2' d='M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z'/%3E%3C/svg%3E") + no-repeat; +} diff --git a/microsite/static/img/3scale.svg b/microsite/static/img/3scale.svg index 46551958aa..00649d34c7 100644 --- a/microsite/static/img/3scale.svg +++ b/microsite/static/img/3scale.svg @@ -1,22 +1 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/backstage-search-platform.svg b/microsite/static/img/backstage-search-platform.svg index 9ddc3fbb2e..abe4fa2a96 100644 --- a/microsite/static/img/backstage-search-platform.svg +++ b/microsite/static/img/backstage-search-platform.svg @@ -1,17 +1 @@ - - - - - - - - - - - - + \ No newline at end of file diff --git a/microsite/static/img/badges.svg b/microsite/static/img/badges.svg index b0272986e6..2f60eb01b6 100644 --- a/microsite/static/img/badges.svg +++ b/microsite/static/img/badges.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/bazaar.svg b/microsite/static/img/bazaar.svg index 1d180a1e03..7f142902ea 100644 --- a/microsite/static/img/bazaar.svg +++ b/microsite/static/img/bazaar.svg @@ -1 +1 @@ - + \ No newline at end of file diff --git a/microsite/static/img/buildkite.svg b/microsite/static/img/buildkite.svg index cc6bb28961..3781985e8b 100644 --- a/microsite/static/img/buildkite.svg +++ b/microsite/static/img/buildkite.svg @@ -1 +1 @@ - + \ No newline at end of file diff --git a/microsite/static/img/catalog-graph.svg b/microsite/static/img/catalog-graph.svg index 6cd13b0e66..67f91dc3ba 100644 --- a/microsite/static/img/catalog-graph.svg +++ b/microsite/static/img/catalog-graph.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/cicd-statistics.svg b/microsite/static/img/cicd-statistics.svg index 302f5e8f98..64c71b0854 100644 --- a/microsite/static/img/cicd-statistics.svg +++ b/microsite/static/img/cicd-statistics.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/cncf-white.svg b/microsite/static/img/cncf-white.svg index 652249b8d8..c5e3b2af9a 100644 --- a/microsite/static/img/cncf-white.svg +++ b/microsite/static/img/cncf-white.svg @@ -1 +1 @@ - + \ No newline at end of file diff --git a/microsite/static/img/codacy-icon.svg b/microsite/static/img/codacy-icon.svg index ef65004330..19626911e1 100644 --- a/microsite/static/img/codacy-icon.svg +++ b/microsite/static/img/codacy-icon.svg @@ -1 +1 @@ -codacy-white \ No newline at end of file +codacy-white \ No newline at end of file diff --git a/microsite/static/img/codescene_logo.svg b/microsite/static/img/codescene_logo.svg index 9e433b2c7b..9ecaf382d2 100644 --- a/microsite/static/img/codescene_logo.svg +++ b/microsite/static/img/codescene_logo.svg @@ -1,50 +1 @@ - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/microsite/static/img/cyclops.svg b/microsite/static/img/cyclops.svg index fbc297443c..584564c9f7 100644 --- a/microsite/static/img/cyclops.svg +++ b/microsite/static/img/cyclops.svg @@ -1,51 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/microsite/static/img/daytona.svg b/microsite/static/img/daytona.svg index 1920b2f878..84d4c05ec1 100644 --- a/microsite/static/img/daytona.svg +++ b/microsite/static/img/daytona.svg @@ -1,62 +1 @@ - - - - - - - - - - + \ No newline at end of file diff --git a/microsite/static/img/devtools.svg b/microsite/static/img/devtools.svg index 6bd5dc17c5..f978b9b3c0 100644 --- a/microsite/static/img/devtools.svg +++ b/microsite/static/img/devtools.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/digital.ai-deploy.svg b/microsite/static/img/digital.ai-deploy.svg index d0becb98f1..780b0e417c 100644 --- a/microsite/static/img/digital.ai-deploy.svg +++ b/microsite/static/img/digital.ai-deploy.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/microsite/static/img/digital.ai-release.svg b/microsite/static/img/digital.ai-release.svg index ba510e2a79..9f33e123a5 100644 --- a/microsite/static/img/digital.ai-release.svg +++ b/microsite/static/img/digital.ai-release.svg @@ -1,14 +1 @@ - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/microsite/static/img/dynatrace.svg b/microsite/static/img/dynatrace.svg index 863f93c123..1f10121bee 100644 --- a/microsite/static/img/dynatrace.svg +++ b/microsite/static/img/dynatrace.svg @@ -1,18 +1 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/entity-validation.svg b/microsite/static/img/entity-validation.svg index c841c8be1a..8a1ae0dc20 100644 --- a/microsite/static/img/entity-validation.svg +++ b/microsite/static/img/entity-validation.svg @@ -1,3 +1 @@ - - - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/github-pull-requests-board-logo.svg b/microsite/static/img/github-pull-requests-board-logo.svg index 0114b50d08..16e55afc33 100644 --- a/microsite/static/img/github-pull-requests-board-logo.svg +++ b/microsite/static/img/github-pull-requests-board-logo.svg @@ -1,30 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/microsite/static/img/hcp-consul.svg b/microsite/static/img/hcp-consul.svg index d84972585c..4716f37348 100644 --- a/microsite/static/img/hcp-consul.svg +++ b/microsite/static/img/hcp-consul.svg @@ -1,17 +1 @@ - -Consul Logo - - - - - - - - - - - - - - - +Consul Logo \ No newline at end of file diff --git a/microsite/static/img/jfrog-artifactory.svg b/microsite/static/img/jfrog-artifactory.svg index ded672b4bc..b43374db61 100644 --- a/microsite/static/img/jfrog-artifactory.svg +++ b/microsite/static/img/jfrog-artifactory.svg @@ -1,22 +1 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/keycloak.svg b/microsite/static/img/keycloak.svg index 871bd5b0f8..16e9c5568f 100644 --- a/microsite/static/img/keycloak.svg +++ b/microsite/static/img/keycloak.svg @@ -1,22 +1 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/kiali.svg b/microsite/static/img/kiali.svg index bfc8510040..db7db43a3e 100644 --- a/microsite/static/img/kiali.svg +++ b/microsite/static/img/kiali.svg @@ -1,22 +1 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/linguist.svg b/microsite/static/img/linguist.svg index 3cddc1affc..89a788a275 100644 --- a/microsite/static/img/linguist.svg +++ b/microsite/static/img/linguist.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/nexus-repository-manager.svg b/microsite/static/img/nexus-repository-manager.svg index 6f145811cc..144fbb00d4 100644 --- a/microsite/static/img/nexus-repository-manager.svg +++ b/microsite/static/img/nexus-repository-manager.svg @@ -1,22 +1 @@ - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/microsite/static/img/nobl9.svg b/microsite/static/img/nobl9.svg index a4065df602..486fe446e3 100644 --- a/microsite/static/img/nobl9.svg +++ b/microsite/static/img/nobl9.svg @@ -1,4 +1 @@ - - - - + \ No newline at end of file diff --git a/microsite/static/img/ocm.svg b/microsite/static/img/ocm.svg index 6ee5c74f9e..f53f1f91cf 100644 --- a/microsite/static/img/ocm.svg +++ b/microsite/static/img/ocm.svg @@ -1,22 +1 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/octopus-deploy.svg b/microsite/static/img/octopus-deploy.svg index 45d8447277..fe077ea54e 100644 --- a/microsite/static/img/octopus-deploy.svg +++ b/microsite/static/img/octopus-deploy.svg @@ -1,13 +1 @@ - - - - - - + \ No newline at end of file diff --git a/microsite/static/img/plugin-feedback-logo.svg b/microsite/static/img/plugin-feedback-logo.svg index bd8014f9c7..da5dc0b46d 100644 --- a/microsite/static/img/plugin-feedback-logo.svg +++ b/microsite/static/img/plugin-feedback-logo.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/quay.svg b/microsite/static/img/quay.svg index cf3c5e435e..144fbb00d4 100644 --- a/microsite/static/img/quay.svg +++ b/microsite/static/img/quay.svg @@ -1,22 +1 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/s3-bucket.svg b/microsite/static/img/s3-bucket.svg index a92ac68982..7a68bc29cf 100644 --- a/microsite/static/img/s3-bucket.svg +++ b/microsite/static/img/s3-bucket.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/shortcuts.svg b/microsite/static/img/shortcuts.svg index c53a45c0ab..f30b3545c2 100644 --- a/microsite/static/img/shortcuts.svg +++ b/microsite/static/img/shortcuts.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/tech-radar.svg b/microsite/static/img/tech-radar.svg index 350ff4f9cc..1253ab0102 100644 --- a/microsite/static/img/tech-radar.svg +++ b/microsite/static/img/tech-radar.svg @@ -1,14 +1 @@ - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/tekton.svg b/microsite/static/img/tekton.svg index a5fdd252df..c0cfa30b74 100644 --- a/microsite/static/img/tekton.svg +++ b/microsite/static/img/tekton.svg @@ -1,32 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/terraform-logo.svg b/microsite/static/img/terraform-logo.svg index 9ec37bdab4..a23001feb0 100644 --- a/microsite/static/img/terraform-logo.svg +++ b/microsite/static/img/terraform-logo.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/topology.svg b/microsite/static/img/topology.svg index 21d84a888a..a848f79203 100644 --- a/microsite/static/img/topology.svg +++ b/microsite/static/img/topology.svg @@ -1,22 +1 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/microsite/static/img/wheel-of-names.svg b/microsite/static/img/wheel-of-names.svg index d6f19a06fb..b10efb2798 100644 --- a/microsite/static/img/wheel-of-names.svg +++ b/microsite/static/img/wheel-of-names.svg @@ -1,4 +1 @@ - - - - + \ No newline at end of file diff --git a/microsite/yarn.lock b/microsite/yarn.lock index 38b097cc63..9a1c627f7e 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -5,126 +5,94 @@ __metadata: version: 8 cacheKey: 10 -"@algolia/autocomplete-core@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-core@npm:1.9.3" +"@algolia/abtesting@npm:1.13.0": + version: 1.13.0 + resolution: "@algolia/abtesting@npm:1.13.0" dependencies: - "@algolia/autocomplete-plugin-algolia-insights": "npm:1.9.3" - "@algolia/autocomplete-shared": "npm:1.9.3" - checksum: 10/a0d195ecde8027f99d40f45a16ecc6db74302063576627f1660fc206d4a9a26fdfcbb4e21a9a6b7812f4f9d378eaa9a4d5899d8ccc9a8fc75cbbad3bb73fd13c + "@algolia/client-common": "npm:5.47.0" + "@algolia/requester-browser-xhr": "npm:5.47.0" + "@algolia/requester-fetch": "npm:5.47.0" + "@algolia/requester-node-http": "npm:5.47.0" + checksum: 10/e2523f868d47b7d2a19849fe3d68b96bc30d8d92cd8f48b42656c2a512c6ebc20fd87edef14a0ea1bf4fd4faaef3df0e8ed8092c128f1bfac3ad3d7ff1fff621 languageName: node linkType: hard -"@algolia/autocomplete-plugin-algolia-insights@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.9.3" +"@algolia/client-abtesting@npm:5.47.0": + version: 5.47.0 + resolution: "@algolia/client-abtesting@npm:5.47.0" dependencies: - "@algolia/autocomplete-shared": "npm:1.9.3" - peerDependencies: - search-insights: ">= 1 < 3" - checksum: 10/de0ddbf4813ac7403dbd1a91cdda950cfecff9cfd23bb5e5823dd2e2666b75c73241daf00c9d002446b625f402381fa23d72f16bb3f848a763f0b3c9851cad43 + "@algolia/client-common": "npm:5.47.0" + "@algolia/requester-browser-xhr": "npm:5.47.0" + "@algolia/requester-fetch": "npm:5.47.0" + "@algolia/requester-node-http": "npm:5.47.0" + checksum: 10/c4217e4fb076e5d99106b3d1f0ec54a22c7a78e060fde55e70296896bce30ece4093fcef87c8a32fd15e4e133bff1e7a9d66811fc878964d91038209082db63c languageName: node linkType: hard -"@algolia/autocomplete-preset-algolia@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-preset-algolia@npm:1.9.3" +"@algolia/client-analytics@npm:5.47.0": + version: 5.47.0 + resolution: "@algolia/client-analytics@npm:5.47.0" dependencies: - "@algolia/autocomplete-shared": "npm:1.9.3" - peerDependencies: - "@algolia/client-search": ">= 4.9.1 < 6" - algoliasearch: ">= 4.9.1 < 6" - checksum: 10/a0df95f377a9db4fe33207e59534cbd80893b1f3eb5fb631dc4b481f0afeaf47135da916500550b52a63d073d1d89df439407efd232201ead7ad65dcbcdce208 + "@algolia/client-common": "npm:5.47.0" + "@algolia/requester-browser-xhr": "npm:5.47.0" + "@algolia/requester-fetch": "npm:5.47.0" + "@algolia/requester-node-http": "npm:5.47.0" + checksum: 10/7fe3fcb31c67688c57b9abd16f0e5498eac96879ba1199aa00fef67dba8921b5ff9c0c36725f5700f89cf1bf75ff93564c5eb1b346c5e01f71c0817442de74fd languageName: node linkType: hard -"@algolia/autocomplete-shared@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-shared@npm:1.9.3" - peerDependencies: - "@algolia/client-search": ">= 4.9.1 < 6" - algoliasearch: ">= 4.9.1 < 6" - checksum: 10/2332d12268b7f9e8cd54954dace9d78791c44c44477b3dc37e15868f2244ae6cbf6f9650c1399a984646d37cf647f35284ecddbfcd98355925fae44ff4b11a4e +"@algolia/client-common@npm:5.47.0": + version: 5.47.0 + resolution: "@algolia/client-common@npm:5.47.0" + checksum: 10/b19a3b209d2a7d13d16f1380cb343b96513d7ee2bc5fcc85d8386e9f5dcccdab158b59e2fa0a66cf2dc428b2c9fbda4322facfce97e3d170f7369de8e667f728 languageName: node linkType: hard -"@algolia/cache-browser-local-storage@npm:4.20.0": - version: 4.20.0 - resolution: "@algolia/cache-browser-local-storage@npm:4.20.0" +"@algolia/client-insights@npm:5.47.0": + version: 5.47.0 + resolution: "@algolia/client-insights@npm:5.47.0" dependencies: - "@algolia/cache-common": "npm:4.20.0" - checksum: 10/b9ca7e190ab77ddf4d30d22223345f69fc89899aa6887ee716e4ffcef14c8c9d28b782cb7cc96a0f04eed95a989878a6feca5b9aa6add0cd1846222c3308bb65 + "@algolia/client-common": "npm:5.47.0" + "@algolia/requester-browser-xhr": "npm:5.47.0" + "@algolia/requester-fetch": "npm:5.47.0" + "@algolia/requester-node-http": "npm:5.47.0" + checksum: 10/cf78729b78d26400cd53282afd53ffba272e7327861468aee65c854ba2796389853d3e2e7a5d2660fc1cf0dab169b0c40eecdf5c4c0997f6c2b3117098c0027e languageName: node linkType: hard -"@algolia/cache-common@npm:4.20.0": - version: 4.20.0 - resolution: "@algolia/cache-common@npm:4.20.0" - checksum: 10/a46377de8a309feea109aae1283fc9157c73766a4c51e3085870a1fc49f6e33698814379f3bbdf475713fa0663dace86fc90f0466e64469b1b885a0538abace4 - languageName: node - linkType: hard - -"@algolia/cache-in-memory@npm:4.20.0": - version: 4.20.0 - resolution: "@algolia/cache-in-memory@npm:4.20.0" +"@algolia/client-personalization@npm:5.47.0": + version: 5.47.0 + resolution: "@algolia/client-personalization@npm:5.47.0" dependencies: - "@algolia/cache-common": "npm:4.20.0" - checksum: 10/3d67dcfae431605c8b9b1502f14865722f13b97b2822e1e3ed53bbf7bf66a120a825ccf5ed03476ebdf4aa15482dad5bfc6c2c93d81f07f862c373c689f49317 + "@algolia/client-common": "npm:5.47.0" + "@algolia/requester-browser-xhr": "npm:5.47.0" + "@algolia/requester-fetch": "npm:5.47.0" + "@algolia/requester-node-http": "npm:5.47.0" + checksum: 10/86d6732899256608d2fa26dc827e6a3f6d9f8aa08e2441be6bbb759cad23eabbf8bd6e474285bf864a122e9d4754e123456527a960a1e3368a37d5b8711f71d1 languageName: node linkType: hard -"@algolia/client-account@npm:4.20.0": - version: 4.20.0 - resolution: "@algolia/client-account@npm:4.20.0" +"@algolia/client-query-suggestions@npm:5.47.0": + version: 5.47.0 + resolution: "@algolia/client-query-suggestions@npm:5.47.0" dependencies: - "@algolia/client-common": "npm:4.20.0" - "@algolia/client-search": "npm:4.20.0" - "@algolia/transporter": "npm:4.20.0" - checksum: 10/b59e9c7a324bbfba4abdab3f41d333522eb1abce7dab74e69d297acd9ee2a3c60e82e5e9db42e6a46b5ea26a35728533e6e4ff846c631b588ceb73d14dcbc5fb + "@algolia/client-common": "npm:5.47.0" + "@algolia/requester-browser-xhr": "npm:5.47.0" + "@algolia/requester-fetch": "npm:5.47.0" + "@algolia/requester-node-http": "npm:5.47.0" + checksum: 10/b067110f7f3c655c1fb0cb97b66829ae21e9bc379f56174b159d83f0e44d53732be46cfc201dc12a6d95413a9e3a06431fcae8fa7cc6fb029e49113c975a40e5 languageName: node linkType: hard -"@algolia/client-analytics@npm:4.20.0": - version: 4.20.0 - resolution: "@algolia/client-analytics@npm:4.20.0" +"@algolia/client-search@npm:5.47.0": + version: 5.47.0 + resolution: "@algolia/client-search@npm:5.47.0" dependencies: - "@algolia/client-common": "npm:4.20.0" - "@algolia/client-search": "npm:4.20.0" - "@algolia/requester-common": "npm:4.20.0" - "@algolia/transporter": "npm:4.20.0" - checksum: 10/f46d47fdd12fc2e458599936f1fd54e346cfb161df35256291744eb39999294644d79befbbfa980b05f6adc98f7023c8a6de84f21a5c6d7eeadf846ada1ee155 - languageName: node - linkType: hard - -"@algolia/client-common@npm:4.20.0": - version: 4.20.0 - resolution: "@algolia/client-common@npm:4.20.0" - dependencies: - "@algolia/requester-common": "npm:4.20.0" - "@algolia/transporter": "npm:4.20.0" - checksum: 10/7418ba5a002fde8844da0f92d6779f2307520eb249737f20afe4679e4ab91eb2a5bf0606131dea3119f76e5c10b79a14ce62a460b1ed9b260ce730718e64b1bb - languageName: node - linkType: hard - -"@algolia/client-personalization@npm:4.20.0": - version: 4.20.0 - resolution: "@algolia/client-personalization@npm:4.20.0" - dependencies: - "@algolia/client-common": "npm:4.20.0" - "@algolia/requester-common": "npm:4.20.0" - "@algolia/transporter": "npm:4.20.0" - checksum: 10/987715df85fbefa9bc2eb96c09080a30e93c3fdd3d52b42a268c93f0d49dc2184bb06d7d1922029e1285b6ed66858ab2c7edff865a0d4bf40f3b44ca26785727 - languageName: node - linkType: hard - -"@algolia/client-search@npm:4.20.0": - version: 4.20.0 - resolution: "@algolia/client-search@npm:4.20.0" - dependencies: - "@algolia/client-common": "npm:4.20.0" - "@algolia/requester-common": "npm:4.20.0" - "@algolia/transporter": "npm:4.20.0" - checksum: 10/e82b56404be4447df491554c988db748463795f4c399cc5375a38531ab201d01bf6c937bd26a76dcef94855ff27fe4c779668732bc001691b34b3a9047852551 + "@algolia/client-common": "npm:5.47.0" + "@algolia/requester-browser-xhr": "npm:5.47.0" + "@algolia/requester-fetch": "npm:5.47.0" + "@algolia/requester-node-http": "npm:5.47.0" + checksum: 10/4a090c1dd0cd04c4aa21d860de2ae2120e6ae533a97aaa96b579a0a832d6dcfd1de9c5a49d71d0067cba43d0c5f538f70a20e11ea4e519c6041566225acde82b languageName: node linkType: hard @@ -135,65 +103,66 @@ __metadata: languageName: node linkType: hard -"@algolia/logger-common@npm:4.20.0": - version: 4.20.0 - resolution: "@algolia/logger-common@npm:4.20.0" - checksum: 10/06ed28f76b630c8e7597534b15138ab6f71c10dfc6e13f1fb1b76965b39c88fd1d9cb3fe6bb9d046de6533ebcbe5ad92e751bc36fabe98ceda39d1d5f47bb637 - languageName: node - linkType: hard - -"@algolia/logger-console@npm:4.20.0": - version: 4.20.0 - resolution: "@algolia/logger-console@npm:4.20.0" +"@algolia/ingestion@npm:1.47.0": + version: 1.47.0 + resolution: "@algolia/ingestion@npm:1.47.0" dependencies: - "@algolia/logger-common": "npm:4.20.0" - checksum: 10/721dffe37563e2998d4c361f09a05736b4baa141bfb7da25d50f890ba8257ac99845dd94b43d0d6db38e2fdab96508a726e184a00e5b1e83ef18a16da6fc716c + "@algolia/client-common": "npm:5.47.0" + "@algolia/requester-browser-xhr": "npm:5.47.0" + "@algolia/requester-fetch": "npm:5.47.0" + "@algolia/requester-node-http": "npm:5.47.0" + checksum: 10/ca2fe63092d7a208dc9ad7ddef0a091746ea7cca3992b072a06c1a1cb3d7ae5b648e475bb899d5f577b1c643056ccd69a98dc4042e39d8d9431df3dfd6659117 languageName: node linkType: hard -"@algolia/requester-browser-xhr@npm:4.20.0": - version: 4.20.0 - resolution: "@algolia/requester-browser-xhr@npm:4.20.0" +"@algolia/monitoring@npm:1.47.0": + version: 1.47.0 + resolution: "@algolia/monitoring@npm:1.47.0" dependencies: - "@algolia/requester-common": "npm:4.20.0" - checksum: 10/669790c7dfd491318976b9d61d98d9785880d7385ba33669f3f8b9c66ea88320bcded82d34f58b5df74b2cb8beb62ef48a28d39117f7997be84348c9fa7f6132 + "@algolia/client-common": "npm:5.47.0" + "@algolia/requester-browser-xhr": "npm:5.47.0" + "@algolia/requester-fetch": "npm:5.47.0" + "@algolia/requester-node-http": "npm:5.47.0" + checksum: 10/a60e8db8b7eff490f9e747554a94359c2e2f3a1b58045be299355f60adf93e2183aacbb83aa832be3bbcf01e0af4f2ea07e21b7c1c90645b92f659968c639ac5 languageName: node linkType: hard -"@algolia/requester-common@npm:4.20.0": - version: 4.20.0 - resolution: "@algolia/requester-common@npm:4.20.0" - checksum: 10/8d7aa1d8fc6f0e18ce759845af8150028e376bc85242a9e8db8e6ba3e71a7aaab8e7adfbf7db60b827c33861c59519bd67a7f6f44916b46827766ccb2907cfca - languageName: node - linkType: hard - -"@algolia/requester-node-http@npm:4.20.0": - version: 4.20.0 - resolution: "@algolia/requester-node-http@npm:4.20.0" +"@algolia/recommend@npm:5.47.0": + version: 5.47.0 + resolution: "@algolia/recommend@npm:5.47.0" dependencies: - "@algolia/requester-common": "npm:4.20.0" - checksum: 10/7857114b59c67e0d22e8a7ff3f755d11534a1602a4fc80802d3b35802777880a4980420914ea4a6e3e21198f5bacb95906289ce1bb9372458bf6a60a723bee59 + "@algolia/client-common": "npm:5.47.0" + "@algolia/requester-browser-xhr": "npm:5.47.0" + "@algolia/requester-fetch": "npm:5.47.0" + "@algolia/requester-node-http": "npm:5.47.0" + checksum: 10/ab57264e408a438ab5ad73168b631172afd65a635ca4d39c2c047932545fb494e1fcd7a23c1b8da11f22ed1e184800d5d5736112e36bd0b601bab2bf9e97983b languageName: node linkType: hard -"@algolia/transporter@npm:4.20.0": - version: 4.20.0 - resolution: "@algolia/transporter@npm:4.20.0" +"@algolia/requester-browser-xhr@npm:5.47.0": + version: 5.47.0 + resolution: "@algolia/requester-browser-xhr@npm:5.47.0" dependencies: - "@algolia/cache-common": "npm:4.20.0" - "@algolia/logger-common": "npm:4.20.0" - "@algolia/requester-common": "npm:4.20.0" - checksum: 10/d02db1b3fe18f4ab08e6ea90407c9dd8e09344ec9271f0eefbfea5ddc863ce8cc7e08e4854bbe67281ea5422bc5cc00c215041f6315f71f22d10f12270b8247c + "@algolia/client-common": "npm:5.47.0" + checksum: 10/6afed1f690c01969c9ef25a7368a2ea201eee155c268bf6082d0d71c0f77803779b8632a38281f3d4794c5140104e607fce8054f8143c9258b1fffc1409b31f0 languageName: node linkType: hard -"@ampproject/remapping@npm:^2.2.0": - version: 2.2.1 - resolution: "@ampproject/remapping@npm:2.2.1" +"@algolia/requester-fetch@npm:5.47.0": + version: 5.47.0 + resolution: "@algolia/requester-fetch@npm:5.47.0" dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.0" - "@jridgewell/trace-mapping": "npm:^0.3.9" - checksum: 10/e15fecbf3b54c988c8b4fdea8ef514ab482537e8a080b2978cc4b47ccca7140577ca7b65ad3322dcce65bc73ee6e5b90cbfe0bbd8c766dad04d5c62ec9634c42 + "@algolia/client-common": "npm:5.47.0" + checksum: 10/6dc1b107af2259d99e1a416f3bb8524c66fa5f75ab7870fb26dccc022bfaf6e23ab56e5bb029783278773598e2136605195512435a0fd16583fb611ed72a742e + languageName: node + linkType: hard + +"@algolia/requester-node-http@npm:5.47.0": + version: 5.47.0 + resolution: "@algolia/requester-node-http@npm:5.47.0" + dependencies: + "@algolia/client-common": "npm:5.47.0" + checksum: 10/36f48c3328da48818e88497fd463afaa4bb492883a030824d1c947eec244e8bf9f60b9801fa8340dab8028a4da57db0eb9d8de1c839381f18076e803bd4ad8af languageName: node linkType: hard @@ -208,367 +177,328 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.24.7, @babel/code-frame@npm:^7.8.3": - version: 7.24.7 - resolution: "@babel/code-frame@npm:7.24.7" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/code-frame@npm:7.28.6" dependencies: - "@babel/highlight": "npm:^7.24.7" - picocolors: "npm:^1.0.0" - checksum: 10/4812e94885ba7e3213d49583a155fdffb05292330f0a9b2c41b49288da70cf3c746a3fda0bf1074041a6d741c33f8d7be24be5e96f41ef77395eeddc5c9ff624 + "@babel/helper-validator-identifier": "npm:^7.28.5" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10/93e7ed9e039e3cb661bdb97c26feebafacc6ec13d745881dae5c7e2708f579475daebe7a3b5d23b183bb940b30744f52f4a5bcb65b4df03b79d82fcb38495784 languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.2, @babel/compat-data@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/compat-data@npm:7.25.4" - checksum: 10/d37a8936cc355a9ca3050102e03d179bdae26bd2e5c99a977637376c192b23637a039795f153c849437a086727628c9860e2c6af92d7151396e2362c09176337 +"@babel/compat-data@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/compat-data@npm:7.28.6" + checksum: 10/dc17dfb55711a15f006e34c4610c49b7335fc11b23e192f9e5f625e8ea0f48805e61a57b6b4f5550879332782c93af0b5d6952825fffbb8d4e604b14d698249f languageName: node linkType: hard -"@babel/core@npm:^7.21.3, @babel/core@npm:^7.23.3": - version: 7.25.2 - resolution: "@babel/core@npm:7.25.2" +"@babel/core@npm:^7.21.3, @babel/core@npm:^7.25.9": + version: 7.28.6 + resolution: "@babel/core@npm:7.28.6" dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.0" - "@babel/helper-compilation-targets": "npm:^7.25.2" - "@babel/helper-module-transforms": "npm:^7.25.2" - "@babel/helpers": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.0" - "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.2" - "@babel/types": "npm:^7.25.2" + "@babel/code-frame": "npm:^7.28.6" + "@babel/generator": "npm:^7.28.6" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-module-transforms": "npm:^7.28.6" + "@babel/helpers": "npm:^7.28.6" + "@babel/parser": "npm:^7.28.6" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + "@jridgewell/remapping": "npm:^2.3.5" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 10/0d6ec10ff430df66f654c089d6f7ef1d9bed0c318ac257ad5f0dfa0caa45666011828ae75f998bcdb279763e892b091b2925d0bc483299e61649d2c7a2245e33 + checksum: 10/1a150a69c547daf13c457be1fdaf1a0935d02b94605e777e049537ec2f279b4bb442ffbe1c2d8ff62c688878b1d5530a5784daf72ece950d1917fb78717f51d2 languageName: node linkType: hard -"@babel/generator@npm:^7.23.3, @babel/generator@npm:^7.25.0, @babel/generator@npm:^7.25.4": - version: 7.25.5 - resolution: "@babel/generator@npm:7.25.5" +"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/generator@npm:7.28.6" dependencies: - "@babel/types": "npm:^7.25.4" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^2.5.1" - checksum: 10/e6d046afe739cfa706c40c127b7436731acb2a3146d408a7d89dbf16448491b35bc09b7d285cc19c2c1f8980d74b5a99df200d67c859bb5260986614685b0770 + "@babel/parser": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" + jsesc: "npm:^3.0.2" + checksum: 10/ef2af927e8e0985d02ec4321a242da761a934e927539147c59fdd544034dc7f0e9846f6bf86209aca7a28aee2243ed0fad668adccd48f96d7d6866215173f9af languageName: node linkType: hard -"@babel/helper-annotate-as-pure@npm:^7.22.5, @babel/helper-annotate-as-pure@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-annotate-as-pure@npm:7.24.7" +"@babel/helper-annotate-as-pure@npm:^7.27.1, @babel/helper-annotate-as-pure@npm:^7.27.3": + version: 7.27.3 + resolution: "@babel/helper-annotate-as-pure@npm:7.27.3" dependencies: - "@babel/types": "npm:^7.24.7" - checksum: 10/a9017bfc1c4e9f2225b967fbf818004703de7cf29686468b54002ffe8d6b56e0808afa20d636819fcf3a34b89ba72f52c11bdf1d69f303928ee10d92752cad95 + "@babel/types": "npm:^7.27.3" + checksum: 10/63863a5c936ef82b546ca289c9d1b18fabfc24da5c4ee382830b124e2e79b68d626207febc8d4bffc720f50b2ee65691d7d12cc0308679dee2cd6bdc926b7190 languageName: node linkType: hard -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.24.7" +"@babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-compilation-targets@npm:7.28.6" dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10/3ddff45d1e086c9c6dcef53ef46521a0c11ddb09fe3ab42dca5af6bb1b1703895a9f4f8056f49fdf53c2dbf6e5cf1ddb4baf17d7e3766c63f051ab8d60a919ee - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.24.7, @babel/helper-compilation-targets@npm:^7.24.8, @babel/helper-compilation-targets@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-compilation-targets@npm:7.25.2" - dependencies: - "@babel/compat-data": "npm:^7.25.2" - "@babel/helper-validator-option": "npm:^7.24.8" - browserslist: "npm:^4.23.1" + "@babel/compat-data": "npm:^7.28.6" + "@babel/helper-validator-option": "npm:^7.27.1" + browserslist: "npm:^4.24.0" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 10/eccb2d75923d2d4d596f9ff64716e8664047c4192f1b44c7d5c07701d4a3498ac2587a72ddae1046e65a501bc630eb7df4557958b08ec2dcf5b4a264a052f111 + checksum: 10/f512a5aeee4dfc6ea8807f521d085fdca8d66a7d068a6dd5e5b37da10a6081d648c0bbf66791a081e4e8e6556758da44831b331540965dfbf4f5275f3d0a8788 languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.24.7, @babel/helper-create-class-features-plugin@npm:^7.25.0, @babel/helper-create-class-features-plugin@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/helper-create-class-features-plugin@npm:7.25.4" +"@babel/helper-create-class-features-plugin@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-create-class-features-plugin@npm:7.28.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-member-expression-to-functions": "npm:^7.24.8" - "@babel/helper-optimise-call-expression": "npm:^7.24.7" - "@babel/helper-replace-supers": "npm:^7.25.0" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" - "@babel/traverse": "npm:^7.25.4" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-member-expression-to-functions": "npm:^7.28.5" + "@babel/helper-optimise-call-expression": "npm:^7.27.1" + "@babel/helper-replace-supers": "npm:^7.28.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.6" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/47218da9fd964af30d41f0635d9e33eed7518e03aa8f10c3eb8a563bb2c14f52be3e3199db5912ae0e26058c23bb511c811e565c55ecec09427b04b867ed13c2 + checksum: 10/11f55607fcf66827ade745c0616aa3c6086aa655c0fab665dd3c4961829752e4c94c942262db30c4831ef9bce37ad444722e85ef1b7136587e28c6b1ef8ad43c languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.24.7, @babel/helper-create-regexp-features-plugin@npm:^7.25.0, @babel/helper-create-regexp-features-plugin@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.25.2" +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.27.1, @babel/helper-create-regexp-features-plugin@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.28.5" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - regexpu-core: "npm:^5.3.1" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + regexpu-core: "npm:^6.3.1" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/33dd627eef9e4229aba66789efd8fb7342fc2667b821d4b7947c7294f6d472cf025ff2db9b358a1e03de98376de44e839f0611a456a57127fd6e4b4dbfc96c51 + checksum: 10/d8791350fe0479af0909aa5efb6dfd3bacda743c7c3f8fa1b0bb18fe014c206505834102ee24382df1cfe5a83b4e4083220e97f420a48b2cec15bb1ad6c7c9d3 languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.4.2": - version: 0.4.2 - resolution: "@babel/helper-define-polyfill-provider@npm:0.4.2" +"@babel/helper-define-polyfill-provider@npm:^0.6.5, @babel/helper-define-polyfill-provider@npm:^0.6.6": + version: 0.6.6 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.6" dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.6" - "@babel/helper-plugin-utils": "npm:^7.22.5" - debug: "npm:^4.1.1" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + debug: "npm:^4.4.3" lodash.debounce: "npm:^4.0.8" - resolve: "npm:^1.14.2" + resolve: "npm:^1.22.11" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/6383a34af4048957e46366fa7e6228b61e140955a707f8af7b69c26b2b780880db164d08b6de9420f6ec5a0ee01eb23aa5d78a4b141f2b65b3670e71906471bf + checksum: 10/1c725c47bafb10ae4527aff6741b44ca49b18bf7005ae4583b15f992783e7c1d7687eab1a5583a373b5494160d46e91e29145280bd850e97d36b8b01bc5fef99 languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.6.2": - version: 0.6.2 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" - dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.6" - "@babel/helper-plugin-utils": "npm:^7.22.5" - debug: "npm:^4.1.1" - lodash.debounce: "npm:^4.0.8" - resolve: "npm:^1.14.2" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/bb32ec12024d3f16e70641bc125d2534a97edbfdabbc9f69001ec9c4ce46f877c7a224c566aa6c8c510c3b0def2e43dc4433bf6a40896ba5ce0cef4ea5ccbcff +"@babel/helper-globals@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/helper-globals@npm:7.28.0" + checksum: 10/91445f7edfde9b65dcac47f4f858f68dc1661bf73332060ab67ad7cc7b313421099a2bfc4bda30c3db3842cfa1e86fffbb0d7b2c5205a177d91b22c8d7d9cb47 languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-member-expression-to-functions@npm:7.24.8" +"@babel/helper-member-expression-to-functions@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-member-expression-to-functions@npm:7.28.5" dependencies: - "@babel/traverse": "npm:^7.24.8" - "@babel/types": "npm:^7.24.8" - checksum: 10/ac878761cfd0a46c081cda0da75cc186f922cf16e8ecdd0c4fb6dca4330d9fe4871b41a9976224cf9669c9e7fe0421b5c27349f2e99c125fa0be871b327fa770 + "@babel/traverse": "npm:^7.28.5" + "@babel/types": "npm:^7.28.5" + checksum: 10/05e0857cf7913f03d88ca62952d3888693c21a4f4d7cfc141c630983f71fc0a64393e05cecceb7701dfe98298f7cc38fcb735d892e3c8c6f56f112c85ee1b154 languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-module-imports@npm:7.24.7" +"@babel/helper-module-imports@npm:^7.27.1, @babel/helper-module-imports@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-module-imports@npm:7.28.6" dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10/df8bfb2bb18413aa151ecd63b7d5deb0eec102f924f9de6bc08022ced7ed8ca7fed914562d2f6fa5b59b74a5d6e255dc35612b2bc3b8abf361e13f61b3704770 + "@babel/traverse": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/64b1380d74425566a3c288074d7ce4dea56d775d2d3325a3d4a6df1dca702916c1d268133b6f385de9ba5b822b3c6e2af5d3b11ac88e5453d5698d77264f0ec0 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.24.7, @babel/helper-module-transforms@npm:^7.24.8, @babel/helper-module-transforms@npm:^7.25.0, @babel/helper-module-transforms@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-module-transforms@npm:7.25.2" +"@babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.28.3, @babel/helper-module-transforms@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-module-transforms@npm:7.28.6" dependencies: - "@babel/helper-module-imports": "npm:^7.24.7" - "@babel/helper-simple-access": "npm:^7.24.7" - "@babel/helper-validator-identifier": "npm:^7.24.7" - "@babel/traverse": "npm:^7.25.2" + "@babel/helper-module-imports": "npm:^7.28.6" + "@babel/helper-validator-identifier": "npm:^7.28.5" + "@babel/traverse": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/a3bcf7815f3e9d8b205e0af4a8d92603d685868e45d119b621357e274996bf916216bb95ab5c6a60fde3775b91941555bf129d608e3d025b04f8aac84589f300 + checksum: 10/2e421c7db743249819ee51e83054952709dc2e197c7d5d415b4bdddc718580195704bfcdf38544b3f674efc2eccd4d29a65d38678fc827ed3934a7690984cd8b languageName: node linkType: hard -"@babel/helper-optimise-call-expression@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-optimise-call-expression@npm:7.24.7" +"@babel/helper-optimise-call-expression@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-optimise-call-expression@npm:7.27.1" dependencies: - "@babel/types": "npm:^7.24.7" - checksum: 10/da7a7f2d1bb1be4cffd5fa820bd605bc075c7dd014e0458f608bb6f34f450fe9412c8cea93e788227ab396e0e02c162d7b1db3fbcb755a6360e354c485d61df0 + "@babel/types": "npm:^7.27.1" + checksum: 10/0fb7ee824a384529d6b74f8a58279f9b56bfe3cce332168067dddeab2552d8eeb56dc8eaf86c04a3a09166a316cb92dfc79c4c623cd034ad4c563952c98b464f languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.24.8, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.24.8 - resolution: "@babel/helper-plugin-utils@npm:7.24.8" - checksum: 10/adbc9fc1142800a35a5eb0793296924ee8057fe35c61657774208670468a9fbfbb216f2d0bc46c680c5fefa785e5ff917cc1674b10bd75cdf9a6aa3444780630 +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.24.8, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.28.6, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.28.6 + resolution: "@babel/helper-plugin-utils@npm:7.28.6" + checksum: 10/21c853bbc13dbdddf03309c9a0477270124ad48989e1ad6524b83e83a77524b333f92edd2caae645c5a7ecf264ec6d04a9ebe15aeb54c7f33c037b71ec521e4a languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.24.7, @babel/helper-remap-async-to-generator@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helper-remap-async-to-generator@npm:7.25.0" +"@babel/helper-remap-async-to-generator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-remap-async-to-generator@npm:7.27.1" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-wrap-function": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.0" + "@babel/helper-annotate-as-pure": "npm:^7.27.1" + "@babel/helper-wrap-function": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/6b1ab73a067008c92e2fe5b7a9f39aab32e7f5a8c5eaf0a864436c21791f708ad8619d4a509febdfe934aeb373af4baa7c7d9f41181b385e09f39eaf11ca108e + checksum: 10/0747397ba013f87dbf575454a76c18210d61c7c9af0f697546b4bcac670b54ddc156330234407b397f0c948738c304c228e0223039bc45eab4fbf46966a5e8cc languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.24.7, @babel/helper-replace-supers@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helper-replace-supers@npm:7.25.0" +"@babel/helper-replace-supers@npm:^7.27.1, @babel/helper-replace-supers@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-replace-supers@npm:7.28.6" dependencies: - "@babel/helper-member-expression-to-functions": "npm:^7.24.8" - "@babel/helper-optimise-call-expression": "npm:^7.24.7" - "@babel/traverse": "npm:^7.25.0" + "@babel/helper-member-expression-to-functions": "npm:^7.28.5" + "@babel/helper-optimise-call-expression": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/97c6c17780cb9692132f7243f5a21fb6420104cb8ff8752dc03cfc9a1912a243994c0290c77ff096637ab6f2a7363b63811cfc68c2bad44e6b39460ac2f6a63f + checksum: 10/ad2724713a4d983208f509e9607e8f950855f11bd97518a700057eb8bec69d687a8f90dc2da0c3c47281d2e3b79cf1d14ecf1fe3e1ee0a8e90b61aee6759c9a7 languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-simple-access@npm:7.24.7" +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.27.1" dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10/5083e190186028e48fc358a192e4b93ab320bd016103caffcfda81302a13300ccce46c9cd255ae520c25d2a6a9b47671f93e5fe5678954a2329dc0a685465c49 + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10/4f380c5d0e0769fa6942a468b0c2d7c8f0c438f941aaa88f785f8752c103631d0904c7b4e76207a3b0e6588b2dec376595370d92ca8f8f1b422c14a69aa146d4 languageName: node linkType: hard -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.24.7" +"@babel/helper-string-parser@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-string-parser@npm:7.27.1" + checksum: 10/0ae29cc2005084abdae2966afdb86ed14d41c9c37db02c3693d5022fba9f5d59b011d039380b8e537c34daf117c549f52b452398f576e908fb9db3c7abbb3a00 + languageName: node + linkType: hard + +"@babel/helper-validator-identifier@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-validator-identifier@npm:7.28.5" + checksum: 10/8e5d9b0133702cfacc7f368bf792f0f8ac0483794877c6dca5fcb73810ee138e27527701826fb58a40a004f3a5ec0a2f3c3dd5e326d262530b119918f3132ba7 + languageName: node + linkType: hard + +"@babel/helper-validator-option@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-option@npm:7.27.1" + checksum: 10/db73e6a308092531c629ee5de7f0d04390835b21a263be2644276cb27da2384b64676cab9f22cd8d8dbd854c92b1d7d56fc8517cf0070c35d1c14a8c828b0903 + languageName: node + linkType: hard + +"@babel/helper-wrap-function@npm:^7.27.1": + version: 7.28.6 + resolution: "@babel/helper-wrap-function@npm:7.28.6" dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10/784a6fdd251a9a7e42ccd04aca087ecdab83eddc60fda76a2950e00eb239cc937d3c914266f0cc476298b52ac3f44ffd04c358e808bd17552a7e008d75494a77 + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/d8a895a75399904746f4127db33593a20021fc55d1a5b5dfeb060b87cc13a8dceea91e70a4951bcd376ba9bd8232b0c04bff9a86c1dab83d691e01852c3b5bcd languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-string-parser@npm:7.24.8" - checksum: 10/6d1bf8f27dd725ce02bdc6dffca3c95fb9ab8a06adc2edbd9c1c9d68500274230d1a609025833ed81981eff560045b6b38f7b4c6fb1ab19fc90e5004e3932535 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-validator-identifier@npm:7.24.7" - checksum: 10/86875063f57361471b531dbc2ea10bbf5406e12b06d249b03827d361db4cad2388c6f00936bcd9dc86479f7e2c69ea21412c2228d4b3672588b754b70a449d4b - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.22.15, @babel/helper-validator-option@npm:^7.24.7, @babel/helper-validator-option@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-validator-option@npm:7.24.8" - checksum: 10/a52442dfa74be6719c0608fee3225bd0493c4057459f3014681ea1a4643cd38b68ff477fe867c4b356da7330d085f247f0724d300582fa4ab9a02efaf34d107c - languageName: node - linkType: hard - -"@babel/helper-wrap-function@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helper-wrap-function@npm:7.25.0" +"@babel/helpers@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helpers@npm:7.28.6" dependencies: - "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.0" - "@babel/types": "npm:^7.25.0" - checksum: 10/08724128b9c540c02a59f02f9c1c9940fe5363d85d0f30ec826a4f926afdb26fa4ec33ca2b88b4aa745fe3dbe1f44be2969b8a03af259af7945d8cd3262168d3 + "@babel/template": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/213485cdfffc4deb81fc1bf2cefed61bc825049322590ef69690e223faa300a2a4d1e7d806c723bb1f1f538226b9b1b6c356ca94eb47fa7c6d9e9f251ee425e6 languageName: node linkType: hard -"@babel/helpers@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/helpers@npm:7.25.0" +"@babel/parser@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/parser@npm:7.28.6" dependencies: - "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.0" - checksum: 10/4fcb8167eba9853e30b8b235b81b923ef7b707396b0e23d7a4fa3e811729506755576cb9ec736e8b92cf19e5a1ec61e83d182904d8e6a0953803c6bebc2e1592 - languageName: node - linkType: hard - -"@babel/highlight@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/highlight@npm:7.24.7" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.24.7" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10/69b73f38cdd4f881b09b939a711e76646da34f4834f4ce141d7a49a6bb1926eab1c594148970a8aa9360398dff800f63aade4e81fafdd7c8d8a8489ea93bfec1 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/parser@npm:7.25.4" - dependencies: - "@babel/types": "npm:^7.25.4" + "@babel/types": "npm:^7.28.6" bin: parser: ./bin/babel-parser.js - checksum: 10/343b8a76c43549e370fe96f4f6d564382a6cdff60e9c3b8a594c51e4cefd58ec9945e82e8c4dfbf15ac865a04e4b29806531440760748e28568e6aec21bc9cb5 + checksum: 10/483a6fb5f9876ec9cbbb98816f2c94f39ae4d1158d35f87e1c4bf19a1f56027c96a1a3962ff0c8c46e8322a6d9e1c80d26b7f9668410df13d5b5769d9447b010 languageName: node linkType: hard -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.3": - version: 7.25.3 - resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.3" +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.28.5" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/traverse": "npm:^7.25.3" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.5" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/9743feb0152f2ac686aaee6dfd41e8ea211989a459d4c2b10b531442f6865057cd1a502515634c25462b155bc58f0710267afed72396780e9b72be25370dd577 + checksum: 10/750de98b34e6d09b545ded6e635b43cbab02fe319622964175259b98f41b16052e5931c4fbd45bad8cd0a37ebdd381233edecec9ee395b8ec51f47f47d1dbcd4 languageName: node linkType: hard -"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.0" +"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/5e504bba884a4500e71224d344efb1e70ebbeabd621e07a58f2d3c0d14a71a49c97b4989259a288cdbbfacebfea224397acf1217d26c77aebf9aa35bdd988249 + checksum: 10/eb7f4146dc01f1198ce559a90b077e58b951a07521ec414e3c7d4593bf6c4ab5c2af22242a7e9fec085e20299e0ba6ea97f44a45e84ab148141bf9eb959ad25e languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.0" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/f574beb1d4f723bb9b913ce379259a55b50a308364585ccb83e00d933465c26c04cbbc85a06e6d4c829279eb1021b3236133d486b3ff11cfd90ad815c8b478d2 + checksum: 10/621cfddfcc99a81e74f8b6f9101fd260b27500cb1a568e3ceae9cc8afe9aee45ac3bca3900a2b66c612b1a2366d29ef67d4df5a1c975be727eaad6906f98c2c6 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.7" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" - "@babel/plugin-transform-optional-chaining": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + "@babel/plugin-transform-optional-chaining": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.13.0 - checksum: 10/887f1b8bd0ef61206ece47919fda78a32eef35da31c0d95ab8d7adc8b4722534dc5177c86c8d6d81bcf4343f3c08c6adab2b46cfd2bea8e33c6c04e51306f9cc + checksum: 10/f07aa80272bd7a46b7ba11a4644da6c9b6a5a64e848dfaffdad6f02663adefd512e1aaebe664c4dd95f7ed4f80c872c7f8db8d8e34b47aae0930b412a28711a0 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.0" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/traverse": "npm:^7.25.0" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/traverse": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/de04a9342e9a0db1673683112c83cdc52173f489f45aeed864ceba72dfba8c8588e565171e64cb2a408a09269e5fb35c6ab4ef50e3e649c4f8c0c787feb5c048 + checksum: 10/9377897aa7cba3a0b78a7c6015799ff71504b2b203329357e42ab3185d44aab07344ba33f5dd53f14d5340c1dc5a2587346343e0859538947bbab0484e72b914 languageName: node linkType: hard @@ -581,39 +511,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-async-generators@npm:^7.8.4": - version: 7.8.4 - resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 - languageName: node - linkType: hard - -"@babel/plugin-syntax-class-properties@npm:^7.12.13": - version: 7.12.13 - resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.12.13" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc - languageName: node - linkType: hard - -"@babel/plugin-syntax-class-static-block@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/3e80814b5b6d4fe17826093918680a351c2d34398a914ce6e55d8083d72a9bdde4fbaf6a2dcea0e23a03de26dc2917ae3efd603d27099e2b98380345703bf948 - languageName: node - linkType: hard - "@babel/plugin-syntax-dynamic-import@npm:^7.8.3": version: 7.8.3 resolution: "@babel/plugin-syntax-dynamic-import@npm:7.8.3" @@ -625,168 +522,47 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-export-namespace-from@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-export-namespace-from@npm:7.8.3" +"@babel/plugin-syntax-import-assertions@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/85740478be5b0de185228e7814451d74ab8ce0a26fcca7613955262a26e99e8e15e9da58f60c754b84515d4c679b590dbd3f2148f0f58025f4ae706f1c5a5d4a + checksum: 10/25017235e1e2c4ed892aa327a3fa10f4209cc618c6dd7806fc40c07d8d7d24a39743d3d5568b8d1c8f416cffe03c174e78874ded513c9338b07a7ab1dcbab050 languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.7" +"@babel/plugin-syntax-import-attributes@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/bd065cd73ae3dbe69e6f9167aa605da3df77d69bbad2ede95e4aa9e7af7744d5bc1838b928c77338ca62df7691a7adf6e608279be50c18e4b3c70cf77e3013d7 + checksum: 10/6c8c6a5988dbb9799d6027360d1a5ba64faabf551f2ef11ba4eade0c62253b5c85d44ddc8eb643c74b9acb2bcaa664a950bd5de9a5d4aef291c4f2a48223bb4b languageName: node linkType: hard -"@babel/plugin-syntax-import-attributes@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.7" +"@babel/plugin-syntax-jsx@npm:^7.27.1, @babel/plugin-syntax-jsx@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-jsx@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/22fc50bd85a491bb8d22065f330a41f60d66f2f2d7a1deb73e80c8a4b5d7a42a092a03f8da18800650eca0fc14585167cc4e5c9fab351f0d390d1592347162ae + checksum: 10/572e38f5c1bb4b8124300e7e3dd13e82ae84a21f90d3f0786c98cd05e63c78ca1f32d1cfe462dfbaf5e7d5102fa7cd8fd741dfe4f3afc2e01a3b2877dcc8c866 languageName: node linkType: hard -"@babel/plugin-syntax-import-meta@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" +"@babel/plugin-syntax-typescript@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-typescript@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b - languageName: node - linkType: hard - -"@babel/plugin-syntax-json-strings@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a - languageName: node - linkType: hard - -"@babel/plugin-syntax-jsx@npm:^7.22.5, @babel/plugin-syntax-jsx@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-syntax-jsx@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/a93516ae5b34868ab892a95315027d4e5e38e8bd1cfca6158f2974b0901cbb32bbe64ea10ad5b25f919ddc40c6d8113c4823372909c9c9922170c12b0b1acecb - languageName: node - linkType: hard - -"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 - languageName: node - linkType: hard - -"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 - languageName: node - linkType: hard - -"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 - languageName: node - linkType: hard - -"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf - languageName: node - linkType: hard - -"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 - languageName: node - linkType: hard - -"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 - languageName: node - linkType: hard - -"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/b317174783e6e96029b743ccff2a67d63d38756876e7e5d0ba53a322e38d9ca452c13354a57de1ad476b4c066dbae699e0ca157441da611117a47af88985ecda - languageName: node - linkType: hard - -"@babel/plugin-syntax-top-level-await@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e - languageName: node - linkType: hard - -"@babel/plugin-syntax-typescript@npm:^7.24.7": - version: 7.25.4 - resolution: "@babel/plugin-syntax-typescript@npm:7.25.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/0771b45a35fd536cd3b3a48e5eda0f53e2d4f4a0ca07377cc247efa39eaf6002ed1c478106aad2650e54aefaebcb4f34f3284c4ae9252695dbd944bf66addfb0 + checksum: 10/5c55f9c63bd36cf3d7e8db892294c8f85000f9c1526c3a1cc310d47d1e174f5c6f6605e5cc902c4636d885faba7a9f3d5e5edc6b35e4f3b1fd4c2d58d0304fa5 languageName: node linkType: hard @@ -802,466 +578,467 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.7" +"@babel/plugin-transform-arrow-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/6720173645826046878015c579c2ca9d93cdba79a2832f0180f5cf147d9817c85bf9c8338b16d6bdaa71f87809b7a194a6902e6c82ec00b6354aca6b40abe5e6 + checksum: 10/62c2cc0ae2093336b1aa1376741c5ed245c0987d9e4b4c5313da4a38155509a7098b5acce582b6781cc0699381420010da2e3086353344abe0a6a0ec38961eb7 languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.4" +"@babel/plugin-transform-async-generator-functions@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-remap-async-to-generator": "npm:^7.25.0" - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" - "@babel/traverse": "npm:^7.25.4" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-remap-async-to-generator": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/0004d910bbec3ef916acf5c7cf8b11671e65d2dd425a82f1101838b9b6243bfdf9578335584d9dedd20acc162796b687930e127c6042484e05b758af695e6cb8 + checksum: 10/b3c9e62a90808e8ad0e1608a7fd7169a5bfba3b54f0d8590495e7b0d95b25e882f45062f490e4ab6823bb9758da3619d645c9a536ae77e62cb9abe38400a8c08 languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.7" +"@babel/plugin-transform-async-to-generator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.28.6" dependencies: - "@babel/helper-module-imports": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-remap-async-to-generator": "npm:^7.24.7" + "@babel/helper-module-imports": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-remap-async-to-generator": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/b2041d9d50b09afef983c4f1dece63fdfc5a8e4646e42591db398bc4322958434d60b3cb0f5d0f9f9dbdad8577e8a1a33ba9859aacc3004bf6d25d094d20193f + checksum: 10/bca5774263ec01dd2bf71c74bbaf7baa183bf03576636b7826c3346be70c8c8cb15cff549112f2983c36885131a0afde6c443591278c281f733ee17f455aa9b1 languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.7" +"@babel/plugin-transform-block-scoped-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/33e2fb9f24c11889b2bacbe9c3625f738edafc2136c8206598e0422664267ec5ca9422cb4563cc42039ccfc333fb42ce5f8513382e56c5b02f934005d0d6e8ff + checksum: 10/7fb4988ca80cf1fc8345310d5edfe38e86b3a72a302675cdd09404d5064fe1d1fe1283ebe658ad2b71445ecef857bfb29a748064306b5f6c628e0084759c2201 languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-block-scoping@npm:7.25.0" +"@babel/plugin-transform-block-scoping@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-block-scoping@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/981e565a8ff1e1f8d539b5ff067328517233142b131329d11e6c60405204e2a4a993828c367f7dc729a9608aabebdada869616563816e5f8f1385e91ac0fa4d6 + checksum: 10/7ab8a0856024a5360ba16c3569b739385e939bc5a15ad7d811bec8459361a9aa5ee7c5f154a4e2ce79f5d66779c19464e7532600c31a1b6f681db4eb7e1c7bde languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/plugin-transform-class-properties@npm:7.25.4" +"@babel/plugin-transform-class-properties@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-class-properties@npm:7.28.6" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.25.4" - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/203a21384303d66fb5d841b77cba8b8994623ff4d26d208e3d05b36858c4919626a8d74871fa4b9195310c2e7883bf180359c4f5a76481ea55190c224d9746f4 + checksum: 10/200f30d44b36a768fa3a8cf690db9e333996af2ad14d9fa1b4c91a427ed9302907873b219b4ce87517ca1014a810eb2e929a6a66be68473f72b546fc64d04fbc languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-class-static-block@npm:7.24.7" +"@babel/plugin-transform-class-static-block@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-class-static-block@npm:7.28.6" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.12.0 - checksum: 10/00b4d35788bcfefb56b6a1d3506ca23f11dd55d4bb5a34eb70397c06283dc7f596cd9d40995c4a6cb897b45ad220de211f854e7a030a05e26a307c8f56b6ba4b + checksum: 10/bea7836846deefd02d9976ad1b30b5ade0d6329ecd92866db789dcf6aacfaf900b7a77031e25680f8de5ad636a771a5bdca8961361e6218d45d538ec5d9b71cc languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/plugin-transform-classes@npm:7.25.4" +"@babel/plugin-transform-classes@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-classes@npm:7.28.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-compilation-targets": "npm:^7.25.2" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-replace-supers": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.4" - globals: "npm:^11.1.0" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-globals": "npm:^7.28.0" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-replace-supers": "npm:^7.28.6" + "@babel/traverse": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/17db5889803529bec366c6f0602687fdd605c2fec8cb6fe918261cb55cd89e9d8c9aa2aa6f3fd64d36492ce02d7d0752b09a284b0f833c1185f7dad9b9506310 + checksum: 10/9c3278a314d1c4bcda792bb22aced20e30c735557daf9bcc56397c0f3eb54761b21c770219e4581036a10dabda3e597321ed093bc245d5f4d561e19ceff66a6d languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-computed-properties@npm:7.24.7" +"@babel/plugin-transform-computed-properties@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-computed-properties@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/template": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/template": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/fecf3c770b2dd8e70be6da12d4dd0273de9d8ef4d0f46be98d56fddb3a451932cdc9bb81de3057c9acb903e05ece657886cc31886d5762afa7b0a256db0f791e + checksum: 10/4a5e270f7e1f1e9787cf7cf133d48e3c1e38eb935d29a90331a1324d7c720f589b7b626b2e6485cd5521a7a13f2dbdc89a3e46ecbe7213d5bbb631175267c4aa languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/plugin-transform-destructuring@npm:7.24.8" +"@babel/plugin-transform-destructuring@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-transform-destructuring@npm:7.28.5" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e3bba0bb050592615fbf062ea07ae94f99e9cf22add006eaa66ed672d67ff7051b578a5ea68a7d79f9184fb3c27c65333d86b0b8ea04f9810bcccbeea2ffbe76 + checksum: 10/9cc67d3377bc5d8063599f2eb4588f5f9a8ab3abc9b64a40c24501fb3c1f91f4d5cf281ea9f208fd6b2ef8d9d8b018dacf1bed9493334577c966cd32370a7036 languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.7" +"@babel/plugin-transform-dotall-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.28.6" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/51b75638748f6e5adab95b711d3365b8d7757f881c178946618a43b15063ec1160b07f4aa3b116bf3f1e097a88226a01db4cae2c5c4aad4c71fe5568828a03f5 + checksum: 10/866ffbbdee77fa955063b37c75593db8dbbe46b1ebb64cc788ea437e3a9aa41cb7b9afcee617c678a32b6705baa0892ec8e5d4b8af3bbb0ab1b254514ccdbd37 languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.7" +"@babel/plugin-transform-duplicate-keys@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/4284d8fe058c838f80d594bace1380ce02995fa9a271decbece59c40815bc2f7e715807dcbe4d5da8b444716e6d05cc6d79771f500fb044cd0dd00ce4324b619 + checksum: 10/987b718d2fab7626f61b72325c8121ead42341d6f46ad3a9b5e5f67f3ec558c903f1b8336277ffc43caac504ce00dd23a5456b5d1da23913333e1da77751f08d languageName: node linkType: hard -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.0" +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.28.6" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.0" - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/869c08def8eb80e3619c77e7af962dd82323a8447697298f461624077593c7b7082fc2238989880a0c0ba94bc6442300fd23e33255ac225760bc8bb755268941 + checksum: 10/3f2e2b85199adfdc3297983412c2ecdacc0004bc5ac3263d29909219b8c5afa2ca49e3b6efc11ce67034d5780eef27882a94873444cf27d841d7fa7f01d7dcff languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.7" +"@babel/plugin-transform-dynamic-import@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e949c02aa57098d916eb6edcbef0f3f7d62640f37e1a061b0692523964e081f8182f2c4292173b4dbea4edb8d146e65d6a20ce4b6b5f8c33be34bd846ae114ea + checksum: 10/7a9fbc8d17148b7f11a1d1ca3990d2c2cd44bd08a45dcaf14f20a017721235b9044b20e6168b6940282bb1b48fb78e6afbdfb9dd9d82fde614e15baa7d579932 languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.7" +"@babel/plugin-transform-explicit-resource-management@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-explicit-resource-management@npm:7.28.6" dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/plugin-transform-destructuring": "npm:^7.28.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/014b211f73a524ee98441541ddc4f6b067eefcf94d509e99074a45ea8c3f3ad0e36cab6f5f96666ac05b747a21fa6fda949aa25153656bb2821545a4b302e0d4 + checksum: 10/36d638a253dbdaee5548b4ddd21c04ee4e39914b207437bb64cf79bb41c2caadb4321768d3dba308c1016702649bc44efe751e2052de393004563c7376210d86 languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.7" +"@babel/plugin-transform-exponentiation-operator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/d59d21945d2fd1ead914bb21f909f75b70ebe0e7627c2b1326ce500babca4c8e4a2513af6899d92e06e87186c61ee5087209345f5102fb4ff5a0e47e7b159a2c + checksum: 10/b232152499370435c7cd4bf3321f58e189150e35ca3722ea16533d33434b97294df1342f5499671ec48e62b71c34cdea0ca8cf317ad12594a10f6fc670315e62 languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-for-of@npm:7.24.7" +"@babel/plugin-transform-export-namespace-from@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/ea471ad1345f1153f7f72f1f084e74f48dc349272ca1b2d8710b841b015c9861d673e12c3c98d42ab3c640cb6ab88bb9a8da1f4ca9c57a8f71f00815fa23ecef + checksum: 10/85082923eca317094f08f4953d8ea2a6558b3117826c0b740676983902b7236df1f4213ad844cb38c2dae104753dbe8f1cc51f01567835d476d32f5f544a4385 languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.25.1": - version: 7.25.1 - resolution: "@babel/plugin-transform-function-name@npm:7.25.1" +"@babel/plugin-transform-for-of@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-for-of@npm:7.27.1" dependencies: - "@babel/helper-compilation-targets": "npm:^7.24.8" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/traverse": "npm:^7.25.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/1b4cd214c8523f7fa024fcda540ffe5503eda0e0be08b7c21405c96a870b5fe8bb1bda9e23a43a31467bf3dfc3a08edca250cf7f55f09dc40759a1ca6c6d6a4a + checksum: 10/705c591d17ef263c309bba8c38e20655e8e74ff7fd21883a9cdaf5bf1df42d724383ad3d88ac01f42926e15b1e1e66f2f7f8c4e87de955afffa290d52314b019 languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-json-strings@npm:7.24.7" +"@babel/plugin-transform-function-name@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-function-name@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + "@babel/helper-compilation-targets": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/5549dc97fc2d429a089d14ccfd51d8b3ba23c39b79edfe6d754e804fb1d50e6a4c070e73550be514a919c4db1553d8e6f7406178d68756b5959afe025a602cb2 + checksum: 10/26a2a183c3c52a96495967420a64afc5a09f743a230272a131668abf23001e393afa6371e6f8e6c60f4182bea210ed31d1caf866452d91009c1daac345a52f23 languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/plugin-transform-literals@npm:7.25.2" +"@babel/plugin-transform-json-strings@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-json-strings@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/d9728625a6d55305610dd37057fe1a3473df4f3789fef693c900516caf8958dfb341394ecf69ce9b60c82c422ad2954491a7e4d4533432fd5df812827443d6e9 + checksum: 10/69d82a1a0a72ed6e6f7969e09cf330516599d79b2b4e680e9dd3c57616a8c6af049b5103456e370ab56642815e80e46ed88bb81e9e059304a85c5fe0bf137c29 languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.7" +"@babel/plugin-transform-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-literals@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e39581cf1f9a43330b8340177c618fdb3232deb03faab1937819ef39327660a1fe94fd0ec2f66d1f5b5f98acba68871a77a9931588011c13dded3d7094ecc9de + checksum: 10/0a76d12ab19f32dd139964aea7da48cecdb7de0b75e207e576f0f700121fe92367d788f328bf4fb44b8261a0f605c97b44e62ae61cddbb67b14e94c88b411f95 languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.7" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/837b60ea42fc69a430c8f7fb124247ba009ff6d93187a521fe9f83556fe124715bd46533b1684a3e139f272849a14d1d4faf3397bde13714f99ce0938526ea6f + checksum: 10/36095d5d1cfc680e95298b5389a16016da800ae3379b130dabf557e94652c47b06610407e9fa44aaa03e9b0a5aa7b4b93348123985d44a45e369bf5f3497d149 languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-modules-amd@npm:7.24.7" +"@babel/plugin-transform-member-expression-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.27.1" dependencies: - "@babel/helper-module-transforms": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/66465ffba49af7a7b7a62995eb58f591ecd23ab42b0c67f8a70020177b3789d2a379bd6cbb68cbd09a69fd75c38a91f5a09ea70f5c8347bf4c6ea81caa0f6c6b + checksum: 10/804121430a6dcd431e6ffe99c6d1fbbc44b43478113b79c677629e7f877b4f78a06b69c6bfb2747fd84ee91879fe2eb32e4620b53124603086cf5b727593ebe8 languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.24.7, @babel/plugin-transform-modules-commonjs@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.8" +"@babel/plugin-transform-modules-amd@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-amd@npm:7.27.1" dependencies: - "@babel/helper-module-transforms": "npm:^7.24.8" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-simple-access": "npm:^7.24.7" + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/18e5d229767c7b5b6ff0cbf1a8d2d555965b90201839d0ac2dc043b56857624ea344e59f733f028142a8c1d54923b82e2a0185694ef36f988d797bfbaf59819c + checksum: 10/5ca9257981f2bbddd9dccf9126f1368de1cb335e7a5ff5cca9282266825af5b18b5f06c144320dcf5d2a200d2b53b6d22d9b801a55dc0509ab5a5838af7e61b7 languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.0" +"@babel/plugin-transform-modules-commonjs@npm:^7.27.1, @babel/plugin-transform-modules-commonjs@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.28.6" dependencies: - "@babel/helper-module-transforms": "npm:^7.25.0" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-validator-identifier": "npm:^7.24.7" - "@babel/traverse": "npm:^7.25.0" + "@babel/helper-module-transforms": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2c38efdbaf6faf730cdcb0c5e42d2d15bb114eecf184db078319de496b5e3ce68d499e531265a0e13e29f0dcaa001f240773db5c4c078eac7f4456d6c8bddd88 + checksum: 10/ec6ea2958e778a7e0220f4a75cb5816cecddc6bd98efa10499fff7baabaa29a594d50d787a4ebf8a8ba66fefcf76ca2ded602be0b4554ae3317e53b3b3375b37 languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-modules-umd@npm:7.24.7" +"@babel/plugin-transform-modules-systemjs@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.28.5" dependencies: - "@babel/helper-module-transforms": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-module-transforms": "npm:^7.28.3" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.28.5" + "@babel/traverse": "npm:^7.28.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/cef9c8917b3c35c3b6cb424dc2e6f74016122f1d25c196e2c7e51eb080d95e96c5d34966c0d5b9d4e17b8e60d455a97ed271317ed104e0e70bff159830a59678 + checksum: 10/1b91b4848845eaf6e21663d97a2a6c896553b127deaf3c2e9a2a4f041249277d13ebf71fd42d0ecbc4385e9f76093eff592fe0da0dcf1401b3f38c1615d8c539 languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.24.7" +"@babel/plugin-transform-modules-umd@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-umd@npm:7.27.1" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/7388932863b4ee01f177eb6c2e2df9e2312005e43ada99897624d5565db4b9cef1e30aa7ad2c79bbe5373f284cfcddea98d8fe212714a24c6aba223272163058 + languageName: node + linkType: hard + +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.27.1" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/b0ecb1afd22946b21fb8f34e826cfbfea4b5337f7592a5ff8af7937eddec4440149c59d2d134b4f21b2ed91b57611f39b19827729e19d99b7c11eaf614435f83 + checksum: 10/a711c92d9753df26cefc1792481e5cbff4fe4f32b383d76b25e36fa865d8023b1b9aa6338cf18f5c0e864c71a7fbe8115e840872ccd61a914d9953849c68de7d languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-new-target@npm:7.24.7" +"@babel/plugin-transform-new-target@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-new-target@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/91b6a7439b7622f80dc755ddfb9ab083355bedc0b2af18e7c7a948faed14467599609331c8d59cfab4273640e3fc36e4cd02ad5b6dcb4a428f5a8baefc507acc + checksum: 10/620d78ee476ae70960989e477dc86031ffa3d554b1b1999e6ec95261629f7a13e5a7b98579c63a009f9fdf14def027db57de1f0ae1f06fb6eaed8908ff65cf68 languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.7" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/113cd24b6ce4d0a8e54ad9324428244942ce752a3fd38f8b615c3a786641ec18a00a01b662fe4cbebf369358f5904a975bbde0a977b839f2438b16f0d7d1dd36 + checksum: 10/88106952ca4f4fea8f97222a25f9595c6859d458d76905845dfa54f54e7d345e3dc338932e8c84a9c57a6c88b2f6d9ebff47130ce508a49c2b6e6a9f03858750 languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.7" +"@babel/plugin-transform-numeric-separator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/dc5bb0534889d207b1da125635471c42da61a4a4e9e68855f24b1cd04ccdcf8325b2c29112e719913c2097242e7e62d660e0fea2a46f3a9a983c9d02a0ec7a04 + checksum: 10/4b5ca60e481e22f0842761a3badca17376a230b5a7e5482338604eb95836c2d0c9c9bde53bdc5c2de1c6a12ae6c12de7464d098bf74b0943f85905ca358f0b68 languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.7" +"@babel/plugin-transform-object-rest-spread@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.28.6" dependencies: - "@babel/helper-compilation-targets": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-transform-parameters": "npm:^7.24.7" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/plugin-transform-destructuring": "npm:^7.28.5" + "@babel/plugin-transform-parameters": "npm:^7.27.7" + "@babel/traverse": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/d586995dc3396bbf8fb75b84f0a3548d923e4c3500bb414641a7fe30762a4ffd82987887fece6381f600d8de2da1e3310fc9a725271724d35f9020fcd5d4b2a3 + checksum: 10/9c8c51a515a5ec98a33a715e82d49f873e58b04b53fa1e826f3c2009f7133cd396d6730553a53d265e096dbfbea17dd100ae38815d0b506c094cb316a7a5519e languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-object-super@npm:7.24.7" +"@babel/plugin-transform-object-super@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-object-super@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-replace-supers": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-replace-supers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/382739a017972d7126416b958ea81b4b950b6275414908a54bfef6aeed9b9fcc6c8d247db3a1134b09a3b355a60039670ce41ee41c626f8acec70f49c3c8d2a6 + checksum: 10/46b819cb9a6cd3cfefe42d07875fee414f18d5e66040366ae856116db560ad4e16f3899a0a7fddd6773e0d1458444f94b208b67c0e3b6977a27ea17a5c13dbf6 languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.7" +"@babel/plugin-transform-optional-catch-binding@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/605ae3764354e83f73c1e6430bac29e308806abcce8d1369cf69e4921771ff3592e8f60ba60c15990070d79b8d8740f0841069d64b466b3ce8a8c43e9743da7e + checksum: 10/ee24a17defec056eb9ef01824d7e4a1f65d531af6b4b79acfd0bcb95ce0b47926e80c61897f36f8c01ce733b069c9acdb1c9ce5ec07a729d0dbf9e8d859fe992 languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.24.7, @babel/plugin-transform-optional-chaining@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.8" +"@babel/plugin-transform-optional-chaining@npm:^7.27.1, @babel/plugin-transform-optional-chaining@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/1f873fb9d86c280b64dfe5ebc59244b459b717ed72a7682da2386db3d9e11fc9d831cfc2e11d37262b4325a7a0e3ccbccfb8cd0b944caf199d3c9e03fff7b0af + checksum: 10/c7cf29f99384a9a98748f04489a122c0106e0316aa64a2e61ef8af74c1057b587b96d9a08eb4e33d2ac17d1aaff1f0a86fae658d429fa7bcce4ef977e0ad684b languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-parameters@npm:7.24.7" +"@babel/plugin-transform-parameters@npm:^7.27.7": + version: 7.27.7 + resolution: "@babel/plugin-transform-parameters@npm:7.27.7" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/41ff6bda926fabfb2e5d90b70621f279330691bed92009297340a8e776cfe9c3f2dda6afbc31dd3cbdccdfa9a5c57f2046e3ccc84f963c3797356df003d1703a + checksum: 10/ba0aa8c977a03bf83030668f64c1d721e4e82d8cce89cdde75a2755862b79dbe9e7f58ca955e68c721fd494d6ee3826e46efad3fbf0855fcc92cb269477b4777 languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/plugin-transform-private-methods@npm:7.25.4" +"@babel/plugin-transform-private-methods@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-private-methods@npm:7.28.6" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.25.4" - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/d5c29ba121d6ce40e8055a632c32e69006c513607145a29701f93b416a8c53a60e53565df417218e2d8b7f1ba73adb837601e8e9d0a3215da50e4c9507f9f1fa + checksum: 10/b80179b28f6a165674d0b0d6c6349b13a01dd282b18f56933423c0a33c23fc0626c8f011f859fc20737d021fe966eb8474a5233e4596401482e9ee7fb00e2aa2 languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.7" +"@babel/plugin-transform-private-property-in-object@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.28.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-create-class-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a23ee18340818e292abfcb98b1086a188c81d640b1045e6809e9a3e8add78f9cb26607774de4ed653cbecd4277965dc4f4f1affc3504682209bb2a65fd4251f8 + checksum: 10/d02008c62fd32ff747b850b8581ab5076b717320e1cb01c7fc66ebf5169095bd922e18cfb269992f85bc7fbd2cc61e5b5af25e2b54aad67411474b789ea94d5f languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-property-literals@npm:7.24.7" +"@babel/plugin-transform-property-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-property-literals@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/71708890fe007d45ad7a130150a2ba1fea0205f575b925ca2e1bb65018730636a68e65c634a474e5b658378d72871c337c953560009c081a645e088769bf168a + checksum: 10/7caec27d5ed8870895c9faf4f71def72745d69da0d8e77903146a4e135fd7bed5778f5f9cebb36c5fba86338e6194dd67a08c033fc84b4299b7eceab6d9630cb languageName: node linkType: hard @@ -1276,302 +1053,300 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-display-name@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-display-name@npm:7.22.5" +"@babel/plugin-transform-react-display-name@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-react-display-name@npm:7.28.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a12bfd1e4e93055efca3ace3c34722571bda59d9740dca364d225d9c6e3ca874f134694d21715c42cc63d79efd46db9665bd4a022998767f9245f1e29d5d204d + checksum: 10/d623644a078086f410b1952429d82c10e2833ebffb97800b25f55ab7f3ffafde34e57a4a71958da73f4abfcef39b598e2ca172f2b43531f98b3f12e0de17c219 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-development@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-jsx-development@npm:7.22.5" +"@babel/plugin-transform-react-jsx-development@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-react-jsx-development@npm:7.27.1" dependencies: - "@babel/plugin-transform-react-jsx": "npm:^7.22.5" + "@babel/plugin-transform-react-jsx": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/36bc3ff0b96bb0ef4723070a50cfdf2e72cfd903a59eba448f9fe92fea47574d6f22efd99364413719e1f3fb3c51b6c9b2990b87af088f8486a84b2a5f9e4560 + checksum: 10/b88865d5b8c018992f2332da939faa15c4d4a864c9435a5937beaff3fe43781432cc42e0a5d5631098e0bd4066fc33f5fa72203b388b074c3545fe7aaa21e474 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.22.15, @babel/plugin-transform-react-jsx@npm:^7.22.5": - version: 7.22.15 - resolution: "@babel/plugin-transform-react-jsx@npm:7.22.15" +"@babel/plugin-transform-react-jsx@npm:^7.27.1": + version: 7.28.6 + resolution: "@babel/plugin-transform-react-jsx@npm:7.28.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/plugin-syntax-jsx": "npm:^7.22.5" - "@babel/types": "npm:^7.22.15" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-module-imports": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/plugin-syntax-jsx": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a436bfbffe723d162e5816d510dca7349a1fc572c501d73f1e17bbca7eb899d7a6a14d8fc2ae5993dd79fdd77bcc68d295e59a3549bed03b8579c767f6e3c9dc + checksum: 10/c6eade7309f0710b6aac9e747f8c3305633801c035a35efc5e2436742cc466e457ed5848d3dd5dade36e34332cfc50ac92d69a33f7803d66ae2d72f13a76c3bc languageName: node linkType: hard -"@babel/plugin-transform-react-pure-annotations@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.22.5" +"@babel/plugin-transform-react-pure-annotations@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.27.1" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.22.5" - "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-annotate-as-pure": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/092021c4f404e267002099ec20b3f12dd730cb90b0d83c5feed3dc00dbe43b9c42c795a18e7c6c7d7bddea20c7dd56221b146aec81b37f2e7eb5137331c61120 + checksum: 10/a6f591c5e85a1ab0685d4a25afe591fe8d11dc0b73c677cf9560ff8d540d036a1cce9efcb729fc9092def4d854dc304ffdc063a89a9247900b69c516bf971a4c languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-regenerator@npm:7.24.7" +"@babel/plugin-transform-regenerator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-regenerator@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - regenerator-transform: "npm:^0.15.2" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/70fa2bb36d3e2ce69a25c7227da8ad92307ab7b50cb6dfcc4dc5ce8f1cc79b0fcf997292a1cb3b4ae7cb136f515d1b2c3fb78c927bdba8d719794430403eb0c6 + checksum: 10/09028ed8ed7f5e3879cbfdcf92a8a730c13b15ce042ef86b29b31cca5a250da641f777dfaf81ab1706fb8cf9252c177f02e882fc7465d3a10b9f385c0bb2ea16 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-reserved-words@npm:7.24.7" +"@babel/plugin-transform-regexp-modifiers@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/64a2669671bb97c3dee3830a82c3e932fe6e02d56a4053c6ee4453d317b5f436d3d44907fbb0f4fbd8a56ebee34f6aee250e49743b7243d14d00c069215f3113 - languageName: node - linkType: hard - -"@babel/plugin-transform-runtime@npm:^7.22.9": - version: 7.22.15 - resolution: "@babel/plugin-transform-runtime@npm:7.22.15" - dependencies: - "@babel/helper-module-imports": "npm:^7.22.15" - "@babel/helper-plugin-utils": "npm:^7.22.5" - babel-plugin-polyfill-corejs2: "npm:^0.4.5" - babel-plugin-polyfill-corejs3: "npm:^0.8.3" - babel-plugin-polyfill-regenerator: "npm:^0.5.2" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/7f4a302a0d61236febf47f7a85d242b5ebb0d08d0ceb501a42e4e0341faadf1d0359d87c9c93c1081d9e1215b37cdcbdd626db6523aab1e60fb385f3bba2523a - languageName: node - linkType: hard - -"@babel/plugin-transform-shorthand-properties@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/c68c2be965007e0cb6667daa209bc0af877cab4b327ef2e21b2114c38554243c3f7fdcc5b03679b20f72a26d966aa646af771f3165c882067e85a3887647f028 - languageName: node - linkType: hard - -"@babel/plugin-transform-spread@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-spread@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/76e2c8544129d727d5a698e2a67d74e438bc35df843adb5f769316ec432c5e1bbb4128123a95b2fe8ef0aec7b26d87efe81d64326291c77ad757ff184d38448a - languageName: node - linkType: hard - -"@babel/plugin-transform-sticky-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/3b9a99ae043ef363c81bfb097fa7a553fcf7c7d9fddc13dd2b47b3b2e45cf2741a9ca78cfe55f463983b043b365f0f8452f2d5eaadbdea20e6d6de50c16bed25 - languageName: node - linkType: hard - -"@babel/plugin-transform-template-literals@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-template-literals@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/ecf05a8511176d5570cb0d481577a407a4e8a9a430f86522d809e0ac2c823913e854ef9e2a1c83c0bd7c12489d82e1b48fabb52e697e80d6a6962125197593ca - languageName: node - linkType: hard - -"@babel/plugin-transform-typeof-symbol@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.8" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/5f113fed94b694ec4a40a27b8628ce736cfa172b69fcffa2833c9a41895032127f3daeea552e94fdb4a3ce4e8cd51de67a670ab87a1f447a0cf55c9cb2d7ed11 - languageName: node - linkType: hard - -"@babel/plugin-transform-typescript@npm:^7.24.7": - version: 7.25.2 - resolution: "@babel/plugin-transform-typescript@npm:7.25.2" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-create-class-features-plugin": "npm:^7.25.0" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" - "@babel/plugin-syntax-typescript": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/50e017ffd131c08661daa22b6c759999bb7a6cdfbf683291ee4bcbea4ae839440b553d2f8896bcf049aca1d267b39f3b09e8336059e919e83149b5ad859671f6 - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-escapes@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/6b8bca3495acedc89e880942de7b83c263fb5b4c9599594dcf3923e2128ae25f1f4725a295fe101027f75d8ef081ef28319296adf274b5022e57039e42836103 - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-property-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.7" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/c0c284bbbdead7e17e059d72e1b288f86b0baacc410398ef6c6c703fe4326b069e68515ccb84359601315cd8e888f9226731d00624b7c6959b1c0853f072b61f - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.7" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/b545310d0d592d75566b9cd158f4b8951e34d07d839656789d179b39b3fd92b32bd387cdfaf33a93e636609f3bfb9bb03d41f3e43be598116c9c6c80cc3418c4 - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.4" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.2" - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/d5d07d17932656fa4d62fd67ecaa1a5e4c2e92365a924f1a2a8cf8108762f137a30cd55eb3a7d0504258f27a19ad0decca6b62a5c37a5aada709cbb46c4a871f + checksum: 10/5aacc570034c085afa0165137bb9a04cd4299b86eb9092933a96dcc1132c8f591d9d534419988f5f762b2f70d43a3c719a6b8fa05fdd3b2b1820d01cf85500da languageName: node linkType: hard -"@babel/preset-env@npm:^7.20.2, @babel/preset-env@npm:^7.22.9": - version: 7.25.4 - resolution: "@babel/preset-env@npm:7.25.4" +"@babel/plugin-transform-reserved-words@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-reserved-words@npm:7.27.1" dependencies: - "@babel/compat-data": "npm:^7.25.4" - "@babel/helper-compilation-targets": "npm:^7.25.2" - "@babel/helper-plugin-utils": "npm:^7.24.8" - "@babel/helper-validator-option": "npm:^7.24.8" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.3" - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.25.0" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.7" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.25.0" - "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" - "@babel/plugin-syntax-class-properties": "npm:^7.12.13" - "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" - "@babel/plugin-syntax-import-assertions": "npm:^7.24.7" - "@babel/plugin-syntax-import-attributes": "npm:^7.24.7" - "@babel/plugin-syntax-import-meta": "npm:^7.10.4" - "@babel/plugin-syntax-json-strings": "npm:^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" - "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" - "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" - "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.24.7" - "@babel/plugin-transform-async-generator-functions": "npm:^7.25.4" - "@babel/plugin-transform-async-to-generator": "npm:^7.24.7" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.7" - "@babel/plugin-transform-block-scoping": "npm:^7.25.0" - "@babel/plugin-transform-class-properties": "npm:^7.25.4" - "@babel/plugin-transform-class-static-block": "npm:^7.24.7" - "@babel/plugin-transform-classes": "npm:^7.25.4" - "@babel/plugin-transform-computed-properties": "npm:^7.24.7" - "@babel/plugin-transform-destructuring": "npm:^7.24.8" - "@babel/plugin-transform-dotall-regex": "npm:^7.24.7" - "@babel/plugin-transform-duplicate-keys": "npm:^7.24.7" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.0" - "@babel/plugin-transform-dynamic-import": "npm:^7.24.7" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.7" - "@babel/plugin-transform-export-namespace-from": "npm:^7.24.7" - "@babel/plugin-transform-for-of": "npm:^7.24.7" - "@babel/plugin-transform-function-name": "npm:^7.25.1" - "@babel/plugin-transform-json-strings": "npm:^7.24.7" - "@babel/plugin-transform-literals": "npm:^7.25.2" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.7" - "@babel/plugin-transform-member-expression-literals": "npm:^7.24.7" - "@babel/plugin-transform-modules-amd": "npm:^7.24.7" - "@babel/plugin-transform-modules-commonjs": "npm:^7.24.8" - "@babel/plugin-transform-modules-systemjs": "npm:^7.25.0" - "@babel/plugin-transform-modules-umd": "npm:^7.24.7" - "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.7" - "@babel/plugin-transform-new-target": "npm:^7.24.7" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.7" - "@babel/plugin-transform-numeric-separator": "npm:^7.24.7" - "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" - "@babel/plugin-transform-object-super": "npm:^7.24.7" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.7" - "@babel/plugin-transform-optional-chaining": "npm:^7.24.8" - "@babel/plugin-transform-parameters": "npm:^7.24.7" - "@babel/plugin-transform-private-methods": "npm:^7.25.4" - "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7" - "@babel/plugin-transform-property-literals": "npm:^7.24.7" - "@babel/plugin-transform-regenerator": "npm:^7.24.7" - "@babel/plugin-transform-reserved-words": "npm:^7.24.7" - "@babel/plugin-transform-shorthand-properties": "npm:^7.24.7" - "@babel/plugin-transform-spread": "npm:^7.24.7" - "@babel/plugin-transform-sticky-regex": "npm:^7.24.7" - "@babel/plugin-transform-template-literals": "npm:^7.24.7" - "@babel/plugin-transform-typeof-symbol": "npm:^7.24.8" - "@babel/plugin-transform-unicode-escapes": "npm:^7.24.7" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.7" - "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.25.4" - "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.10" - babel-plugin-polyfill-corejs3: "npm:^0.10.6" - babel-plugin-polyfill-regenerator: "npm:^0.6.1" - core-js-compat: "npm:^3.37.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/dea0b66742d2863b369c06c053e11e15ba785892ea19cccf7aef3c1bdaa38b6ab082e19984c5ea7810d275d9445c5400fcc385ad71ce707ed9256fadb102af3b + languageName: node + linkType: hard + +"@babel/plugin-transform-runtime@npm:^7.25.9": + version: 7.28.5 + resolution: "@babel/plugin-transform-runtime@npm:7.28.5" + dependencies: + "@babel/helper-module-imports": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + babel-plugin-polyfill-corejs2: "npm:^0.4.14" + babel-plugin-polyfill-corejs3: "npm:^0.13.0" + babel-plugin-polyfill-regenerator: "npm:^0.6.5" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/45ca65bdc7fa11ca51167804052460eda32bf2e6620c7ba998e2d95bc867595913532ee7d748e97e808eabcc66aabe796bd75c59014d996ec8183fa5a7245862 + checksum: 10/0d16c90d40dd34f1a981e742ad656ceef619b92d3662ec9ac8d7c8ba79f22bb425c3f9e097333659a4938f03868a53077b1a3aadb7f37504157a0c7af64ec2be + languageName: node + linkType: hard + +"@babel/plugin-transform-shorthand-properties@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/fbba6e2aef0b69681acb68202aa249c0598e470cc0853d7ff5bd0171fd6a7ec31d77cfabcce9df6360fc8349eded7e4a65218c32551bd3fc0caaa1ac899ac6d4 + languageName: node + linkType: hard + +"@babel/plugin-transform-spread@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-spread@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/1fa02ac60ae5e49d46fa2966aaf3f7578cf37255534c2ecf379d65855088a1623c3eea28b9ee6a0b1413b0199b51f9019d0da3fe9da89986bc47e07242415f60 + languageName: node + linkType: hard + +"@babel/plugin-transform-sticky-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/e1414a502efba92c7974681767e365a8cda6c5e9e5f33472a9eaa0ce2e75cea0a9bef881ff8dda37c7810ad902f98d3c00ead92a3ac3b73a79d011df85b5a189 + languageName: node + linkType: hard + +"@babel/plugin-transform-template-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-template-literals@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/93aad782503b691faef7c0893372d5243df3219b07f1f22cfc32c104af6a2e7acd6102c128439eab15336d048f1b214ca134b87b0630d8cd568bf447f78b25ce + languageName: node + linkType: hard + +"@babel/plugin-transform-typeof-symbol@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/812d736402a6f9313b86b8adf36740394400be7a09c48e51ee45ab4a383a3f46fc618d656dd12e44934665e42ae71cf143e25b95491b699ef7c737950dbdb862 + languageName: node + linkType: hard + +"@babel/plugin-transform-typescript@npm:^7.28.5": + version: 7.28.6 + resolution: "@babel/plugin-transform-typescript@npm:7.28.6" + dependencies: + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + "@babel/plugin-syntax-typescript": "npm:^7.28.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/a0bccc531fa8710a45b0b593140273741e0e4a0721b1ef6ef9dfefae0bbe61528440d65aab7936929551fd76793272257d74f60cf66891352f793294930a4b67 + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-escapes@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/87b9e49dee4ab6e78f4cdcdbdd837d7784f02868a96bfc206c8dbb17dd85db161b5a0ecbe95b19a42e8aea0ce57e80249e1facbf9221d7f4114d52c3b9136c9e + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-property-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.28.6" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/d14e8c51aa73f592575c1543400fd67d96df6410d75c9dc10dd640fd7eecb37366a2f2368bbdd7529842532eda4af181c921bda95146c6d373c64ea59c6e9991 + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.27.1" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/a34d89a2b75fb78e66d97c3dc90d4877f7e31f43316b52176f95a5dee20e9bb56ecf158eafc42a001676ddf7b393d9e67650bad6b32f5405780f25fb83cd68e3 + languageName: node + linkType: hard + +"@babel/plugin-transform-unicode-sets-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.28.6" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/423971fe2eef9d18782b1c30f5f42613ee510e5b9c08760c5538a0997b36c34495acce261e0e37a27831f81330359230bd1f33c2e1822de70241002b45b7d68e + languageName: node + linkType: hard + +"@babel/preset-env@npm:^7.20.2, @babel/preset-env@npm:^7.25.9": + version: 7.28.6 + resolution: "@babel/preset-env@npm:7.28.6" + dependencies: + "@babel/compat-data": "npm:^7.28.6" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-validator-option": "npm:^7.27.1" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.28.5" + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.27.1" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.27.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.27.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.28.6" + "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions": "npm:^7.28.6" + "@babel/plugin-syntax-import-attributes": "npm:^7.28.6" + "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" + "@babel/plugin-transform-arrow-functions": "npm:^7.27.1" + "@babel/plugin-transform-async-generator-functions": "npm:^7.28.6" + "@babel/plugin-transform-async-to-generator": "npm:^7.28.6" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.27.1" + "@babel/plugin-transform-block-scoping": "npm:^7.28.6" + "@babel/plugin-transform-class-properties": "npm:^7.28.6" + "@babel/plugin-transform-class-static-block": "npm:^7.28.6" + "@babel/plugin-transform-classes": "npm:^7.28.6" + "@babel/plugin-transform-computed-properties": "npm:^7.28.6" + "@babel/plugin-transform-destructuring": "npm:^7.28.5" + "@babel/plugin-transform-dotall-regex": "npm:^7.28.6" + "@babel/plugin-transform-duplicate-keys": "npm:^7.27.1" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.28.6" + "@babel/plugin-transform-dynamic-import": "npm:^7.27.1" + "@babel/plugin-transform-explicit-resource-management": "npm:^7.28.6" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.28.6" + "@babel/plugin-transform-export-namespace-from": "npm:^7.27.1" + "@babel/plugin-transform-for-of": "npm:^7.27.1" + "@babel/plugin-transform-function-name": "npm:^7.27.1" + "@babel/plugin-transform-json-strings": "npm:^7.28.6" + "@babel/plugin-transform-literals": "npm:^7.27.1" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.28.6" + "@babel/plugin-transform-member-expression-literals": "npm:^7.27.1" + "@babel/plugin-transform-modules-amd": "npm:^7.27.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.28.6" + "@babel/plugin-transform-modules-systemjs": "npm:^7.28.5" + "@babel/plugin-transform-modules-umd": "npm:^7.27.1" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.27.1" + "@babel/plugin-transform-new-target": "npm:^7.27.1" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.28.6" + "@babel/plugin-transform-numeric-separator": "npm:^7.28.6" + "@babel/plugin-transform-object-rest-spread": "npm:^7.28.6" + "@babel/plugin-transform-object-super": "npm:^7.27.1" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.28.6" + "@babel/plugin-transform-optional-chaining": "npm:^7.28.6" + "@babel/plugin-transform-parameters": "npm:^7.27.7" + "@babel/plugin-transform-private-methods": "npm:^7.28.6" + "@babel/plugin-transform-private-property-in-object": "npm:^7.28.6" + "@babel/plugin-transform-property-literals": "npm:^7.27.1" + "@babel/plugin-transform-regenerator": "npm:^7.28.6" + "@babel/plugin-transform-regexp-modifiers": "npm:^7.28.6" + "@babel/plugin-transform-reserved-words": "npm:^7.27.1" + "@babel/plugin-transform-shorthand-properties": "npm:^7.27.1" + "@babel/plugin-transform-spread": "npm:^7.28.6" + "@babel/plugin-transform-sticky-regex": "npm:^7.27.1" + "@babel/plugin-transform-template-literals": "npm:^7.27.1" + "@babel/plugin-transform-typeof-symbol": "npm:^7.27.1" + "@babel/plugin-transform-unicode-escapes": "npm:^7.27.1" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.28.6" + "@babel/plugin-transform-unicode-regex": "npm:^7.27.1" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.28.6" + "@babel/preset-modules": "npm:0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2: "npm:^0.4.14" + babel-plugin-polyfill-corejs3: "npm:^0.13.0" + babel-plugin-polyfill-regenerator: "npm:^0.6.5" + core-js-compat: "npm:^3.43.0" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/ee1b96dec8518436013c4a758003734842e9fed2a3af2013bee7a462289bae4e7bbce99733701164c28a93554be5a9a4c50818fa32335274d19e8b7d3dd53316 languageName: node linkType: hard @@ -1588,97 +1363,86 @@ __metadata: languageName: node linkType: hard -"@babel/preset-react@npm:^7.18.6, @babel/preset-react@npm:^7.22.5": - version: 7.22.15 - resolution: "@babel/preset-react@npm:7.22.15" +"@babel/preset-react@npm:^7.18.6, @babel/preset-react@npm:^7.25.9": + version: 7.28.5 + resolution: "@babel/preset-react@npm:7.28.5" dependencies: - "@babel/helper-plugin-utils": "npm:^7.22.5" - "@babel/helper-validator-option": "npm:^7.22.15" - "@babel/plugin-transform-react-display-name": "npm:^7.22.5" - "@babel/plugin-transform-react-jsx": "npm:^7.22.15" - "@babel/plugin-transform-react-jsx-development": "npm:^7.22.5" - "@babel/plugin-transform-react-pure-annotations": "npm:^7.22.5" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-validator-option": "npm:^7.27.1" + "@babel/plugin-transform-react-display-name": "npm:^7.28.0" + "@babel/plugin-transform-react-jsx": "npm:^7.27.1" + "@babel/plugin-transform-react-jsx-development": "npm:^7.27.1" + "@babel/plugin-transform-react-pure-annotations": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/f9296e45346c3b6ab8296952edde5f1774cc9fdbdbefbc76047278fc3e889d3e15740f038ce017aca562d89f32fcbb6c11783d464fc6ae3066433178fa58513c + checksum: 10/c00d43b27790caddee7c4971b11b4bf479a761175433e2f168b3d7e1ac6ee36d4d929a76acc7f302e9bff3a5b26d02d37f0ad7ae6359e076e5baa862b00843b2 languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.21.0, @babel/preset-typescript@npm:^7.22.5": - version: 7.24.7 - resolution: "@babel/preset-typescript@npm:7.24.7" +"@babel/preset-typescript@npm:^7.21.0, @babel/preset-typescript@npm:^7.25.9": + version: 7.28.5 + resolution: "@babel/preset-typescript@npm:7.28.5" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-validator-option": "npm:^7.24.7" - "@babel/plugin-syntax-jsx": "npm:^7.24.7" - "@babel/plugin-transform-modules-commonjs": "npm:^7.24.7" - "@babel/plugin-transform-typescript": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-validator-option": "npm:^7.27.1" + "@babel/plugin-syntax-jsx": "npm:^7.27.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.27.1" + "@babel/plugin-transform-typescript": "npm:^7.28.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/995e9783f8e474581e7533d6b10ec1fbea69528cc939ad8582b5937e13548e5215d25a8e2c845e7b351fdaa13139896b5e42ab3bde83918ea4e41773f10861ac + checksum: 10/72c03e01c34906041b1813542761a283c52da1751e7ddf63191bc5fb2a0354eca30a00537c5a92951688bec3975bdc0e50ef4516b5e94cfd6d4cf947f2125bdc languageName: node linkType: hard -"@babel/regjsgen@npm:^0.8.0": - version: 0.8.0 - resolution: "@babel/regjsgen@npm:0.8.0" - checksum: 10/c57fb730b17332b7572574b74364a77d70faa302a281a62819476fa3b09822974fd75af77aea603ad77378395be64e81f89f0e800bf86cbbf21652d49ce12ee8 - languageName: node - linkType: hard - -"@babel/runtime-corejs3@npm:^7.22.6": - version: 7.26.10 - resolution: "@babel/runtime-corejs3@npm:7.26.10" +"@babel/runtime-corejs3@npm:^7.25.9": + version: 7.28.6 + resolution: "@babel/runtime-corejs3@npm:7.28.6" dependencies: - core-js-pure: "npm:^3.30.2" - regenerator-runtime: "npm:^0.14.0" - checksum: 10/6da4663c8b1c46410fb698188754ef69d7600c90b47e997a5a002fe069af9bbe5075f7f8c88df3559222536383b47406613e3158d5dcc08b013fc4bcc287324f + core-js-pure: "npm:^3.43.0" + checksum: 10/7110da259094d1299762b619dd92bc3cc4f6ae124662e87c9856c24fe425628a423fe133c577168cd54049d05159952000bf58705efb147231059f4802a4c7bb languageName: node linkType: hard -"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.22.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.9.2": - version: 7.26.10 - resolution: "@babel/runtime@npm:7.26.10" - dependencies: - regenerator-runtime: "npm:^0.14.0" - checksum: 10/9d7ff8e96abe3791047c1138789c742411e3ef19c4d7ca18ce916f83cec92c06ec5dc64401759f6dd1e377cf8a01bbd2c62e033eb7550f435cf6579768d0d4a5 +"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.25.9": + version: 7.28.6 + resolution: "@babel/runtime@npm:7.28.6" + checksum: 10/fbcd439cb74d4a681958eb064c509829e3f46d8a4bfaaf441baa81bb6733d1e680bccc676c813883d7741bcaada1d0d04b15aa320ef280b5734e2192b50decf9 languageName: node linkType: hard -"@babel/template@npm:^7.24.7, @babel/template@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/template@npm:7.25.0" +"@babel/template@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/template@npm:7.28.6" dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/parser": "npm:^7.25.0" - "@babel/types": "npm:^7.25.0" - checksum: 10/07ebecf6db8b28244b7397628e09c99e7a317b959b926d90455c7253c88df3677a5a32d1501d9749fe292a263ff51a4b6b5385bcabd5dadd3a48036f4d4949e0 + "@babel/code-frame": "npm:^7.28.6" + "@babel/parser": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/0ad6e32bf1e7e31bf6b52c20d15391f541ddd645cbd488a77fe537a15b280ee91acd3a777062c52e03eedbc2e1f41548791f6a3697c02476ec5daf49faa38533 languageName: node linkType: hard -"@babel/traverse@npm:^7.22.8, @babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.1, @babel/traverse@npm:^7.25.2, @babel/traverse@npm:^7.25.3, @babel/traverse@npm:^7.25.4": - version: 7.25.4 - resolution: "@babel/traverse@npm:7.25.4" +"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.5, @babel/traverse@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/traverse@npm:7.28.6" dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.4" - "@babel/parser": "npm:^7.25.4" - "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.4" + "@babel/code-frame": "npm:^7.28.6" + "@babel/generator": "npm:^7.28.6" + "@babel/helper-globals": "npm:^7.28.0" + "@babel/parser": "npm:^7.28.6" + "@babel/template": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10/a85c16047ab8e454e2e758c75c31994cec328bd6d8b4b22e915fa7393a03b3ab96d1218f43dc7ef77c957cc488dc38100bdf504d08a80a131e89b2e49cfa2be5 + checksum: 10/dd71efe9412433169b805d5c346a6473e539ce30f605752a0d40a0733feba37259bd72bb4ad2ab591e2eaff1ee56633de160c1e98efdc8f373cf33a4a8660275 languageName: node linkType: hard -"@babel/types@npm:^7.21.3, @babel/types@npm:^7.22.15, @babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.4, @babel/types@npm:^7.4.4": - version: 7.25.4 - resolution: "@babel/types@npm:7.25.4" +"@babel/types@npm:^7.21.3, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.5, @babel/types@npm:^7.28.6, @babel/types@npm:^7.4.4": + version: 7.28.6 + resolution: "@babel/types@npm:7.28.6" dependencies: - "@babel/helper-string-parser": "npm:^7.24.8" - "@babel/helper-validator-identifier": "npm:^7.24.7" - to-fast-properties: "npm:^2.0.0" - checksum: 10/d4a1194612d0a2a6ce9a0be325578b43d74e5f5278c67409468ba0a924341f0ad349ef0245ee8a36da3766efe5cc59cd6bb52547674150f97d8dc4c8cfa5d6b8 + "@babel/helper-string-parser": "npm:^7.27.1" + "@babel/helper-validator-identifier": "npm:^7.28.5" + checksum: 10/f9c6e52b451065aae5654686ecfc7de2d27dd0fbbc204ee2bd912a71daa359521a32f378981b1cf333ace6c8f86928814452cb9f388a7da59ad468038deb6b5f languageName: node linkType: hard @@ -1689,6 +1453,600 @@ __metadata: languageName: node linkType: hard +"@csstools/cascade-layer-name-parser@npm:^2.0.5": + version: 2.0.5 + resolution: "@csstools/cascade-layer-name-parser@npm:2.0.5" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10/fb26ae1db6f7a71ee0c3fdaea89f5325f88d7a0b2505fcf4b75e94f2c816ef1edb2961eecbc397df06f67d696ccc6bc99588ea9ee07dd7632bf10febf6b67ed9 + languageName: node + linkType: hard + +"@csstools/color-helpers@npm:^5.1.0": + version: 5.1.0 + resolution: "@csstools/color-helpers@npm:5.1.0" + checksum: 10/0138b3d5ccbe77aeccf6721fd008a53523c70e932f0c82dca24a1277ca780447e1d8357da47512ebf96358476f8764de57002f3e491920d67e69202f5a74c383 + languageName: node + linkType: hard + +"@csstools/css-calc@npm:^2.1.4": + version: 2.1.4 + resolution: "@csstools/css-calc@npm:2.1.4" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10/06975b650c0f44c60eeb7afdb3fd236f2dd607b2c622e0bc908d3f54de39eb84e0692833320d03dac04bd6c1ab0154aa3fa0dd442bd9e5f917cf14d8e2ba8d74 + languageName: node + linkType: hard + +"@csstools/css-color-parser@npm:^3.1.0": + version: 3.1.0 + resolution: "@csstools/css-color-parser@npm:3.1.0" + dependencies: + "@csstools/color-helpers": "npm:^5.1.0" + "@csstools/css-calc": "npm:^2.1.4" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10/4741095fdc4501e8e7ada4ed14fbf9dbbe6fea9b989818790ebca15657c29c62defbebacf18592cde2aa638a1d098bbe86d742d2c84ba932fbc00fac51cb8805 + languageName: node + linkType: hard + +"@csstools/css-parser-algorithms@npm:^3.0.5": + version: 3.0.5 + resolution: "@csstools/css-parser-algorithms@npm:3.0.5" + peerDependencies: + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10/e93083b5cb36a3c1e7a47ce10cf62961d05bd1e4c608bb3ee50186ff740157ab0ec16a3956f7b86251efd10703034d849693201eea858ae904848c68d2d46ada + languageName: node + linkType: hard + +"@csstools/css-tokenizer@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/css-tokenizer@npm:3.0.4" + checksum: 10/eb6c84c086312f6bb8758dfe2c85addd7475b0927333c5e39a4d59fb210b9810f8c346972046f95e60a721329cffe98895abe451e51de753ad1ca7a8c24ec65f + languageName: node + linkType: hard + +"@csstools/media-query-list-parser@npm:^4.0.3": + version: 4.0.3 + resolution: "@csstools/media-query-list-parser@npm:4.0.3" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 + checksum: 10/ac4e34c21a1c7fc8b788274f316c29ff2f07e7a08996d27b9beb06454666591be9946362c1b7c4d342558c278c8e7d0e35655043e47a9ffd94c3fdb292fbe020 + languageName: node + linkType: hard + +"@csstools/postcss-alpha-function@npm:^1.0.1": + version: 1.0.1 + resolution: "@csstools/postcss-alpha-function@npm:1.0.1" + dependencies: + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/40dfd418eb36fe87500769e2ee31717fc549eced3152966a4a5b4121e657a9846d14ef9bffee4faa3298a362d85af2684c3a4fea31bbca785205e7bfecbb94dc + languageName: node + linkType: hard + +"@csstools/postcss-cascade-layers@npm:^5.0.2": + version: 5.0.2 + resolution: "@csstools/postcss-cascade-layers@npm:5.0.2" + dependencies: + "@csstools/selector-specificity": "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/9b73c28338f75eebd1032d6375e76547f90683806971f1dd3a47e6305901c89642094e1a80815fcfbb10b0afb61174f9ab3207db860a5841ca92ae993dc87cbe + languageName: node + linkType: hard + +"@csstools/postcss-color-function-display-p3-linear@npm:^1.0.1": + version: 1.0.1 + resolution: "@csstools/postcss-color-function-display-p3-linear@npm:1.0.1" + dependencies: + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/10b1b098d66314d287cca728c601c6905017769a31dd27488da49922937476a22eb280232e4b1df352b4f76158994dc18607cfc7b565d83346746795cb3f7844 + languageName: node + linkType: hard + +"@csstools/postcss-color-function@npm:^4.0.12": + version: 4.0.12 + resolution: "@csstools/postcss-color-function@npm:4.0.12" + dependencies: + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/b13563a097966f9f670544e7f76abe8d170a59d09c5e7bd26533daf5b6bffcc74a82e694d5d970326299b5fa70c52972d9aeabe5dbd2fd90a3322668d4aa3e74 + languageName: node + linkType: hard + +"@csstools/postcss-color-mix-function@npm:^3.0.12": + version: 3.0.12 + resolution: "@csstools/postcss-color-mix-function@npm:3.0.12" + dependencies: + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/f4ac11b913860e919fc325e817ba1dd7fa2740d6a86eb2abe92013ac8173fa4efb697f6ccffa3178526fa9ed6274ce654bf278adc86effa62dd1f5adf16e2f7c + languageName: node + linkType: hard + +"@csstools/postcss-color-mix-variadic-function-arguments@npm:^1.0.2": + version: 1.0.2 + resolution: "@csstools/postcss-color-mix-variadic-function-arguments@npm:1.0.2" + dependencies: + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/a38642b7020589ffc684f0f4c76a2e59a8d6dc75f55036a06c9e8a109c55245234c9fb50eae6f2b97b0046591767af922d0a089a8a0c742372cf4935411f5e5c + languageName: node + linkType: hard + +"@csstools/postcss-content-alt-text@npm:^2.0.8": + version: 2.0.8 + resolution: "@csstools/postcss-content-alt-text@npm:2.0.8" + dependencies: + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/a69e1daf2fddd4cfb46806a7e5888b9138d498e173b15040d27d963a3d66aaaed9097a780291229e5dafaf8292443b4adcb329d4f1a4fb7d3f04ef2edd798c12 + languageName: node + linkType: hard + +"@csstools/postcss-contrast-color-function@npm:^2.0.12": + version: 2.0.12 + resolution: "@csstools/postcss-contrast-color-function@npm:2.0.12" + dependencies: + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/ac8fed35786d6e4c077d34b023a72278e29a5cef90ee834df273ce0197fcee9848b3d40046bfff37959f42c7cfb4f14ffac1b58a86d87a80c1759a9300db7c49 + languageName: node + linkType: hard + +"@csstools/postcss-exponential-functions@npm:^2.0.9": + version: 2.0.9 + resolution: "@csstools/postcss-exponential-functions@npm:2.0.9" + dependencies: + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10/80d5847d747fc67c32ee3ba49f9c9290654fb086c58b2f13256b14124b7349dac68ba8e107f631248cef2448ca57ef18adbbbc816dd63a54ba91826345373f39 + languageName: node + linkType: hard + +"@csstools/postcss-font-format-keywords@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-font-format-keywords@npm:4.0.0" + dependencies: + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/63091d4748cfc5a51e3c288cd620f058a4e776ba15da6180edaee94aaad9c4e92076f575d064dabc00b28966b33dd1e59f84a6ca6a66aed59556ef92a0dfed45 + languageName: node + linkType: hard + +"@csstools/postcss-gamut-mapping@npm:^2.0.11": + version: 2.0.11 + resolution: "@csstools/postcss-gamut-mapping@npm:2.0.11" + dependencies: + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10/be4cb5a14eef78acbd9dfca7cdad0ab4e8e4a11c9e8bbb27e427bfd276fd5d3aa37bc1bf36deb040d404398989a3123bd70fc51be970c4d944cf6a18d231c1b8 + languageName: node + linkType: hard + +"@csstools/postcss-gradients-interpolation-method@npm:^5.0.12": + version: 5.0.12 + resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.12" + dependencies: + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/902505cccb5a3b91d0cb8c22594130a9da3b8ec8be135b406ef7ab799e3564a8c571a08820dbe83de556d011ef9b0fe298d7cfcb741e98862ac66b287c938bf2 + languageName: node + linkType: hard + +"@csstools/postcss-hwb-function@npm:^4.0.12": + version: 4.0.12 + resolution: "@csstools/postcss-hwb-function@npm:4.0.12" + dependencies: + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/8e37a45cffa9458466fa9a05a0926ea1579e6b21501c59bb464282481f41a2694f45343e85d37da744a36a99a4ceb3e263aeca46ea5fcfb8a12a5558cc11efaa + languageName: node + linkType: hard + +"@csstools/postcss-ic-unit@npm:^4.0.4": + version: 4.0.4 + resolution: "@csstools/postcss-ic-unit@npm:4.0.4" + dependencies: + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/3bbdbba983686b9e12a5bbf36bb2ba823a6426efb9369ca415e342c37136e041929fcafacb6fa113a06a117c22785098707c91dbf306446e66618c7881553324 + languageName: node + linkType: hard + +"@csstools/postcss-initial@npm:^2.0.1": + version: 2.0.1 + resolution: "@csstools/postcss-initial@npm:2.0.1" + peerDependencies: + postcss: ^8.4 + checksum: 10/d0e7205d1db23f7957472738f039c9029f2cc80a7ed03a47d459a543f687327e3a92e75ad871dd0ca0522999e00cd834c4b225e3fbee72edffbb051ea6cec014 + languageName: node + linkType: hard + +"@csstools/postcss-is-pseudo-class@npm:^5.0.3": + version: 5.0.3 + resolution: "@csstools/postcss-is-pseudo-class@npm:5.0.3" + dependencies: + "@csstools/selector-specificity": "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/99abf2595c3b92ba993f26704c622837ec7546832037f75778d74a2c3d2e5009a027e52178d7f5c967d9c0dcda44244db9a8131c51e42fcbf4a0c22f21b3b1b6 + languageName: node + linkType: hard + +"@csstools/postcss-light-dark-function@npm:^2.0.11": + version: 2.0.11 + resolution: "@csstools/postcss-light-dark-function@npm:2.0.11" + dependencies: + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/52fa6464e31d4815557ef9bcff0a94a89549bcf1ccb4ffcc51478a5fa01815311fb2b52b96e3f671c64da8493fb50d3fc235cbfcec797f685dcccb4133dc09c4 + languageName: node + linkType: hard + +"@csstools/postcss-logical-float-and-clear@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-logical-float-and-clear@npm:3.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/793d9a89c28d4809a83b6111d321f60947a59f119d61046e5c4023ce2caedbb221298e69b6df38995e51b763545807db7b03da47e47461622f32928fec92b65f + languageName: node + linkType: hard + +"@csstools/postcss-logical-overflow@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-logical-overflow@npm:2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/bf73ea1d7754f59773af5a7b434e9eaa2ce05c8fe7aa26a726dce8f2a42abb0f5686fbf9672d25912250226174c35f2c5737ca072d21f8b68420500b7449fe58 + languageName: node + linkType: hard + +"@csstools/postcss-logical-overscroll-behavior@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/postcss-logical-overscroll-behavior@npm:2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/bf043fdad02b9578fc2dcddb409b014a15dee65a9813ceb583237dff1caf807e18101f68bde2b0d8b685139d823114ab8deed6da3027878d11a945755824d3b1 + languageName: node + linkType: hard + +"@csstools/postcss-logical-resize@npm:^3.0.0": + version: 3.0.0 + resolution: "@csstools/postcss-logical-resize@npm:3.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/3be1133a9ac27e0a0d73b19d573adc00ad78a697522eaf6c9de90260882ba8ff0904c7ab3e68379ee7724e28661c4b497cb665e258214bc8355f4a0d91021c46 + languageName: node + linkType: hard + +"@csstools/postcss-logical-viewport-units@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/postcss-logical-viewport-units@npm:3.0.4" + dependencies: + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/ddb8d9b473c55cce1c1261652d657d33d9306d80112eac578d53b05dd48a5607ea2064fcf6bc298ccc1e63143e11517d35230bad6063dae14d445530c45a81ec + languageName: node + linkType: hard + +"@csstools/postcss-media-minmax@npm:^2.0.9": + version: 2.0.9 + resolution: "@csstools/postcss-media-minmax@npm:2.0.9" + dependencies: + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/media-query-list-parser": "npm:^4.0.3" + peerDependencies: + postcss: ^8.4 + checksum: 10/ddd35129dc482a2cffe44cc75c48844cee56370f551e7e3abcfa0a158c3a2a48d8a2196e82e223fdf794a066688d423558e211f69010cfbc6044c989464d3899 + languageName: node + linkType: hard + +"@csstools/postcss-media-queries-aspect-ratio-number-values@npm:^3.0.5": + version: 3.0.5 + resolution: "@csstools/postcss-media-queries-aspect-ratio-number-values@npm:3.0.5" + dependencies: + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/media-query-list-parser": "npm:^4.0.3" + peerDependencies: + postcss: ^8.4 + checksum: 10/b0124a071c7880327b23ebcd77e2c74594a852bf9193f2f552630d9e8b0996789884c05cf4ebff4dbf5c3bfb5e6cb70e9e52a740f150034bfae87208898d3d9d + languageName: node + linkType: hard + +"@csstools/postcss-nested-calc@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-nested-calc@npm:4.0.0" + dependencies: + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/f334861687d7e3a4b9c26940e767a06f07e0095cab405a5b086fca407d6f743c57b552d4504ba7d5b1700a97da3507a41bf3bc2d126a26028b79f96ea38b6af5 + languageName: node + linkType: hard + +"@csstools/postcss-normalize-display-values@npm:^4.0.1": + version: 4.0.1 + resolution: "@csstools/postcss-normalize-display-values@npm:4.0.1" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/46138f696ddadc0777dc66e97ff3a5f5a4dfa4f25ac396590b22df66dcc46d335c19af4fb4468e35472e1379ff180c858839c3ad51e7763ba3f9d898b00fb8a1 + languageName: node + linkType: hard + +"@csstools/postcss-oklab-function@npm:^4.0.12": + version: 4.0.12 + resolution: "@csstools/postcss-oklab-function@npm:4.0.12" + dependencies: + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/d5a57c23939bdb71ab9cf0ecf35b217ee958206e4b31f7955ff006a74284de51fb79bc1df50974171d2975bd0fa5d34a31687c49d1c52c36d4b83ee09b7544fc + languageName: node + linkType: hard + +"@csstools/postcss-position-area-property@npm:^1.0.0": + version: 1.0.0 + resolution: "@csstools/postcss-position-area-property@npm:1.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/50f1274b8f88d89d90494f7511c2d34736ccc6f48ce650efe85772fb1a355c98bc41b749ba6c7129de24a26536c77166a850a912b650c9c6781665ed9e85321e + languageName: node + linkType: hard + +"@csstools/postcss-progressive-custom-properties@npm:^4.2.1": + version: 4.2.1 + resolution: "@csstools/postcss-progressive-custom-properties@npm:4.2.1" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/aefbdcd7ceaa25c004c454245148ed03cdeecf420887062c04eb0ff1a0ea0394ac174da2968250db34278236ecae5b25d8b3fb0c6b9b9e594b67f13e99ba56fd + languageName: node + linkType: hard + +"@csstools/postcss-property-rule-prelude-list@npm:^1.0.0": + version: 1.0.0 + resolution: "@csstools/postcss-property-rule-prelude-list@npm:1.0.0" + dependencies: + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10/f915cef138a8a96d256a47c6c317456d3d31d516777bc3d556ad8276a2d919405cc24781c91e4c629f2bf009e79be84f38cf62ac73fe94edd7bf61d4b2c7cf93 + languageName: node + linkType: hard + +"@csstools/postcss-random-function@npm:^2.0.1": + version: 2.0.1 + resolution: "@csstools/postcss-random-function@npm:2.0.1" + dependencies: + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10/d421a790b11675edf493f3e48259636beca164c494ed2883042118b35674d26f04e1a46f9e89203a179e20acc2a1f5912078ec81b330a2c1a1abef7e7387e587 + languageName: node + linkType: hard + +"@csstools/postcss-relative-color-syntax@npm:^3.0.12": + version: 3.0.12 + resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.12" + dependencies: + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/7c6b5671268c1e30e8f113305c362d567010a0164e2b573a4d878289d5e79ab390d95975375a4c1ab577a1075d244bf242a411c4ca7ecc395546664d59becc0b + languageName: node + linkType: hard + +"@csstools/postcss-scope-pseudo-class@npm:^4.0.1": + version: 4.0.1 + resolution: "@csstools/postcss-scope-pseudo-class@npm:4.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/043667ad54b3a26e619d6c16129c1f4d8f8c7cd1c52443475aa7782dbc411390c23bd2fe41ea9c6a3f280594abbcdd9d4117a3d7c27cd2a77e31e6fd11e29fc0 + languageName: node + linkType: hard + +"@csstools/postcss-sign-functions@npm:^1.1.4": + version: 1.1.4 + resolution: "@csstools/postcss-sign-functions@npm:1.1.4" + dependencies: + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10/0afcb008142a0a41df51267d79cf950f4f314394dca7c041e3a0be87df56517ac5400861630a979b5bef49f01c296025106622110384039e3c8f82802d6adcde + languageName: node + linkType: hard + +"@csstools/postcss-stepped-value-functions@npm:^4.0.9": + version: 4.0.9 + resolution: "@csstools/postcss-stepped-value-functions@npm:4.0.9" + dependencies: + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10/6465a883be42d4cc4a4e83be2626a1351de4bfe84a63641c53e7c39d3c0e109152489ca2d8235625cdf6726341c676b9fbbca18fe80bb5eae8d488a0e42fc5e4 + languageName: node + linkType: hard + +"@csstools/postcss-syntax-descriptor-syntax-production@npm:^1.0.1": + version: 1.0.1 + resolution: "@csstools/postcss-syntax-descriptor-syntax-production@npm:1.0.1" + dependencies: + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10/d0216cf3cd0b86203c5927cb211500543dec498d6d91b393caaa1df82af7dd7570a477a9a829ab15341ef812e341a7b34193f204a18c10e571b6da8df14c2127 + languageName: node + linkType: hard + +"@csstools/postcss-system-ui-font-family@npm:^1.0.0": + version: 1.0.0 + resolution: "@csstools/postcss-system-ui-font-family@npm:1.0.0" + dependencies: + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10/6e2eed873ce887e3e3cec8d36d48fb71ef68b9995275ba008b3d5538ce63704eb4c9d4b1bd8e4a9e6d605116d7658a64557abbca7858069c7e81ea386433b8f9 + languageName: node + linkType: hard + +"@csstools/postcss-text-decoration-shorthand@npm:^4.0.3": + version: 4.0.3 + resolution: "@csstools/postcss-text-decoration-shorthand@npm:4.0.3" + dependencies: + "@csstools/color-helpers": "npm:^5.1.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/afc350e389bae7fdceecb3876b9be00bdbd56e5f43054f9f5de2d42b3c55a163e5ba737212030479389c9c1fca5d066f5b051da1fdf72e13191a035d2cc6f4e0 + languageName: node + linkType: hard + +"@csstools/postcss-trigonometric-functions@npm:^4.0.9": + version: 4.0.9 + resolution: "@csstools/postcss-trigonometric-functions@npm:4.0.9" + dependencies: + "@csstools/css-calc": "npm:^2.1.4" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10/c746cd986df061a87de4f2d0129aa2d2e98a2948e5005fe6fe419a9e9ec7a0f7382461847cbd3f67f8f66169bdf23a1d7f53ca6b9922ddd235ec45f2867a8825 + languageName: node + linkType: hard + +"@csstools/postcss-unset-value@npm:^4.0.0": + version: 4.0.0 + resolution: "@csstools/postcss-unset-value@npm:4.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/af65b1c59fe93fa15ad6e5a6edbfd6fe89a3c6e19118a4729592f623c1f55b14518f2de3e8ef2bb6838b1540ebffc9df1a4f1e097dea44abf0faeefeb93d1f58 + languageName: node + linkType: hard + +"@csstools/selector-resolve-nested@npm:^3.1.0": + version: 3.1.0 + resolution: "@csstools/selector-resolve-nested@npm:3.1.0" + peerDependencies: + postcss-selector-parser: ^7.0.0 + checksum: 10/eaad6a6c99345cae2849a2c73daf53381fabd75851eefd830ee743e4d454d4e2930aa99c8b9e651fed92b9a8361f352c6c754abf82c576bba4953f1e59c927e9 + languageName: node + linkType: hard + +"@csstools/selector-specificity@npm:^5.0.0": + version: 5.0.0 + resolution: "@csstools/selector-specificity@npm:5.0.0" + peerDependencies: + postcss-selector-parser: ^7.0.0 + checksum: 10/8df1a01a1fa52b66c7ba0286e1c77d1faff45009876f09ddcac542a1c4bca9f34ee92a10acf056b8e7b7ac93679c1635496c6cdfd7d88dbaff2b6afd1eb823ec + languageName: node + linkType: hard + +"@csstools/utilities@npm:^2.0.0": + version: 2.0.0 + resolution: "@csstools/utilities@npm:2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/c9c8d82063ec5156d56b056c9124fed95714f05d7c1a64043174b0559aa099989f17a826579f22045384defe152e32d6355b7a9660cfed96819f43fccf277941 + languageName: node + linkType: hard + "@discoveryjs/json-ext@npm:0.5.7": version: 0.5.7 resolution: "@discoveryjs/json-ext@npm:0.5.7" @@ -1696,25 +2054,41 @@ __metadata: languageName: node linkType: hard -"@docsearch/css@npm:3.5.2": - version: 3.5.2 - resolution: "@docsearch/css@npm:3.5.2" - checksum: 10/a4d3cdeb75d2811eae6edc45f69a8e8490d3a639c74d235c6c952ea7e7f75591f541924f854a69bbf5fba9ab956ac3b3a1114a6badd3a2d461faca3166cfc457 +"@docsearch/core@npm:4.5.3": + version: 4.5.3 + resolution: "@docsearch/core@npm:4.5.3" + peerDependencies: + "@types/react": ">= 16.8.0 < 20.0.0" + react: ">= 16.8.0 < 20.0.0" + react-dom: ">= 16.8.0 < 20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true + react: + optional: true + react-dom: + optional: true + checksum: 10/0254ff87d6ac62b94d6e266a37ec8702655175b6faccad6d20af8e37f98e47770ea4a556c929221e683676df337b032c09abfed0fda44b8d9cdcf073c33f2917 languageName: node linkType: hard -"@docsearch/react@npm:^3.5.2": - version: 3.5.2 - resolution: "@docsearch/react@npm:3.5.2" +"@docsearch/css@npm:4.5.3": + version: 4.5.3 + resolution: "@docsearch/css@npm:4.5.3" + checksum: 10/2e706d9f6f619018a5b19e50cd0227f336361cc747e4659bc533336d5c1bea5e135435aa4e312171c4cadc394b60c54ec9d144dd198a6aa366a8d1dec112505c + languageName: node + linkType: hard + +"@docsearch/react@npm:^3.9.0 || ^4.1.0": + version: 4.5.3 + resolution: "@docsearch/react@npm:4.5.3" dependencies: - "@algolia/autocomplete-core": "npm:1.9.3" - "@algolia/autocomplete-preset-algolia": "npm:1.9.3" - "@docsearch/css": "npm:3.5.2" - algoliasearch: "npm:^4.19.1" + "@docsearch/core": "npm:4.5.3" + "@docsearch/css": "npm:4.5.3" peerDependencies: - "@types/react": ">= 16.8.0 < 19.0.0" - react: ">= 16.8.0 < 19.0.0" - react-dom: ">= 16.8.0 < 19.0.0" + "@types/react": ">= 16.8.0 < 20.0.0" + react: ">= 16.8.0 < 20.0.0" + react-dom: ">= 16.8.0 < 20.0.0" search-insights: ">= 1 < 3" peerDependenciesMeta: "@types/react": @@ -1725,128 +2099,181 @@ __metadata: optional: true search-insights: optional: true - checksum: 10/3191dbb443625ea993480e7f4ff8189ff3ca4e8ab0c69248d61363dd32853dc7c338af9ae0e8014cc30f61ec6b94a21d7cd66f3d9128ff9def1971b6c21a6f36 + checksum: 10/855af70e9af5f09420b23c55cb93e973ba0ef39c2454df94385ff46cf9659a08795e7c8361a1583f9bf4c98c985290462984348685def6df375e3d1027ec3b6a languageName: node linkType: hard -"@docusaurus/core@npm:3.5.2, @docusaurus/core@npm:^3.1.1": - version: 3.5.2 - resolution: "@docusaurus/core@npm:3.5.2" +"@docusaurus/babel@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/babel@npm:3.9.2" dependencies: - "@babel/core": "npm:^7.23.3" - "@babel/generator": "npm:^7.23.3" + "@babel/core": "npm:^7.25.9" + "@babel/generator": "npm:^7.25.9" "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - "@babel/plugin-transform-runtime": "npm:^7.22.9" - "@babel/preset-env": "npm:^7.22.9" - "@babel/preset-react": "npm:^7.22.5" - "@babel/preset-typescript": "npm:^7.22.5" - "@babel/runtime": "npm:^7.22.6" - "@babel/runtime-corejs3": "npm:^7.22.6" - "@babel/traverse": "npm:^7.22.8" - "@docusaurus/cssnano-preset": "npm:3.5.2" - "@docusaurus/logger": "npm:3.5.2" - "@docusaurus/mdx-loader": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-common": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" - autoprefixer: "npm:^10.4.14" - babel-loader: "npm:^9.1.3" + "@babel/plugin-transform-runtime": "npm:^7.25.9" + "@babel/preset-env": "npm:^7.25.9" + "@babel/preset-react": "npm:^7.25.9" + "@babel/preset-typescript": "npm:^7.25.9" + "@babel/runtime": "npm:^7.25.9" + "@babel/runtime-corejs3": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" babel-plugin-dynamic-import-node: "npm:^2.3.3" + fs-extra: "npm:^11.1.1" + tslib: "npm:^2.6.0" + checksum: 10/ff1806ee5899e61c37930046faf4e485368ebb5412a42b65666c0a9dd15f330acf3136cbccb8d8ff98f9d1403b407b698fbffab4b23c08815607152c1dda1c2a + languageName: node + linkType: hard + +"@docusaurus/bundler@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/bundler@npm:3.9.2" + dependencies: + "@babel/core": "npm:^7.25.9" + "@docusaurus/babel": "npm:3.9.2" + "@docusaurus/cssnano-preset": "npm:3.9.2" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + babel-loader: "npm:^9.2.1" + clean-css: "npm:^5.3.3" + copy-webpack-plugin: "npm:^11.0.0" + css-loader: "npm:^6.11.0" + css-minimizer-webpack-plugin: "npm:^5.0.1" + cssnano: "npm:^6.1.2" + file-loader: "npm:^6.2.0" + html-minifier-terser: "npm:^7.2.0" + mini-css-extract-plugin: "npm:^2.9.2" + null-loader: "npm:^4.0.1" + postcss: "npm:^8.5.4" + postcss-loader: "npm:^7.3.4" + postcss-preset-env: "npm:^10.2.1" + terser-webpack-plugin: "npm:^5.3.9" + tslib: "npm:^2.6.0" + url-loader: "npm:^4.1.1" + webpack: "npm:^5.95.0" + webpackbar: "npm:^6.0.1" + peerDependencies: + "@docusaurus/faster": "*" + peerDependenciesMeta: + "@docusaurus/faster": + optional: true + checksum: 10/767c3554305b7e7ab6d5b4bf36ab00bad3d257a9936f7b3698fe9d8275e10a16098ad84d4492a469ddde4dcf098e75df8cca82443fbeb634719fdf6d7fe2c4be + languageName: node + linkType: hard + +"@docusaurus/core@npm:3.9.2, @docusaurus/core@npm:^3.9.0": + version: 3.9.2 + resolution: "@docusaurus/core@npm:3.9.2" + dependencies: + "@docusaurus/babel": "npm:3.9.2" + "@docusaurus/bundler": "npm:3.9.2" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/mdx-loader": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-common": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" boxen: "npm:^6.2.1" chalk: "npm:^4.1.2" chokidar: "npm:^3.5.3" - clean-css: "npm:^5.3.2" cli-table3: "npm:^0.6.3" combine-promises: "npm:^1.1.0" commander: "npm:^5.1.0" - copy-webpack-plugin: "npm:^11.0.0" core-js: "npm:^3.31.1" - css-loader: "npm:^6.8.1" - css-minimizer-webpack-plugin: "npm:^5.0.1" - cssnano: "npm:^6.1.2" - del: "npm:^6.1.1" detect-port: "npm:^1.5.1" escape-html: "npm:^1.0.3" eta: "npm:^2.2.0" eval: "npm:^0.1.8" - file-loader: "npm:^6.2.0" + execa: "npm:5.1.1" fs-extra: "npm:^11.1.1" - html-minifier-terser: "npm:^7.2.0" html-tags: "npm:^3.3.1" - html-webpack-plugin: "npm:^5.5.3" + html-webpack-plugin: "npm:^5.6.0" leven: "npm:^3.1.0" lodash: "npm:^4.17.21" - mini-css-extract-plugin: "npm:^2.7.6" + open: "npm:^8.4.0" p-map: "npm:^4.0.0" - postcss: "npm:^8.4.26" - postcss-loader: "npm:^7.3.3" prompts: "npm:^2.4.2" - react-dev-utils: "npm:^12.0.1" - react-helmet-async: "npm:^1.3.0" + react-helmet-async: "npm:@slorber/react-helmet-async@1.3.0" react-loadable: "npm:@docusaurus/react-loadable@6.0.0" react-loadable-ssr-addon-v5-slorber: "npm:^1.0.1" react-router: "npm:^5.3.4" react-router-config: "npm:^5.1.1" react-router-dom: "npm:^5.3.4" - rtl-detect: "npm:^1.0.4" semver: "npm:^7.5.4" - serve-handler: "npm:^6.1.5" - shelljs: "npm:^0.8.5" - terser-webpack-plugin: "npm:^5.3.9" + serve-handler: "npm:^6.1.6" + tinypool: "npm:^1.0.2" tslib: "npm:^2.6.0" update-notifier: "npm:^6.0.2" - url-loader: "npm:^4.1.1" - webpack: "npm:^5.88.1" - webpack-bundle-analyzer: "npm:^4.9.0" - webpack-dev-server: "npm:^4.15.1" - webpack-merge: "npm:^5.9.0" - webpackbar: "npm:^5.0.2" + webpack: "npm:^5.95.0" + webpack-bundle-analyzer: "npm:^4.10.2" + webpack-dev-server: "npm:^5.2.2" + webpack-merge: "npm:^6.0.1" peerDependencies: "@mdx-js/react": ^3.0.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 bin: docusaurus: bin/docusaurus.mjs - checksum: 10/4515fe7502ad9912c2d25b7b1ec56196d4f96fc5b4702f6f8551ab2b3dbd0e6286f789e3663ceb8e95b31af0816817b0b35a7fb230a0c950b7e2802f30966442 + checksum: 10/3d6e1219648fdf8f32c3a53c06c79df512715edb054a524f1874d81f7a95f9bd599ca803ae9decbec3917ec648aa10606643f2b9c36b12ef349b4cbe3a4abf23 languageName: node linkType: hard -"@docusaurus/cssnano-preset@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/cssnano-preset@npm:3.5.2" +"@docusaurus/cssnano-preset@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/cssnano-preset@npm:3.9.2" dependencies: cssnano-preset-advanced: "npm:^6.1.2" - postcss: "npm:^8.4.38" + postcss: "npm:^8.5.4" postcss-sort-media-queries: "npm:^5.2.0" tslib: "npm:^2.6.0" - checksum: 10/4bb1fae3741e14cbbdb64c1b0707435970838bf219831234a70cf382e6811ffac1cadf733d5e1fe7c278e7b2a9e533bfa802a5212b22ec46edd703208cf49f92 + checksum: 10/21b9b787042ab00db945969c45fdd6fb489cd0811ad256e482b44db3d6846b4f9c54a5b360e76f7160736e2866602d690bbe29d3cb9b08577d7087b38720566f languageName: node linkType: hard -"@docusaurus/logger@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/logger@npm:3.5.2" +"@docusaurus/faster@npm:^3.9.0": + version: 3.9.2 + resolution: "@docusaurus/faster@npm:3.9.2" + dependencies: + "@docusaurus/types": "npm:3.9.2" + "@rspack/core": "npm:^1.5.0" + "@swc/core": "npm:^1.7.39" + "@swc/html": "npm:^1.13.5" + browserslist: "npm:^4.24.2" + lightningcss: "npm:^1.27.0" + swc-loader: "npm:^0.2.6" + tslib: "npm:^2.6.0" + webpack: "npm:^5.95.0" + peerDependencies: + "@docusaurus/types": "*" + checksum: 10/116c4df683a59199c2522407015ca066917accf2ab148fb93c36274c6db669feb23198a6dc15201205670e10fd7ce33a143c14827188f37084ad8ca0aac42824 + languageName: node + linkType: hard + +"@docusaurus/logger@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/logger@npm:3.9.2" dependencies: chalk: "npm:^4.1.2" tslib: "npm:^2.6.0" - checksum: 10/9cc1ac17503fdd739ceba6340289bf39740e1aad87e0a7e5da97fcd2f6186b5f4da05bbbbf660a43af04f0ec8bc2aaac086d6d31c79ab64c71acb3da36213b9e + checksum: 10/4d7b1bccc90fa108d7c8ffd1cd071ce2e179e0af9989f4c76acfe021789b186a15e4e56db55360df15de3e41f1d69c4e851a73cdf594fa02bb6fb219eaf48e57 languageName: node linkType: hard -"@docusaurus/mdx-loader@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/mdx-loader@npm:3.5.2" +"@docusaurus/mdx-loader@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/mdx-loader@npm:3.9.2" dependencies: - "@docusaurus/logger": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" "@mdx-js/mdx": "npm:^3.0.0" "@slorber/remark-comment": "npm:^1.0.0" escape-html: "npm:^1.0.3" estree-util-value-to-estree: "npm:^3.0.1" file-loader: "npm:^6.2.0" fs-extra: "npm:^11.1.1" - image-size: "npm:^1.0.2" + image-size: "npm:^2.0.2" mdast-util-mdx: "npm:^3.0.0" mdast-util-to-string: "npm:^4.0.0" rehype-raw: "npm:^7.0.0" @@ -1862,67 +2289,67 @@ __metadata: vfile: "npm:^6.0.1" webpack: "npm:^5.88.1" peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10/9d9f771c1af1d285e182c2966159d4d0904fae563d7ce0e4e3d5fbf2a98555721252a32d1acd4f971f0a5fca90929906fd1ad9c005c7ec9306801c11b3c64ffc + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10/00777730141774c9f465ee9b35a61c414e694f43995377c0f1a6a3fa07cca177eea45614be72a8ed40b094cdcc5fd2ba3762b68a4ad410071d2ea018a502d76e languageName: node linkType: hard -"@docusaurus/module-type-aliases@npm:3.5.2, @docusaurus/module-type-aliases@npm:^3.1.1": - version: 3.5.2 - resolution: "@docusaurus/module-type-aliases@npm:3.5.2" +"@docusaurus/module-type-aliases@npm:3.9.2, @docusaurus/module-type-aliases@npm:^3.1.1": + version: 3.9.2 + resolution: "@docusaurus/module-type-aliases@npm:3.9.2" dependencies: - "@docusaurus/types": "npm:3.5.2" + "@docusaurus/types": "npm:3.9.2" "@types/history": "npm:^4.7.11" "@types/react": "npm:*" "@types/react-router-config": "npm:*" "@types/react-router-dom": "npm:*" - react-helmet-async: "npm:*" + react-helmet-async: "npm:@slorber/react-helmet-async@1.3.0" react-loadable: "npm:@docusaurus/react-loadable@6.0.0" peerDependencies: react: "*" react-dom: "*" - checksum: 10/48d7b8a1f4fb946d541cff312a953149692bd6590e0ee2e6877b6903f7cb1871c6e79dfcaad465bd24201388d58a85a7a49c53d95f6f51d51bd1ae49d37020f2 + checksum: 10/6b47ea9f31871e7200ca8c76016496a524fa0b0458ab9bdd582afbd79a9c1756c1ad8414c1cf8ff942b94b2505d1a50492963d8d59294cafc5f7b894e82f3d5f languageName: node linkType: hard -"@docusaurus/plugin-client-redirects@npm:^3.1.1": - version: 3.5.2 - resolution: "@docusaurus/plugin-client-redirects@npm:3.5.2" +"@docusaurus/plugin-client-redirects@npm:^3.9.0": + version: 3.9.2 + resolution: "@docusaurus/plugin-client-redirects@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/logger": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-common": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-common": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" eta: "npm:^2.2.0" fs-extra: "npm:^11.1.1" lodash: "npm:^4.17.21" tslib: "npm:^2.6.0" peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10/f42d00b7be74b140dc71aa72a33570bd7742d9e2b094d465500f54657a7058a205f741cbf5c5520871e6bc8a2842a6d376a6b37a1929141b564d8cceb5beaa9b + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10/2f45f0a247bf02c54b4fdbd7de73be6523ad467869573861fe083586e46b94844eb01103e5e1e3c1f44d93b2e9b9e64c8fac9168910fe9d6aa377c2fcd79701a languageName: node linkType: hard -"@docusaurus/plugin-content-blog@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/plugin-content-blog@npm:3.5.2" +"@docusaurus/plugin-content-blog@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-content-blog@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/logger": "npm:3.5.2" - "@docusaurus/mdx-loader": "npm:3.5.2" - "@docusaurus/theme-common": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-common": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/mdx-loader": "npm:3.9.2" + "@docusaurus/theme-common": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-common": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" cheerio: "npm:1.0.0-rc.12" feed: "npm:^4.2.2" fs-extra: "npm:^11.1.1" lodash: "npm:^4.17.21" - reading-time: "npm:^1.5.0" + schema-dts: "npm:^1.1.2" srcset: "npm:^4.0.0" tslib: "npm:^2.6.0" unist-util-visit: "npm:^5.0.0" @@ -1930,189 +2357,224 @@ __metadata: webpack: "npm:^5.88.1" peerDependencies: "@docusaurus/plugin-content-docs": "*" - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10/42429c6d9182e6fb6699eefb016597be11718859bda9a107aaa226c67bda08a3f567952be72b04f71ded7e18bd3513380aa42466b960495c8219db3f1b0b3c83 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10/86680042f4b36acf22a7f83cd432eebca31d2770027595e48151b21e081bc50bf18f4e090549a69dd2d4da49cec83953bfb40c71c1a3a91d36ddd0f84351a659 languageName: node linkType: hard -"@docusaurus/plugin-content-docs@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/plugin-content-docs@npm:3.5.2" +"@docusaurus/plugin-content-docs@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-content-docs@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/logger": "npm:3.5.2" - "@docusaurus/mdx-loader": "npm:3.5.2" - "@docusaurus/module-type-aliases": "npm:3.5.2" - "@docusaurus/theme-common": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-common": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/mdx-loader": "npm:3.9.2" + "@docusaurus/module-type-aliases": "npm:3.9.2" + "@docusaurus/theme-common": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-common": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" "@types/react-router-config": "npm:^5.0.7" combine-promises: "npm:^1.1.0" fs-extra: "npm:^11.1.1" js-yaml: "npm:^4.1.0" lodash: "npm:^4.17.21" + schema-dts: "npm:^1.1.2" tslib: "npm:^2.6.0" utility-types: "npm:^3.10.0" webpack: "npm:^5.88.1" peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10/100250c4e988de1f31cf5bc1fd9f6b6929ccfbb748113352bf5ac4b90ed2f096cb4366d95451a367d26d79735879711f0ec1eae352a7829c0f5e40443c873d6f + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10/5a3fb39a1add1f5db8aabd03b56f65e988a776d5983def89b6b4f17ab0c78dd4de255aab080a082aa8e7e7915da1705277148789fada56d9c6d9ad8f468e784e languageName: node linkType: hard -"@docusaurus/plugin-content-pages@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/plugin-content-pages@npm:3.5.2" +"@docusaurus/plugin-content-pages@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-content-pages@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/mdx-loader": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/mdx-loader": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" fs-extra: "npm:^11.1.1" tslib: "npm:^2.6.0" webpack: "npm:^5.88.1" peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10/f89fdd30d4c4e6e750c6814f28eb21f6886d4e5f6c56bbfb14fc518262b19406222da48ab7884dce0dd599045d6325ae89a02a16a807df60b8d52aa27cdb4e8b + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10/341b5ac4d4e55fcb8f72cad3977f548e19061d4bb19392f5dea194cdb7f7d260640ed656a793145809fc8c0ca5fb15cac6e9b6c73545a83dfcd0463cad3f60a2 languageName: node linkType: hard -"@docusaurus/plugin-debug@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/plugin-debug@npm:3.5.2" +"@docusaurus/plugin-css-cascade-layers@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-css-cascade-layers@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" + tslib: "npm:^2.6.0" + checksum: 10/039debb4e3764b9ecb6aafa2b7ca1d59f2cf52bb4f4e71390394d554149b0bc9a7aa355f2ea72a92c2e2fbdd5b7ed7843cd8100d1b8d0f62187588253ff8d6d5 + languageName: node + linkType: hard + +"@docusaurus/plugin-debug@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-debug@npm:3.9.2" + dependencies: + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" fs-extra: "npm:^11.1.1" - react-json-view-lite: "npm:^1.2.0" + react-json-view-lite: "npm:^2.3.0" tslib: "npm:^2.6.0" peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10/a839e6c3a595ea202fdd7fbce638ab8df26ba73a8c7ead8c04d1bbb509ebe34e9633e7fe9eb54a7a733e93a03d74a60df4d9f6597b9621ff464280d4dd71db34 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10/8974d17143f3b379c977441011f6c9daa8d38eb484c33726b9e9a63012553e66847a1a18e7e86ed52bc5321d2833ee8e934a1619afcdd669b255089ffd23a506 languageName: node linkType: hard -"@docusaurus/plugin-google-analytics@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/plugin-google-analytics@npm:3.5.2" +"@docusaurus/plugin-google-analytics@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-google-analytics@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" tslib: "npm:^2.6.0" peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10/0b8c4d21333d40c2509d6ef807caaf69f085010c5deac514ab34f53b5486fd76766c90213dc98976a6c4d66fdfa14bf6b05594e51e8a53ec60c2a3fa08fd9a83 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10/026ffe26b4e47adf509f3de79a9a4b095e0374e4db0ce73041f9d28933df1e7697069bce7a0be1744eeca2b2d5ed057f023f4f2e98aff838b33cc2c2d1eed882 languageName: node linkType: hard -"@docusaurus/plugin-google-gtag@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/plugin-google-gtag@npm:3.5.2" +"@docusaurus/plugin-google-gtag@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-google-gtag@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" "@types/gtag.js": "npm:^0.0.12" tslib: "npm:^2.6.0" peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10/5d53c2483c8c7e3a8e842bd091a774d4041f0e165d216b3c02f031a224a77258c9456e8b2acd0500b4a0eff474a83c1b82803628db9d4b132514409936c68ac4 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10/ee596c5a1d1a71d947c390274326b46a9aeb56c3d0c0c0b672629e890e783f6f6947505dc66ee0abe4d70fe61f743ff9df0a4b4cdc4fe3994eefbb1a4386769b languageName: node linkType: hard -"@docusaurus/plugin-google-tag-manager@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/plugin-google-tag-manager@npm:3.5.2" +"@docusaurus/plugin-google-tag-manager@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-google-tag-manager@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" tslib: "npm:^2.6.0" peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10/9a6fc2ca54ea677c6edfd78f4f392d7d9ae86afd085fcda96d5ac41efa441352c25a2519595d9d15fb9b838e2ae39837f0daf02e2406c5cd56199ae237bd7b7a + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10/0c4ee07b5ee2cdf252b53aa52b54f42ae591441df5e289e2a1614bcabe1852f973ec65a1086c7682f7e5a5e65a50c0597ed9c393505c2902f1a52569798ef6c0 languageName: node linkType: hard -"@docusaurus/plugin-sitemap@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/plugin-sitemap@npm:3.5.2" +"@docusaurus/plugin-sitemap@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-sitemap@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/logger": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-common": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-common": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" fs-extra: "npm:^11.1.1" sitemap: "npm:^7.1.1" tslib: "npm:^2.6.0" peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10/74d17206fdf7fb1fe826e0876b71f0e404e115e98a71fe34a1b0ce607e84b285dfd0f5995bab53eeff2e32ee3f03ae5c27d9337bd8cab9108f55bcbb2f5d9333 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10/adba37c28fadf7901b6d12253093b92c90856a00f98f9830b039fdcb92c2472cdb43a0f939a9d3012db0e003571fd77e6cb58972c375b70b7bae748be2a6f263 languageName: node linkType: hard -"@docusaurus/preset-classic@npm:^3.1.1": - version: 3.5.2 - resolution: "@docusaurus/preset-classic@npm:3.5.2" +"@docusaurus/plugin-svgr@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/plugin-svgr@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/plugin-content-blog": "npm:3.5.2" - "@docusaurus/plugin-content-docs": "npm:3.5.2" - "@docusaurus/plugin-content-pages": "npm:3.5.2" - "@docusaurus/plugin-debug": "npm:3.5.2" - "@docusaurus/plugin-google-analytics": "npm:3.5.2" - "@docusaurus/plugin-google-gtag": "npm:3.5.2" - "@docusaurus/plugin-google-tag-manager": "npm:3.5.2" - "@docusaurus/plugin-sitemap": "npm:3.5.2" - "@docusaurus/theme-classic": "npm:3.5.2" - "@docusaurus/theme-common": "npm:3.5.2" - "@docusaurus/theme-search-algolia": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" + "@svgr/core": "npm:8.1.0" + "@svgr/webpack": "npm:^8.1.0" + tslib: "npm:^2.6.0" + webpack: "npm:^5.88.1" peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10/ec578e62b3b13b1874b14235a448a913c2d2358ea9b9d9c60bb250be468ab62387c88ec44e1ee82ad5b3d7243306e31919888a80eae62e5e8eab0ae12194bf69 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10/5e5b7789a34c1d013d248e41ea8704dc22174aaff4fdd77336886021f5ae38e435bb8109b97f122ba2ecbcba87a8d0cd0705987e2fc014162d567ea38cc1ee04 languageName: node linkType: hard -"@docusaurus/theme-classic@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/theme-classic@npm:3.5.2" +"@docusaurus/preset-classic@npm:^3.9.0": + version: 3.9.2 + resolution: "@docusaurus/preset-classic@npm:3.9.2" dependencies: - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/mdx-loader": "npm:3.5.2" - "@docusaurus/module-type-aliases": "npm:3.5.2" - "@docusaurus/plugin-content-blog": "npm:3.5.2" - "@docusaurus/plugin-content-docs": "npm:3.5.2" - "@docusaurus/plugin-content-pages": "npm:3.5.2" - "@docusaurus/theme-common": "npm:3.5.2" - "@docusaurus/theme-translations": "npm:3.5.2" - "@docusaurus/types": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-common": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/plugin-content-blog": "npm:3.9.2" + "@docusaurus/plugin-content-docs": "npm:3.9.2" + "@docusaurus/plugin-content-pages": "npm:3.9.2" + "@docusaurus/plugin-css-cascade-layers": "npm:3.9.2" + "@docusaurus/plugin-debug": "npm:3.9.2" + "@docusaurus/plugin-google-analytics": "npm:3.9.2" + "@docusaurus/plugin-google-gtag": "npm:3.9.2" + "@docusaurus/plugin-google-tag-manager": "npm:3.9.2" + "@docusaurus/plugin-sitemap": "npm:3.9.2" + "@docusaurus/plugin-svgr": "npm:3.9.2" + "@docusaurus/theme-classic": "npm:3.9.2" + "@docusaurus/theme-common": "npm:3.9.2" + "@docusaurus/theme-search-algolia": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10/ae8328253111429e9ca219273d5ae8c39f26a98c2422b25a8d233e3a0f2737e453dd1dbcc29e4c9a601b936d0217b3e91dce218d12f9f33793ae3120ed629c1c + languageName: node + linkType: hard + +"@docusaurus/theme-classic@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/theme-classic@npm:3.9.2" + dependencies: + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/mdx-loader": "npm:3.9.2" + "@docusaurus/module-type-aliases": "npm:3.9.2" + "@docusaurus/plugin-content-blog": "npm:3.9.2" + "@docusaurus/plugin-content-docs": "npm:3.9.2" + "@docusaurus/plugin-content-pages": "npm:3.9.2" + "@docusaurus/theme-common": "npm:3.9.2" + "@docusaurus/theme-translations": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-common": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" "@mdx-js/react": "npm:^3.0.0" clsx: "npm:^2.0.0" - copy-text-to-clipboard: "npm:^3.2.0" - infima: "npm:0.2.0-alpha.44" + infima: "npm:0.2.0-alpha.45" lodash: "npm:^4.17.21" nprogress: "npm:^0.2.0" - postcss: "npm:^8.4.26" + postcss: "npm:^8.5.4" prism-react-renderer: "npm:^2.3.0" prismjs: "npm:^1.29.0" react-router-dom: "npm:^5.3.4" @@ -2120,20 +2582,20 @@ __metadata: tslib: "npm:^2.6.0" utility-types: "npm:^3.10.0" peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10/74a4bf64ba6699ebb3adea29d7c57996b032a6d77e4b650dcf68b8af7d6152a3712354dd964eab674a189d582ffbde50037cec8c0cf6369da267c37e5856eb2b + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10/aeb889cf6d0d4b8836d4684d775b70098f675f3d53cf24cca773784d7ed9ffa33c6240ea87bcd33b9abb6a66ba6a4c3c1d16c004da1e6ad4167af5600f3131d6 languageName: node linkType: hard -"@docusaurus/theme-common@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/theme-common@npm:3.5.2" +"@docusaurus/theme-common@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/theme-common@npm:3.9.2" dependencies: - "@docusaurus/mdx-loader": "npm:3.5.2" - "@docusaurus/module-type-aliases": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-common": "npm:3.5.2" + "@docusaurus/mdx-loader": "npm:3.9.2" + "@docusaurus/module-type-aliases": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-common": "npm:3.9.2" "@types/history": "npm:^4.7.11" "@types/react": "npm:*" "@types/react-router-config": "npm:*" @@ -2144,26 +2606,26 @@ __metadata: utility-types: "npm:^3.10.0" peerDependencies: "@docusaurus/plugin-content-docs": "*" - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10/1cb8f97516f152f3b4a747926e9c1a22dc1be5ffc8cfe1a3b0ac5a3bdaaa749b61fb34dbf4c0cb03e319b2cc9ea5c12b39dedcd869721cd2ad8d19be82e015f9 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10/697a23f4bcad3ec49af6386e939f5d10c04c7160daaee11e78c021b385a18d6d040f6c7a86f8f8d0e076fc2d2abd4eea71d51849bebc8c409af5d73a7b2c6738 languageName: node linkType: hard -"@docusaurus/theme-search-algolia@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/theme-search-algolia@npm:3.5.2" +"@docusaurus/theme-search-algolia@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/theme-search-algolia@npm:3.9.2" dependencies: - "@docsearch/react": "npm:^3.5.2" - "@docusaurus/core": "npm:3.5.2" - "@docusaurus/logger": "npm:3.5.2" - "@docusaurus/plugin-content-docs": "npm:3.5.2" - "@docusaurus/theme-common": "npm:3.5.2" - "@docusaurus/theme-translations": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-validation": "npm:3.5.2" - algoliasearch: "npm:^4.18.0" - algoliasearch-helper: "npm:^3.13.3" + "@docsearch/react": "npm:^3.9.0 || ^4.1.0" + "@docusaurus/core": "npm:3.9.2" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/plugin-content-docs": "npm:3.9.2" + "@docusaurus/theme-common": "npm:3.9.2" + "@docusaurus/theme-translations": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-validation": "npm:3.9.2" + algoliasearch: "npm:^5.37.0" + algoliasearch-helper: "npm:^3.26.0" clsx: "npm:^2.0.0" eta: "npm:^2.2.0" fs-extra: "npm:^11.1.1" @@ -2171,87 +2633,85 @@ __metadata: tslib: "npm:^2.6.0" utility-types: "npm:^3.10.0" peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10/24e9378dec5ec91d1f2a6e539182d2424bbf14d60e92db180870716e3c7327931d4aab912a8251e18323395bd5b9a10f97f9af87e88a962ef691903fb9f3d7be + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10/e2623c11c69a40eaec8cbf76e4b19444c0929ee47a899882dc0b5e314153e64aa1ed64b7a0ea0b182bdf418e616191a147e5ff5ff9679efec761e0757d7a0825 languageName: node linkType: hard -"@docusaurus/theme-translations@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/theme-translations@npm:3.5.2" +"@docusaurus/theme-translations@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/theme-translations@npm:3.9.2" dependencies: fs-extra: "npm:^11.1.1" tslib: "npm:^2.6.0" - checksum: 10/f89d7d87b4fb2fd43e286c557d9fa830d06a369516cd6c26d43afd7ab4d92c57be47c2ca8bf5779c150193511bab439237e6d2901e637a8c094955de34f9a044 + checksum: 10/a98b5a7b1d7f123b5609caadea4000b4ee956426396d4a62ce675bd1e0fe7fd65be3bba2ef97b2ec3f84bafd65fd53d1d55d3a35c585ddc7288ebca199c5a865 languageName: node linkType: hard "@docusaurus/tsconfig@npm:^3.1.1": - version: 3.5.2 - resolution: "@docusaurus/tsconfig@npm:3.5.2" - checksum: 10/808a17eaf422ae9a948c6558dd1e92d4700b067ead3a63a84049c6845bf94f84e311cd0e4d517047fe9ea057efe393bb22c2d5c92d727d06c9f895e971f2c3ea + version: 3.9.2 + resolution: "@docusaurus/tsconfig@npm:3.9.2" + checksum: 10/8e08e352ab8285d4601822dbd424700a7c875b30dd2eefb087f540e62e5a9f05026368625ce3e89948380f0b232ecd7a52e03ce069fab4de1e6a39dedf324d1b languageName: node linkType: hard -"@docusaurus/types@npm:3.5.2, @docusaurus/types@npm:^3.1.1": - version: 3.5.2 - resolution: "@docusaurus/types@npm:3.5.2" +"@docusaurus/types@npm:3.9.2, @docusaurus/types@npm:^3.9.0": + version: 3.9.2 + resolution: "@docusaurus/types@npm:3.9.2" dependencies: "@mdx-js/mdx": "npm:^3.0.0" "@types/history": "npm:^4.7.11" + "@types/mdast": "npm:^4.0.2" "@types/react": "npm:*" commander: "npm:^5.1.0" joi: "npm:^17.9.2" - react-helmet-async: "npm:^1.3.0" + react-helmet-async: "npm:@slorber/react-helmet-async@1.3.0" utility-types: "npm:^3.10.0" - webpack: "npm:^5.88.1" + webpack: "npm:^5.95.0" webpack-merge: "npm:^5.9.0" peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: 10/d13193916812312ae06d0e193c9f5d778948a6f1635d03b381b06a10d12f6479394e617fc5ef5b028fd7a155090d366b6ccd15b5552895645be2fede880faf0b + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + checksum: 10/bc91d05a206de008bfb301873877dd531b361d64a40d1301106a6952901bb3662d349e0e0c9af9e40ff1b6c7764741cc86e15e4d116c1b7d7f065dde0e8e38e1 languageName: node linkType: hard -"@docusaurus/utils-common@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/utils-common@npm:3.5.2" +"@docusaurus/utils-common@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/utils-common@npm:3.9.2" dependencies: + "@docusaurus/types": "npm:3.9.2" tslib: "npm:^2.6.0" - peerDependencies: - "@docusaurus/types": "*" - peerDependenciesMeta: - "@docusaurus/types": - optional: true - checksum: 10/9d550c89663d4271456ae0832c82a1691207ccc95e21df3a05a4bd6bbd2624bb9e3ab7327d939c04b2023378987bcf99321b2c37be1af214852832f65d6db14a + checksum: 10/77e01da05ebbf202343b3131ffaba7132c764ccc0ab48dd4421535c75a59e2d4a1dcaf8471cde257b5394528ada52f79da6398f6f2eb9fde79904be736f19275 languageName: node linkType: hard -"@docusaurus/utils-validation@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/utils-validation@npm:3.5.2" +"@docusaurus/utils-validation@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/utils-validation@npm:3.9.2" dependencies: - "@docusaurus/logger": "npm:3.5.2" - "@docusaurus/utils": "npm:3.5.2" - "@docusaurus/utils-common": "npm:3.5.2" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/utils": "npm:3.9.2" + "@docusaurus/utils-common": "npm:3.9.2" fs-extra: "npm:^11.2.0" joi: "npm:^17.9.2" js-yaml: "npm:^4.1.0" lodash: "npm:^4.17.21" tslib: "npm:^2.6.0" - checksum: 10/636a5c0d3543c6bd64a844e4ff365afbba270ab7722a6b22c64384939ce952d88df72000e7d47e80adf312810fbb501c20c7afdbfa755b19ecbda31c26073dd0 + checksum: 10/d8a853d7e79efd986be4dd3eb575ac287b58aa2363086742856671bace480f3ee35920634057d661fba2bda5992c7d45ac5dc021d77e5882e356d735e428e60f languageName: node linkType: hard -"@docusaurus/utils@npm:3.5.2": - version: 3.5.2 - resolution: "@docusaurus/utils@npm:3.5.2" +"@docusaurus/utils@npm:3.9.2": + version: 3.9.2 + resolution: "@docusaurus/utils@npm:3.9.2" dependencies: - "@docusaurus/logger": "npm:3.5.2" - "@docusaurus/utils-common": "npm:3.5.2" - "@svgr/webpack": "npm:^8.1.0" + "@docusaurus/logger": "npm:3.9.2" + "@docusaurus/types": "npm:3.9.2" + "@docusaurus/utils-common": "npm:3.9.2" escape-string-regexp: "npm:^4.0.0" + execa: "npm:5.1.1" file-loader: "npm:^6.2.0" fs-extra: "npm:^11.1.1" github-slugger: "npm:^1.5.0" @@ -2261,19 +2721,42 @@ __metadata: js-yaml: "npm:^4.1.0" lodash: "npm:^4.17.21" micromatch: "npm:^4.0.5" + p-queue: "npm:^6.6.2" prompts: "npm:^2.4.2" resolve-pathname: "npm:^3.0.0" - shelljs: "npm:^0.8.5" tslib: "npm:^2.6.0" url-loader: "npm:^4.1.1" utility-types: "npm:^3.10.0" webpack: "npm:^5.88.1" - peerDependencies: - "@docusaurus/types": "*" - peerDependenciesMeta: - "@docusaurus/types": - optional: true - checksum: 10/93355851b49de217d21f9a31d5e4083bd2b1b761af438fed5eb49c3890f01aba4bcb1801f1cd69e440ef88aa29b81783479c22302ad08a061fb1b559659e34e6 + checksum: 10/bb4f24acd4fb2d998186d4bd315c5bb481e6afa3a1dfaa549bb52e2b0d4cb94bc9f635bd897690838cc812a0cff3a30cf3ab713b2d74221902b58c2214ce5268 + languageName: node + linkType: hard + +"@emnapi/core@npm:^1.5.0": + version: 1.8.1 + resolution: "@emnapi/core@npm:1.8.1" + dependencies: + "@emnapi/wasi-threads": "npm:1.1.0" + tslib: "npm:^2.4.0" + checksum: 10/904ea60c91fc7d8aeb4a8f2c433b8cfb47c50618f2b6f37429fc5093c857c6381c60628a5cfbc3a7b0d75b0a288f21d4ed2d4533e82f92c043801ef255fd6a5c + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.5.0": + version: 1.8.1 + resolution: "@emnapi/runtime@npm:1.8.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/26725e202d4baefdc4a6ba770f703dfc80825a27c27a08c22bac1e1ce6f8f75c47b4fe9424d9b63239463c33ef20b650f08d710da18dfa1164a95e5acb865dba + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.1.0": + version: 1.1.0 + resolution: "@emnapi/wasi-threads@npm:1.1.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/0d557e75262d2f4c95cb2a456ba0785ef61f919ce488c1d76e5e3acfd26e00c753ef928cd80068363e0c166ba8cc0141305daf0f81aad5afcd421f38f11e0f4e languageName: node linkType: hard @@ -2362,14 +2845,23 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.8 - resolution: "@jridgewell/gen-mapping@npm:0.3.8" +"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/sourcemap-codec": "npm:^1.5.0" "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10/9d3a56ab3612ab9b85d38b2a93b87f3324f11c5130859957f6500e4ac8ce35f299d5ccc3ecd1ae87597601ecf83cee29e9afd04c18777c24011073992ff946df + checksum: 10/902f8261dcf450b4af7b93f9656918e02eec80a2169e155000cb2059f90113dd98f3ccf6efc6072cee1dd84cac48cade51da236972d942babc40e4c23da4d62a + languageName: node + linkType: hard + +"@jridgewell/remapping@npm:^2.3.5": + version: 2.3.5 + resolution: "@jridgewell/remapping@npm:2.3.5" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10/c2bb01856e65b506d439455f28aceacf130d6c023d1d4e3b48705e88def3571753e1a887daa04b078b562316c92d26ce36408a60534bceca3f830aec88a339ad languageName: node linkType: hard @@ -2380,13 +2872,6 @@ __metadata: languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 10/832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 - languageName: node - linkType: hard - "@jridgewell/source-map@npm:^0.3.3": version: 0.3.5 resolution: "@jridgewell/source-map@npm:0.3.5" @@ -2397,20 +2882,20 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10/4ed6123217569a1484419ac53f6ea0d9f3b57e5b57ab30d7c267bdb27792a27eb0e4b08e84a2680aa55cc2f2b411ffd6ec3db01c44fdc6dc43aca4b55f8374fd +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: 10/5d9d207b462c11e322d71911e55e21a4e2772f71ffe8d6f1221b8eb5ae6774458c1d242f897fb0814e8714ca9a6b498abfa74dfe4f434493342902b1a48b33a5 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" +"@jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28, @jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.31 + resolution: "@jridgewell/trace-mapping@npm:0.3.31" dependencies: "@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10/dced32160a44b49d531b80a4a2159dceab6b3ddf0c8e95a0deae4b0e894b172defa63d5ac52a19c2068e1fe7d31ea4ba931fbeec103233ecb4208953967120fc + checksum: 10/da0283270e691bdb5543806077548532791608e52386cfbbf3b9e8fb00457859d1bd01d512851161c886eb3a2f3ce6fd9bcf25db8edf3bddedd275bd4a88d606 languageName: node linkType: hard @@ -2421,6 +2906,246 @@ __metadata: languageName: node linkType: hard +"@jsonjoy.com/base64@npm:17.65.0": + version: 17.65.0 + resolution: "@jsonjoy.com/base64@npm:17.65.0" + peerDependencies: + tslib: 2 + checksum: 10/966e890665a8bb9618d8491e6432767c9e256f835b616a589bd192a24a8259696b30dea60e35aa2700a24872540fd704fefb661c7b5a8e78f886c348a29ea061 + languageName: node + linkType: hard + +"@jsonjoy.com/base64@npm:^1.1.2": + version: 1.1.2 + resolution: "@jsonjoy.com/base64@npm:1.1.2" + peerDependencies: + tslib: 2 + checksum: 10/d76bb58eff841c090d9bf69a073611ffa73c40a664ccbcea689f65961f57d7b24051269d06b437e4f6204285d6ba92f50f587c5e95c5f9e4f10b36a2ed4cd0c8 + languageName: node + linkType: hard + +"@jsonjoy.com/buffers@npm:17.65.0, @jsonjoy.com/buffers@npm:^17.65.0": + version: 17.65.0 + resolution: "@jsonjoy.com/buffers@npm:17.65.0" + peerDependencies: + tslib: 2 + checksum: 10/d5e9072da89bc1181af1436ceaaec0ad5e5749d69c3301ffd5cd56b2fc15a812e15726ddad86218b6312feaa25791f4162ed861eed73b1ec4ac389b8b576b2ef + languageName: node + linkType: hard + +"@jsonjoy.com/buffers@npm:^1.0.0, @jsonjoy.com/buffers@npm:^1.2.0": + version: 1.2.1 + resolution: "@jsonjoy.com/buffers@npm:1.2.1" + peerDependencies: + tslib: 2 + checksum: 10/8ef4784d05c0fb4d0f27a1f78f5b0ae1f3b537d237f978d10be0b88f59a534ae44db2a4bde28eee0eb461ede31dc194aab5927ac001ed2b764629fa43ae9b60b + languageName: node + linkType: hard + +"@jsonjoy.com/codegen@npm:17.65.0": + version: 17.65.0 + resolution: "@jsonjoy.com/codegen@npm:17.65.0" + peerDependencies: + tslib: 2 + checksum: 10/ea7093b9015f95fc8189a0429927b8658a43b2be528a78935730ed1e270d42e00160d94d0b51c94f0a202bbdd2a4f3396a8d2d08d22325b21feaedc00a407123 + languageName: node + linkType: hard + +"@jsonjoy.com/codegen@npm:^1.0.0": + version: 1.0.0 + resolution: "@jsonjoy.com/codegen@npm:1.0.0" + peerDependencies: + tslib: 2 + checksum: 10/a0afb03d2af4fbc1377c547e507f5db99a25f515d8c4b6b2cef1ff28145ac59fff12b6e1f41f9734cb62ea5619e7f9be1acd0908305d6f4176898ee534ee9a64 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-core@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-core@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-node-builtins": "npm:4.56.10" + "@jsonjoy.com/fs-node-utils": "npm:4.56.10" + thingies: "npm:^2.5.0" + peerDependencies: + tslib: 2 + checksum: 10/4ff94bf45f11a87f7a2efa46af4bcdc7d3a3d89c44d834529bd32be9e4563910bd28ecb0e232bfcdd9365b7696a8ee4c5bc4928b8abd03ac14167209eff033a8 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-fsa@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-fsa@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-core": "npm:4.56.10" + "@jsonjoy.com/fs-node-builtins": "npm:4.56.10" + "@jsonjoy.com/fs-node-utils": "npm:4.56.10" + thingies: "npm:^2.5.0" + peerDependencies: + tslib: 2 + checksum: 10/1b5213fe0c47f8ef675477bd4d66a76a5650f5891fce32599303d5a498614e248dec06cead4bcb58a0721f1c31dd2e2400b2a0941d4dc04db1861359d015aac6 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-node-builtins@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-node-builtins@npm:4.56.10" + peerDependencies: + tslib: 2 + checksum: 10/49ebcc00bb794960b591808ce242c17604556a6b8792413876e75344e0506dd73d4ea4ea3cd566447e399cfacd8a41a2a0fbd361cdcb00a43bbb32a37d2c60d9 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-node-to-fsa@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-node-to-fsa@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-fsa": "npm:4.56.10" + "@jsonjoy.com/fs-node-builtins": "npm:4.56.10" + "@jsonjoy.com/fs-node-utils": "npm:4.56.10" + peerDependencies: + tslib: 2 + checksum: 10/171ad50c365829684deda3cb27de69a482dbb9916b2ea944d70f2f61a337a2994d8e5b0c17df08700fbf11f71e1a513d0332d8d9379bc3ed9e707ef0ec9967bf + languageName: node + linkType: hard + +"@jsonjoy.com/fs-node-utils@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-node-utils@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-node-builtins": "npm:4.56.10" + peerDependencies: + tslib: 2 + checksum: 10/6a64c96e7b3e31580e747d675ddb380de05635970cd597c185aa254a987873410fd03cffdf52ad18512a4c9692f148a45292fbc736f1a8c0fcf03be532dd6f99 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-node@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-node@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-core": "npm:4.56.10" + "@jsonjoy.com/fs-node-builtins": "npm:4.56.10" + "@jsonjoy.com/fs-node-utils": "npm:4.56.10" + "@jsonjoy.com/fs-print": "npm:4.56.10" + "@jsonjoy.com/fs-snapshot": "npm:4.56.10" + glob-to-regex.js: "npm:^1.0.0" + thingies: "npm:^2.5.0" + peerDependencies: + tslib: 2 + checksum: 10/5cb12740f9294d3e3ffe2d5fa19d620df7c1fddcefeb41940df62ff1c5fb7ca7c2d077cb4e285f35dd7abe1075a0998ce92c264c9d7551f5d8b0edf030c5332a + languageName: node + linkType: hard + +"@jsonjoy.com/fs-print@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-print@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-node-utils": "npm:4.56.10" + tree-dump: "npm:^1.1.0" + peerDependencies: + tslib: 2 + checksum: 10/48cb69d7d2c4567d6938e59d3bcd2ddaca4d2154dcb3922064a2968727009cf239b54def9fe9e5818a9042bfd749cc11c961efbec58dd686a2ece59d127bb333 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-snapshot@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-snapshot@npm:4.56.10" + dependencies: + "@jsonjoy.com/buffers": "npm:^17.65.0" + "@jsonjoy.com/fs-node-utils": "npm:4.56.10" + "@jsonjoy.com/json-pack": "npm:^17.65.0" + "@jsonjoy.com/util": "npm:^17.65.0" + peerDependencies: + tslib: 2 + checksum: 10/151f38050afe22d724d3a543b5363f43f3e0e7a6904fc1c1ba890569e34c80332dbd5f30d829fad02e76ccd0a141419a3ba331b89edb86ebc3a6d1896c1b7d04 + languageName: node + linkType: hard + +"@jsonjoy.com/json-pack@npm:^1.11.0": + version: 1.21.0 + resolution: "@jsonjoy.com/json-pack@npm:1.21.0" + dependencies: + "@jsonjoy.com/base64": "npm:^1.1.2" + "@jsonjoy.com/buffers": "npm:^1.2.0" + "@jsonjoy.com/codegen": "npm:^1.0.0" + "@jsonjoy.com/json-pointer": "npm:^1.0.2" + "@jsonjoy.com/util": "npm:^1.9.0" + hyperdyperid: "npm:^1.2.0" + thingies: "npm:^2.5.0" + tree-dump: "npm:^1.1.0" + peerDependencies: + tslib: 2 + checksum: 10/138b7eb8c96e6e435b0218c8f2eb5554e4eb49198a8718673a65e81da53b4617553ffa7124b51d6ea00fdfb868d6ff8b5ad6365e8336380ca7025f04d0412ee7 + languageName: node + linkType: hard + +"@jsonjoy.com/json-pack@npm:^17.65.0": + version: 17.65.0 + resolution: "@jsonjoy.com/json-pack@npm:17.65.0" + dependencies: + "@jsonjoy.com/base64": "npm:17.65.0" + "@jsonjoy.com/buffers": "npm:17.65.0" + "@jsonjoy.com/codegen": "npm:17.65.0" + "@jsonjoy.com/json-pointer": "npm:17.65.0" + "@jsonjoy.com/util": "npm:17.65.0" + hyperdyperid: "npm:^1.2.0" + thingies: "npm:^2.5.0" + tree-dump: "npm:^1.1.0" + peerDependencies: + tslib: 2 + checksum: 10/a80ab55e08eb99a4bed1f235f9b2c9623b2c33f7ff7238a9afe6907dd140c403af551621c48ef9e4003ff00ac78612a4186c7b4edfb79fe7e43a59ba5f8028ce + languageName: node + linkType: hard + +"@jsonjoy.com/json-pointer@npm:17.65.0": + version: 17.65.0 + resolution: "@jsonjoy.com/json-pointer@npm:17.65.0" + dependencies: + "@jsonjoy.com/util": "npm:17.65.0" + peerDependencies: + tslib: 2 + checksum: 10/864e1f6e026653e4b825155b8d8b4f84cd96d40122330e01d8539abfd34cbe9e339288bec20ab2715c2ded0d6f8853d15dcdff27a4338e6e24cee13c9ce02cd1 + languageName: node + linkType: hard + +"@jsonjoy.com/json-pointer@npm:^1.0.2": + version: 1.0.2 + resolution: "@jsonjoy.com/json-pointer@npm:1.0.2" + dependencies: + "@jsonjoy.com/codegen": "npm:^1.0.0" + "@jsonjoy.com/util": "npm:^1.9.0" + peerDependencies: + tslib: 2 + checksum: 10/f22baeb3abc8ace2d8902d06ec297343431d4486dcf399aaaffd26ace7e62e194fe0efb4b7880e45b3b7939224ee838d3213448ef654fc8a61c91a76fe994d94 + languageName: node + linkType: hard + +"@jsonjoy.com/util@npm:17.65.0, @jsonjoy.com/util@npm:^17.65.0": + version: 17.65.0 + resolution: "@jsonjoy.com/util@npm:17.65.0" + dependencies: + "@jsonjoy.com/buffers": "npm:17.65.0" + "@jsonjoy.com/codegen": "npm:17.65.0" + peerDependencies: + tslib: 2 + checksum: 10/487715ccd3969a9ce053827feb5cacdf5959b4d3990202d51e4ba009095cc80c271cab8c55df5859ed2f6a36700609a9a1a5c8a2f010a665d90d6132472b7a25 + languageName: node + linkType: hard + +"@jsonjoy.com/util@npm:^1.9.0": + version: 1.9.0 + resolution: "@jsonjoy.com/util@npm:1.9.0" + dependencies: + "@jsonjoy.com/buffers": "npm:^1.0.0" + "@jsonjoy.com/codegen": "npm:^1.0.0" + peerDependencies: + tslib: 2 + checksum: 10/1a6e5301d725a7161b93ff707eb1a954bf4552a2fa96eee9a960d3ae3ed5f993d18b56dcff29e98036341a5968c5d1b2dfe21f76695390e7f0d89b81f24c85e0 + languageName: node + linkType: hard + "@leichtgewicht/ip-codec@npm:^2.0.1": version: 2.0.4 resolution: "@leichtgewicht/ip-codec@npm:2.0.4" @@ -2471,6 +3196,79 @@ __metadata: languageName: node linkType: hard +"@module-federation/error-codes@npm:0.22.0": + version: 0.22.0 + resolution: "@module-federation/error-codes@npm:0.22.0" + checksum: 10/4edb269e9f3039899f879788c84d2bfecff94ca8e87ffcd80dbf8589d8543ec32558b3fa05c8549a8abd3ac33e856ff2aacf458dea5c0d7bea608bf12bb13359 + languageName: node + linkType: hard + +"@module-federation/runtime-core@npm:0.22.0": + version: 0.22.0 + resolution: "@module-federation/runtime-core@npm:0.22.0" + dependencies: + "@module-federation/error-codes": "npm:0.22.0" + "@module-federation/sdk": "npm:0.22.0" + checksum: 10/d21969198322b6f79e0513b702d0af5097613d47819724c849b6c677c163cd10fb8c89e3ff62b798bec498ee4d8e95dec71861071bc4ed74bd86a7e43193bc05 + languageName: node + linkType: hard + +"@module-federation/runtime-tools@npm:0.22.0": + version: 0.22.0 + resolution: "@module-federation/runtime-tools@npm:0.22.0" + dependencies: + "@module-federation/runtime": "npm:0.22.0" + "@module-federation/webpack-bundler-runtime": "npm:0.22.0" + checksum: 10/0e7693c1ec02fc5bef770b478c8757cad9cfefb2310d1943151d0ad079b72472d9b2c8a087299e9124dfcd6b649c83290c7fdfa333865baab4ba193f39e7b6bd + languageName: node + linkType: hard + +"@module-federation/runtime@npm:0.22.0": + version: 0.22.0 + resolution: "@module-federation/runtime@npm:0.22.0" + dependencies: + "@module-federation/error-codes": "npm:0.22.0" + "@module-federation/runtime-core": "npm:0.22.0" + "@module-federation/sdk": "npm:0.22.0" + checksum: 10/eca608be999d7d2e83abc1169643c2f795a5ed950f9e2bdf7000400a30b3e1e0ca4bdaa5daa09f55e44868383d444707e40236cec1aaa7b40432b0cce800b7f3 + languageName: node + linkType: hard + +"@module-federation/sdk@npm:0.22.0": + version: 0.22.0 + resolution: "@module-federation/sdk@npm:0.22.0" + checksum: 10/d7085d883730a33145052520787a7e59cf9c54b51b2946bebc7c63a6bb668bcc6cbdc27fa0b7354a62f5a7ee4e8829a66b84e644607498f2e37cfd5eb4ded0da + languageName: node + linkType: hard + +"@module-federation/webpack-bundler-runtime@npm:0.22.0": + version: 0.22.0 + resolution: "@module-federation/webpack-bundler-runtime@npm:0.22.0" + dependencies: + "@module-federation/runtime": "npm:0.22.0" + "@module-federation/sdk": "npm:0.22.0" + checksum: 10/afd24406817dfc6474ebcf5be714ccf26690eb3f6f5172bda711c8f23dba149fe47293f7aa2d0733dfed0334c98d4d3d9e7c2da2be78750cae5a72d72f32ce93 + languageName: node + linkType: hard + +"@napi-rs/wasm-runtime@npm:1.0.7": + version: 1.0.7 + resolution: "@napi-rs/wasm-runtime@npm:1.0.7" + dependencies: + "@emnapi/core": "npm:^1.5.0" + "@emnapi/runtime": "npm:^1.5.0" + "@tybys/wasm-util": "npm:^0.10.1" + checksum: 10/6bc32d32d486d07b83220a9b7b2b715e39acacbacef0011ebca05c00b41d80a0535123da10fea7a7d6d7e206712bb50dc50ac3cf88b770754d44378570fb5c05 + languageName: node + linkType: hard + +"@noble/hashes@npm:1.4.0": + version: 1.4.0 + resolution: "@noble/hashes@npm:1.4.0" + checksum: 10/e156e65794c473794c52fa9d06baf1eb20903d0d96719530f523cc4450f6c721a957c544796e6efd0197b2296e7cd70efeb312f861465e17940a3e3c7e0febc6 + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -2652,6 +3450,151 @@ __metadata: languageName: node linkType: hard +"@peculiar/asn1-cms@npm:^2.6.0": + version: 2.6.0 + resolution: "@peculiar/asn1-cms@npm:2.6.0" + dependencies: + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.0" + "@peculiar/asn1-x509-attr": "npm:^2.6.0" + asn1js: "npm:^3.0.6" + tslib: "npm:^2.8.1" + checksum: 10/cc3f2c60d87ecd400fe5409dc0016578c8c80511ae1295747913c5704adeb571136f1b779362996879acdb81efb34735f3fae6f8513fae4542dd004ae4615b13 + languageName: node + linkType: hard + +"@peculiar/asn1-csr@npm:^2.6.0": + version: 2.6.0 + resolution: "@peculiar/asn1-csr@npm:2.6.0" + dependencies: + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.0" + asn1js: "npm:^3.0.6" + tslib: "npm:^2.8.1" + checksum: 10/68653246ae56119722ca737bddd8a3edc1dd0e2f4bcc58d611b62512667073b9ccd61a0051ca8f0a67cf6d07245ecbdbf526e6f389c81ef81e845c46a2bc5bbb + languageName: node + linkType: hard + +"@peculiar/asn1-ecc@npm:^2.6.0": + version: 2.6.0 + resolution: "@peculiar/asn1-ecc@npm:2.6.0" + dependencies: + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.0" + asn1js: "npm:^3.0.6" + tslib: "npm:^2.8.1" + checksum: 10/f31146a78c634440d49e0b1959c8ba59657e0fd172c2f9aff421627aee954cf3dcaa9c9b957390960d107cc460f277b9266c95cf32e434ba6b5475f87fad6436 + languageName: node + linkType: hard + +"@peculiar/asn1-pfx@npm:^2.6.0": + version: 2.6.0 + resolution: "@peculiar/asn1-pfx@npm:2.6.0" + dependencies: + "@peculiar/asn1-cms": "npm:^2.6.0" + "@peculiar/asn1-pkcs8": "npm:^2.6.0" + "@peculiar/asn1-rsa": "npm:^2.6.0" + "@peculiar/asn1-schema": "npm:^2.6.0" + asn1js: "npm:^3.0.6" + tslib: "npm:^2.8.1" + checksum: 10/623ffda2b04822140afd0a6e1846089a55f986686d72dfb1c6eaad67791a0aaa519e13a8528f72de1a930739318ea7a87eb11d7de0c3587f950cb45338ac302b + languageName: node + linkType: hard + +"@peculiar/asn1-pkcs8@npm:^2.6.0": + version: 2.6.0 + resolution: "@peculiar/asn1-pkcs8@npm:2.6.0" + dependencies: + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.0" + asn1js: "npm:^3.0.6" + tslib: "npm:^2.8.1" + checksum: 10/f76334284f5c9833eff807948363f7835ac311cb59a82dd92757960c8f8b15c8ea52bcee20b4ff21dd0adb4c7db51411cb87a612c2e28c66b4426366a302f6d8 + languageName: node + linkType: hard + +"@peculiar/asn1-pkcs9@npm:^2.6.0": + version: 2.6.0 + resolution: "@peculiar/asn1-pkcs9@npm:2.6.0" + dependencies: + "@peculiar/asn1-cms": "npm:^2.6.0" + "@peculiar/asn1-pfx": "npm:^2.6.0" + "@peculiar/asn1-pkcs8": "npm:^2.6.0" + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.0" + "@peculiar/asn1-x509-attr": "npm:^2.6.0" + asn1js: "npm:^3.0.6" + tslib: "npm:^2.8.1" + checksum: 10/ab2cfd497c1585fa89c2a257c61edbb6b5a4182fc3cec0c255782d6480932732bb3b9f47c3dc1706e65f7b683dab615d9ae9c235071bee366645a95b4cc70b06 + languageName: node + linkType: hard + +"@peculiar/asn1-rsa@npm:^2.6.0": + version: 2.6.0 + resolution: "@peculiar/asn1-rsa@npm:2.6.0" + dependencies: + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.0" + asn1js: "npm:^3.0.6" + tslib: "npm:^2.8.1" + checksum: 10/9084becd2d06d3b0fc8baafcebb5bdd085cc3be5221ce7f7017ae575b0abc59cd1eaeb880b475aae5a28c97eda3551ab620ba0a0a5eb72b12b8db103182d8cf4 + languageName: node + linkType: hard + +"@peculiar/asn1-schema@npm:^2.6.0": + version: 2.6.0 + resolution: "@peculiar/asn1-schema@npm:2.6.0" + dependencies: + asn1js: "npm:^3.0.6" + pvtsutils: "npm:^1.3.6" + tslib: "npm:^2.8.1" + checksum: 10/af9b1094d0e020f0fd828777488578322d62a41f597ead7d80939dafcfe35b672fcb0ec7460ef66b2a155f9614d4340a98896d417a830aff1685cb4c21d5bbe4 + languageName: node + linkType: hard + +"@peculiar/asn1-x509-attr@npm:^2.6.0": + version: 2.6.0 + resolution: "@peculiar/asn1-x509-attr@npm:2.6.0" + dependencies: + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.0" + asn1js: "npm:^3.0.6" + tslib: "npm:^2.8.1" + checksum: 10/9ecd7a2e57e2199cc937691fc6e8fdce0d25039e2d16b2261ba5b7550250b903fd9d9f8bf3f5290eb23332fdb289abb79656c97477bf711af6897235312e0535 + languageName: node + linkType: hard + +"@peculiar/asn1-x509@npm:^2.6.0": + version: 2.6.0 + resolution: "@peculiar/asn1-x509@npm:2.6.0" + dependencies: + "@peculiar/asn1-schema": "npm:^2.6.0" + asn1js: "npm:^3.0.6" + pvtsutils: "npm:^1.3.6" + tslib: "npm:^2.8.1" + checksum: 10/61e5ef1bb83fa4687b0c307b9e10d982bd4b2c09af7d66d1d4c486a190dab9ebc15ae382880229d3678743a6fa32081d21d6c2d18a7bbe9d634fc09c46c244b6 + languageName: node + linkType: hard + +"@peculiar/x509@npm:^1.14.2": + version: 1.14.3 + resolution: "@peculiar/x509@npm:1.14.3" + dependencies: + "@peculiar/asn1-cms": "npm:^2.6.0" + "@peculiar/asn1-csr": "npm:^2.6.0" + "@peculiar/asn1-ecc": "npm:^2.6.0" + "@peculiar/asn1-pkcs9": "npm:^2.6.0" + "@peculiar/asn1-rsa": "npm:^2.6.0" + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.0" + pvtsutils: "npm:^1.3.6" + reflect-metadata: "npm:^0.2.2" + tslib: "npm:^2.8.1" + tsyringe: "npm:^4.10.0" + checksum: 10/d37c56fa5f2c644141948d85010e14f0e4963089e3b0b81edd0bfe85bdfea0eb3f38ab6ff20d322db2bd6977117824cc498a77b2d35af111983b4d58b5e2ccd1 + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -2705,48 +3648,183 @@ __metadata: languageName: node linkType: hard -"@redocly/config@npm:^0.20.1": - version: 0.20.3 - resolution: "@redocly/config@npm:0.20.3" - checksum: 10/dd9501c96d6aa7d6cd7d9879d9bbab6c62fced0adbc8ca2ee1cde37a65384e8b09972aad2dd3a3bef1ee48e6a6287b854deb9858b3fd27c8c36fc7aec039a496 +"@redocly/config@npm:^0.22.0": + version: 0.22.2 + resolution: "@redocly/config@npm:0.22.2" + checksum: 10/f4c33b9654a65c5407630bfebe83b46ea18fab3f5d40a0c69d4476ed1bf45cdc5edbad94cdef994e99fba14e27d1adc5ef1205422855604d1852d442518bb447 languageName: node linkType: hard -"@redocly/openapi-core@npm:^1.10.5": - version: 1.27.2 - resolution: "@redocly/openapi-core@npm:1.27.2" +"@redocly/openapi-core@npm:^1.34.3": + version: 1.34.6 + resolution: "@redocly/openapi-core@npm:1.34.6" dependencies: "@redocly/ajv": "npm:^8.11.2" - "@redocly/config": "npm:^0.20.1" + "@redocly/config": "npm:^0.22.0" colorette: "npm:^1.2.0" - https-proxy-agent: "npm:^7.0.4" + https-proxy-agent: "npm:^7.0.5" js-levenshtein: "npm:^1.1.6" js-yaml: "npm:^4.1.0" minimatch: "npm:^5.0.1" - node-fetch: "npm:^2.6.1" pluralize: "npm:^8.0.0" yaml-ast-parser: "npm:0.0.43" - checksum: 10/f23ee5db3ea31fa8eeb4e13644f4a70a1ce875a4a939a2a9f4c79020055a3d0ac32593e9716b8e9b1ab2478d14efa63a755400a798dc955421acd472ffdabbc8 + checksum: 10/d643b9d98c1de604796867bba0cd9ecd7f24773e121fa7f9381d2bde72bb176895a52b9b02856ede874d13c96e1fe8eade592fc63e70b58f271fa57c1e47d195 languageName: node linkType: hard -"@reduxjs/toolkit@npm:^1.7.1": - version: 1.9.7 - resolution: "@reduxjs/toolkit@npm:1.9.7" +"@reduxjs/toolkit@npm:^2.8.2": + version: 2.11.2 + resolution: "@reduxjs/toolkit@npm:2.11.2" dependencies: - immer: "npm:^9.0.21" - redux: "npm:^4.2.1" - redux-thunk: "npm:^2.4.2" - reselect: "npm:^4.1.8" + "@standard-schema/spec": "npm:^1.0.0" + "@standard-schema/utils": "npm:^0.3.0" + immer: "npm:^11.0.0" + redux: "npm:^5.0.1" + redux-thunk: "npm:^3.1.0" + reselect: "npm:^5.1.0" peerDependencies: - react: ^16.9.0 || ^17.0.0 || ^18 - react-redux: ^7.2.1 || ^8.0.2 + react: ^16.9.0 || ^17.0.0 || ^18 || ^19 + react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 peerDependenciesMeta: react: optional: true react-redux: optional: true - checksum: 10/11c718270bb378e5b26e172eb84cc549d6f263748b6f330b07ee9c366c6474b013fd410e5b2f65a5742e73b7873a3ac14e06cae4bb01480ba03b423c4fd92583 + checksum: 10/2e1098c7fcd10b770344d0b39c58a3b9cb3aec7da0979c02f1ac1ef8f56619ac787c623e480bef0cf6f2c05f1c13fd4d44045c794e2c2d3460f9bf0d2875995c + languageName: node + linkType: hard + +"@rspack/binding-darwin-arm64@npm:1.7.3": + version: 1.7.3 + resolution: "@rspack/binding-darwin-arm64@npm:1.7.3" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rspack/binding-darwin-x64@npm:1.7.3": + version: 1.7.3 + resolution: "@rspack/binding-darwin-x64@npm:1.7.3" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rspack/binding-linux-arm64-gnu@npm:1.7.3": + version: 1.7.3 + resolution: "@rspack/binding-linux-arm64-gnu@npm:1.7.3" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rspack/binding-linux-arm64-musl@npm:1.7.3": + version: 1.7.3 + resolution: "@rspack/binding-linux-arm64-musl@npm:1.7.3" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rspack/binding-linux-x64-gnu@npm:1.7.3": + version: 1.7.3 + resolution: "@rspack/binding-linux-x64-gnu@npm:1.7.3" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rspack/binding-linux-x64-musl@npm:1.7.3": + version: 1.7.3 + resolution: "@rspack/binding-linux-x64-musl@npm:1.7.3" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rspack/binding-wasm32-wasi@npm:1.7.3": + version: 1.7.3 + resolution: "@rspack/binding-wasm32-wasi@npm:1.7.3" + dependencies: + "@napi-rs/wasm-runtime": "npm:1.0.7" + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@rspack/binding-win32-arm64-msvc@npm:1.7.3": + version: 1.7.3 + resolution: "@rspack/binding-win32-arm64-msvc@npm:1.7.3" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rspack/binding-win32-ia32-msvc@npm:1.7.3": + version: 1.7.3 + resolution: "@rspack/binding-win32-ia32-msvc@npm:1.7.3" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rspack/binding-win32-x64-msvc@npm:1.7.3": + version: 1.7.3 + resolution: "@rspack/binding-win32-x64-msvc@npm:1.7.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rspack/binding@npm:1.7.3": + version: 1.7.3 + resolution: "@rspack/binding@npm:1.7.3" + dependencies: + "@rspack/binding-darwin-arm64": "npm:1.7.3" + "@rspack/binding-darwin-x64": "npm:1.7.3" + "@rspack/binding-linux-arm64-gnu": "npm:1.7.3" + "@rspack/binding-linux-arm64-musl": "npm:1.7.3" + "@rspack/binding-linux-x64-gnu": "npm:1.7.3" + "@rspack/binding-linux-x64-musl": "npm:1.7.3" + "@rspack/binding-wasm32-wasi": "npm:1.7.3" + "@rspack/binding-win32-arm64-msvc": "npm:1.7.3" + "@rspack/binding-win32-ia32-msvc": "npm:1.7.3" + "@rspack/binding-win32-x64-msvc": "npm:1.7.3" + dependenciesMeta: + "@rspack/binding-darwin-arm64": + optional: true + "@rspack/binding-darwin-x64": + optional: true + "@rspack/binding-linux-arm64-gnu": + optional: true + "@rspack/binding-linux-arm64-musl": + optional: true + "@rspack/binding-linux-x64-gnu": + optional: true + "@rspack/binding-linux-x64-musl": + optional: true + "@rspack/binding-wasm32-wasi": + optional: true + "@rspack/binding-win32-arm64-msvc": + optional: true + "@rspack/binding-win32-ia32-msvc": + optional: true + "@rspack/binding-win32-x64-msvc": + optional: true + checksum: 10/295c59c22370f71e0f8543fca9819d7d13741e02ef340f1fdda84789d800e324a91d7e54c5119ec0e2a64d4074efff7d2a7f989522bef2d8cb12fb7abffbb5d5 + languageName: node + linkType: hard + +"@rspack/core@npm:^1.5.0": + version: 1.7.3 + resolution: "@rspack/core@npm:1.7.3" + dependencies: + "@module-federation/runtime-tools": "npm:0.22.0" + "@rspack/binding": "npm:1.7.3" + "@rspack/lite-tapable": "npm:1.1.0" + peerDependencies: + "@swc/helpers": ">=0.5.1" + peerDependenciesMeta: + "@swc/helpers": + optional: true + checksum: 10/cd6a4d8dea6eb2fe8fd97b1266ef3ab0bdefd02970f70f0154b20c7ba3b4235cb92e712cf7f9f42bf64786663422ee46e85917b15fe06b563da22bc39ca5f35e + languageName: node + linkType: hard + +"@rspack/lite-tapable@npm:1.1.0": + version: 1.1.0 + resolution: "@rspack/lite-tapable@npm:1.1.0" + checksum: 10/41ff73fe5e1b8dccaad746c9c1bd36dd67649e1ad35776f311b5ba94333a397704e11158579e25a6a7e677c51abe35e66987b1b000faef48d4e4ad2470fea150 languageName: node linkType: hard @@ -2805,6 +3883,20 @@ __metadata: languageName: node linkType: hard +"@standard-schema/spec@npm:^1.0.0": + version: 1.1.0 + resolution: "@standard-schema/spec@npm:1.1.0" + checksum: 10/a209615c9e8b2ea535d7db0a5f6aa0f962fd4ab73ee86a46c100fb78116964af1f55a27c1794d4801e534a196794223daa25ff5135021e03c7828aa3d95e1763 + languageName: node + linkType: hard + +"@standard-schema/utils@npm:^0.3.0": + version: 0.3.0 + resolution: "@standard-schema/utils@npm:0.3.0" + checksum: 10/7084f875d322792f2e0a5904009434c8374b9345b09ba89828b68fd56fa3c2b366d35bf340d9e8c72736ef01793c2f70d350c372ed79845dc3566c58d34b4b51 + languageName: node + linkType: hard + "@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0": version: 8.0.0 resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0" @@ -3084,6 +4176,116 @@ __metadata: languageName: node linkType: hard +"@swc/html-darwin-arm64@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/html-darwin-arm64@npm:1.15.3" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@swc/html-darwin-x64@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/html-darwin-x64@npm:1.15.3" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@swc/html-linux-arm-gnueabihf@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/html-linux-arm-gnueabihf@npm:1.15.3" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@swc/html-linux-arm64-gnu@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/html-linux-arm64-gnu@npm:1.15.3" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@swc/html-linux-arm64-musl@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/html-linux-arm64-musl@npm:1.15.3" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@swc/html-linux-x64-gnu@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/html-linux-x64-gnu@npm:1.15.3" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@swc/html-linux-x64-musl@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/html-linux-x64-musl@npm:1.15.3" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@swc/html-win32-arm64-msvc@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/html-win32-arm64-msvc@npm:1.15.3" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@swc/html-win32-ia32-msvc@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/html-win32-ia32-msvc@npm:1.15.3" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@swc/html-win32-x64-msvc@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/html-win32-x64-msvc@npm:1.15.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@swc/html@npm:1.15.3": + version: 1.15.3 + resolution: "@swc/html@npm:1.15.3" + dependencies: + "@swc/counter": "npm:^0.1.3" + "@swc/html-darwin-arm64": "npm:1.15.3" + "@swc/html-darwin-x64": "npm:1.15.3" + "@swc/html-linux-arm-gnueabihf": "npm:1.15.3" + "@swc/html-linux-arm64-gnu": "npm:1.15.3" + "@swc/html-linux-arm64-musl": "npm:1.15.3" + "@swc/html-linux-x64-gnu": "npm:1.15.3" + "@swc/html-linux-x64-musl": "npm:1.15.3" + "@swc/html-win32-arm64-msvc": "npm:1.15.3" + "@swc/html-win32-ia32-msvc": "npm:1.15.3" + "@swc/html-win32-x64-msvc": "npm:1.15.3" + dependenciesMeta: + "@swc/html-darwin-arm64": + optional: true + "@swc/html-darwin-x64": + optional: true + "@swc/html-linux-arm-gnueabihf": + optional: true + "@swc/html-linux-arm64-gnu": + optional: true + "@swc/html-linux-arm64-musl": + optional: true + "@swc/html-linux-x64-gnu": + optional: true + "@swc/html-linux-x64-musl": + optional: true + "@swc/html-win32-arm64-msvc": + optional: true + "@swc/html-win32-ia32-msvc": + optional: true + "@swc/html-win32-x64-msvc": + optional: true + checksum: 10/753ddec5a5fb53a5245b4e5ab990c8dc9e6aff2c3da99ab671be2535d3fc566953dac4aa30c9a435e78a80901384fbc8f43c603c379abe2d21a11303dd804393 + languageName: node + linkType: hard + "@swc/types@npm:^0.1.25": version: 0.1.25 resolution: "@swc/types@npm:0.1.25" @@ -3116,6 +4318,15 @@ __metadata: languageName: node linkType: hard +"@tybys/wasm-util@npm:^0.10.1": + version: 0.10.1 + resolution: "@tybys/wasm-util@npm:0.10.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/7fe0d239397aebb002ac4855d30c197c06a05ea8df8511350a3a5b1abeefe26167c60eda8a5508337571161e4c4b53d7c1342296123f9607af8705369de9fa7f + languageName: node + linkType: hard + "@types/acorn@npm:^4.0.0": version: 4.0.6 resolution: "@types/acorn@npm:4.0.6" @@ -3135,22 +4346,22 @@ __metadata: languageName: node linkType: hard -"@types/bonjour@npm:^3.5.9": - version: 3.5.10 - resolution: "@types/bonjour@npm:3.5.10" +"@types/bonjour@npm:^3.5.13": + version: 3.5.13 + resolution: "@types/bonjour@npm:3.5.13" dependencies: "@types/node": "npm:*" - checksum: 10/bfcadb042a41b124c4e3de4925e3be6d35b78f93f27c4535d5ff86980dc0f8bc407ed99b9b54528952dc62834d5a779392f7a12c2947dd19330eb05a6bcae15a + checksum: 10/e827570e097bd7d625a673c9c208af2d1a22fa3885c0a1646533cf24394c839c3e5f60ac1bc60c0ddcc69c0615078c9fb2c01b42596c7c582d895d974f2409ee languageName: node linkType: hard -"@types/connect-history-api-fallback@npm:^1.3.5": - version: 1.3.5 - resolution: "@types/connect-history-api-fallback@npm:1.3.5" +"@types/connect-history-api-fallback@npm:^1.5.4": + version: 1.5.4 + resolution: "@types/connect-history-api-fallback@npm:1.5.4" dependencies: "@types/express-serve-static-core": "npm:*" "@types/node": "npm:*" - checksum: 10/464d06e5ab00f113fa89978633d5eb00d225aeb4ebbadc07f6f3bc337aa7cbfcd74957b2a539d6d47f2e128e956a17819973ec7ae62ade2e16e367a6c38b8d3a + checksum: 10/e1dee43b8570ffac02d2d47a2b4ba80d3ca0dd1840632dafb221da199e59dbe3778d3d7303c9e23c6b401f37c076935a5bc2aeae1c4e5feaefe1c371fe2073fd languageName: node linkType: hard @@ -3201,33 +4412,34 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6": - version: 1.0.6 - resolution: "@types/estree@npm:1.0.6" - checksum: 10/9d35d475095199c23e05b431bcdd1f6fec7380612aed068b14b2a08aa70494de8a9026765a5a91b1073f636fb0368f6d8973f518a31391d519e20c59388ed88d +"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.8": + version: 1.0.8 + resolution: "@types/estree@npm:1.0.8" + checksum: 10/25a4c16a6752538ffde2826c2cc0c6491d90e69cd6187bef4a006dd2c3c45469f049e643d7e516c515f21484dc3d48fd5c870be158a5beb72f5baf3dc43e4099 languageName: node linkType: hard -"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.18": - version: 4.17.31 - resolution: "@types/express-serve-static-core@npm:4.17.31" +"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.21, @types/express-serve-static-core@npm:^4.17.33": + version: 4.19.8 + resolution: "@types/express-serve-static-core@npm:4.19.8" dependencies: "@types/node": "npm:*" "@types/qs": "npm:*" "@types/range-parser": "npm:*" - checksum: 10/020210f32d12fa4848d686e3acb98bc35dcec3ade16ae857e99005ac808aa07e1e1a909fdf4f1f2033159afb3eec3622811ac4cb82fa41553c714d9fa35fb77a + "@types/send": "npm:*" + checksum: 10/eb1b832343c0991395c9b10e124dc805921ea7c08efe01222d83912123b8c054119d009e9e55c91af6bdbeeec153c0d35411c9c6d80781bc8c0a43e8b1a84387 languageName: node linkType: hard -"@types/express@npm:*, @types/express@npm:^4.17.13": - version: 4.17.14 - resolution: "@types/express@npm:4.17.14" +"@types/express@npm:*, @types/express@npm:^4.17.25": + version: 4.17.25 + resolution: "@types/express@npm:4.17.25" dependencies: "@types/body-parser": "npm:*" - "@types/express-serve-static-core": "npm:^4.17.18" + "@types/express-serve-static-core": "npm:^4.17.33" "@types/qs": "npm:*" - "@types/serve-static": "npm:*" - checksum: 10/293e53a7572ef93f70c830a0b1d620b5e16670509bb91e800393a67e7f41f170478809d862deed0edf573fc1afc3a6f7fc99ed176a28c0d8dd3f07c433f88672 + "@types/serve-static": "npm:^1" + checksum: 10/c309fdb79fb8569b5d8d8f11268d0160b271f8b38f0a82c20a0733e526baf033eb7a921cd51d54fe4333c616de9e31caf7d4f3ef73baaf212d61f23f460b0369 languageName: node linkType: hard @@ -3238,15 +4450,6 @@ __metadata: languageName: node linkType: hard -"@types/hast@npm:^2.0.0": - version: 2.3.10 - resolution: "@types/hast@npm:2.3.10" - dependencies: - "@types/unist": "npm:^2" - checksum: 10/41531b7fbf590b02452996fc63272479c20a07269e370bd6514982cbcd1819b4b84d3ea620f2410d1b9541a23d08ce2eeb0a592145d05e00e249c3d56700d460 - languageName: node - linkType: hard - "@types/hast@npm:^3.0.0": version: 3.0.4 resolution: "@types/hast@npm:3.0.4" @@ -3263,16 +4466,6 @@ __metadata: languageName: node linkType: hard -"@types/hoist-non-react-statics@npm:^3.3.0": - version: 3.3.6 - resolution: "@types/hoist-non-react-statics@npm:3.3.6" - dependencies: - "@types/react": "npm:*" - hoist-non-react-statics: "npm:^3.3.0" - checksum: 10/f03e43bd081876c49584ffa0eb690d69991f258203efca44dcc30efdda49a50653ff06402917d1edc9cb7e2adebbe9e2d1d0e739bc99c1b5372103b1cc534e47 - languageName: node - linkType: hard - "@types/html-minifier-terser@npm:^6.0.0": version: 6.1.0 resolution: "@types/html-minifier-terser@npm:6.1.0" @@ -3287,6 +4480,13 @@ __metadata: languageName: node linkType: hard +"@types/http-errors@npm:*": + version: 2.0.5 + resolution: "@types/http-errors@npm:2.0.5" + checksum: 10/a88da669366bc483e8f3b3eb3d34ada5f8d13eeeef851b1204d77e2ba6fc42aba4566d877cca5c095204a3f4349b87fe397e3e21288837bdd945dd514120755b + languageName: node + linkType: hard + "@types/http-proxy@npm:^1.17.8": version: 1.17.9 resolution: "@types/http-proxy@npm:1.17.9" @@ -3321,22 +4521,13 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10/1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 languageName: node linkType: hard -"@types/mdast@npm:^3.0.0": - version: 3.0.15 - resolution: "@types/mdast@npm:3.0.15" - dependencies: - "@types/unist": "npm:^2" - checksum: 10/050a5c1383928b2688dd145382a22535e2af87dc3fd592c843abb7851bcc99893a1ee0f63be19fc4e89779387ec26a57486cfb425b016c0b2a98a17fc4a1e8b3 - languageName: node - linkType: hard - "@types/mdast@npm:^4.0.0, @types/mdast@npm:^4.0.2": version: 4.0.3 resolution: "@types/mdast@npm:4.0.3" @@ -3353,10 +4544,10 @@ __metadata: languageName: node linkType: hard -"@types/mime@npm:*": - version: 3.0.1 - resolution: "@types/mime@npm:3.0.1" - checksum: 10/4040fac73fd0cea2460e29b348c1a6173da747f3a87da0dbce80dd7a9355a3d0e51d6d9a401654f3e5550620e3718b5a899b2ec1debf18424e298a2c605346e7 +"@types/mime@npm:^1": + version: 1.3.5 + resolution: "@types/mime@npm:1.3.5" + checksum: 10/e29a5f9c4776f5229d84e525b7cd7dd960b51c30a0fb9a028c0821790b82fca9f672dab56561e2acd9e8eed51d431bde52eafdfef30f643586c4162f1aecfc78 languageName: node linkType: hard @@ -3381,20 +4572,6 @@ __metadata: languageName: node linkType: hard -"@types/parse-json@npm:^4.0.0": - version: 4.0.0 - resolution: "@types/parse-json@npm:4.0.0" - checksum: 10/4df9de98150d2978afc2161482a3a8e6617883effba3223324f079de97ba7eabd7d84b90ced11c3f82b0c08d4a8383f678c9f73e9c41258f769b3fa234a2bb4f - languageName: node - linkType: hard - -"@types/parse5@npm:^6.0.0": - version: 6.0.3 - resolution: "@types/parse5@npm:6.0.3" - checksum: 10/834d40c9b1a8a99a9574b0b3f6629cf48adcff2eda01a35d701f1de5dcf46ce24223684647890aba9f985d6c801b233f878168683de0ae425940403c383fba8f - languageName: node - linkType: hard - "@types/prismjs@npm:^1.26.0": version: 1.26.1 resolution: "@types/prismjs@npm:1.26.1" @@ -3402,7 +4579,7 @@ __metadata: languageName: node linkType: hard -"@types/prop-types@npm:*, @types/prop-types@npm:^15.0.0": +"@types/prop-types@npm:*": version: 15.7.14 resolution: "@types/prop-types@npm:15.7.14" checksum: 10/d0c5407b9ccc3dd5fae0ccf9b1007e7622ba5e6f1c18399b4f24dff33619d469da4b9fa918a374f19dc0d9fe6a013362aab0b844b606cfc10676efba3f5f736d @@ -3423,18 +4600,6 @@ __metadata: languageName: node linkType: hard -"@types/react-redux@npm:^7.1.20": - version: 7.1.34 - resolution: "@types/react-redux@npm:7.1.34" - dependencies: - "@types/hoist-non-react-statics": "npm:^3.3.0" - "@types/react": "npm:*" - hoist-non-react-statics: "npm:^3.3.0" - redux: "npm:^4.0.0" - checksum: 10/febcd1db0c83c5002c6bee0fdda9e70da0653454ffbb72d6c37cbf2f5c005e06fb5271cff344d7164c385c944526565282de9a95ff379e040476b71d27fc2512 - languageName: node - linkType: hard - "@types/react-router-config@npm:*, @types/react-router-config@npm:^5.0.7": version: 5.0.8 resolution: "@types/react-router-config@npm:5.0.8" @@ -3478,10 +4643,10 @@ __metadata: languageName: node linkType: hard -"@types/retry@npm:0.12.0": - version: 0.12.0 - resolution: "@types/retry@npm:0.12.0" - checksum: 10/bbd0b88f4b3eba7b7acfc55ed09c65ef6f2e1bcb4ec9b4dca82c66566934351534317d294a770a7cc6c0468d5573c5350abab6e37c65f8ef254443e1b028e44d +"@types/retry@npm:0.12.2": + version: 0.12.2 + resolution: "@types/retry@npm:0.12.2" + checksum: 10/e5675035717b39ce4f42f339657cae9637cf0c0051cf54314a6a2c44d38d91f6544be9ddc0280587789b6afd056be5d99dbe3e9f4df68c286c36321579b1bf4a languageName: node linkType: hard @@ -3501,31 +4666,51 @@ __metadata: languageName: node linkType: hard -"@types/serve-index@npm:^1.9.1": - version: 1.9.1 - resolution: "@types/serve-index@npm:1.9.1" +"@types/send@npm:*": + version: 1.2.1 + resolution: "@types/send@npm:1.2.1" + dependencies: + "@types/node": "npm:*" + checksum: 10/81ef5790037ba1d2d458392e4241501f0f8b4838cc8797e169e179e099410e12069ec68e8dbd39211cb097c4a9b1ff1682dbcea897ab4ce21dad93438b862d27 + languageName: node + linkType: hard + +"@types/send@npm:<1": + version: 0.17.6 + resolution: "@types/send@npm:0.17.6" + dependencies: + "@types/mime": "npm:^1" + "@types/node": "npm:*" + checksum: 10/4948ab32ab84a81a0073f8243dd48ee766bc80608d5391060360afd1249f83c08a7476f142669ac0b0b8831c89d909a88bcb392d1b39ee48b276a91b50f3d8d1 + languageName: node + linkType: hard + +"@types/serve-index@npm:^1.9.4": + version: 1.9.4 + resolution: "@types/serve-index@npm:1.9.4" dependencies: "@types/express": "npm:*" - checksum: 10/026f3995fb500f6df7c3fe5009e53bad6d739e20b84089f58ebfafb2f404bbbb6162bbe33f72d2f2af32d5b8d3799c8e179793f90d9ed5871fb8591190bb6056 + checksum: 10/72727c88d54da5b13275ebfb75dcdc4aa12417bbe9da1939e017c4c5f0c906fae843aa4e0fbfe360e7ee9df2f3d388c21abfc488f77ce58693fb57809f8ded92 languageName: node linkType: hard -"@types/serve-static@npm:*, @types/serve-static@npm:^1.13.10": - version: 1.15.0 - resolution: "@types/serve-static@npm:1.15.0" +"@types/serve-static@npm:^1, @types/serve-static@npm:^1.15.5": + version: 1.15.10 + resolution: "@types/serve-static@npm:1.15.10" dependencies: - "@types/mime": "npm:*" + "@types/http-errors": "npm:*" "@types/node": "npm:*" - checksum: 10/5f2f36a8f5970e350c19a2bfac385f0a225e16b5cc9a2441e8b01df32f2f5cb0f2950da53f67579f77c52236b3580909c3fe83d50d64fb56b216ea0a67c1d12b + "@types/send": "npm:<1" + checksum: 10/d9be72487540b9598e7d77260d533f241eb2e5db5181bb885ef2d6bc4592dad1c9e8c0e27f465d59478b2faf90edd2d535e834f20fbd9dd3c0928d43dc486404 languageName: node linkType: hard -"@types/sockjs@npm:^0.3.33": - version: 0.3.33 - resolution: "@types/sockjs@npm:0.3.33" +"@types/sockjs@npm:^0.3.36": + version: 0.3.36 + resolution: "@types/sockjs@npm:0.3.36" dependencies: "@types/node": "npm:*" - checksum: 10/b9bbb2b5c5ead2fb884bb019f61a014e37410bddd295de28184e1b2e71ee6b04120c5ba7b9954617f0bdf962c13d06249ce65004490889c747c80d3f628ea842 + checksum: 10/b4b5381122465d80ea8b158537c00bc82317222d3fb31fd7229ff25b31fa89134abfbab969118da55622236bf3d8fee75759f3959908b5688991f492008f29bc languageName: node linkType: hard @@ -3536,13 +4721,20 @@ __metadata: languageName: node linkType: hard -"@types/unist@npm:^2, @types/unist@npm:^2.0.0": +"@types/unist@npm:^2.0.0": version: 2.0.11 resolution: "@types/unist@npm:2.0.11" checksum: 10/6d436e832bc35c6dde9f056ac515ebf2b3384a1d7f63679d12358766f9b313368077402e9c1126a14d827f10370a5485e628bf61aa91117cf4fc882423191a4e languageName: node linkType: hard +"@types/use-sync-external-store@npm:^0.0.6": + version: 0.0.6 + resolution: "@types/use-sync-external-store@npm:0.0.6" + checksum: 10/a95ce330668501ad9b1c5b7f2b14872ad201e552a0e567787b8f1588b22c7040c7c3d80f142cbb9f92d13c4ea41c46af57a20f2af4edf27f224d352abcfe4049 + languageName: node + linkType: hard + "@types/webpack-env@npm:^1.18.0": version: 1.18.8 resolution: "@types/webpack-env@npm:1.18.8" @@ -3550,12 +4742,12 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^8.5.5": - version: 8.5.6 - resolution: "@types/ws@npm:8.5.6" +"@types/ws@npm:^8.5.10": + version: 8.18.1 + resolution: "@types/ws@npm:8.18.1" dependencies: "@types/node": "npm:*" - checksum: 10/1c3ce7fe65569dc85314981622bdbccd8bab671cff74367f9bfba8390ddd0f241f29cdcf67b14163a2c832a0a08bfc0e8f60912b9c143648e25a5a05e016b892 + checksum: 10/1ce05e3174dcacf28dae0e9b854ef1c9a12da44c7ed73617ab6897c5cbe4fccbb155a20be5508ae9a7dde2f83bd80f5cf3baa386b934fc4b40889ec963e94f3a languageName: node linkType: hard @@ -3754,16 +4946,7 @@ __metadata: languageName: node linkType: hard -"abort-controller@npm:^3.0.0": - version: 3.0.0 - resolution: "abort-controller@npm:3.0.0" - dependencies: - event-target-shim: "npm:^5.0.0" - checksum: 10/ed84af329f1828327798229578b4fe03a4dd2596ba304083ebd2252666bdc1d7647d66d0b18704477e1f8aa315f055944aa6e859afebd341f12d0a53c37b4b40 - languageName: node - linkType: hard - -"accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": +"accepts@npm:~1.3.4, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: @@ -3773,6 +4956,15 @@ __metadata: languageName: node linkType: hard +"acorn-import-phases@npm:^1.0.3": + version: 1.0.4 + resolution: "acorn-import-phases@npm:1.0.4" + peerDependencies: + acorn: ^8.14.0 + checksum: 10/471050ac7d9b61909c837b426de9eeef2958997f6277ad7dea88d5894fd9b3245d8ed4a225c2ca44f814dbb20688009db7a80e525e8196fc9e98c5285b66161d + languageName: node + linkType: hard + "acorn-jsx@npm:^5.0.0": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -3789,16 +4981,16 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.0.0, acorn@npm:^8.0.4, acorn@npm:^8.14.0, acorn@npm:^8.8.2": - version: 8.14.0 - resolution: "acorn@npm:8.14.0" +"acorn@npm:^8.0.0, acorn@npm:^8.0.4, acorn@npm:^8.15.0": + version: 8.15.0 + resolution: "acorn@npm:8.15.0" bin: acorn: bin/acorn - checksum: 10/6df29c35556782ca9e632db461a7f97947772c6c1d5438a81f0c873a3da3a792487e83e404d1c6c25f70513e91aa18745f6eafb1fcc3a43ecd1920b21dd173d2 + checksum: 10/77f2de5051a631cf1729c090e5759148459cdb76b5f5c70f890503d629cf5052357b0ce783c0f976dd8a93c5150f59f6d18df1def3f502396a20f81282482fa4 languageName: node linkType: hard -"address@npm:^1.0.1, address@npm:^1.1.2": +"address@npm:^1.0.1": version: 1.2.1 resolution: "address@npm:1.2.1" checksum: 10/270cde3ed9836fd14b51c425bdc0f445933f7a880e3871412addfff4f871df378a4a0945b4496dd270a0dfa6734bb5fa5647547afe2ce84cbd3d435e2ca5f325 @@ -3868,7 +5060,7 @@ __metadata: languageName: node linkType: hard -"ajv-keywords@npm:^3.4.1, ajv-keywords@npm:^3.5.2": +"ajv-keywords@npm:^3.5.2": version: 3.5.2 resolution: "ajv-keywords@npm:3.5.2" peerDependencies: @@ -3888,19 +5080,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:8.11.0": - version: 8.11.0 - resolution: "ajv@npm:8.11.0" - dependencies: - fast-deep-equal: "npm:^3.1.1" - json-schema-traverse: "npm:^1.0.0" - require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.2.2" - checksum: 10/aa0dfd6cebdedde8e77747e84e7b7c55921930974b8547f54b4156164ff70445819398face32dafda4bd4c61bbc7513d308d4c2bf769f8ea6cb9c8449f9faf54 - languageName: node - linkType: hard - -"ajv@npm:^6.12.2, ajv@npm:^6.12.5": +"ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -3912,7 +5092,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^8.0.0, ajv@npm:^8.9.0": +"ajv@npm:^8.0.0, ajv@npm:^8.11.0, ajv@npm:^8.9.0": version: 8.17.1 resolution: "ajv@npm:8.17.1" dependencies: @@ -3924,36 +5104,36 @@ __metadata: languageName: node linkType: hard -"algoliasearch-helper@npm:^3.13.3": - version: 3.14.2 - resolution: "algoliasearch-helper@npm:3.14.2" +"algoliasearch-helper@npm:^3.26.0": + version: 3.27.0 + resolution: "algoliasearch-helper@npm:3.27.0" dependencies: "@algolia/events": "npm:^4.0.1" peerDependencies: algoliasearch: ">= 3.1 < 6" - checksum: 10/f0b61bd5fa6ecae250c7ee4e4e8804721dad68b2e5781dfe36fdeec5f6e967470b3116f63ab67312b1499ccd40ab1b8c0d05d36dc9ca72aa2d9cd57c0874adb3 + checksum: 10/46ee2f2a2349898c29d54e4228534789103967ce2681aa0f6e05a968d6ca6d7524855a0b09909c7d313c9ad24c455b9243117015d32a79a900d0b6320229bee6 languageName: node linkType: hard -"algoliasearch@npm:^4.18.0, algoliasearch@npm:^4.19.1": - version: 4.20.0 - resolution: "algoliasearch@npm:4.20.0" +"algoliasearch@npm:^5.37.0": + version: 5.47.0 + resolution: "algoliasearch@npm:5.47.0" dependencies: - "@algolia/cache-browser-local-storage": "npm:4.20.0" - "@algolia/cache-common": "npm:4.20.0" - "@algolia/cache-in-memory": "npm:4.20.0" - "@algolia/client-account": "npm:4.20.0" - "@algolia/client-analytics": "npm:4.20.0" - "@algolia/client-common": "npm:4.20.0" - "@algolia/client-personalization": "npm:4.20.0" - "@algolia/client-search": "npm:4.20.0" - "@algolia/logger-common": "npm:4.20.0" - "@algolia/logger-console": "npm:4.20.0" - "@algolia/requester-browser-xhr": "npm:4.20.0" - "@algolia/requester-common": "npm:4.20.0" - "@algolia/requester-node-http": "npm:4.20.0" - "@algolia/transporter": "npm:4.20.0" - checksum: 10/15129c8d1cb9710e958e3b687835361ed6b79ed45b7b4f4283b2339c3044e101b19821a9e2a83ef38c240eb663f74b0179434ed11dee02076693bc8df2b2c1ff + "@algolia/abtesting": "npm:1.13.0" + "@algolia/client-abtesting": "npm:5.47.0" + "@algolia/client-analytics": "npm:5.47.0" + "@algolia/client-common": "npm:5.47.0" + "@algolia/client-insights": "npm:5.47.0" + "@algolia/client-personalization": "npm:5.47.0" + "@algolia/client-query-suggestions": "npm:5.47.0" + "@algolia/client-search": "npm:5.47.0" + "@algolia/ingestion": "npm:1.47.0" + "@algolia/monitoring": "npm:1.47.0" + "@algolia/recommend": "npm:5.47.0" + "@algolia/requester-browser-xhr": "npm:5.47.0" + "@algolia/requester-fetch": "npm:5.47.0" + "@algolia/requester-node-http": "npm:5.47.0" + checksum: 10/afd7b3aec5c4f28d88d19ef409c163f16954a4f1c3fff545f78593a5864ff3d6b3bd16ffed16e074b2162d58f77a13270fed00fdb86d68d26f291ae67f6ade58 languageName: node linkType: hard @@ -3975,6 +5155,15 @@ __metadata: languageName: node linkType: hard +"ansi-escapes@npm:^4.3.2": + version: 4.3.2 + resolution: "ansi-escapes@npm:4.3.2" + dependencies: + type-fest: "npm:^0.21.3" + checksum: 10/8661034456193ffeda0c15c8c564a9636b0c04094b7f78bd01517929c17c504090a60f7a75f949f5af91289c264d3e1001d91492c1bd58efc8e100500ce04de2 + languageName: node + linkType: hard + "ansi-html-community@npm:^0.0.8": version: 0.0.8 resolution: "ansi-html-community@npm:0.0.8" @@ -3998,15 +5187,6 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.0" - checksum: 10/d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 - languageName: node - linkType: hard - "ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" @@ -4087,13 +5267,6 @@ __metadata: languageName: node linkType: hard -"array-flatten@npm:^2.1.2": - version: 2.1.2 - resolution: "array-flatten@npm:2.1.2" - checksum: 10/e8988aac1fbfcdaae343d08c9a06a6fddd2c6141721eeeea45c3cf523bf4431d29a46602929455ed548c7a3e0769928cdc630405427297e7081bd118fdec9262 - languageName: node - linkType: hard - "array-union@npm:^2.1.0": version: 2.1.0 resolution: "array-union@npm:2.1.0" @@ -4101,27 +5274,14 @@ __metadata: languageName: node linkType: hard -"asn1.js@npm:^4.10.1": - version: 4.10.1 - resolution: "asn1.js@npm:4.10.1" +"asn1js@npm:^3.0.6": + version: 3.0.7 + resolution: "asn1js@npm:3.0.7" dependencies: - bn.js: "npm:^4.0.0" - inherits: "npm:^2.0.1" - minimalistic-assert: "npm:^1.0.0" - checksum: 10/5a02104b9ba167917c786a3fdac9840a057d29e6b609250e6af924d0529ead1a32417da13eec809cadea8f991eb67782196f3df427c5b4f30eaf22044fc64fda - languageName: node - linkType: hard - -"assert@npm:^2.1.0": - version: 2.1.0 - resolution: "assert@npm:2.1.0" - dependencies: - call-bind: "npm:^1.0.2" - is-nan: "npm:^1.3.2" - object-is: "npm:^1.1.5" - object.assign: "npm:^4.1.4" - util: "npm:^0.12.5" - checksum: 10/6b9d813c8eef1c0ac13feac5553972e4bd180ae16000d4eb5c0ded2489188737c75a5aacefc97a985008b37502f62fe1bad34da1a7481a54bbfabec3964c8aa7 + pvtsutils: "npm:^1.3.6" + pvutils: "npm:^1.1.3" + tslib: "npm:^2.8.1" + checksum: 10/1ae92cc6825ff002aed5b2a800e89db1fccd0775b42278431332fe3ee6839711e80e1ca504c72a35a03d94d417c3b315fb03bc6a6f4518c309b1dcb5385a1a93 languageName: node linkType: hard @@ -4141,57 +5301,40 @@ __metadata: languageName: node linkType: hard -"async@npm:3.2.4": - version: 3.2.4 - resolution: "async@npm:3.2.4" - checksum: 10/bebb5dc2258c45b83fa1d3be179ae0eb468e1646a62d443c8d60a45e84041b28fccebe1e2d1f234bfc3dcad44e73dcdbf4ba63d98327c9f6556e3dbd47c2ae8b +"async@npm:3.2.6": + version: 3.2.6 + resolution: "async@npm:3.2.6" + checksum: 10/cb6e0561a3c01c4b56a799cc8bab6ea5fef45f069ab32500b6e19508db270ef2dffa55e5aed5865c5526e9907b1f8be61b27530823b411ffafb5e1538c86c368 languageName: node linkType: hard -"at-least-node@npm:^1.0.0": - version: 1.0.0 - resolution: "at-least-node@npm:1.0.0" - checksum: 10/463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e - languageName: node - linkType: hard - -"autoprefixer@npm:^10.4.14, autoprefixer@npm:^10.4.19": - version: 10.4.20 - resolution: "autoprefixer@npm:10.4.20" +"autoprefixer@npm:^10.4.19, autoprefixer@npm:^10.4.23": + version: 10.4.23 + resolution: "autoprefixer@npm:10.4.23" dependencies: - browserslist: "npm:^4.23.3" - caniuse-lite: "npm:^1.0.30001646" - fraction.js: "npm:^4.3.7" - normalize-range: "npm:^0.1.2" - picocolors: "npm:^1.0.1" + browserslist: "npm:^4.28.1" + caniuse-lite: "npm:^1.0.30001760" + fraction.js: "npm:^5.3.4" + picocolors: "npm:^1.1.1" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: 10/d3c4b562fc4af2393623a0207cc336f5b9f94c4264ae1c316376904c279702ce2b12dc3f27205f491195d1e29bb52ffc269970ceb0f271f035fadee128a273f7 + checksum: 10/153033db6f137712383ddf3f1f267b1d5900695d135f7794cbfaaec832fdbf4e34efd85418dec6f78c418062afdf3f0a07313e32a83764c119bfb5b2f01648b6 languageName: node linkType: hard -"available-typed-arrays@npm:^1.0.7": - version: 1.0.7 - resolution: "available-typed-arrays@npm:1.0.7" - dependencies: - possible-typed-array-names: "npm:^1.0.0" - checksum: 10/6c9da3a66caddd83c875010a1ca8ef11eac02ba15fb592dc9418b2b5e7b77b645fa7729380a92d9835c2f05f2ca1b6251f39b993e0feb3f1517c74fa1af02cab - languageName: node - linkType: hard - -"babel-loader@npm:^9.1.3": - version: 9.1.3 - resolution: "babel-loader@npm:9.1.3" +"babel-loader@npm:^9.2.1": + version: 9.2.1 + resolution: "babel-loader@npm:9.2.1" dependencies: find-cache-dir: "npm:^4.0.0" schema-utils: "npm:^4.0.0" peerDependencies: "@babel/core": ^7.12.0 webpack: ">=5" - checksum: 10/7086e678273b5d1261141dca84ed784caab9f7921c8c24d7278c8ee3088235a9a9fd85caac9f0fa687336cb3c27248ca22dbf431469769b1b995d55aec606992 + checksum: 10/f1f24ae3c22d488630629240b0eba9c935545f82ff843c214e8f8df66e266492b7a3d4cb34ef9c9721fb174ca222e900799951c3fd82199473bc6bac52ec03a3 languageName: node linkType: hard @@ -4204,62 +5347,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.10, babel-plugin-polyfill-corejs2@npm:^0.4.5": - version: 0.4.11 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" +"babel-plugin-polyfill-corejs2@npm:^0.4.14": + version: 0.4.15 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.15" dependencies: - "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.6.2" + "@babel/compat-data": "npm:^7.28.6" + "@babel/helper-define-polyfill-provider": "npm:^0.6.6" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/9c79908bed61b9f52190f254e22d3dca6ce25769738642579ba8d23832f3f9414567a90d8367a31831fa45d9b9607ac43d8d07ed31167d8ca8cda22871f4c7a1 + checksum: 10/e5f8a4e716400b2b5c51f7b3c0eec58da92f1d8cc1c6fe2e32555c98bc594be1de7fa1da373f8e42ab098c33867c4cc2931ce648c92aab7a4f4685417707c438 languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.10.6": - version: 0.10.6 - resolution: "babel-plugin-polyfill-corejs3@npm:0.10.6" +"babel-plugin-polyfill-corejs3@npm:^0.13.0": + version: 0.13.0 + resolution: "babel-plugin-polyfill-corejs3@npm:0.13.0" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.2" - core-js-compat: "npm:^3.38.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.5" + core-js-compat: "npm:^3.43.0" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/360ac9054a57a18c540059dc627ad5d84d15f79790cb3d84d19a02eec7188c67d08a07db789c3822d6f5df22d918e296d1f27c4055fec2e287d328f09ea8a78a + checksum: 10/aa36f9a09521404dd0569a4cbd5f88aa4b9abff59508749abde5d09d66c746012fb94ed1e6e2c8be3710939a2a4c6293ee3be889125d7611c93e5897d9e5babd languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.8.3": - version: 0.8.4 - resolution: "babel-plugin-polyfill-corejs3@npm:0.8.4" +"babel-plugin-polyfill-regenerator@npm:^0.6.5": + version: 0.6.6 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.6" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.4.2" - core-js-compat: "npm:^3.32.2" + "@babel/helper-define-polyfill-provider": "npm:^0.6.6" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/d1c642f0a9f5935c31e9adb4f3777d826b8c84bdd043bd8074ec7cd6f108aa4290f261e9e9b846273a677795b68a53f8779a3218000b6fe5ba62d05f81ee4da2 - languageName: node - linkType: hard - -"babel-plugin-polyfill-regenerator@npm:^0.5.2": - version: 0.5.2 - resolution: "babel-plugin-polyfill-regenerator@npm:0.5.2" - dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.4.2" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/d962200f604016a9a09bc9b4aaf60a3db7af876bb65bcefaeac04d44ac9d9ec4037cf24ce117760cc141d7046b6394c7eb0320ba9665cb4a2ee64df2be187c93 - languageName: node - linkType: hard - -"babel-plugin-polyfill-regenerator@npm:^0.6.1": - version: 0.6.2 - resolution: "babel-plugin-polyfill-regenerator@npm:0.6.2" - dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.2" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/150233571072b6b3dfe946242da39cba8587b7f908d1c006f7545fc88b0e3c3018d445739beb61e7a75835f0c2751dbe884a94ff9b245ec42369d9267e0e1b3f + checksum: 10/8de7ea32856e75784601cacf8f4e3cbf04ce1fd05d56614b08b7bbe0674d1e59e37ccaa1c7ed16e3b181a63abe5bd43a1ab0e28b8c95618a9ebf0be5e24d6b25 languageName: node linkType: hard @@ -4267,14 +5387,15 @@ __metadata: version: 0.0.0-use.local resolution: "backstage-microsite@workspace:." dependencies: - "@docusaurus/core": "npm:^3.1.1" + "@docusaurus/core": "npm:^3.9.0" + "@docusaurus/faster": "npm:^3.9.0" "@docusaurus/module-type-aliases": "npm:^3.1.1" - "@docusaurus/plugin-client-redirects": "npm:^3.1.1" - "@docusaurus/preset-classic": "npm:^3.1.1" + "@docusaurus/plugin-client-redirects": "npm:^3.9.0" + "@docusaurus/preset-classic": "npm:^3.9.0" "@docusaurus/tsconfig": "npm:^3.1.1" - "@docusaurus/types": "npm:^3.1.1" + "@docusaurus/types": "npm:^3.9.0" "@mdx-js/react": "npm:^3.0.0" - "@swc/core": "npm:1.15.3" + "@swc/core": "npm:^1.15.6" "@types/webpack-env": "npm:^1.18.0" clsx: "npm:^2.0.0" docusaurus-plugin-openapi-docs: "npm:^4.3.0" @@ -4290,7 +5411,7 @@ __metadata: sass: "npm:^1.57.1" swc-loader: "npm:^0.2.3" typescript: "npm:~5.7.0" - yaml-loader: "npm:^0.8.0" + yaml-loader: "npm:^0.9.0" languageName: unknown linkType: soft @@ -4315,6 +5436,15 @@ __metadata: languageName: node linkType: hard +"baseline-browser-mapping@npm:^2.9.0": + version: 2.9.18 + resolution: "baseline-browser-mapping@npm:2.9.18" + bin: + baseline-browser-mapping: dist/cli.js + checksum: 10/7607ae6cad62e013787f13f52856899ebc81d4fc47c311ed513619ade9c83a317b8c0e17092e6de96a0d26f2c6bbf10e1c37db84d419cfb2e4a5485fa5af0d93 + languageName: node + linkType: hard + "batch@npm:0.6.1": version: 0.6.1 resolution: "batch@npm:0.6.1" @@ -4336,20 +5466,6 @@ __metadata: languageName: node linkType: hard -"bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.11.9": - version: 4.12.1 - resolution: "bn.js@npm:4.12.1" - checksum: 10/07f22df8880b423c4890648e95791319898b96712b6ebc5d6b1082b34074f09dedb8601e717d67f905ce29bb1a5313f9a2b1a2015a679e42c9eed94392c0d379 - languageName: node - linkType: hard - -"bn.js@npm:^5.2.1": - version: 5.2.1 - resolution: "bn.js@npm:5.2.1" - checksum: 10/7a7e8764d7a6e9708b8b9841b2b3d6019cc154d2fc23716d0efecfe1e16921b7533c6f7361fb05471eab47986c4aa310c270f88e3507172104632ac8df2cfd84 - languageName: node - linkType: hard - "body-parser@npm:~1.20.3": version: 1.20.4 resolution: "body-parser@npm:1.20.4" @@ -4370,15 +5486,13 @@ __metadata: languageName: node linkType: hard -"bonjour-service@npm:^1.0.11": - version: 1.0.14 - resolution: "bonjour-service@npm:1.0.14" +"bonjour-service@npm:^1.2.1": + version: 1.3.0 + resolution: "bonjour-service@npm:1.3.0" dependencies: - array-flatten: "npm:^2.1.2" - dns-equal: "npm:^1.0.0" fast-deep-equal: "npm:^3.1.3" multicast-dns: "npm:^7.2.5" - checksum: 10/cd6626a7cdbedc4d230537a2d9f6892aef6bdcf04b303554e87ff8c6362a00e072365a5d91b1980206afdf10c8e2ad8006f908e3368005ea15cc13aa18f00775 + checksum: 10/63d516d88f15fa4b89e247e6ff7d81c21a3ef5ed035b0b043c2b38e0c839f54f4ce58fbf9b7668027bf538ac86de366939dbb55cca63930f74eeea1e278c9585 languageName: node linkType: hard @@ -4449,99 +5563,18 @@ __metadata: languageName: node linkType: hard -"brorand@npm:^1.0.1, brorand@npm:^1.1.0": - version: 1.1.0 - resolution: "brorand@npm:1.1.0" - checksum: 10/8a05c9f3c4b46572dec6ef71012b1946db6cae8c7bb60ccd4b7dd5a84655db49fe043ecc6272e7ef1f69dc53d6730b9e2a3a03a8310509a3d797a618cbee52be - languageName: node - linkType: hard - -"browserify-aes@npm:^1.0.4, browserify-aes@npm:^1.2.0": - version: 1.2.0 - resolution: "browserify-aes@npm:1.2.0" +"browserslist@npm:^4.0.0, browserslist@npm:^4.23.0, browserslist@npm:^4.24.0, browserslist@npm:^4.24.2, browserslist@npm:^4.28.1": + version: 4.28.1 + resolution: "browserslist@npm:4.28.1" dependencies: - buffer-xor: "npm:^1.0.3" - cipher-base: "npm:^1.0.0" - create-hash: "npm:^1.1.0" - evp_bytestokey: "npm:^1.0.3" - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - checksum: 10/2813058f74e083a00450b11ea9d5d1f072de7bf0133f5d122d4ff7b849bece56d52b9c51ad0db0fad21c0bc4e8272fd5196114bbe7b94a9b7feb0f9fbb33a3bf - languageName: node - linkType: hard - -"browserify-cipher@npm:^1.0.1": - version: 1.0.1 - resolution: "browserify-cipher@npm:1.0.1" - dependencies: - browserify-aes: "npm:^1.0.4" - browserify-des: "npm:^1.0.0" - evp_bytestokey: "npm:^1.0.0" - checksum: 10/2d8500acf1ee535e6bebe808f7a20e4c3a9e2ed1a6885fff1facbfd201ac013ef030422bec65ca9ece8ffe82b03ca580421463f9c45af6c8415fd629f4118c13 - languageName: node - linkType: hard - -"browserify-des@npm:^1.0.0": - version: 1.0.2 - resolution: "browserify-des@npm:1.0.2" - dependencies: - cipher-base: "npm:^1.0.1" - des.js: "npm:^1.0.0" - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.1.2" - checksum: 10/2fd9018e598b1b25e002abaf656d46d8e0f2ee2666ff18852d37e5c3d0e47701d6824256b060fac395420d56a0c49c2b0d40a194e6fbd837bfdd893e7eb5ade4 - languageName: node - linkType: hard - -"browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.1.0": - version: 4.1.1 - resolution: "browserify-rsa@npm:4.1.1" - dependencies: - bn.js: "npm:^5.2.1" - randombytes: "npm:^2.1.0" - safe-buffer: "npm:^5.2.1" - checksum: 10/62ae0da60e49e8d5dd3b0922119b6edee94ebfa3a184211c804024b3a75f9dab31a1d124cc0545ed050e273f0325c2fd7aba6a51e44ba6f726fceae3210ddade - languageName: node - linkType: hard - -"browserify-sign@npm:^4.2.3": - version: 4.2.3 - resolution: "browserify-sign@npm:4.2.3" - dependencies: - bn.js: "npm:^5.2.1" - browserify-rsa: "npm:^4.1.0" - create-hash: "npm:^1.2.0" - create-hmac: "npm:^1.1.7" - elliptic: "npm:^6.5.5" - hash-base: "npm:~3.0" - inherits: "npm:^2.0.4" - parse-asn1: "npm:^5.1.7" - readable-stream: "npm:^2.3.8" - safe-buffer: "npm:^5.2.1" - checksum: 10/403a8061d229ae31266670345b4a7c00051266761d2c9bbeb68b1a9bcb05f68143b16110cf23a171a5d6716396a1f41296282b3e73eeec0a1871c77f0ff4ee6b - languageName: node - linkType: hard - -"browserify-zlib@npm:^0.2.0": - version: 0.2.0 - resolution: "browserify-zlib@npm:0.2.0" - dependencies: - pako: "npm:~1.0.5" - checksum: 10/852e72effdc00bf8acc6d167d835179eda9e5bd13721ae5d0a2d132dc542f33e73bead2959eb43a2f181a9c495bc2ae2bdb4ec37c4e37ff61a0277741cbaaa7a - languageName: node - linkType: hard - -"browserslist@npm:^4.0.0, browserslist@npm:^4.18.1, browserslist@npm:^4.23.0, browserslist@npm:^4.23.1, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0": - version: 4.24.4 - resolution: "browserslist@npm:4.24.4" - dependencies: - caniuse-lite: "npm:^1.0.30001688" - electron-to-chromium: "npm:^1.5.73" - node-releases: "npm:^2.0.19" - update-browserslist-db: "npm:^1.1.1" + baseline-browser-mapping: "npm:^2.9.0" + caniuse-lite: "npm:^1.0.30001759" + electron-to-chromium: "npm:^1.5.263" + node-releases: "npm:^2.0.27" + update-browserslist-db: "npm:^1.2.0" bin: browserslist: cli.js - checksum: 10/11fda105e803d891311a21a1f962d83599319165faf471c2d70e045dff82a12128f5b50b1fcba665a2352ad66147aaa248a9d2355a80aadc3f53375eb3de2e48 + checksum: 10/64f2a97de4bce8473c0e5ae0af8d76d1ead07a5b05fc6bc87b848678bb9c3a91ae787b27aa98cdd33fc00779607e6c156000bed58fefb9cf8e4c5a183b994cdb languageName: node linkType: hard @@ -4552,13 +5585,6 @@ __metadata: languageName: node linkType: hard -"buffer-xor@npm:^1.0.3": - version: 1.0.3 - resolution: "buffer-xor@npm:1.0.3" - checksum: 10/4a63d48b5117c7eda896d81cd3582d9707329b07c97a14b0ece2edc6e64220ea7ea17c94b295e8c2cb7b9f8291e2b079f9096be8ac14be238420a43e06ec66e2 - languageName: node - linkType: hard - "buffer@npm:^6.0.3": version: 6.0.3 resolution: "buffer@npm:6.0.3" @@ -4569,10 +5595,12 @@ __metadata: languageName: node linkType: hard -"builtin-status-codes@npm:^3.0.0": - version: 3.0.0 - resolution: "builtin-status-codes@npm:3.0.0" - checksum: 10/1119429cf4b0d57bf76b248ad6f529167d343156ebbcc4d4e4ad600484f6bc63002595cbb61b67ad03ce55cd1d3c4711c03bbf198bf24653b8392420482f3773 +"bundle-name@npm:^4.1.0": + version: 4.1.0 + resolution: "bundle-name@npm:4.1.0" + dependencies: + run-applescript: "npm:^7.0.0" + checksum: 10/1d966c8d2dbf4d9d394e53b724ac756c2414c45c01340b37743621f59cc565a435024b394ddcb62b9b335d1c9a31f4640eb648c3fec7f97ee74dc0694c9beb6c languageName: node linkType: hard @@ -4583,13 +5611,20 @@ __metadata: languageName: node linkType: hard -"bytes@npm:~3.1.2": +"bytes@npm:3.1.2, bytes@npm:~3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" checksum: 10/a10abf2ba70c784471d6b4f58778c0beeb2b5d405148e66affa91f23a9f13d07603d0a0354667310ae1d6dc141474ffd44e2a074be0f6e2254edb8fc21445388 languageName: node linkType: hard +"bytestreamjs@npm:^2.0.1": + version: 2.0.1 + resolution: "bytestreamjs@npm:2.0.1" + checksum: 10/523b1024e3f887cdc0b3db7c4fc14b8563aaeb75e6642a41991b3208277fd0ae9cd66003c73473fe706c42797bf0c3f1f498fb9880b431d75b332e5709d56a0c + languageName: node + linkType: hard + "cacache@npm:^16.1.0": version: 16.1.3 resolution: "cacache@npm:16.1.3" @@ -4648,7 +5683,7 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": +"call-bind@npm:^1.0.8": version: 1.0.8 resolution: "call-bind@npm:1.0.8" dependencies: @@ -4720,10 +5755,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001688": - version: 1.0.30001695 - resolution: "caniuse-lite@npm:1.0.30001695" - checksum: 10/8107c5e89b86c7a2fd506b93c658ff945c98c6518260c3b28af9f02bd83bf83939696241f0b413545c5b9895c86bcae64c9370388576440e74e9b848f04170d3 +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001759, caniuse-lite@npm:^1.0.30001760": + version: 1.0.30001766 + resolution: "caniuse-lite@npm:1.0.30001766" + checksum: 10/0edeb69bdb741c98deda609b75e35e5c31e944537e9873ea89a4cf9e9baa3e158675b224951a6f3a212d1f0c328a8494ace323c551ca1fa58ce4915562c4e4d3 languageName: node linkType: hard @@ -4734,18 +5769,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: "npm:^3.2.1" - escape-string-regexp: "npm:^1.0.5" - supports-color: "npm:^5.3.0" - checksum: 10/3d1d103433166f6bfe82ac75724951b33769675252d8417317363ef9d54699b7c3b2d46671b772b893a8e50c3ece70c4b933c73c01e81bc60ea4df9b55afa303 - languageName: node - linkType: hard - -"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.2": +"chalk@npm:^4.0.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: @@ -4833,9 +5857,9 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^3.4.2, chokidar@npm:^3.5.3": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" +"chokidar@npm:^3.5.3, chokidar@npm:^3.6.0": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" dependencies: anymatch: "npm:~3.1.2" braces: "npm:~3.0.2" @@ -4848,7 +5872,7 @@ __metadata: dependenciesMeta: fsevents: optional: true - checksum: 10/863e3ff78ee7a4a24513d2a416856e84c8e4f5e60efbe03e8ab791af1a183f569b62fc6f6b8044e2804966cb81277ddbbc1dc374fba3265bd609ea8efd62f5b3 + checksum: 10/c327fb07704443f8d15f7b4a7ce93b2f0bc0e6cea07ec28a7570aa22cd51fcf0379df589403976ea956c369f25aa82d84561947e227cd925902e1751371658df languageName: node linkType: hard @@ -4882,22 +5906,12 @@ __metadata: languageName: node linkType: hard -"cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": - version: 1.0.6 - resolution: "cipher-base@npm:1.0.6" - dependencies: - inherits: "npm:^2.0.4" - safe-buffer: "npm:^5.2.1" - checksum: 10/faf232deff2351448ea23d265eb8723e035ebbb454baca45fb60c1bd71056ede8b153bef1b221e067f13e6b9288ebb83bb6ae2d5dd4cec285411f9fc22ec1f5b - languageName: node - linkType: hard - -"clean-css@npm:^5.2.2, clean-css@npm:^5.3.2, clean-css@npm:~5.3.2": - version: 5.3.2 - resolution: "clean-css@npm:5.3.2" +"clean-css@npm:^5.2.2, clean-css@npm:^5.3.3, clean-css@npm:~5.3.2": + version: 5.3.3 + resolution: "clean-css@npm:5.3.3" dependencies: source-map: "npm:~0.6.0" - checksum: 10/efd9efbf400f38a12f99324bad5359bdd153211b048721e4d4ddb629a88865dff3012dca547a14bdd783d78ccf064746e39fd91835546a08e2d811866aff0857 + checksum: 10/2db1ae37b384c8ff0a06a12bfa80f56cc02b4abcaaf340db98c0ae88a61dd67c856653fd8135ace6eb0ec13aeab3089c425d2e4238d2a2ad6b6917e6ccc74729 languageName: node linkType: hard @@ -4950,14 +5964,7 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^1.1.1": - version: 1.2.1 - resolution: "clsx@npm:1.2.1" - checksum: 10/5ded6f61f15f1fa0350e691ccec43a28b12fb8e64c8e94715f2a937bc3722d4c3ed41d6e945c971fc4dcc2a7213a43323beaf2e1c28654af63ba70c9968a8643 - languageName: node - linkType: hard - -"clsx@npm:^2.0.0": +"clsx@npm:^2.0.0, clsx@npm:^2.1.1": version: 2.1.1 resolution: "clsx@npm:2.1.1" checksum: 10/cdfb57fa6c7649bbff98d9028c2f0de2f91c86f551179541cf784b1cfdc1562dcb951955f46d54d930a3879931a980e32a46b598acaea274728dbe068deca919 @@ -4971,15 +5978,6 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: "npm:1.1.3" - checksum: 10/ffa319025045f2973919d155f25e7c00d08836b6b33ea2d205418c59bd63a665d713c52d9737a9e0fe467fb194b40fbef1d849bae80d674568ee220a31ef3d10 - languageName: node - linkType: hard - "color-convert@npm:^2.0.1": version: 2.0.1 resolution: "color-convert@npm:2.0.1" @@ -4989,13 +5987,6 @@ __metadata: languageName: node linkType: hard -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 10/09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d - languageName: node - linkType: hard - "color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" @@ -5096,7 +6087,7 @@ __metadata: languageName: node linkType: hard -"compressible@npm:~2.0.16": +"compressible@npm:~2.0.18": version: 2.0.18 resolution: "compressible@npm:2.0.18" dependencies: @@ -5105,18 +6096,18 @@ __metadata: languageName: node linkType: hard -"compression@npm:^1.7.4": - version: 1.7.4 - resolution: "compression@npm:1.7.4" +"compression@npm:^1.8.1": + version: 1.8.1 + resolution: "compression@npm:1.8.1" dependencies: - accepts: "npm:~1.3.5" - bytes: "npm:3.0.0" - compressible: "npm:~2.0.16" + bytes: "npm:3.1.2" + compressible: "npm:~2.0.18" debug: "npm:2.6.9" - on-headers: "npm:~1.0.2" - safe-buffer: "npm:5.1.2" + negotiator: "npm:~0.6.4" + on-headers: "npm:~1.1.0" + safe-buffer: "npm:5.2.1" vary: "npm:~1.1.2" - checksum: 10/469cd097908fe1d3ff146596d4c24216ad25eabb565c5456660bdcb3a14c82ebc45c23ce56e19fc642746cf407093b55ab9aa1ac30b06883b27c6c736e6383c2 + checksum: 10/e7552bfbd780f2003c6fe8decb44561f5cc6bc82f0c61e81122caff5ec656f37824084f52155b1e8ef31d7656cecbec9a2499b7a68e92e20780ffb39b479abb7 languageName: node linkType: hard @@ -5180,17 +6171,10 @@ __metadata: languageName: node linkType: hard -"consola@npm:^2.15.3": - version: 2.15.3 - resolution: "consola@npm:2.15.3" - checksum: 10/ba5b3c6960b2eafb9d2ff2325444dd1d4eb53115df46eba823a4e7bfe6afbba0eb34747c0de82c7cd8a939db59b0cb5a8b8a54a94bb2e44feeddc26cefde3622 - languageName: node - linkType: hard - -"console-browserify@npm:^1.2.0": - version: 1.2.0 - resolution: "console-browserify@npm:1.2.0" - checksum: 10/4f16c471fa84909af6ae00527ce8d19dd9ed587eab85923c145cadfbc35414139f87e7bdd61746138e22cd9df45c2a1ca060370998c2c39f801d4a778105bac5 +"consola@npm:^3.2.3": + version: 3.4.2 + resolution: "consola@npm:3.4.2" + checksum: 10/32192c9f50d7cac27c5d7c4ecd3ff3679aea863e6bf5bd6a9cc2b05d1cd78addf5dae71df08c54330c142be8e7fbd46f051030129b57c6aacdd771efe409c4b2 languageName: node linkType: hard @@ -5201,13 +6185,6 @@ __metadata: languageName: node linkType: hard -"constants-browserify@npm:^1.0.0": - version: 1.0.0 - resolution: "constants-browserify@npm:1.0.0" - checksum: 10/49ef0babd907616dddde6905b80fe44ad5948e1eaaf6cf65d5f23a8c60c029ff63a1198c364665be1d6b2cb183d7e12921f33049cc126734ade84a3cfdbc83f6 - languageName: node - linkType: hard - "content-disposition@npm:0.5.2": version: 0.5.2 resolution: "content-disposition@npm:0.5.2" @@ -5252,10 +6229,10 @@ __metadata: languageName: node linkType: hard -"copy-text-to-clipboard@npm:^3.1.0, copy-text-to-clipboard@npm:^3.2.0": - version: 3.2.0 - resolution: "copy-text-to-clipboard@npm:3.2.0" - checksum: 10/df7115c197a166d51f59e4e20ab2a68a855ae8746d25ff149b5465c694d9a405c7e6684b73a9f87ba8d653070164e229c15dfdb9fd77c30be1ff0da569661060 +"copy-text-to-clipboard@npm:^3.2.0": + version: 3.2.2 + resolution: "copy-text-to-clipboard@npm:3.2.2" + checksum: 10/ae512de746632eb0cc3fe78ba16022b46134f835aa411d372798ee76c93baae8faa6b2cf5052ebd132ec6a2016124dc19786b231e5c0d333999c5d448e7a2e42 languageName: node linkType: hard @@ -5275,19 +6252,19 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.32.2, core-js-compat@npm:^3.37.1, core-js-compat@npm:^3.38.0": - version: 3.38.1 - resolution: "core-js-compat@npm:3.38.1" +"core-js-compat@npm:^3.43.0": + version: 3.48.0 + resolution: "core-js-compat@npm:3.48.0" dependencies: - browserslist: "npm:^4.23.3" - checksum: 10/4e2f219354fd268895f79486461a12df96f24ed307321482fe2a43529c5a64e7c16bcba654980ba217d603444f5141d43a79058aeac77511085f065c5da72207 + browserslist: "npm:^4.28.1" + checksum: 10/83c326dcfef5e174fd3f8f33c892c66e06d567ce27f323a1197a6c280c0178fe18d3e9c5fb95b00c18b98d6c53fba5c646def5fedaa77310a4297d16dfbe2029 languageName: node linkType: hard -"core-js-pure@npm:^3.30.2": - version: 3.33.0 - resolution: "core-js-pure@npm:3.33.0" - checksum: 10/4916014881a4e19475a503c91788ea0414d11687ea5c0de6666d5de756819db444ef88b29e12c7ad35d7320fc952251183ec60cf3f206e7955cccdfe4c260054 +"core-js-pure@npm:^3.43.0": + version: 3.48.0 + resolution: "core-js-pure@npm:3.48.0" + checksum: 10/7c624d5551252ad166b9a7df4daca354540b71bb2ce9c8df2a9ef7acb6335a7a56557bcbe2bd78e20e3a4eeeee2922ff37a22a67e978b293a2b4e5b9a7a04d9b languageName: node linkType: hard @@ -5305,20 +6282,7 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^6.0.0": - version: 6.0.0 - resolution: "cosmiconfig@npm:6.0.0" - dependencies: - "@types/parse-json": "npm:^4.0.0" - import-fresh: "npm:^3.1.0" - parse-json: "npm:^5.0.0" - path-type: "npm:^4.0.0" - yaml: "npm:^1.7.2" - checksum: 10/b184d2bfbced9ba6840fd097dbf3455c68b7258249bb9b1277913823d516d8dfdade8c5ccbf79db0ca8ebd4cc9b9be521ccc06a18396bd242d50023c208f1594 - languageName: node - linkType: hard - -"cosmiconfig@npm:^8.1.3, cosmiconfig@npm:^8.2.0": +"cosmiconfig@npm:^8.1.3, cosmiconfig@npm:^8.3.5": version: 8.3.6 resolution: "cosmiconfig@npm:8.3.6" dependencies: @@ -5335,55 +6299,6 @@ __metadata: languageName: node linkType: hard -"create-ecdh@npm:^4.0.4": - version: 4.0.4 - resolution: "create-ecdh@npm:4.0.4" - dependencies: - bn.js: "npm:^4.1.0" - elliptic: "npm:^6.5.3" - checksum: 10/0dd7fca9711d09e152375b79acf1e3f306d1a25ba87b8ff14c2fd8e68b83aafe0a7dd6c4e540c9ffbdd227a5fa1ad9b81eca1f233c38bb47770597ba247e614b - languageName: node - linkType: hard - -"create-hash@npm:^1.1.0, create-hash@npm:^1.2.0": - version: 1.2.0 - resolution: "create-hash@npm:1.2.0" - dependencies: - cipher-base: "npm:^1.0.1" - inherits: "npm:^2.0.1" - md5.js: "npm:^1.3.4" - ripemd160: "npm:^2.0.1" - sha.js: "npm:^2.4.0" - checksum: 10/3cfef32043b47a8999602af9bcd74966db6971dd3eb828d1a479f3a44d7f58e38c1caf34aa21a01941cc8d9e1a841738a732f200f00ea155f8a8835133d2e7bc - languageName: node - linkType: hard - -"create-hash@npm:~1.1.3": - version: 1.1.3 - resolution: "create-hash@npm:1.1.3" - dependencies: - cipher-base: "npm:^1.0.1" - inherits: "npm:^2.0.1" - ripemd160: "npm:^2.0.0" - sha.js: "npm:^2.4.0" - checksum: 10/b9f675719321dd3a3c3540bb46afcbdaf7182366ce93da9265318290e928be881e5edeff8c48a5ee9263c342e5e3f705fad5eb48f2e2cddc5fed1eb54077e076 - languageName: node - linkType: hard - -"create-hmac@npm:^1.1.7": - version: 1.1.7 - resolution: "create-hmac@npm:1.1.7" - dependencies: - cipher-base: "npm:^1.0.3" - create-hash: "npm:^1.1.0" - inherits: "npm:^2.0.1" - ripemd160: "npm:^2.0.0" - safe-buffer: "npm:^5.0.1" - sha.js: "npm:^2.4.8" - checksum: 10/2b26769f87e99ef72150bf99d1439d69272b2e510e23a2b8daf4e93e2412f4842504237d726044fa797cb20ee0ec8bee78d414b11f2d7ca93299185c93df0dae - languageName: node - linkType: hard - "cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" @@ -5395,27 +6310,7 @@ __metadata: languageName: node linkType: hard -"crypto-browserify@npm:^3.12.0": - version: 3.12.1 - resolution: "crypto-browserify@npm:3.12.1" - dependencies: - browserify-cipher: "npm:^1.0.1" - browserify-sign: "npm:^4.2.3" - create-ecdh: "npm:^4.0.4" - create-hash: "npm:^1.2.0" - create-hmac: "npm:^1.1.7" - diffie-hellman: "npm:^5.0.3" - hash-base: "npm:~3.0.4" - inherits: "npm:^2.0.4" - pbkdf2: "npm:^3.1.2" - public-encrypt: "npm:^4.0.3" - randombytes: "npm:^2.1.0" - randomfill: "npm:^1.0.4" - checksum: 10/13da0b5f61b3e8e68fcbebf0394f2b2b4d35a0d0ba6ab762720c13391d3697ea42735260a26328a6a3d872be7d4cb5abe98a7a8f88bc93da7ba59b993331b409 - languageName: node - linkType: hard - -"crypto-js@npm:^4.1.1": +"crypto-js@npm:^4.2.0": version: 4.2.0 resolution: "crypto-js@npm:4.2.0" checksum: 10/c7bcc56a6e01c3c397e95aa4a74e4241321f04677f9a618a8f48a63b5781617248afb9adb0629824792e7ec20ca0d4241a49b6b2938ae6f973ec4efc5c53c924 @@ -5431,6 +6326,17 @@ __metadata: languageName: node linkType: hard +"css-blank-pseudo@npm:^7.0.1": + version: 7.0.1 + resolution: "css-blank-pseudo@npm:7.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/bbe45955d0cb5a803f63f44f68b565cd1df41e737aca391262f9e9c8f2b86600fad18fbf9c5f48ba0cf10891647662831bc29019c02bcfc697c65ba649d18a1b + languageName: node + linkType: hard + "css-declaration-sorter@npm:^7.2.0": version: 7.2.0 resolution: "css-declaration-sorter@npm:7.2.0" @@ -5440,21 +6346,40 @@ __metadata: languageName: node linkType: hard -"css-loader@npm:^6.8.1": - version: 6.8.1 - resolution: "css-loader@npm:6.8.1" +"css-has-pseudo@npm:^7.0.3": + version: 7.0.3 + resolution: "css-has-pseudo@npm:7.0.3" + dependencies: + "@csstools/selector-specificity": "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/ffda6490aacb2903803f7d6c7b3ee41e654a3e9084c5eb0cf8f7602cf49ebce1b7891962016f622c36c67f4f685ed57628e7a0efbdba8cc55c5bf76ed58267d8 + languageName: node + linkType: hard + +"css-loader@npm:^6.11.0": + version: 6.11.0 + resolution: "css-loader@npm:6.11.0" dependencies: icss-utils: "npm:^5.1.0" - postcss: "npm:^8.4.21" - postcss-modules-extract-imports: "npm:^3.0.0" - postcss-modules-local-by-default: "npm:^4.0.3" - postcss-modules-scope: "npm:^3.0.0" + postcss: "npm:^8.4.33" + postcss-modules-extract-imports: "npm:^3.1.0" + postcss-modules-local-by-default: "npm:^4.0.5" + postcss-modules-scope: "npm:^3.2.0" postcss-modules-values: "npm:^4.0.0" postcss-value-parser: "npm:^4.2.0" - semver: "npm:^7.3.8" + semver: "npm:^7.5.4" peerDependencies: + "@rspack/core": 0.x || 1.x webpack: ^5.0.0 - checksum: 10/f20bb2a181c64d2f49586ab3922cae884519cfc8ae9ba8513065032255ed7bbdb4de75362f99d641d39d36d3732b7932884cd0e6fc71c8b0fb8b99a654f9cd08 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10/9e3665509f6786d46683de5c5f5c4bdd4aa62396b4017b41dbbb41ea5ada4012c80ee1e3302b79b504bc24da7fa69e3552d99006cecc953e0d9eef4a3053b929 languageName: node linkType: hard @@ -5487,6 +6412,15 @@ __metadata: languageName: node linkType: hard +"css-prefers-color-scheme@npm:^10.0.0": + version: 10.0.0 + resolution: "css-prefers-color-scheme@npm:10.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/b09055fdb8250c5f83b396bb310f7df48955cac6ff5dedb52f271af089a568b0c7b442461a24c533ffbe3f406ab39a043713264c32b9c75a625c8aaa48551714 + languageName: node + linkType: hard + "css-select@npm:^4.1.3": version: 4.3.0 resolution: "css-select@npm:4.3.0" @@ -5540,6 +6474,13 @@ __metadata: languageName: node linkType: hard +"cssdb@npm:^8.6.0": + version: 8.7.1 + resolution: "cssdb@npm:8.7.1" + checksum: 10/70b38620d6ac4b3fff0c1e6edff4ee5ed37f22f9d426dbf0fe5051ad14e39b31e4606068eb12cf46233ea305554a589574f95cce89f23bb79f651e344002bde6 + languageName: node + linkType: hard + "cssesc@npm:^3.0.0": version: 3.0.0 resolution: "cssesc@npm:3.0.0" @@ -5643,7 +6584,14 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.6.0": +"debounce@npm:^1.2.1": + version: 1.2.1 + resolution: "debounce@npm:1.2.1" + checksum: 10/0b95b2a9d80ed69117d890f8dab8c0f2d6066f8d20edd1d810ae51f8f366a6d4c8b1d56e97dcb9304e93d57de4d5db440d34a03def7dad50403fc3f22bf16808 + languageName: node + linkType: hard + +"debug@npm:2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -5652,15 +6600,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.3": - version: 4.3.4 - resolution: "debug@npm:4.3.4" +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.3, debug@npm:^4.4.3": + version: 4.4.3 + resolution: "debug@npm:4.4.3" dependencies: - ms: "npm:2.1.2" + ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10/0073c3bcbd9cb7d71dd5f6b55be8701af42df3e56e911186dfa46fac3a5b9eb7ce7f377dd1d3be6db8977221f8eb333d945216f645cf56f6b688cd484837d255 + checksum: 10/9ada3434ea2993800bd9a1e320bd4aa7af69659fb51cca685d390949434bc0a8873c21ed7c9b852af6f2455a55c6d050aa3937d52b3c69f796dab666f762acad languageName: node linkType: hard @@ -5689,19 +6637,27 @@ __metadata: languageName: node linkType: hard -"deepmerge@npm:^4.2.2, deepmerge@npm:^4.3.1": +"deepmerge@npm:^4.3.1": version: 4.3.1 resolution: "deepmerge@npm:4.3.1" checksum: 10/058d9e1b0ff1a154468bf3837aea436abcfea1ba1d165ddaaf48ca93765fdd01a30d33c36173da8fbbed951dd0a267602bc782fe288b0fc4b7e1e7091afc4529 languageName: node linkType: hard -"default-gateway@npm:^6.0.3": - version: 6.0.3 - resolution: "default-gateway@npm:6.0.3" +"default-browser-id@npm:^5.0.0": + version: 5.0.1 + resolution: "default-browser-id@npm:5.0.1" + checksum: 10/52c637637bcd76bfe974462a2f1dd75cb04784c2852935575760f82e1fd338e5e80d3c45a9b01fdbb1e450553a830bb163b004d2eca223c5573989f82232a072 + languageName: node + linkType: hard + +"default-browser@npm:^5.2.1": + version: 5.4.0 + resolution: "default-browser@npm:5.4.0" dependencies: - execa: "npm:^5.0.0" - checksum: 10/126f8273ecac8ee9ff91ea778e8784f6cd732d77c3157e8c5bdd6ed03651b5291f71446d05bc02d04073b1e67583604db5394ea3cf992ede0088c70ea15b7378 + bundle-name: "npm:^4.1.0" + default-browser-id: "npm:^5.0.0" + checksum: 10/cac0222ca5c9a3387d25337228689652ab33679a6566995c7194a75af7e554e91ec9ac92a70bfaa8e8089eae9f466ae99267bb38601282aade89b200f50a765c languageName: node linkType: hard @@ -5730,7 +6686,14 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": +"define-lazy-prop@npm:^3.0.0": + version: 3.0.0 + resolution: "define-lazy-prop@npm:3.0.0" + checksum: 10/f28421cf9ee86eecaf5f3b8fe875f13d7009c2625e97645bfff7a2a49aca678270b86c39f9c32939e5ca7ab96b551377ed4139558c795e076774287ad3af1aa4 + languageName: node + linkType: hard + +"define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" dependencies: @@ -5741,22 +6704,6 @@ __metadata: languageName: node linkType: hard -"del@npm:^6.1.1": - version: 6.1.1 - resolution: "del@npm:6.1.1" - dependencies: - globby: "npm:^11.0.1" - graceful-fs: "npm:^4.2.4" - is-glob: "npm:^4.0.1" - is-path-cwd: "npm:^2.2.0" - is-path-inside: "npm:^3.0.2" - p-map: "npm:^4.0.0" - rimraf: "npm:^3.0.2" - slash: "npm:^3.0.0" - checksum: 10/563288b73b8b19a7261c47fd21a330eeab6e2acd7c6208c49790dfd369127120dd7836cdf0c1eca216b77c94782a81507eac6b4734252d3bef2795cb366996b6 - languageName: node - linkType: hard - "delegates@npm:^1.0.0": version: 1.0.0 resolution: "delegates@npm:1.0.0" @@ -5785,16 +6732,6 @@ __metadata: languageName: node linkType: hard -"des.js@npm:^1.0.0": - version: 1.1.0 - resolution: "des.js@npm:1.1.0" - dependencies: - inherits: "npm:^2.0.1" - minimalistic-assert: "npm:^1.0.0" - checksum: 10/d35fc82b5a0b2127b12699212e90b54ddd8134e0cf8d27a8c30507ed3572aa574ab71800cbb473769128a52dcf21acc3271c5c359508a5aa772e990df3b1a698 - languageName: node - linkType: hard - "destroy@npm:1.2.0, destroy@npm:~1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" @@ -5811,6 +6748,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.0.3": + version: 2.1.2 + resolution: "detect-libc@npm:2.1.2" + checksum: 10/b736c8d97d5d46164c0d1bed53eb4e6a3b1d8530d460211e2d52f1c552875e706c58a5376854e4e54f8b828c9cada58c855288c968522eb93ac7696d65970766 + languageName: node + linkType: hard + "detect-node@npm:^2.0.4": version: 2.1.0 resolution: "detect-node@npm:2.1.0" @@ -5827,19 +6771,6 @@ __metadata: languageName: node linkType: hard -"detect-port-alt@npm:^1.1.6": - version: 1.1.6 - resolution: "detect-port-alt@npm:1.1.6" - dependencies: - address: "npm:^1.0.1" - debug: "npm:^2.6.0" - bin: - detect: ./bin/detect-port - detect-port: ./bin/detect-port - checksum: 10/35c9f9c69d12d2ca43d093f4f02d7763b47673910749bd12e6fedeb0ab5c546d27ab8e6425a9cbc65edd408490241390a8e680e8ec7e13940e84754ad81d632e - languageName: node - linkType: hard - "detect-port@npm:^1.5.1": version: 1.5.1 resolution: "detect-port@npm:1.5.1" @@ -5862,24 +6793,6 @@ __metadata: languageName: node linkType: hard -"diff@npm:^5.0.0": - version: 5.2.0 - resolution: "diff@npm:5.2.0" - checksum: 10/01b7b440f83a997350a988e9d2f558366c0f90f15be19f4aa7f1bb3109a4e153dfc3b9fbf78e14ea725717017407eeaa2271e3896374a0181e8f52445740846d - languageName: node - linkType: hard - -"diffie-hellman@npm:^5.0.3": - version: 5.0.3 - resolution: "diffie-hellman@npm:5.0.3" - dependencies: - bn.js: "npm:^4.1.0" - miller-rabin: "npm:^4.0.0" - randombytes: "npm:^2.0.0" - checksum: 10/2ff28231f93b27a4903461432d2de831df02e3568ea7633d5d7b6167eb73077f823b2bca26de6ba4f5c7ecd10a3df5aa94d376d136ab6209948c03cc4e4ac1fe - languageName: node - linkType: hard - "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -5889,13 +6802,6 @@ __metadata: languageName: node linkType: hard -"dns-equal@npm:^1.0.0": - version: 1.0.0 - resolution: "dns-equal@npm:1.0.0" - checksum: 10/c4f55af6f13536de39ebcfa15f504a5678d4fc2cf37b76fd41e73aa46dbd1fa596c9468c0c929aeb248ec443cb217fde949942c513312acf93c76cf783276617 - languageName: node - linkType: hard - "dns-packet@npm:^5.2.2": version: 5.4.0 resolution: "dns-packet@npm:5.4.0" @@ -5906,30 +6812,30 @@ __metadata: linkType: hard "docusaurus-plugin-openapi-docs@npm:^4.3.0": - version: 4.5.1 - resolution: "docusaurus-plugin-openapi-docs@npm:4.5.1" + version: 4.7.1 + resolution: "docusaurus-plugin-openapi-docs@npm:4.7.1" dependencies: "@apidevtools/json-schema-ref-parser": "npm:^11.5.4" - "@redocly/openapi-core": "npm:^1.10.5" + "@redocly/openapi-core": "npm:^1.34.3" allof-merge: "npm:^0.6.6" chalk: "npm:^4.1.2" - clsx: "npm:^1.1.1" - fs-extra: "npm:^9.0.1" + clsx: "npm:^2.1.1" + fs-extra: "npm:^11.3.0" json-pointer: "npm:^0.6.2" json5: "npm:^2.2.3" - lodash: "npm:^4.17.20" + lodash: "npm:^4.17.21" mustache: "npm:^4.2.0" - openapi-to-postmanv2: "npm:^4.21.0" - postman-collection: "npm:^4.4.0" - slugify: "npm:^1.6.5" + openapi-to-postmanv2: "npm:^5.0.0" + postman-collection: "npm:^5.0.2" + slugify: "npm:^1.6.6" swagger2openapi: "npm:^7.0.8" - xml-formatter: "npm:^2.6.1" + xml-formatter: "npm:^3.6.6" peerDependencies: "@docusaurus/plugin-content-docs": ^3.5.0 "@docusaurus/utils": ^3.5.0 "@docusaurus/utils-validation": ^3.5.0 react: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10/496ce49d494f06803a61eaa6c6810782668269574c12a1a55315742974884a7ffd6e2c75875d8fd9909611bdccaa4de42419e0debbf47def0db6974617b9e5ba + checksum: 10/641edbbcac889edacd109f40815d46bd4b45b3941981f57c2922e916f2657d95beae5f0d68a628b4c24b0e926289e93e27e52e27480e01087262d29734f5b1c8 languageName: node linkType: hard @@ -5955,41 +6861,43 @@ __metadata: linkType: hard "docusaurus-theme-openapi-docs@npm:^4.3.0": - version: 4.3.2 - resolution: "docusaurus-theme-openapi-docs@npm:4.3.2" + version: 4.7.1 + resolution: "docusaurus-theme-openapi-docs@npm:4.7.1" dependencies: "@hookform/error-message": "npm:^2.0.1" - "@reduxjs/toolkit": "npm:^1.7.1" + "@reduxjs/toolkit": "npm:^2.8.2" allof-merge: "npm:^0.6.6" - clsx: "npm:^1.1.1" - copy-text-to-clipboard: "npm:^3.1.0" - crypto-js: "npm:^4.1.1" + buffer: "npm:^6.0.3" + clsx: "npm:^2.1.1" + copy-text-to-clipboard: "npm:^3.2.0" + crypto-js: "npm:^4.2.0" file-saver: "npm:^2.0.5" - lodash: "npm:^4.17.20" - node-polyfill-webpack-plugin: "npm:^3.0.0" - postman-code-generators: "npm:^1.10.1" - postman-collection: "npm:^4.4.0" - prism-react-renderer: "npm:^2.3.0" - react-hook-form: "npm:^7.43.8" - react-live: "npm:^4.0.0" + lodash: "npm:^4.17.21" + pako: "npm:^2.1.0" + postman-code-generators: "npm:^2.0.0" + postman-collection: "npm:^5.0.2" + prism-react-renderer: "npm:^2.4.1" + process: "npm:^0.11.10" + react-hook-form: "npm:^7.59.0" + react-live: "npm:^4.1.8" react-magic-dropzone: "npm:^1.0.1" - react-markdown: "npm:^8.0.1" - react-modal: "npm:^3.15.1" - react-redux: "npm:^7.2.0" - rehype-raw: "npm:^6.1.1" - remark-gfm: "npm:3.0.1" - sass: "npm:^1.80.4" - sass-loader: "npm:^16.0.2" + react-markdown: "npm:^10.1.0" + react-modal: "npm:^3.16.3" + react-redux: "npm:^9.2.0" + rehype-raw: "npm:^7.0.0" + remark-gfm: "npm:4.0.1" + sass: "npm:^1.89.2" + sass-loader: "npm:^16.0.5" unist-util-visit: "npm:^5.0.0" - webpack: "npm:^5.61.0" - xml-formatter: "npm:^2.6.1" + url: "npm:^0.11.4" + xml-formatter: "npm:^3.6.6" peerDependencies: "@docusaurus/theme-common": ^3.5.0 docusaurus-plugin-openapi-docs: ^4.0.0 docusaurus-plugin-sass: ^0.2.3 react: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10/94e7203c2773605a3f883c744ccdb756e96e763dd79823e20e40433a53f45e4b23a586902462295e75e49b7e7f08b864111fa3b77e66bdd963c7e8bbf5f8f424 + checksum: 10/2b8ad287d156c26f04fd617895da54ed7ffdc368bbb0ef95bdde30870c6e9306a0cbcafeb8002ef6fc5a3a6e623c7de92488fded450c47efa1986aca1f752c16 languageName: node linkType: hard @@ -6024,13 +6932,6 @@ __metadata: languageName: node linkType: hard -"domain-browser@npm:^4.22.0": - version: 4.23.0 - resolution: "domain-browser@npm:4.23.0" - checksum: 10/56d5a969ed330a16aa6f03f26e7ba3b98e07c7ce4a77d08f987e9e424f1deca009070ed9bd24011d9b863499dcba95de4d679bba77aef346ee23230e570ab9cf - languageName: node - linkType: hard - "domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0, domelementtype@npm:^2.3.0": version: 2.3.0 resolution: "domelementtype@npm:2.3.0" @@ -6129,25 +7030,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.73": - version: 1.5.88 - resolution: "electron-to-chromium@npm:1.5.88" - checksum: 10/cb52f817ad7b918580c2d70f3e7c21bea7e6f260d3b3a221265fce03cd6b653af91464bfebee8a55f0f6bcbc11b34853e7555bafb3ecf65ff035d65e63e6c745 - languageName: node - linkType: hard - -"elliptic@npm:^6.5.3, elliptic@npm:^6.5.5": - version: 6.6.1 - resolution: "elliptic@npm:6.6.1" - dependencies: - bn.js: "npm:^4.11.9" - brorand: "npm:^1.1.0" - hash.js: "npm:^1.0.0" - hmac-drbg: "npm:^1.0.1" - inherits: "npm:^2.0.4" - minimalistic-assert: "npm:^1.0.1" - minimalistic-crypto-utils: "npm:^1.0.1" - checksum: 10/dc678c9febd89a219c4008ba3a9abb82237be853d9fd171cd602c8fb5ec39927e65c6b5e7a1b2a4ea82ee8e0ded72275e7932bb2da04a5790c2638b818e4e1c5 +"electron-to-chromium@npm:^1.5.263": + version: 1.5.279 + resolution: "electron-to-chromium@npm:1.5.279" + checksum: 10/debb143e6d5482a0f4cff7535bdb5725d58625f65bfa3704a5d1074052d934a72b20f253e7db124acad9cd40f404f14a53eb671db11cc10d69833960483be70d languageName: node linkType: hard @@ -6209,13 +7095,13 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.17.1": - version: 5.17.1 - resolution: "enhanced-resolve@npm:5.17.1" +"enhanced-resolve@npm:^5.17.4": + version: 5.18.4 + resolution: "enhanced-resolve@npm:5.18.4" dependencies: graceful-fs: "npm:^4.2.4" tapable: "npm:^2.2.0" - checksum: 10/e8e03cb7a4bf3c0250a89afbd29e5ec20e90ba5fcd026066232a0754864d7d0a393fa6fc0e5379314a6529165a1834b36731147080714459d98924520410d8f5 + checksum: 10/dcd477cb694d9cc84109a03269c13d3da0851d50099fd3fa7c56b2867dd720d59c7f1431bd47c9cad2825ad52588bd71d3a68cf1e5ee0bc57551d8a3fab4e6f2 languageName: node linkType: hard @@ -6270,10 +7156,10 @@ __metadata: languageName: node linkType: hard -"es-module-lexer@npm:^1.2.1": - version: 1.2.1 - resolution: "es-module-lexer@npm:1.2.1" - checksum: 10/4bb92673b94b46e8d2e23ff275696842c83cdabd19eaa84bab60ce37ee036051dedb158746f6d88a58b9d430f881a717c23434e2c8f05d1ba2c69d68e4f05ab4 +"es-module-lexer@npm:^2.0.0": + version: 2.0.0 + resolution: "es-module-lexer@npm:2.0.0" + checksum: 10/b075855289b5f40ee496f3d7525c5c501d029c3da15c22298a0030d625bf36d1da0768b26278f7f4bada2a602459b505888e20b77c414fba5da5619b0e84dbd1 languageName: node linkType: hard @@ -6476,39 +7362,21 @@ __metadata: languageName: node linkType: hard -"event-target-shim@npm:^5.0.0": - version: 5.0.1 - resolution: "event-target-shim@npm:5.0.1" - checksum: 10/49ff46c3a7facbad3decb31f597063e761785d7fdb3920d4989d7b08c97a61c2f51183e2f3a03130c9088df88d4b489b1b79ab632219901f184f85158508f4c8 - languageName: node - linkType: hard - -"eventemitter3@npm:^4.0.0": +"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.4": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" checksum: 10/8030029382404942c01d0037079f1b1bc8fed524b5849c237b80549b01e2fc49709e1d0c557fa65ca4498fc9e24cff1475ef7b855121fcc15f9d61f93e282346 languageName: node linkType: hard -"events@npm:^3.2.0, events@npm:^3.3.0": +"events@npm:^3.2.0": version: 3.3.0 resolution: "events@npm:3.3.0" checksum: 10/a3d47e285e28d324d7180f1e493961a2bbb4cad6412090e4dec114f4db1f5b560c7696ee8e758f55e23913ede856e3689cd3aa9ae13c56b5d8314cd3b3ddd1be languageName: node linkType: hard -"evp_bytestokey@npm:^1.0.0, evp_bytestokey@npm:^1.0.3": - version: 1.0.3 - resolution: "evp_bytestokey@npm:1.0.3" - dependencies: - md5.js: "npm:^1.3.4" - node-gyp: "npm:latest" - safe-buffer: "npm:^5.1.1" - checksum: 10/ad4e1577f1a6b721c7800dcc7c733fe01f6c310732bb5bf2240245c2a5b45a38518b91d8be2c610611623160b9d1c0e91f1ce96d639f8b53e8894625cf20fa45 - languageName: node - linkType: hard - -"execa@npm:^5.0.0, execa@npm:^5.1.1": +"execa@npm:5.1.1, execa@npm:^5.1.1": version: 5.1.1 resolution: "execa@npm:5.1.1" dependencies: @@ -6532,7 +7400,7 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.17.3": +"express@npm:^4.22.1": version: 4.22.1 resolution: "express@npm:4.22.1" dependencies: @@ -6628,15 +7496,6 @@ __metadata: languageName: node linkType: hard -"fast-url-parser@npm:1.1.3": - version: 1.1.3 - resolution: "fast-url-parser@npm:1.1.3" - dependencies: - punycode: "npm:^1.3.2" - checksum: 10/6d33f46ce9776f7f3017576926207a950ca39bc5eb78fc794404f2288fe494720f9a119084b75569bd9eb09d2b46678bfaf39c191fb2c808ef3c833dc8982752 - languageName: node - linkType: hard - "fastq@npm:^1.6.0": version: 1.14.0 resolution: "fastq@npm:1.14.0" @@ -6673,6 +7532,15 @@ __metadata: languageName: node linkType: hard +"figures@npm:^3.2.0": + version: 3.2.0 + resolution: "figures@npm:3.2.0" + dependencies: + escape-string-regexp: "npm:^1.0.5" + checksum: 10/a3bf94e001be51d3770500789157f067218d4bc681a65e1f69d482de15120bcac822dceb1a7b3803f32e4e3a61a46df44f7f2c8ba95d6375e7491502e0dd3d97 + languageName: node + linkType: hard + "file-loader@npm:^6.2.0": version: 6.2.0 resolution: "file-loader@npm:6.2.0" @@ -6699,13 +7567,6 @@ __metadata: languageName: node linkType: hard -"filesize@npm:^8.0.6": - version: 8.0.7 - resolution: "filesize@npm:8.0.7" - checksum: 10/e35f1799c314cef49a585af82fe2d15b362f743a74c95f06e3dd99cf0334ca45516ed144f6a58649ca0e2e5e63844c0ef476d9374d5d43736d26f7c13aa49dad - languageName: node - linkType: hard - "fill-range@npm:^7.1.1": version: 7.1.1 resolution: "fill-range@npm:7.1.1" @@ -6740,25 +7601,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^3.0.0": - version: 3.0.0 - resolution: "find-up@npm:3.0.0" - dependencies: - locate-path: "npm:^3.0.0" - checksum: 10/38eba3fe7a66e4bc7f0f5a1366dc25508b7cfc349f852640e3678d26ad9a6d7e2c43eff0a472287de4a9753ef58f066a0ea892a256fa3636ad51b3fe1e17fae9 - languageName: node - linkType: hard - -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: "npm:^6.0.0" - path-exists: "npm:^4.0.0" - checksum: 10/07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 - languageName: node - linkType: hard - "find-up@npm:^6.3.0": version: 6.3.0 resolution: "find-up@npm:6.3.0" @@ -6769,6 +7611,15 @@ __metadata: languageName: node linkType: hard +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: 10/72479e651c15eab53e25ce04c31bab18cfaac0556505cac19221dbbe85bbb9686bc76e4d397e89e5bf516ce667dcf818f8b07e585568edba55abc2bf1f698fb5 + languageName: node + linkType: hard + "follow-redirects@npm:^1.0.0": version: 1.15.6 resolution: "follow-redirects@npm:1.15.6" @@ -6779,15 +7630,6 @@ __metadata: languageName: node linkType: hard -"for-each@npm:^0.3.3": - version: 0.3.4 - resolution: "for-each@npm:0.3.4" - dependencies: - is-callable: "npm:^1.2.7" - checksum: 10/c3bc4ebe8bd51655919dd9132c7ad0703c267bd0d737093e8424f46feea2eeaa73ecc54237346435258548d07aaeac643deb47de9b872c359e0c37cf0507a7f1 - languageName: node - linkType: hard - "foreach@npm:^2.0.4": version: 2.0.6 resolution: "foreach@npm:2.0.6" @@ -6805,37 +7647,6 @@ __metadata: languageName: node linkType: hard -"fork-ts-checker-webpack-plugin@npm:^6.5.0": - version: 6.5.2 - resolution: "fork-ts-checker-webpack-plugin@npm:6.5.2" - dependencies: - "@babel/code-frame": "npm:^7.8.3" - "@types/json-schema": "npm:^7.0.5" - chalk: "npm:^4.1.0" - chokidar: "npm:^3.4.2" - cosmiconfig: "npm:^6.0.0" - deepmerge: "npm:^4.2.2" - fs-extra: "npm:^9.0.0" - glob: "npm:^7.1.6" - memfs: "npm:^3.1.2" - minimatch: "npm:^3.0.4" - schema-utils: "npm:2.7.0" - semver: "npm:^7.3.2" - tapable: "npm:^1.0.0" - peerDependencies: - eslint: ">= 6" - typescript: ">= 2.7" - vue-template-compiler: "*" - webpack: ">= 4" - peerDependenciesMeta: - eslint: - optional: true - vue-template-compiler: - optional: true - checksum: 10/4a7037d654c07eb4e881d0626fdfdfac22fe90531e1e203846be89d68e863d3f9fcfc004b9037669455bf461081c83091eddf6485a7b131e7e6706c8939eeb67 - languageName: node - linkType: hard - "form-data-encoder@npm:^2.1.2": version: 2.1.4 resolution: "form-data-encoder@npm:2.1.4" @@ -6857,10 +7668,10 @@ __metadata: languageName: node linkType: hard -"fraction.js@npm:^4.3.7": - version: 4.3.7 - resolution: "fraction.js@npm:4.3.7" - checksum: 10/bb5ebcdeeffcdc37b68ead3bdfc244e68de188e0c64e9702197333c72963b95cc798883ad16adc21588088b942bca5b6a6ff4aeb1362d19f6f3b629035dc15f5 +"fraction.js@npm:^5.3.4": + version: 5.3.4 + resolution: "fraction.js@npm:5.3.4" + checksum: 10/ef2c4bc81b2484065f8f7e4c2498f3fdfe6d233b8e7c7f75e3683ed10698536129b2c2dbd6c3f788ca4a020ec07116dd909a91036a364c98dc802b5003bfc613 languageName: node linkType: hard @@ -6871,26 +7682,14 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^11.1.1, fs-extra@npm:^11.2.0": - version: 11.2.0 - resolution: "fs-extra@npm:11.2.0" +"fs-extra@npm:^11.1.1, fs-extra@npm:^11.2.0, fs-extra@npm:^11.3.0": + version: 11.3.3 + resolution: "fs-extra@npm:11.3.3" dependencies: graceful-fs: "npm:^4.2.0" jsonfile: "npm:^6.0.1" universalify: "npm:^2.0.0" - checksum: 10/0579bf6726a4cd054d4aa308f10b483f52478bb16284f32cf60b4ce0542063d551fca1a08a2af365e35db21a3fa5a06cf2a6ed614004b4368982bc754cb816b3 - languageName: node - linkType: hard - -"fs-extra@npm:^9.0.0, fs-extra@npm:^9.0.1": - version: 9.1.0 - resolution: "fs-extra@npm:9.1.0" - dependencies: - at-least-node: "npm:^1.0.0" - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 10/08600da1b49552ed23dfac598c8fc909c66776dd130fea54fbcad22e330f7fcc13488bb995f6bc9ce5651aa35b65702faf616fe76370ee56f1aade55da982dca + checksum: 10/daeaefafbebe8fa6efd2fb96fc926f2c952be5877811f00a6794f0d64e0128e3d0d93368cd328f8f063b45deacf385c40e3d931aa46014245431cd2f4f89c67a languageName: node linkType: hard @@ -6903,13 +7702,6 @@ __metadata: languageName: node linkType: hard -"fs-monkey@npm:^1.0.3": - version: 1.0.3 - resolution: "fs-monkey@npm:1.0.3" - checksum: 10/af1abe305863956f5471fe41a4026da7607e866ee5f6c9a9ad6666b51eed102cbba08043eec708e15a1c78ced56bc33c72ee1ddf79720704791c77ed8f274a47 - languageName: node - linkType: hard - "fs.realpath@npm:^1.0.0": version: 1.0.0 resolution: "fs.realpath@npm:1.0.0" @@ -6936,7 +7728,7 @@ __metadata: languageName: node linkType: hard -"function-bind@npm:^1.1.1, function-bind@npm:^1.1.2": +"function-bind@npm:^1.1.2": version: 1.1.2 resolution: "function-bind@npm:1.1.2" checksum: 10/185e20d20f10c8d661d59aac0f3b63b31132d492e1b11fcc2a93cb2c47257ebaee7407c38513efd2b35cafdf972d9beb2ea4593c1e0f3bf8f2744836928d7454 @@ -7040,6 +7832,15 @@ __metadata: languageName: node linkType: hard +"glob-to-regex.js@npm:^1.0.0, glob-to-regex.js@npm:^1.0.1": + version: 1.2.0 + resolution: "glob-to-regex.js@npm:1.2.0" + peerDependencies: + tslib: 2 + checksum: 10/13034e642db479d75448bdd9f37de7451bef2879c394bfe3f8df6588e0479893e94059eaee77cdf50dce675607fb2395c132dcca0c9a559a6192e89b2ad0f134 + languageName: node + linkType: hard + "glob-to-regexp@npm:^0.4.1": version: 0.4.1 resolution: "glob-to-regexp@npm:0.4.1" @@ -7063,7 +7864,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^7.0.0, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": +"glob@npm:^7.0.0, glob@npm:^7.1.3, glob@npm:^7.1.4": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -7099,34 +7900,7 @@ __metadata: languageName: node linkType: hard -"global-modules@npm:^2.0.0": - version: 2.0.0 - resolution: "global-modules@npm:2.0.0" - dependencies: - global-prefix: "npm:^3.0.0" - checksum: 10/4aee73adf533fe82ead2ad15c8bfb6ea4fb29e16d2d067521ab39d3b45b8f834d71c47a807e4f8f696e79497c3946d4ccdcd708da6f3a4522d65b087b8852f64 - languageName: node - linkType: hard - -"global-prefix@npm:^3.0.0": - version: 3.0.0 - resolution: "global-prefix@npm:3.0.0" - dependencies: - ini: "npm:^1.3.5" - kind-of: "npm:^6.0.2" - which: "npm:^1.3.1" - checksum: 10/a405b9f83c7d88a49dc1c1e458d6585e258356810d3d0f41094265152a06a0f393b14d911f45616e35a4ce3894176a73be2984883575e778f55e90bf812d7337 - languageName: node - linkType: hard - -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10/9f054fa38ff8de8fa356502eb9d2dae0c928217b8b5c8de1f09f5c9b6c8a96d8b9bd3afc49acbcd384a98a81fea713c859e1b09e214c60509517bb8fc2bc13c2 - languageName: node - linkType: hard - -"globby@npm:^11.0.1, globby@npm:^11.0.4, globby@npm:^11.1.0": +"globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -7230,13 +8004,6 @@ __metadata: languageName: node linkType: hard -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 10/4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b - languageName: node - linkType: hard - "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" @@ -7253,22 +8020,13 @@ __metadata: languageName: node linkType: hard -"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": +"has-symbols@npm:^1.1.0": version: 1.1.0 resolution: "has-symbols@npm:1.1.0" checksum: 10/959385c98696ebbca51e7534e0dc723ada325efa3475350951363cce216d27373e0259b63edb599f72eb94d6cde8577b4b2375f080b303947e560f85692834fa languageName: node linkType: hard -"has-tostringtag@npm:^1.0.2": - version: 1.0.2 - resolution: "has-tostringtag@npm:1.0.2" - dependencies: - has-symbols: "npm:^1.0.3" - checksum: 10/c74c5f5ceee3c8a5b8bc37719840dc3749f5b0306d818974141dda2471a1a2ca6c8e46b9d6ac222c5345df7a901c9b6f350b1e6d62763fec877e26609a401bfe - languageName: node - linkType: hard - "has-unicode@npm:^2.0.1": version: 2.0.1 resolution: "has-unicode@npm:2.0.1" @@ -7283,55 +8041,6 @@ __metadata: languageName: node linkType: hard -"has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" - dependencies: - function-bind: "npm:^1.1.1" - checksum: 10/a449f3185b1d165026e8d25f6a8c3390bd25c201ff4b8c1aaf948fc6a5fcfd6507310b8c00c13a3325795ea9791fcc3d79d61eafa313b5750438fc19183df57b - languageName: node - linkType: hard - -"hash-base@npm:^2.0.0": - version: 2.0.2 - resolution: "hash-base@npm:2.0.2" - dependencies: - inherits: "npm:^2.0.1" - checksum: 10/e39f3f2bb91679ed350bd2eb81035acb1e1e6e9bb86d9f1197fcfdc3cf39a2c56bf82a1870f000fae651477883b4c107fd6ac0c640a18ab06298b87c39939396 - languageName: node - linkType: hard - -"hash-base@npm:^3.0.0": - version: 3.1.0 - resolution: "hash-base@npm:3.1.0" - dependencies: - inherits: "npm:^2.0.4" - readable-stream: "npm:^3.6.0" - safe-buffer: "npm:^5.2.0" - checksum: 10/26b7e97ac3de13cb23fc3145e7e3450b0530274a9562144fc2bf5c1e2983afd0e09ed7cc3b20974ba66039fad316db463da80eb452e7373e780cbee9a0d2f2dc - languageName: node - linkType: hard - -"hash-base@npm:~3.0, hash-base@npm:~3.0.4": - version: 3.0.5 - resolution: "hash-base@npm:3.0.5" - dependencies: - inherits: "npm:^2.0.4" - safe-buffer: "npm:^5.2.1" - checksum: 10/6a82675a5de2ea9347501bbe655a2334950c7ec972fd9810ae9529e06aeab8f7e8ef68fc2112e5e6f0745561a7e05326efca42ad59bb5fd116537f5f8b0a216d - languageName: node - linkType: hard - -"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3": - version: 1.1.7 - resolution: "hash.js@npm:1.1.7" - dependencies: - inherits: "npm:^2.0.3" - minimalistic-assert: "npm:^1.0.1" - checksum: 10/0c89ee4006606a40f92df5cc3c263342e7fea68110f3e9ef032bd2083650430505db01b6b7926953489517d4027535e4fdc7f970412893d3031c361d3ec8f4b3 - languageName: node - linkType: hard - "hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" @@ -7341,21 +8050,6 @@ __metadata: languageName: node linkType: hard -"hast-util-from-parse5@npm:^7.0.0": - version: 7.1.2 - resolution: "hast-util-from-parse5@npm:7.1.2" - dependencies: - "@types/hast": "npm:^2.0.0" - "@types/unist": "npm:^2.0.0" - hastscript: "npm:^7.0.0" - property-information: "npm:^6.0.0" - vfile: "npm:^5.0.0" - vfile-location: "npm:^4.0.0" - web-namespaces: "npm:^2.0.0" - checksum: 10/7a90a16430a1482ed1be5c2f8b182e8b12aee8834781245b101700b5a04cea8b569cf40ef08214e1eb333249432e861b17e6fe46d0447b5281827c8798e86f1a - languageName: node - linkType: hard - "hast-util-from-parse5@npm:^8.0.0": version: 8.0.1 resolution: "hast-util-from-parse5@npm:8.0.1" @@ -7372,15 +8066,6 @@ __metadata: languageName: node linkType: hard -"hast-util-parse-selector@npm:^3.0.0": - version: 3.1.1 - resolution: "hast-util-parse-selector@npm:3.1.1" - dependencies: - "@types/hast": "npm:^2.0.0" - checksum: 10/511d373465f60dd65e924f88bf0954085f4fb6e3a2b062a4b5ac43b93cbfd36a8dce6234b5d1e3e63499d936375687e83fc5da55628b22bd6b581b5ee167d1c4 - languageName: node - linkType: hard - "hast-util-parse-selector@npm:^4.0.0": version: 4.0.0 resolution: "hast-util-parse-selector@npm:4.0.0" @@ -7390,25 +8075,6 @@ __metadata: languageName: node linkType: hard -"hast-util-raw@npm:^7.2.0": - version: 7.2.3 - resolution: "hast-util-raw@npm:7.2.3" - dependencies: - "@types/hast": "npm:^2.0.0" - "@types/parse5": "npm:^6.0.0" - hast-util-from-parse5: "npm:^7.0.0" - hast-util-to-parse5: "npm:^7.0.0" - html-void-elements: "npm:^2.0.0" - parse5: "npm:^6.0.0" - unist-util-position: "npm:^4.0.0" - unist-util-visit: "npm:^4.0.0" - vfile: "npm:^5.0.0" - web-namespaces: "npm:^2.0.0" - zwitch: "npm:^2.0.0" - checksum: 10/fe39d4b9e68de7131ec61e9abe887cc0579dc7491f738735150c6021565fc998e37c9d096e97fc35c769e986e04b721d4724835ee82fcc22076d778acf6c4832 - languageName: node - linkType: hard - "hast-util-raw@npm:^9.0.0": version: 9.0.2 resolution: "hast-util-raw@npm:9.0.2" @@ -7477,20 +8143,6 @@ __metadata: languageName: node linkType: hard -"hast-util-to-parse5@npm:^7.0.0": - version: 7.1.0 - resolution: "hast-util-to-parse5@npm:7.1.0" - dependencies: - "@types/hast": "npm:^2.0.0" - comma-separated-tokens: "npm:^2.0.0" - property-information: "npm:^6.0.0" - space-separated-tokens: "npm:^2.0.0" - web-namespaces: "npm:^2.0.0" - zwitch: "npm:^2.0.0" - checksum: 10/695539881431f9713ca4a0be7d06bf3e57ae4d9f930eccba371534c50cff11855d345f8ec30099d04482637ad82e3c70d480269bfa4c109f37993536e8ea690d - languageName: node - linkType: hard - "hast-util-to-parse5@npm:^8.0.0": version: 8.0.0 resolution: "hast-util-to-parse5@npm:8.0.0" @@ -7506,13 +8158,6 @@ __metadata: languageName: node linkType: hard -"hast-util-whitespace@npm:^2.0.0": - version: 2.0.1 - resolution: "hast-util-whitespace@npm:2.0.1" - checksum: 10/ad5a61f4e81330413d4182247e158d77408a076994fbe7257574ea6489728bb4138c83e00482051c941973d4ed3049729afb35600debfc6d1d945c40453685f7 - languageName: node - linkType: hard - "hast-util-whitespace@npm:^3.0.0": version: 3.0.0 resolution: "hast-util-whitespace@npm:3.0.0" @@ -7522,19 +8167,6 @@ __metadata: languageName: node linkType: hard -"hastscript@npm:^7.0.0": - version: 7.2.0 - resolution: "hastscript@npm:7.2.0" - dependencies: - "@types/hast": "npm:^2.0.0" - comma-separated-tokens: "npm:^2.0.0" - hast-util-parse-selector: "npm:^3.0.0" - property-information: "npm:^6.0.0" - space-separated-tokens: "npm:^2.0.0" - checksum: 10/98740e0b69b4765a23d0174fb93eb1c1bdcae6a9f1c9e1b07de6aca2d578427a42e1d45ee98eda26463ac58ff73a8ce45af19c4eb8b5f6f768a9c8543964d28f - languageName: node - linkType: hard - "hastscript@npm:^8.0.0": version: 8.0.0 resolution: "hastscript@npm:8.0.0" @@ -7571,18 +8203,7 @@ __metadata: languageName: node linkType: hard -"hmac-drbg@npm:^1.0.1": - version: 1.0.1 - resolution: "hmac-drbg@npm:1.0.1" - dependencies: - hash.js: "npm:^1.0.3" - minimalistic-assert: "npm:^1.0.0" - minimalistic-crypto-utils: "npm:^1.0.1" - checksum: 10/0298a1445b8029a69b713d918ecaa84a1d9f614f5857e0c6e1ca517abfa1357216987b2ee08cc6cc73ba82a6c6ddf2ff11b9717a653530ef03be599d4699b836 - languageName: node - linkType: hard - -"hoist-non-react-statics@npm:^3.1.0, hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.2": +"hoist-non-react-statics@npm:^3.1.0": version: 3.3.2 resolution: "hoist-non-react-statics@npm:3.3.2" dependencies: @@ -7603,10 +8224,10 @@ __metadata: languageName: node linkType: hard -"html-entities@npm:^2.3.2": - version: 2.3.3 - resolution: "html-entities@npm:2.3.3" - checksum: 10/24f6b77ce234e263f3d44530de2356e67c313c8ba7e5f6e02c16dcea3a950711d8820afb320746d57b8dae61fde7aaaa7f60017b706fa4bce8624ba3c29ad316 +"html-escaper@npm:^2.0.2": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: 10/034d74029dcca544a34fb6135e98d427acd73019796ffc17383eaa3ec2fe1c0471dcbbc8f8ed39e46e86d43ccd753a160631615e4048285e313569609b66d5b7 languageName: node linkType: hard @@ -7651,10 +8272,10 @@ __metadata: languageName: node linkType: hard -"html-void-elements@npm:^2.0.0": - version: 2.0.1 - resolution: "html-void-elements@npm:2.0.1" - checksum: 10/06d41f13b9d5d6e0f39861c4bec9a9196fa4906d56cd5cf6cf54ad2e52a85bf960cca2bf9600026bde16c8331db171bedba5e5a35e2e43630c8f1d497b2fb658 +"html-url-attributes@npm:^3.0.0": + version: 3.0.1 + resolution: "html-url-attributes@npm:3.0.1" + checksum: 10/494074c2f730c5c0e517aa1b10111fb36732534a2d2b70427582c4a615472b47da472cf3a17562cc653826d378d20960f2783e0400f4f7cf0c3c2d91c6188d13 languageName: node linkType: hard @@ -7665,9 +8286,9 @@ __metadata: languageName: node linkType: hard -"html-webpack-plugin@npm:^5.5.3": - version: 5.5.3 - resolution: "html-webpack-plugin@npm:5.5.3" +"html-webpack-plugin@npm:^5.6.0": + version: 5.6.6 + resolution: "html-webpack-plugin@npm:5.6.6" dependencies: "@types/html-minifier-terser": "npm:^6.0.0" html-minifier-terser: "npm:^6.0.2" @@ -7675,8 +8296,14 @@ __metadata: pretty-error: "npm:^4.0.0" tapable: "npm:^2.0.0" peerDependencies: + "@rspack/core": 0.x || 1.x webpack: ^5.20.0 - checksum: 10/01d302a434e3db9f0e2db370f06300fb613de0fb8bdcafd4693e44c2528b8608621e5e7ca5d8302446db3f20c5f8875f1f675926d469b13ebab139954d241055 + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10/819ebee079466029a771236fdadcbcfe0aaf110eac1b74c0983a0318a7f99f3c69adcf1d617e218769a8c8e96ea17de2df30759bd950ec391d0c5676d480894e languageName: node linkType: hard @@ -7774,7 +8401,7 @@ __metadata: languageName: node linkType: hard -"http-proxy-middleware@npm:^2.0.3": +"http-proxy-middleware@npm:^2.0.9": version: 2.0.9 resolution: "http-proxy-middleware@npm:2.0.9" dependencies: @@ -7827,13 +8454,6 @@ __metadata: languageName: node linkType: hard -"https-browserify@npm:^1.0.0": - version: 1.0.0 - resolution: "https-browserify@npm:1.0.0" - checksum: 10/2d707c457319e1320adf0e7556174c190865fb345b6a183f033cee440f73221dbe7fa3f0adcffb1e6b0664726256bd44771a82e50fe6c66976c10b237100536a - languageName: node - linkType: hard - "https-proxy-agent@npm:^5.0.0": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" @@ -7844,7 +8464,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.4": +"https-proxy-agent@npm:^7.0.5": version: 7.0.6 resolution: "https-proxy-agent@npm:7.0.6" dependencies: @@ -7870,6 +8490,13 @@ __metadata: languageName: node linkType: hard +"hyperdyperid@npm:^1.2.0": + version: 1.2.0 + resolution: "hyperdyperid@npm:1.2.0" + checksum: 10/64abb5568ff17aa08ac0175ae55e46e22831c5552be98acdd1692081db0209f36fff58b31432017b4e1772c178962676a2cc3c54e4d5d7f020d7710cec7ad7a6 + languageName: node + linkType: hard + "iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" @@ -7911,21 +8538,19 @@ __metadata: languageName: node linkType: hard -"image-size@npm:^1.0.2": - version: 1.0.2 - resolution: "image-size@npm:1.0.2" - dependencies: - queue: "npm:6.0.2" +"image-size@npm:^2.0.2": + version: 2.0.2 + resolution: "image-size@npm:2.0.2" bin: image-size: bin/image-size.js - checksum: 10/693dfb2f8bfda2aacd087ef7130fd997fd0aceca838291bae400646db1826b80108185d0062ea3c0365b12c3ab5145bb923fdc777fd94c4991840d47fe44ade3 + checksum: 10/d15203279fe7ada01252d8c56ba97516385d6d5ac2cbf3d734580fc88db4f5272b9b3f7f378ad63abc7d06b5500c43b90d9f84626e2bda1cab403c16eb469592 languageName: node linkType: hard -"immer@npm:^9.0.21, immer@npm:^9.0.7": - version: 9.0.21 - resolution: "immer@npm:9.0.21" - checksum: 10/8455d6b4dc8abfe40f06eeec9bcc944d147c81279424c0f927a4d4905ae34e5af19ab6da60bcc700c14f51c452867d7089b3b9236f5a9a2248e39b4a09ee89de +"immer@npm:^11.0.0": + version: 11.1.3 + resolution: "immer@npm:11.1.3" + checksum: 10/d0c591381d8022fcad868d36f087635d5e5cddfd7f43c069bc0d2fee946ddc9969cd5f886e76a4ef0a36f2ce81b5e0228177e2cb4d85b3215aca40e6cb53ad2a languageName: node linkType: hard @@ -7936,7 +8561,7 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^3.1.0, import-fresh@npm:^3.3.0": +"import-fresh@npm:^3.3.0": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" dependencies: @@ -7974,10 +8599,10 @@ __metadata: languageName: node linkType: hard -"infima@npm:0.2.0-alpha.44": - version: 0.2.0-alpha.44 - resolution: "infima@npm:0.2.0-alpha.44" - checksum: 10/a4d724ca23a67229ce61b6f73a4a394ff93a15bd9f141b2941e6dfc032f112ee49362c10ece388c189e53895cd5a8e264671184e097cc48aab90cd7d0fe41646 +"infima@npm:0.2.0-alpha.45": + version: 0.2.0-alpha.45 + resolution: "infima@npm:0.2.0-alpha.45" + checksum: 10/5e620f52d4787a0d4f96fd428411138ec09042d2a7e9adc7fc38612a9c57e49dd485ccc4f35bbbcd07f66e63bb2f6fbb6dde35a8351e9a978a7e4e1ebb7f0af0 languageName: node linkType: hard @@ -7991,7 +8616,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3, inherits@npm:~2.0.4": +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.3, inherits@npm:~2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10/cd45e923bee15186c07fa4c89db0aace24824c482fb887b528304694b2aa6ff8a898da8657046a5dcf3e46cd6db6c61629551f9215f208d7c3f157cf9b290521 @@ -8012,7 +8637,7 @@ __metadata: languageName: node linkType: hard -"ini@npm:^1.3.4, ini@npm:^1.3.5, ini@npm:~1.3.0": +"ini@npm:^1.3.4, ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" checksum: 10/314ae176e8d4deb3def56106da8002b462221c174ddb7ce0c49ee72c8cd1f9044f7b10cc555a7d8850982c3b9ca96fc212122749f5234bc2b6fb05fb942ed566 @@ -8063,10 +8688,10 @@ __metadata: languageName: node linkType: hard -"ipaddr.js@npm:^2.0.1": - version: 2.0.1 - resolution: "ipaddr.js@npm:2.0.1" - checksum: 10/b809f60af0473f1452480b05a2cec8270284290d18d2778df522d08e0b6d0db21b84f5bf4949190f3c728794d3eef36bfaeff14a1e1acf6045553f4532b119de +"ipaddr.js@npm:^2.1.0": + version: 2.3.0 + resolution: "ipaddr.js@npm:2.3.0" + checksum: 10/be3d01bc2e20fc2dc5349b489ea40883954b816ce3e57aa48ad943d4e7c4ace501f28a7a15bde4b96b6b97d0fbb28d599ff2f87399f3cda7bd728889402eed3b languageName: node linkType: hard @@ -8087,16 +8712,6 @@ __metadata: languageName: node linkType: hard -"is-arguments@npm:^1.0.4": - version: 1.2.0 - resolution: "is-arguments@npm:1.2.0" - dependencies: - call-bound: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.2" - checksum: 10/471a8ef631b8ee8829c43a8ab05c081700c0e25180c73d19f3bf819c1a8448c426a9e8e601f278973eca68966384b16ceb78b8c63af795b099cd199ea5afc457 - languageName: node - linkType: hard - "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" @@ -8113,20 +8728,6 @@ __metadata: languageName: node linkType: hard -"is-buffer@npm:^2.0.0": - version: 2.0.5 - resolution: "is-buffer@npm:2.0.5" - checksum: 10/3261a8b858edcc6c9566ba1694bf829e126faa88911d1c0a747ea658c5d81b14b6955e3a702d59dabadd58fdd440c01f321aa71d6547105fd21d03f94d0597e7 - languageName: node - linkType: hard - -"is-callable@npm:^1.2.7": - version: 1.2.7 - resolution: "is-callable@npm:1.2.7" - checksum: 10/48a9297fb92c99e9df48706241a189da362bff3003354aea4048bd5f7b2eb0d823cd16d0a383cece3d76166ba16d85d9659165ac6fcce1ac12e6c649d66dbdb9 - languageName: node - linkType: hard - "is-ci@npm:^3.0.1": version: 3.0.1 resolution: "is-ci@npm:3.0.1" @@ -8138,12 +8739,12 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.9.0": - version: 2.11.0 - resolution: "is-core-module@npm:2.11.0" +"is-core-module@npm:^2.16.1": + version: 2.16.1 + resolution: "is-core-module@npm:2.16.1" dependencies: - has: "npm:^1.0.3" - checksum: 10/9b09ce78f1f281e20c596023e8464d51dfc93b5933bf23f00c002eafbebdaa766726be42bacfb4459c4cfe14569f0987db11fe6bc30d6e57985c9071a289966e + hasown: "npm:^2.0.2" + checksum: 10/452b2c2fb7f889cbbf7e54609ef92cf6c24637c568acc7e63d166812a0fb365ae8a504c333a29add8bdb1686704068caa7f4e4b639b650dde4f00a038b8941fb languageName: node linkType: hard @@ -8163,6 +8764,15 @@ __metadata: languageName: node linkType: hard +"is-docker@npm:^3.0.0": + version: 3.0.0 + resolution: "is-docker@npm:3.0.0" + bin: + is-docker: cli.js + checksum: 10/b698118f04feb7eaf3338922bd79cba064ea54a1c3db6ec8c0c8d8ee7613e7e5854d802d3ef646812a8a3ace81182a085dfa0a71cc68b06f3fa794b9783b3c90 + languageName: node + linkType: hard + "is-extendable@npm:^0.1.0": version: 0.1.1 resolution: "is-extendable@npm:0.1.1" @@ -8184,18 +8794,6 @@ __metadata: languageName: node linkType: hard -"is-generator-function@npm:^1.0.7": - version: 1.1.0 - resolution: "is-generator-function@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.3" - get-proto: "npm:^1.0.0" - has-tostringtag: "npm:^1.0.2" - safe-regex-test: "npm:^1.1.0" - checksum: 10/5906ff51a856a5fbc6b90a90fce32040b0a6870da905f98818f1350f9acadfc9884f7c3dec833fce04b83dd883937b86a190b6593ede82e8b1af8b6c4ecf7cbd - languageName: node - linkType: hard - "is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" @@ -8212,6 +8810,17 @@ __metadata: languageName: node linkType: hard +"is-inside-container@npm:^1.0.0": + version: 1.0.0 + resolution: "is-inside-container@npm:1.0.0" + dependencies: + is-docker: "npm:^3.0.0" + bin: + is-inside-container: cli.js + checksum: 10/c50b75a2ab66ab3e8b92b3bc534e1ea72ca25766832c0623ac22d134116a98bcf012197d1caabe1d1c4bd5f84363d4aa5c36bb4b585fbcaf57be172cd10a1a03 + languageName: node + linkType: hard + "is-installed-globally@npm:^0.4.0": version: 0.4.0 resolution: "is-installed-globally@npm:0.4.0" @@ -8229,13 +8838,10 @@ __metadata: languageName: node linkType: hard -"is-nan@npm:^1.3.2": - version: 1.3.2 - resolution: "is-nan@npm:1.3.2" - dependencies: - call-bind: "npm:^1.0.0" - define-properties: "npm:^1.1.3" - checksum: 10/1f784d3472c09bc2e47acba7ffd4f6c93b0394479aa613311dc1d70f1bfa72eb0846c81350967722c959ba65811bae222204d6c65856fdce68f31986140c7b0e +"is-network-error@npm:^1.0.0": + version: 1.3.0 + resolution: "is-network-error@npm:1.3.0" + checksum: 10/56dc0b8ed9c0bb72202058f172ad0c3121cf68772e8cbba343d3775f6e2ec7877d423cbcea45f4cedcd345de8693de1b52dfe0c6fc15d652c4aa98c2abf0185a languageName: node linkType: hard @@ -8267,13 +8873,6 @@ __metadata: languageName: node linkType: hard -"is-path-cwd@npm:^2.2.0": - version: 2.2.0 - resolution: "is-path-cwd@npm:2.2.0" - checksum: 10/46a840921bb8cc0dc7b5b423a14220e7db338072a4495743a8230533ce78812dc152548c86f4b828411fe98c5451959f07cf841c6a19f611e46600bd699e8048 - languageName: node - linkType: hard - "is-path-inside@npm:^3.0.2": version: 3.0.3 resolution: "is-path-inside@npm:3.0.3" @@ -8304,13 +8903,6 @@ __metadata: languageName: node linkType: hard -"is-plain-object@npm:^5.0.0": - version: 5.0.0 - resolution: "is-plain-object@npm:5.0.0" - checksum: 10/e32d27061eef62c0847d303125440a38660517e586f2f3db7c9d179ae5b6674ab0f469d519b2e25c147a1a3bc87156d0d5f4d8821e0ce4a9ee7fe1fcf11ce45c - languageName: node - linkType: hard - "is-reference@npm:^3.0.0": version: 3.0.1 resolution: "is-reference@npm:3.0.1" @@ -8320,18 +8912,6 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.2.1": - version: 1.2.1 - resolution: "is-regex@npm:1.2.1" - dependencies: - call-bound: "npm:^1.0.2" - gopd: "npm:^1.2.0" - has-tostringtag: "npm:^1.0.2" - hasown: "npm:^2.0.2" - checksum: 10/c42b7efc5868a5c9a4d8e6d3e9816e8815c611b09535c00fead18a1138455c5cb5e1887f0023a467ad3f9c419d62ba4dc3d9ba8bafe55053914d6d6454a945d2 - languageName: node - linkType: hard - "is-regexp@npm:^1.0.0": version: 1.0.0 resolution: "is-regexp@npm:1.0.0" @@ -8339,13 +8919,6 @@ __metadata: languageName: node linkType: hard -"is-root@npm:^2.1.0": - version: 2.1.0 - resolution: "is-root@npm:2.1.0" - checksum: 10/37eea0822a2a9123feb58a9d101558ba276771a6d830f87005683349a9acff15958a9ca590a44e778c6b335660b83e85c744789080d734f6081a935a4880aee2 - languageName: node - linkType: hard - "is-stream@npm:^2.0.0": version: 2.0.1 resolution: "is-stream@npm:2.0.1" @@ -8353,15 +8926,6 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.3": - version: 1.1.15 - resolution: "is-typed-array@npm:1.1.15" - dependencies: - which-typed-array: "npm:^1.1.16" - checksum: 10/e8cf60b9ea85667097a6ad68c209c9722cfe8c8edf04d6218366469e51944c5cc25bae45ffb845c23f811d262e4314d3b0168748eb16711aa34d12724cdf0735 - languageName: node - linkType: hard - "is-typedarray@npm:^1.0.0": version: 1.0.0 resolution: "is-typedarray@npm:1.0.0" @@ -8378,6 +8942,15 @@ __metadata: languageName: node linkType: hard +"is-wsl@npm:^3.1.0": + version: 3.1.0 + resolution: "is-wsl@npm:3.1.0" + dependencies: + is-inside-container: "npm:^1.0.0" + checksum: 10/f9734c81f2f9cf9877c5db8356bfe1ff61680f1f4c1011e91278a9c0564b395ae796addb4bf33956871041476ec82c3e5260ed57b22ac91794d4ae70a1d2f0a9 + languageName: node + linkType: hard + "is-yarn-global@npm:^0.4.0": version: 0.4.1 resolution: "is-yarn-global@npm:0.4.1" @@ -8392,13 +8965,6 @@ __metadata: languageName: node linkType: hard -"isarray@npm:^2.0.5": - version: 2.0.5 - resolution: "isarray@npm:2.0.5" - checksum: 10/1d8bc7911e13bb9f105b1b3e0b396c787a9e63046af0b8fe0ab1414488ab06b2b099b87a2d8a9e31d21c9a6fad773c7fc8b257c4880f2d957274479d28ca3414 - languageName: node - linkType: hard - "isarray@npm:~1.0.0": version: 1.0.0 resolution: "isarray@npm:1.0.0" @@ -8477,7 +9043,7 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^1.18.2, jiti@npm:^1.20.0": +"jiti@npm:^1.20.0": version: 1.21.0 resolution: "jiti@npm:1.21.0" bin: @@ -8547,21 +9113,12 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" +"jsesc@npm:^3.0.2, jsesc@npm:~3.1.0": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" bin: jsesc: bin/jsesc - checksum: 10/d2096abdcdec56969764b40ffc91d4a23408aa2f351b4d1c13f736f25476643238c43fdbaf38a191c26b1b78fd856d965f5d4d0dde7b89459cd94025190cdf13 - languageName: node - linkType: hard - -"jsesc@npm:~0.5.0": - version: 0.5.0 - resolution: "jsesc@npm:0.5.0" - bin: - jsesc: bin/jsesc - checksum: 10/fab949f585c71e169c5cbe00f049f20de74f067081bbd64a55443bad1c71e1b5a5b448f2359bf2fe06f5ed7c07e2e4a9101843b01c823c30b6afc11f5bfaf724 + checksum: 10/20bd37a142eca5d1794f354db8f1c9aeb54d85e1f5c247b371de05d23a9751ecd7bd3a9c4fc5298ea6fa09a100dafb4190fa5c98c6610b75952c3487f3ce7967 languageName: node linkType: hard @@ -8674,13 +9231,6 @@ __metadata: languageName: node linkType: hard -"kleur@npm:^4.0.3": - version: 4.1.5 - resolution: "kleur@npm:4.1.5" - checksum: 10/44d84cc4eedd4311099402ef6d4acd9b2d16e08e499d6ef3bb92389bd4692d7ef09e35248c26e27f98acac532122acb12a1bfee645994ae3af4f0a37996da7df - languageName: node - linkType: hard - "klona@npm:^2.0.4": version: 2.0.6 resolution: "klona@npm:2.0.6" @@ -8697,13 +9247,13 @@ __metadata: languageName: node linkType: hard -"launch-editor@npm:^2.6.0": - version: 2.6.0 - resolution: "launch-editor@npm:2.6.0" +"launch-editor@npm:^2.6.1": + version: 2.12.0 + resolution: "launch-editor@npm:2.12.0" dependencies: - picocolors: "npm:^1.0.0" - shell-quote: "npm:^1.7.3" - checksum: 10/48e4230643e8fdb5c14c11314706d58d9f3fbafe2606be3d6e37da1918ad8bfe39dd87875c726a1b59b9f4da99d87ec3e36d4c528464f0b820f9e91e5cb1c02d + picocolors: "npm:^1.1.1" + shell-quote: "npm:^1.8.3" + checksum: 10/43d2b66c674d129f9a96bbae602808a0afa7e6bb6f38de5518479e33b1a542e9772b262304505c2aa363b0185424580b4011a9198082d306e2b419c6f12da5e2 languageName: node linkType: hard @@ -8714,6 +9264,126 @@ __metadata: languageName: node linkType: hard +"lightningcss-android-arm64@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-android-arm64@npm:1.31.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-arm64@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-darwin-arm64@npm:1.31.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-darwin-x64@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-darwin-x64@npm:1.31.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-freebsd-x64@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-freebsd-x64@npm:1.31.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"lightningcss-linux-arm-gnueabihf@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-linux-arm-gnueabihf@npm:1.31.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"lightningcss-linux-arm64-gnu@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-linux-arm64-gnu@npm:1.31.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-arm64-musl@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-linux-arm64-musl@npm:1.31.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-linux-x64-gnu@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-linux-x64-gnu@npm:1.31.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"lightningcss-linux-x64-musl@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-linux-x64-musl@npm:1.31.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"lightningcss-win32-arm64-msvc@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-win32-arm64-msvc@npm:1.31.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"lightningcss-win32-x64-msvc@npm:1.31.1": + version: 1.31.1 + resolution: "lightningcss-win32-x64-msvc@npm:1.31.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"lightningcss@npm:^1.27.0": + version: 1.31.1 + resolution: "lightningcss@npm:1.31.1" + dependencies: + detect-libc: "npm:^2.0.3" + lightningcss-android-arm64: "npm:1.31.1" + lightningcss-darwin-arm64: "npm:1.31.1" + lightningcss-darwin-x64: "npm:1.31.1" + lightningcss-freebsd-x64: "npm:1.31.1" + lightningcss-linux-arm-gnueabihf: "npm:1.31.1" + lightningcss-linux-arm64-gnu: "npm:1.31.1" + lightningcss-linux-arm64-musl: "npm:1.31.1" + lightningcss-linux-x64-gnu: "npm:1.31.1" + lightningcss-linux-x64-musl: "npm:1.31.1" + lightningcss-win32-arm64-msvc: "npm:1.31.1" + lightningcss-win32-x64-msvc: "npm:1.31.1" + dependenciesMeta: + lightningcss-android-arm64: + optional: true + lightningcss-darwin-arm64: + optional: true + lightningcss-darwin-x64: + optional: true + lightningcss-freebsd-x64: + optional: true + lightningcss-linux-arm-gnueabihf: + optional: true + lightningcss-linux-arm64-gnu: + optional: true + lightningcss-linux-arm64-musl: + optional: true + lightningcss-linux-x64-gnu: + optional: true + lightningcss-linux-x64-musl: + optional: true + lightningcss-win32-arm64-msvc: + optional: true + lightningcss-win32-x64-msvc: + optional: true + checksum: 10/3c2b2c2f648b12d9cba623d2e558f74fcce35911077e3d33f97ed521e0ad7a84e2c814628f6e16f64095c4483f6b180dee7b2e441b3ff5f44d142a510785a0c6 + languageName: node + linkType: hard + "lilconfig@npm:^3.1.1": version: 3.1.2 resolution: "lilconfig@npm:3.1.2" @@ -8735,10 +9405,10 @@ __metadata: languageName: node linkType: hard -"loader-runner@npm:^4.2.0": - version: 4.3.0 - resolution: "loader-runner@npm:4.3.0" - checksum: 10/555ae002869c1e8942a0efd29a99b50a0ce6c3296efea95caf48f00d7f6f7f659203ed6613688b6181aa81dc76de3e65ece43094c6dffef3127fe1a84d973cd3 +"loader-runner@npm:^4.3.1": + version: 4.3.1 + resolution: "loader-runner@npm:4.3.1" + checksum: 10/d77127497c3f91fdba351e3e91156034e6e590e9f050b40df6c38ac16c54b5c903f7e2e141e09fefd046ee96b26fb50773c695ebc0aa205a4918683b124b04ba languageName: node linkType: hard @@ -8753,32 +9423,6 @@ __metadata: languageName: node linkType: hard -"loader-utils@npm:^3.2.0": - version: 3.2.1 - resolution: "loader-utils@npm:3.2.1" - checksum: 10/177f5bb9b4c651263714fcd1b50682c1367b06893462529f510287775f9e461ca27a41bf364c8dffa9cd74ed9e8b1fdb30c03a526f6bcf12573bdc1a1644d086 - languageName: node - linkType: hard - -"locate-path@npm:^3.0.0": - version: 3.0.0 - resolution: "locate-path@npm:3.0.0" - dependencies: - p-locate: "npm:^3.0.0" - path-exists: "npm:^3.0.0" - checksum: 10/53db3996672f21f8b0bf2a2c645ae2c13ffdae1eeecfcd399a583bce8516c0b88dcb4222ca6efbbbeb6949df7e46860895be2c02e8d3219abd373ace3bfb4e11 - languageName: node - linkType: hard - -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: "npm:^5.0.0" - checksum: 10/72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a - languageName: node - linkType: hard - "locate-path@npm:^7.1.0": version: 7.2.0 resolution: "locate-path@npm:7.2.0" @@ -8795,27 +9439,6 @@ __metadata: languageName: node linkType: hard -"lodash.escape@npm:^4.0.1": - version: 4.0.1 - resolution: "lodash.escape@npm:4.0.1" - checksum: 10/ba1effab9aea7e20ee69b26cbfeb41c73da2eb4d2ab1c261aaf53dd0902ce1afc2f0b34fb24bc69c1d2dd201c332e1d1eb696092fc844a2c5c8e7ccd1ca32014 - languageName: node - linkType: hard - -"lodash.flatten@npm:^4.4.0": - version: 4.4.0 - resolution: "lodash.flatten@npm:4.4.0" - checksum: 10/a2b192f220b0b6c78a6c0175e96bad888b9e0f2a887a8e8c1d0c29d03231fbf110bbb9be0d9de5f936537d143eeb9d5b4f44c4a44f5592c195bf2fae6a6b1e3a - languageName: node - linkType: hard - -"lodash.invokemap@npm:^4.6.0": - version: 4.6.0 - resolution: "lodash.invokemap@npm:4.6.0" - checksum: 10/70e629f78dc0e7aabfabf0ef575cc0b3d3b207699a5c91788bf5363d8f53764b80afd5c1985a98043ecc23095a145b271101626ed62dbb785ffcb22237b731c9 - languageName: node - linkType: hard - "lodash.memoize@npm:^4.1.2": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" @@ -8823,13 +9446,6 @@ __metadata: languageName: node linkType: hard -"lodash.pullall@npm:^4.2.0": - version: 4.2.0 - resolution: "lodash.pullall@npm:4.2.0" - checksum: 10/ec2aa1a1eea37226ef7b69041779221ef6fdc6472589dd4d89cec2a0f3d067301a0274abc6a0522797f9958497c79d8bc754825f23ea21e0e053ef8bdfe742ad - languageName: node - linkType: hard - "lodash.uniq@npm:^4.5.0": version: 4.5.0 resolution: "lodash.uniq@npm:4.5.0" @@ -8837,13 +9453,6 @@ __metadata: languageName: node linkType: hard -"lodash.uniqby@npm:^4.7.0": - version: 4.7.0 - resolution: "lodash.uniqby@npm:4.7.0" - checksum: 10/256616bd1bd6be84d8a5eceb61338a0ab8d8b34314ba7bfd5f0de35227d0e2c1e659c61ff4ac31eba6a664085cc7e397bc34c3534fba208102db660a4f98f211 - languageName: node - linkType: hard - "lodash@npm:4.17.21, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4": version: 4.17.21 resolution: "lodash@npm:4.17.21" @@ -8946,6 +9555,15 @@ __metadata: languageName: node linkType: hard +"markdown-table@npm:^2.0.0": + version: 2.0.0 + resolution: "markdown-table@npm:2.0.0" + dependencies: + repeat-string: "npm:^1.0.0" + checksum: 10/8018cd1a1733ffda916a0548438e50f3d21b6c6b71fb23696b33c0b5922a8cc46035eb4b204a59c6054f063076f934461ae094599656a63f87c1c3a80bd3c229 + languageName: node + linkType: hard + "markdown-table@npm:^3.0.0": version: 3.0.3 resolution: "markdown-table@npm:3.0.3" @@ -8960,28 +9578,6 @@ __metadata: languageName: node linkType: hard -"md5.js@npm:^1.3.4": - version: 1.3.5 - resolution: "md5.js@npm:1.3.5" - dependencies: - hash-base: "npm:^3.0.0" - inherits: "npm:^2.0.1" - safe-buffer: "npm:^5.1.2" - checksum: 10/098494d885684bcc4f92294b18ba61b7bd353c23147fbc4688c75b45cb8590f5a95fd4584d742415dcc52487f7a1ef6ea611cfa1543b0dc4492fe026357f3f0c - languageName: node - linkType: hard - -"mdast-util-definitions@npm:^5.0.0": - version: 5.1.2 - resolution: "mdast-util-definitions@npm:5.1.2" - dependencies: - "@types/mdast": "npm:^3.0.0" - "@types/unist": "npm:^2.0.0" - unist-util-visit: "npm:^4.0.0" - checksum: 10/4491b7c551ce1bdeb6c8fb1968cd461acb01ca1584f12c240755541a92d7f02bc5b9c9d6303d50deaed6d959ba58fe9a352a3e676e0f1d954e003de1277f57e4 - languageName: node - linkType: hard - "mdast-util-directive@npm:^3.0.0": version: 3.0.0 resolution: "mdast-util-directive@npm:3.0.0" @@ -8998,18 +9594,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-find-and-replace@npm:^2.0.0": - version: 2.2.2 - resolution: "mdast-util-find-and-replace@npm:2.2.2" - dependencies: - "@types/mdast": "npm:^3.0.0" - escape-string-regexp: "npm:^5.0.0" - unist-util-is: "npm:^5.0.0" - unist-util-visit-parents: "npm:^5.0.0" - checksum: 10/59e11e853b74d8f6083950327df39e27287b383930ff836298a5100aeda5568282bb45046c27886d2156ea101580bb0689b890c29623cefa5adc74e95d9ca9ff - languageName: node - linkType: hard - "mdast-util-find-and-replace@npm:^3.0.0, mdast-util-find-and-replace@npm:^3.0.1": version: 3.0.1 resolution: "mdast-util-find-and-replace@npm:3.0.1" @@ -9022,26 +9606,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-from-markdown@npm:^1.0.0": - version: 1.3.1 - resolution: "mdast-util-from-markdown@npm:1.3.1" - dependencies: - "@types/mdast": "npm:^3.0.0" - "@types/unist": "npm:^2.0.0" - decode-named-character-reference: "npm:^1.0.0" - mdast-util-to-string: "npm:^3.1.0" - micromark: "npm:^3.0.0" - micromark-util-decode-numeric-character-reference: "npm:^1.0.0" - micromark-util-decode-string: "npm:^1.0.0" - micromark-util-normalize-identifier: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - unist-util-stringify-position: "npm:^3.0.0" - uvu: "npm:^0.5.0" - checksum: 10/1d334a54ddd6481ec4acf64c2c537b6463bc5113ba5a408f65c228dcc302d46837352814f11307af0f8b51dd7e4a0b887ce692e4d30ff31ff9d578b8ca82810b - languageName: node - linkType: hard - "mdast-util-from-markdown@npm:^2.0.0": version: 2.0.0 resolution: "mdast-util-from-markdown@npm:2.0.0" @@ -9076,18 +9640,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-gfm-autolink-literal@npm:^1.0.0": - version: 1.0.3 - resolution: "mdast-util-gfm-autolink-literal@npm:1.0.3" - dependencies: - "@types/mdast": "npm:^3.0.0" - ccount: "npm:^2.0.0" - mdast-util-find-and-replace: "npm:^2.0.0" - micromark-util-character: "npm:^1.0.0" - checksum: 10/272d075cdc7937bec0179af4052bd9032a6fbb05608b387b1b075b0491c73ce012f3ff1c718cdb5fb0ed1032c1fa7570d955b59c0ab3c3c72609928754774529 - languageName: node - linkType: hard - "mdast-util-gfm-autolink-literal@npm:^2.0.0": version: 2.0.0 resolution: "mdast-util-gfm-autolink-literal@npm:2.0.0" @@ -9101,17 +9653,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-gfm-footnote@npm:^1.0.0": - version: 1.0.2 - resolution: "mdast-util-gfm-footnote@npm:1.0.2" - dependencies: - "@types/mdast": "npm:^3.0.0" - mdast-util-to-markdown: "npm:^1.3.0" - micromark-util-normalize-identifier: "npm:^1.0.0" - checksum: 10/825f207afc98fd1daa0acc8adcb5754d1f0d577ccb1749245289bee7c892557668d8ee3a5ab618f42e710646cf018dcda84f3c0c608ae11718e9014e5bf4f9dc - languageName: node - linkType: hard - "mdast-util-gfm-footnote@npm:^2.0.0": version: 2.0.0 resolution: "mdast-util-gfm-footnote@npm:2.0.0" @@ -9125,16 +9666,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-gfm-strikethrough@npm:^1.0.0": - version: 1.0.3 - resolution: "mdast-util-gfm-strikethrough@npm:1.0.3" - dependencies: - "@types/mdast": "npm:^3.0.0" - mdast-util-to-markdown: "npm:^1.3.0" - checksum: 10/a9c2dc3ef46be7952d13b7063a16171bba8aa266bffe6b1e7267df02a60b4fa3734115cca311e9127db8cfcbbcd68fdd92aa26152bcd0c14372c79b254e4df2f - languageName: node - linkType: hard - "mdast-util-gfm-strikethrough@npm:^2.0.0": version: 2.0.0 resolution: "mdast-util-gfm-strikethrough@npm:2.0.0" @@ -9146,18 +9677,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-gfm-table@npm:^1.0.0": - version: 1.0.7 - resolution: "mdast-util-gfm-table@npm:1.0.7" - dependencies: - "@types/mdast": "npm:^3.0.0" - markdown-table: "npm:^3.0.0" - mdast-util-from-markdown: "npm:^1.0.0" - mdast-util-to-markdown: "npm:^1.3.0" - checksum: 10/167f7f7a9dc17ce852f4f9bd155d7be179588e2ccf4ce3c4f23b12c1c9db5de904cdacc6f41b2d635cb84eb09a7ff5a33497585f2664a7f1e6bd6f7ab7e1197a - languageName: node - linkType: hard - "mdast-util-gfm-table@npm:^2.0.0": version: 2.0.0 resolution: "mdast-util-gfm-table@npm:2.0.0" @@ -9171,16 +9690,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-gfm-task-list-item@npm:^1.0.0": - version: 1.0.2 - resolution: "mdast-util-gfm-task-list-item@npm:1.0.2" - dependencies: - "@types/mdast": "npm:^3.0.0" - mdast-util-to-markdown: "npm:^1.3.0" - checksum: 10/958417a7d7690728b44d65127ab9189c7feaa17aea924dd56a888c781ab3abaa4eb0c209f05c4dbf203da3d0c4df8fdace4c9471b644268bfc7fc792a018a171 - languageName: node - linkType: hard - "mdast-util-gfm-task-list-item@npm:^2.0.0": version: 2.0.0 resolution: "mdast-util-gfm-task-list-item@npm:2.0.0" @@ -9193,21 +9702,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-gfm@npm:^2.0.0": - version: 2.0.2 - resolution: "mdast-util-gfm@npm:2.0.2" - dependencies: - mdast-util-from-markdown: "npm:^1.0.0" - mdast-util-gfm-autolink-literal: "npm:^1.0.0" - mdast-util-gfm-footnote: "npm:^1.0.0" - mdast-util-gfm-strikethrough: "npm:^1.0.0" - mdast-util-gfm-table: "npm:^1.0.0" - mdast-util-gfm-task-list-item: "npm:^1.0.0" - mdast-util-to-markdown: "npm:^1.0.0" - checksum: 10/70e6cd32af94181d409f171f984f83fc18b3efe316844c62f31816f5c1612a92517b8ed766340f23e0a6d6cb0f27a8b07d288bab6619cbdbb0c5341006bcdc4d - languageName: node - linkType: hard - "mdast-util-gfm@npm:^3.0.0": version: 3.0.0 resolution: "mdast-util-gfm@npm:3.0.0" @@ -9285,16 +9779,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-phrasing@npm:^3.0.0": - version: 3.0.1 - resolution: "mdast-util-phrasing@npm:3.0.1" - dependencies: - "@types/mdast": "npm:^3.0.0" - unist-util-is: "npm:^5.0.0" - checksum: 10/c5b616d9b1eb76a6b351d195d94318494722525a12a89d9c8a3b091af7db3dd1fc55d294f9d29266d8159a8267b0df4a7a133bda8a3909d5331c383e1e1ff328 - languageName: node - linkType: hard - "mdast-util-phrasing@npm:^4.0.0": version: 4.0.0 resolution: "mdast-util-phrasing@npm:4.0.0" @@ -9305,22 +9789,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-to-hast@npm:^12.1.0": - version: 12.3.0 - resolution: "mdast-util-to-hast@npm:12.3.0" - dependencies: - "@types/hast": "npm:^2.0.0" - "@types/mdast": "npm:^3.0.0" - mdast-util-definitions: "npm:^5.0.0" - micromark-util-sanitize-uri: "npm:^1.1.0" - trim-lines: "npm:^3.0.0" - unist-util-generated: "npm:^2.0.0" - unist-util-position: "npm:^4.0.0" - unist-util-visit: "npm:^4.0.0" - checksum: 10/82b72bf46863f0f5683dbf1c5917186ee2da2e06af1a5f5aaeca51b880f4cb2b3ae0463ebb4fa1a776f5d3c73f5fc6cd542920060cf5040f3d4431607ee73cce - languageName: node - linkType: hard - "mdast-util-to-hast@npm:^13.0.0": version: 13.1.0 resolution: "mdast-util-to-hast@npm:13.1.0" @@ -9338,22 +9806,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-to-markdown@npm:^1.0.0, mdast-util-to-markdown@npm:^1.3.0": - version: 1.5.0 - resolution: "mdast-util-to-markdown@npm:1.5.0" - dependencies: - "@types/mdast": "npm:^3.0.0" - "@types/unist": "npm:^2.0.0" - longest-streak: "npm:^3.0.0" - mdast-util-phrasing: "npm:^3.0.0" - mdast-util-to-string: "npm:^3.0.0" - micromark-util-decode-string: "npm:^1.0.0" - unist-util-visit: "npm:^4.0.0" - zwitch: "npm:^2.0.0" - checksum: 10/713f674588a01969a2ce524a69985bd57e507377eea2c4ba69800fb305414468b30144ae9b837fbdde8c609877673140e4f56f6cabe9e0e2bc1487291e3c5144 - languageName: node - linkType: hard - "mdast-util-to-markdown@npm:^2.0.0": version: 2.1.0 resolution: "mdast-util-to-markdown@npm:2.1.0" @@ -9370,15 +9822,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-to-string@npm:^3.0.0, mdast-util-to-string@npm:^3.1.0": - version: 3.2.0 - resolution: "mdast-util-to-string@npm:3.2.0" - dependencies: - "@types/mdast": "npm:^3.0.0" - checksum: 10/fafe201c12a0d412a875fe8540bf70b4360f3775fb7f0d19403ba7b59e50f74f730e3b405c72ad940bc8a3ec1ba311f76dfca61c4ce585dce1ccda2168ec244f - languageName: node - linkType: hard - "mdast-util-to-string@npm:^4.0.0": version: 4.0.0 resolution: "mdast-util-to-string@npm:4.0.0" @@ -9409,12 +9852,27 @@ __metadata: languageName: node linkType: hard -"memfs@npm:^3.1.2, memfs@npm:^3.4.3": - version: 3.4.12 - resolution: "memfs@npm:3.4.12" +"memfs@npm:^4.43.1": + version: 4.56.10 + resolution: "memfs@npm:4.56.10" dependencies: - fs-monkey: "npm:^1.0.3" - checksum: 10/3c03b1c10915c902da6a4c68de63d936c56a69069eec739fe1c952b14b168217adff1b34e438dd8268123ab2af7f6dafa75e89718144b9a5e2d1f6497b934e40 + "@jsonjoy.com/fs-core": "npm:4.56.10" + "@jsonjoy.com/fs-fsa": "npm:4.56.10" + "@jsonjoy.com/fs-node": "npm:4.56.10" + "@jsonjoy.com/fs-node-builtins": "npm:4.56.10" + "@jsonjoy.com/fs-node-to-fsa": "npm:4.56.10" + "@jsonjoy.com/fs-node-utils": "npm:4.56.10" + "@jsonjoy.com/fs-print": "npm:4.56.10" + "@jsonjoy.com/fs-snapshot": "npm:4.56.10" + "@jsonjoy.com/json-pack": "npm:^1.11.0" + "@jsonjoy.com/util": "npm:^1.9.0" + glob-to-regex.js: "npm:^1.0.1" + thingies: "npm:^2.5.0" + tree-dump: "npm:^1.0.3" + tslib: "npm:^2.0.0" + peerDependencies: + tslib: 2 + checksum: 10/9358ab01174207aa3de7c47d7810dd32d0b6c0cdcbef455f3a51628c454e29feb4f1bfc15f25bfc59354ba6645fb3a10fcbb0dd1fbfc42e0595fae33fbc73bd1 languageName: node linkType: hard @@ -9446,30 +9904,6 @@ __metadata: languageName: node linkType: hard -"micromark-core-commonmark@npm:^1.0.0, micromark-core-commonmark@npm:^1.0.1": - version: 1.1.0 - resolution: "micromark-core-commonmark@npm:1.1.0" - dependencies: - decode-named-character-reference: "npm:^1.0.0" - micromark-factory-destination: "npm:^1.0.0" - micromark-factory-label: "npm:^1.0.0" - micromark-factory-space: "npm:^1.0.0" - micromark-factory-title: "npm:^1.0.0" - micromark-factory-whitespace: "npm:^1.0.0" - micromark-util-character: "npm:^1.0.0" - micromark-util-chunked: "npm:^1.0.0" - micromark-util-classify-character: "npm:^1.0.0" - micromark-util-html-tag-name: "npm:^1.0.0" - micromark-util-normalize-identifier: "npm:^1.0.0" - micromark-util-resolve-all: "npm:^1.0.0" - micromark-util-subtokenize: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.1" - uvu: "npm:^0.5.0" - checksum: 10/a73694d223ac8baad8ff00597a3c39d61f5b32bfd56fe4bcf295d75b2a4e8e67fb2edbfc7cc287b362b9d7f6d24fce08b6a7e8b5b155d79bcc1e4d9b2756ffb2 - languageName: node - linkType: hard - "micromark-core-commonmark@npm:^2.0.0": version: 2.0.0 resolution: "micromark-core-commonmark@npm:2.0.0" @@ -9521,18 +9955,6 @@ __metadata: languageName: node linkType: hard -"micromark-extension-gfm-autolink-literal@npm:^1.0.0": - version: 1.0.5 - resolution: "micromark-extension-gfm-autolink-literal@npm:1.0.5" - dependencies: - micromark-util-character: "npm:^1.0.0" - micromark-util-sanitize-uri: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - checksum: 10/1e0ccc758baef3cd0478ba84ff86fa1ec2b389042421c7cade9485b775456c1a9c3bd797393002b2c6f6abd9bdf829cb114874557bbcb8e43d16d06a464811c0 - languageName: node - linkType: hard - "micromark-extension-gfm-autolink-literal@npm:^2.0.0": version: 2.0.0 resolution: "micromark-extension-gfm-autolink-literal@npm:2.0.0" @@ -9545,22 +9967,6 @@ __metadata: languageName: node linkType: hard -"micromark-extension-gfm-footnote@npm:^1.0.0": - version: 1.1.2 - resolution: "micromark-extension-gfm-footnote@npm:1.1.2" - dependencies: - micromark-core-commonmark: "npm:^1.0.0" - micromark-factory-space: "npm:^1.0.0" - micromark-util-character: "npm:^1.0.0" - micromark-util-normalize-identifier: "npm:^1.0.0" - micromark-util-sanitize-uri: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - uvu: "npm:^0.5.0" - checksum: 10/8777073fb76d2fd01f6b2405106af6c349c1e25660c4d37cadcc61c187d71c8444870f73cefaaa67f12884d5e45c78ee3c5583561a0b330bd91c6d997113584a - languageName: node - linkType: hard - "micromark-extension-gfm-footnote@npm:^2.0.0": version: 2.0.0 resolution: "micromark-extension-gfm-footnote@npm:2.0.0" @@ -9577,20 +9983,6 @@ __metadata: languageName: node linkType: hard -"micromark-extension-gfm-strikethrough@npm:^1.0.0": - version: 1.0.7 - resolution: "micromark-extension-gfm-strikethrough@npm:1.0.7" - dependencies: - micromark-util-chunked: "npm:^1.0.0" - micromark-util-classify-character: "npm:^1.0.0" - micromark-util-resolve-all: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - uvu: "npm:^0.5.0" - checksum: 10/8411ef1aa5dc83f662e8b45b085f70ddff29deb3c4259269e8a1ff656397abb755d8ea841a14be23e8585a31d3c0a5de1bd2c05f3453b66670e499d4a0004f5e - languageName: node - linkType: hard - "micromark-extension-gfm-strikethrough@npm:^2.0.0": version: 2.0.0 resolution: "micromark-extension-gfm-strikethrough@npm:2.0.0" @@ -9605,19 +9997,6 @@ __metadata: languageName: node linkType: hard -"micromark-extension-gfm-table@npm:^1.0.0": - version: 1.0.7 - resolution: "micromark-extension-gfm-table@npm:1.0.7" - dependencies: - micromark-factory-space: "npm:^1.0.0" - micromark-util-character: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - uvu: "npm:^0.5.0" - checksum: 10/f05d86a099c941a2a309d60bf4839d16a00a93cb880cda4ab8faeb831647763fff6e03197ec15b80e1f195002afcca6afe2b95c3622b049b82d7ff8ef1c1c776 - languageName: node - linkType: hard - "micromark-extension-gfm-table@npm:^2.0.0": version: 2.0.0 resolution: "micromark-extension-gfm-table@npm:2.0.0" @@ -9631,15 +10010,6 @@ __metadata: languageName: node linkType: hard -"micromark-extension-gfm-tagfilter@npm:^1.0.0": - version: 1.0.2 - resolution: "micromark-extension-gfm-tagfilter@npm:1.0.2" - dependencies: - micromark-util-types: "npm:^1.0.0" - checksum: 10/55c7d9019d6a39efaaed2c2e40b0aaa137d2c4f9c94cac82e93f509a806c3a775e4c815b5d8e986617450b68861a19776e4b886307e83db452b393f15a837b39 - languageName: node - linkType: hard - "micromark-extension-gfm-tagfilter@npm:^2.0.0": version: 2.0.0 resolution: "micromark-extension-gfm-tagfilter@npm:2.0.0" @@ -9649,19 +10019,6 @@ __metadata: languageName: node linkType: hard -"micromark-extension-gfm-task-list-item@npm:^1.0.0": - version: 1.0.5 - resolution: "micromark-extension-gfm-task-list-item@npm:1.0.5" - dependencies: - micromark-factory-space: "npm:^1.0.0" - micromark-util-character: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - uvu: "npm:^0.5.0" - checksum: 10/46bb1baa10bfb785a2e3e2f975e5509260b9995d5c3aeddf77051957d218ce1af4ea737bcb6a56a930e62d42b05307b20632a400eff25cdb290789ff3170cad5 - languageName: node - linkType: hard - "micromark-extension-gfm-task-list-item@npm:^2.0.0": version: 2.0.1 resolution: "micromark-extension-gfm-task-list-item@npm:2.0.1" @@ -9675,22 +10032,6 @@ __metadata: languageName: node linkType: hard -"micromark-extension-gfm@npm:^2.0.0": - version: 2.0.3 - resolution: "micromark-extension-gfm@npm:2.0.3" - dependencies: - micromark-extension-gfm-autolink-literal: "npm:^1.0.0" - micromark-extension-gfm-footnote: "npm:^1.0.0" - micromark-extension-gfm-strikethrough: "npm:^1.0.0" - micromark-extension-gfm-table: "npm:^1.0.0" - micromark-extension-gfm-tagfilter: "npm:^1.0.0" - micromark-extension-gfm-task-list-item: "npm:^1.0.0" - micromark-util-combine-extensions: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - checksum: 10/3ffd06ced4314abd0f0c72ec227f034f38dd47facbb62439ef3216d42f32433f3901d14675cf806e8d73689802a11849958b330bb5b55dd4fd5cdc64ebaf345c - languageName: node - linkType: hard - "micromark-extension-gfm@npm:^3.0.0": version: 3.0.0 resolution: "micromark-extension-gfm@npm:3.0.0" @@ -9783,17 +10124,6 @@ __metadata: languageName: node linkType: hard -"micromark-factory-destination@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-factory-destination@npm:1.1.0" - dependencies: - micromark-util-character: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - checksum: 10/9e2b5fb5fedbf622b687e20d51eb3d56ae90c0e7ecc19b37bd5285ec392c1e56f6e21aa7cfcb3c01eda88df88fe528f3acb91a5f57d7f4cba310bc3cd7f824fa - languageName: node - linkType: hard - "micromark-factory-destination@npm:^2.0.0": version: 2.0.0 resolution: "micromark-factory-destination@npm:2.0.0" @@ -9805,18 +10135,6 @@ __metadata: languageName: node linkType: hard -"micromark-factory-label@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-factory-label@npm:1.1.0" - dependencies: - micromark-util-character: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - uvu: "npm:^0.5.0" - checksum: 10/fcda48f1287d9b148c562c627418a2ab759cdeae9c8e017910a0cba94bb759a96611e1fc6df33182e97d28fbf191475237298983bb89ef07d5b02464b1ad28d5 - languageName: node - linkType: hard - "micromark-factory-label@npm:^2.0.0": version: 2.0.0 resolution: "micromark-factory-label@npm:2.0.0" @@ -9865,18 +10183,6 @@ __metadata: languageName: node linkType: hard -"micromark-factory-title@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-factory-title@npm:1.1.0" - dependencies: - micromark-factory-space: "npm:^1.0.0" - micromark-util-character: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - checksum: 10/4432d3dbc828c81f483c5901b0c6591a85d65a9e33f7d96ba7c3ae821617a0b3237ff5faf53a9152d00aaf9afb3a9f185b205590f40ed754f1d9232e0e9157b1 - languageName: node - linkType: hard - "micromark-factory-title@npm:^2.0.0": version: 2.0.0 resolution: "micromark-factory-title@npm:2.0.0" @@ -9889,18 +10195,6 @@ __metadata: languageName: node linkType: hard -"micromark-factory-whitespace@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-factory-whitespace@npm:1.1.0" - dependencies: - micromark-factory-space: "npm:^1.0.0" - micromark-util-character: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - checksum: 10/ef0fa682c7d593d85a514ee329809dee27d10bc2a2b65217d8ef81173e33b8e83c549049764b1ad851adfe0a204dec5450d9d20a4ca8598f6c94533a73f73fcd - languageName: node - linkType: hard - "micromark-factory-whitespace@npm:^2.0.0": version: 2.0.0 resolution: "micromark-factory-whitespace@npm:2.0.0" @@ -9933,15 +10227,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-chunked@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-chunked@npm:1.1.0" - dependencies: - micromark-util-symbol: "npm:^1.0.0" - checksum: 10/c435bde9110cb595e3c61b7f54c2dc28ee03e6a57fa0fc1e67e498ad8bac61ee5a7457a2b6a73022ddc585676ede4b912d28dcf57eb3bd6951e54015e14dc20b - languageName: node - linkType: hard - "micromark-util-chunked@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-chunked@npm:2.0.0" @@ -9951,17 +10236,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-classify-character@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-classify-character@npm:1.1.0" - dependencies: - micromark-util-character: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - checksum: 10/8499cb0bb1f7fb946f5896285fcca65cd742f66cd3e79ba7744792bd413ec46834f932a286de650349914d02e822946df3b55d03e6a8e1d245d1ddbd5102e5b0 - languageName: node - linkType: hard - "micromark-util-classify-character@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-classify-character@npm:2.0.0" @@ -9973,16 +10247,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-combine-extensions@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-combine-extensions@npm:1.1.0" - dependencies: - micromark-util-chunked: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - checksum: 10/ee78464f5d4b61ccb437850cd2d7da4d690b260bca4ca7a79c4bb70291b84f83988159e373b167181b6716cb197e309bc6e6c96a68cc3ba9d50c13652774aba9 - languageName: node - linkType: hard - "micromark-util-combine-extensions@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-combine-extensions@npm:2.0.0" @@ -9993,15 +10257,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-decode-numeric-character-reference@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-decode-numeric-character-reference@npm:1.1.0" - dependencies: - micromark-util-symbol: "npm:^1.0.0" - checksum: 10/4733fe75146e37611243f055fc6847137b66f0cde74d080e33bd26d0408c1d6f44cabc984063eee5968b133cb46855e729d555b9ff8d744652262b7b51feec73 - languageName: node - linkType: hard - "micromark-util-decode-numeric-character-reference@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.0" @@ -10011,18 +10266,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-decode-string@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-decode-string@npm:1.1.0" - dependencies: - decode-named-character-reference: "npm:^1.0.0" - micromark-util-character: "npm:^1.0.0" - micromark-util-decode-numeric-character-reference: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - checksum: 10/f1625155db452f15aa472918499689ba086b9c49d1322a08b22bfbcabe918c61b230a3002c8bc3ea9b1f52ca7a9bb1c3dd43ccb548c7f5f8b16c24a1ae77a813 - languageName: node - linkType: hard - "micromark-util-decode-string@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-decode-string@npm:2.0.0" @@ -10035,13 +10278,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-encode@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-encode@npm:1.1.0" - checksum: 10/4ef29d02b12336918cea6782fa87c8c578c67463925221d4e42183a706bde07f4b8b5f9a5e1c7ce8c73bb5a98b261acd3238fecd152e6dd1cdfa2d1ae11b60a0 - languageName: node - linkType: hard - "micromark-util-encode@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-encode@npm:2.0.0" @@ -10065,13 +10301,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-html-tag-name@npm:^1.0.0": - version: 1.2.0 - resolution: "micromark-util-html-tag-name@npm:1.2.0" - checksum: 10/ccf0fa99b5c58676dc5192c74665a3bfd1b536fafaf94723bd7f31f96979d589992df6fcf2862eba290ef18e6a8efb30ec8e1e910d9f3fc74f208871e9f84750 - languageName: node - linkType: hard - "micromark-util-html-tag-name@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-html-tag-name@npm:2.0.0" @@ -10079,15 +10308,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-normalize-identifier@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-normalize-identifier@npm:1.1.0" - dependencies: - micromark-util-symbol: "npm:^1.0.0" - checksum: 10/8655bea41ffa4333e03fc22462cb42d631bbef9c3c07b625fd852b7eb442a110f9d2e5902a42e65188d85498279569502bf92f3434a1180fc06f7c37edfbaee2 - languageName: node - linkType: hard - "micromark-util-normalize-identifier@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-normalize-identifier@npm:2.0.0" @@ -10097,15 +10317,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-resolve-all@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-resolve-all@npm:1.1.0" - dependencies: - micromark-util-types: "npm:^1.0.0" - checksum: 10/1ce6c0237cd3ca061e76fae6602cf95014e764a91be1b9f10d36cb0f21ca88f9a07de8d49ab8101efd0b140a4fbfda6a1efb72027ab3f4d5b54c9543271dc52c - languageName: node - linkType: hard - "micromark-util-resolve-all@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-resolve-all@npm:2.0.0" @@ -10115,17 +10326,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-sanitize-uri@npm:^1.0.0, micromark-util-sanitize-uri@npm:^1.1.0": - version: 1.2.0 - resolution: "micromark-util-sanitize-uri@npm:1.2.0" - dependencies: - micromark-util-character: "npm:^1.0.0" - micromark-util-encode: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - checksum: 10/0d024100d95ffb88bf75f3360e305b545c1eb745430959b8633f7aa93f37ec401fc7094c90c97298409a9e30d94d53b895bae224e1bb966bea114976cfa0fd48 - languageName: node - linkType: hard - "micromark-util-sanitize-uri@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-sanitize-uri@npm:2.0.0" @@ -10137,18 +10337,6 @@ __metadata: languageName: node linkType: hard -"micromark-util-subtokenize@npm:^1.0.0": - version: 1.1.0 - resolution: "micromark-util-subtokenize@npm:1.1.0" - dependencies: - micromark-util-chunked: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.0" - uvu: "npm:^0.5.0" - checksum: 10/075a1db6ea586d65827d3eead33dbfc520c4e43659c93fcd8fd82f44a7b75cfe61dcde967a3dfcc2ffd999347440ba5aa6698e65a04f3fc627e13e9f12a1a910 - languageName: node - linkType: hard - "micromark-util-subtokenize@npm:^2.0.0": version: 2.0.0 resolution: "micromark-util-subtokenize@npm:2.0.0" @@ -10175,7 +10363,7 @@ __metadata: languageName: node linkType: hard -"micromark-util-types@npm:^1.0.0, micromark-util-types@npm:^1.0.1": +"micromark-util-types@npm:^1.0.0": version: 1.1.0 resolution: "micromark-util-types@npm:1.1.0" checksum: 10/287ac5de4a3802bb6f6c3842197c294997a488db1c0486e03c7a8e674d9eb7720c17dda1bcb814814b8343b338c4826fcbc0555f3e75463712a60dcdb53a028e @@ -10189,31 +10377,6 @@ __metadata: languageName: node linkType: hard -"micromark@npm:^3.0.0": - version: 3.2.0 - resolution: "micromark@npm:3.2.0" - dependencies: - "@types/debug": "npm:^4.0.0" - debug: "npm:^4.0.0" - decode-named-character-reference: "npm:^1.0.0" - micromark-core-commonmark: "npm:^1.0.1" - micromark-factory-space: "npm:^1.0.0" - micromark-util-character: "npm:^1.0.0" - micromark-util-chunked: "npm:^1.0.0" - micromark-util-combine-extensions: "npm:^1.0.0" - micromark-util-decode-numeric-character-reference: "npm:^1.0.0" - micromark-util-encode: "npm:^1.0.0" - micromark-util-normalize-identifier: "npm:^1.0.0" - micromark-util-resolve-all: "npm:^1.0.0" - micromark-util-sanitize-uri: "npm:^1.0.0" - micromark-util-subtokenize: "npm:^1.0.0" - micromark-util-symbol: "npm:^1.0.0" - micromark-util-types: "npm:^1.0.1" - uvu: "npm:^0.5.0" - checksum: 10/560a4a501efc3859d622461aaa9345fb95b99a2f34d3d3f2a775ab04de1dd857cb0f642083a6b28ab01bd817f5f0741a1be9857fd702f45e04a3752927a66719 - languageName: node - linkType: hard - "micromark@npm:^4.0.0": version: 4.0.0 resolution: "micromark@npm:4.0.0" @@ -10249,25 +10412,20 @@ __metadata: languageName: node linkType: hard -"miller-rabin@npm:^4.0.0": - version: 4.0.1 - resolution: "miller-rabin@npm:4.0.1" - dependencies: - bn.js: "npm:^4.0.0" - brorand: "npm:^1.0.1" - bin: - miller-rabin: bin/miller-rabin - checksum: 10/2a38ba9d1e878d94ee8a8ab3505b40e8d44fb9700a7716570fe4c8ca7e20d49b69aea579106580618c877cc6ff969eff71705042fafb47573736bf89404417bc - languageName: node - linkType: hard - -"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2": +"mime-db@npm:1.52.0": version: 1.52.0 resolution: "mime-db@npm:1.52.0" checksum: 10/54bb60bf39e6f8689f6622784e668a3d7f8bed6b0d886f5c3c446cb3284be28b30bf707ed05d0fe44a036f8469976b2629bbea182684977b084de9da274694d7 languageName: node linkType: hard +"mime-db@npm:>= 1.43.0 < 2, mime-db@npm:^1.54.0": + version: 1.54.0 + resolution: "mime-db@npm:1.54.0" + checksum: 10/9e7834be3d66ae7f10eaa69215732c6d389692b194f876198dca79b2b90cbf96688d9d5d05ef7987b20f749b769b11c01766564264ea5f919c88b32a29011311 + languageName: node + linkType: hard + "mime-db@npm:~1.33.0": version: 1.33.0 resolution: "mime-db@npm:1.33.0" @@ -10275,12 +10433,12 @@ __metadata: languageName: node linkType: hard -"mime-format@npm:2.0.1": - version: 2.0.1 - resolution: "mime-format@npm:2.0.1" +"mime-format@npm:2.0.2": + version: 2.0.2 + resolution: "mime-format@npm:2.0.2" dependencies: charset: "npm:^1.0.0" - checksum: 10/0a7731d2a268f5076fdb401e60e908fdf2d842b39a67a11ba8bac682d6d968c2290a257226b86318afbaafb6317b33d1f4c4a934b585bf8f9c9543b0b291cf3e + checksum: 10/8dfcb4310f0fad63b85455314972ad6660f40fa527056e45e633c5956189db44c9c73568d03cb2d68fb12e3fbe88f92ad92ab695e22121c7a37a299b3d4d38cc languageName: node linkType: hard @@ -10293,7 +10451,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:2.1.35, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.27, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -10302,6 +10460,15 @@ __metadata: languageName: node linkType: hard +"mime-types@npm:^3.0.1": + version: 3.0.2 + resolution: "mime-types@npm:3.0.2" + dependencies: + mime-db: "npm:^1.54.0" + checksum: 10/9db0ad31f5eff10ee8f848130779b7f2d056ddfdb6bda696cb69be68d486d33a3457b4f3f9bdeb60d0736edb471bd5a7c0a384375c011c51c889fd0d5c3b893e + languageName: node + linkType: hard + "mime@npm:1.6.0": version: 1.6.0 resolution: "mime@npm:1.6.0" @@ -10311,6 +10478,15 @@ __metadata: languageName: node linkType: hard +"mime@npm:3.0.0": + version: 3.0.0 + resolution: "mime@npm:3.0.0" + bin: + mime: cli.js + checksum: 10/b2d31580deb58be89adaa1877cbbf152b7604b980fd7ef8f08b9e96bfedf7d605d9c23a8ba62aa12c8580b910cd7c1d27b7331d0f40f7a14e17d5a0bbec3b49f + languageName: node + linkType: hard + "mimic-fn@npm:^2.1.0": version: 2.1.0 resolution: "mimic-fn@npm:2.1.0" @@ -10332,32 +10508,26 @@ __metadata: languageName: node linkType: hard -"mini-css-extract-plugin@npm:^2.7.6": - version: 2.7.6 - resolution: "mini-css-extract-plugin@npm:2.7.6" +"mini-css-extract-plugin@npm:^2.9.2": + version: 2.10.0 + resolution: "mini-css-extract-plugin@npm:2.10.0" dependencies: schema-utils: "npm:^4.0.0" + tapable: "npm:^2.2.1" peerDependencies: webpack: ^5.0.0 - checksum: 10/1f718bfdcb7c2bf5e4336f694e5576432149d63f9dacaf94eae38ad046534050471a712a2d1bedf95e1722a2d3b56c3361d7352849e802e4875e716885e952c3 + checksum: 10/bae5350ab82171c6c9a22a4397df14aa69280f5ff0e1ff4d2429ea841bc096927b1e27ba7b75a9c3dd77bd44bab449d6197bd748381f1326cbc8befcb10d1a9e languageName: node linkType: hard -"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": +"minimalistic-assert@npm:^1.0.0": version: 1.0.1 resolution: "minimalistic-assert@npm:1.0.1" checksum: 10/cc7974a9268fbf130fb055aff76700d7e2d8be5f761fb5c60318d0ed010d839ab3661a533ad29a5d37653133385204c503bfac995aaa4236f4e847461ea32ba7 languageName: node linkType: hard -"minimalistic-crypto-utils@npm:^1.0.1": - version: 1.0.1 - resolution: "minimalistic-crypto-utils@npm:1.0.1" - checksum: 10/6e8a0422b30039406efd4c440829ea8f988845db02a3299f372fceba56ffa94994a9c0f2fd70c17f9969eedfbd72f34b5070ead9656a34d3f71c0bd72583a0ed - languageName: node - linkType: hard - -"minimatch@npm:3.1.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1": +"minimatch@npm:3.1.2, minimatch@npm:^3.1.1": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -10484,13 +10654,6 @@ __metadata: languageName: node linkType: hard -"mri@npm:^1.1.0": - version: 1.2.0 - resolution: "mri@npm:1.2.0" - checksum: 10/6775a1d2228bb9d191ead4efc220bd6be64f943ad3afd4dcb3b3ac8fc7b87034443f666e38805df38e8d047b29f910c3cc7810da0109af83e42c82c73bd3f6bc - languageName: node - linkType: hard - "mrmime@npm:^1.0.0": version: 1.0.1 resolution: "mrmime@npm:1.0.1" @@ -10505,14 +10668,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 10/673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:2.1.3, ms@npm:^2.0.0": +"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10/aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -10551,22 +10707,29 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.7": - version: 3.3.8 - resolution: "nanoid@npm:3.3.8" +"nanoid@npm:^3.3.11": + version: 3.3.11 + resolution: "nanoid@npm:3.3.11" bin: nanoid: bin/nanoid.cjs - checksum: 10/2d1766606cf0d6f47b6f0fdab91761bb81609b2e3d367027aff45e6ee7006f660fb7e7781f4a34799fe6734f1268eeed2e37a5fdee809ade0c2d4eb11b0f9c40 + checksum: 10/73b5afe5975a307aaa3c95dfe3334c52cdf9ae71518176895229b8d65ab0d1c0417dd081426134eb7571c055720428ea5d57c645138161e7d10df80815527c48 languageName: node linkType: hard -"negotiator@npm:0.6.3, negotiator@npm:^0.6.3": +"negotiator@npm:0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" checksum: 10/2723fb822a17ad55c93a588a4bc44d53b22855bf4be5499916ca0cab1e7165409d0b288ba2577d7b029f10ce18cf2ed8e703e5af31c984e1e2304277ef979837 languageName: node linkType: hard +"negotiator@npm:^0.6.3, negotiator@npm:~0.6.4": + version: 0.6.4 + resolution: "negotiator@npm:0.6.4" + checksum: 10/d98c04a136583afd055746168f1067d58ce4bfe6e4c73ca1d339567f81ea1f7e665b5bd1e81f4771c67b6c2ea89b21cb2adaea2b16058c7dc31317778f931dab + languageName: node + linkType: hard + "neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" @@ -10635,13 +10798,6 @@ __metadata: languageName: node linkType: hard -"node-forge@npm:^1": - version: 1.3.2 - resolution: "node-forge@npm:1.3.2" - checksum: 10/dcc54aaffe0cf52367214a20c0032aa9b209d9095dd14526504f1972d1900a07e96046b3684cb0c8d0cc3d48744dd18e02b7b447ab28fac615ffb850beeabf18 - languageName: node - linkType: hard - "node-gyp@npm:latest": version: 9.3.0 resolution: "node-gyp@npm:9.3.0" @@ -10662,40 +10818,6 @@ __metadata: languageName: node linkType: hard -"node-polyfill-webpack-plugin@npm:^3.0.0": - version: 3.0.0 - resolution: "node-polyfill-webpack-plugin@npm:3.0.0" - dependencies: - assert: "npm:^2.1.0" - browserify-zlib: "npm:^0.2.0" - buffer: "npm:^6.0.3" - console-browserify: "npm:^1.2.0" - constants-browserify: "npm:^1.0.0" - crypto-browserify: "npm:^3.12.0" - domain-browser: "npm:^4.22.0" - events: "npm:^3.3.0" - https-browserify: "npm:^1.0.0" - os-browserify: "npm:^0.3.0" - path-browserify: "npm:^1.0.1" - process: "npm:^0.11.10" - punycode: "npm:^2.3.0" - querystring-es3: "npm:^0.2.1" - readable-stream: "npm:^4.4.2" - stream-browserify: "npm:^3.0.0" - stream-http: "npm:^3.2.0" - string_decoder: "npm:^1.3.0" - timers-browserify: "npm:^2.0.12" - tty-browserify: "npm:^0.0.1" - type-fest: "npm:^4.4.0" - url: "npm:^0.11.3" - util: "npm:^0.12.5" - vm-browserify: "npm:^1.1.2" - peerDependencies: - webpack: ">=5" - checksum: 10/cd35f2df7bfeb616d4554faf8628fa0425dcbffaa3b6f5520341117add1636b63011afb17f3f95ec53128f84f68e526e829a45d9e9e868ec5a51137db1a63113 - languageName: node - linkType: hard - "node-readfiles@npm:^0.2.0": version: 0.2.0 resolution: "node-readfiles@npm:0.2.0" @@ -10705,10 +10827,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.19": - version: 2.0.19 - resolution: "node-releases@npm:2.0.19" - checksum: 10/c2b33b4f0c40445aee56141f13ca692fa6805db88510e5bbb3baadb2da13e1293b738e638e15e4a8eb668bb9e97debb08e7a35409b477b5cc18f171d35a83045 +"node-releases@npm:^2.0.27": + version: 2.0.27 + resolution: "node-releases@npm:2.0.27" + checksum: 10/f6c78ddb392ae500719644afcbe68a9ea533242c02312eb6a34e8478506eb7482a3fb709c70235b01c32fe65625b68dfa9665113f816d87f163bc3819b62b106 languageName: node linkType: hard @@ -10730,13 +10852,6 @@ __metadata: languageName: node linkType: hard -"normalize-range@npm:^0.1.2": - version: 0.1.2 - resolution: "normalize-range@npm:0.1.2" - checksum: 10/9b2f14f093593f367a7a0834267c24f3cb3e887a2d9809c77d8a7e5fd08738bcd15af46f0ab01cc3a3d660386f015816b5c922cea8bf2ee79777f40874063184 - languageName: node - linkType: hard - "normalize-url@npm:^8.0.0": version: 8.0.0 resolution: "normalize-url@npm:8.0.0" @@ -10781,6 +10896,18 @@ __metadata: languageName: node linkType: hard +"null-loader@npm:^4.0.1": + version: 4.0.1 + resolution: "null-loader@npm:4.0.1" + dependencies: + loader-utils: "npm:^2.0.0" + schema-utils: "npm:^3.0.0" + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + checksum: 10/eeb4c4dd2f8f41e46f5665e4500359109e95ec1028a178a60e0161984906572da7dd87644bcc3cb29f0125d77e2b2508fb4f3813cfb1c6604a15865beb4b987b + languageName: node + linkType: hard + "oas-kit-common@npm:^1.0.8": version: 1.0.8 resolution: "oas-kit-common@npm:1.0.8" @@ -10876,16 +11003,6 @@ __metadata: languageName: node linkType: hard -"object-is@npm:^1.1.5": - version: 1.1.6 - resolution: "object-is@npm:1.1.6" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - checksum: 10/4f6f544773a595da21c69a7531e0e1d6250670f4e09c55f47eb02c516035cfcb1b46ceb744edfd3ecb362309dbccb6d7f88e43bf42e4d4595ac10a329061053a - languageName: node - linkType: hard - "object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" @@ -10893,7 +11010,7 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.0, object.assign@npm:^4.1.4": +"object.assign@npm:^4.1.0": version: 4.1.7 resolution: "object.assign@npm:4.1.7" dependencies: @@ -10914,7 +11031,7 @@ __metadata: languageName: node linkType: hard -"on-finished@npm:2.4.1, on-finished@npm:~2.4.1": +"on-finished@npm:2.4.1, on-finished@npm:^2.4.1, on-finished@npm:~2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" dependencies: @@ -10923,10 +11040,10 @@ __metadata: languageName: node linkType: hard -"on-headers@npm:~1.0.2": - version: 1.0.2 - resolution: "on-headers@npm:1.0.2" - checksum: 10/870766c16345855e2012e9422ba1ab110c7e44ad5891a67790f84610bd70a72b67fdd71baf497295f1d1bf38dd4c92248f825d48729c53c0eae5262fb69fa171 +"on-headers@npm:~1.1.0": + version: 1.1.0 + resolution: "on-headers@npm:1.1.0" + checksum: 10/98aa64629f986fb8cc4517dd8bede73c980e31208cba97f4442c330959f60ced3dc6214b83420491f5111fc7c4f4343abe2ea62c85f505cf041d67850f238776 languageName: node linkType: hard @@ -10948,7 +11065,19 @@ __metadata: languageName: node linkType: hard -"open@npm:^8.0.9, open@npm:^8.4.0": +"open@npm:^10.0.3": + version: 10.2.0 + resolution: "open@npm:10.2.0" + dependencies: + default-browser: "npm:^5.2.1" + define-lazy-prop: "npm:^3.0.0" + is-inside-container: "npm:^1.0.0" + wsl-utils: "npm:^0.1.0" + checksum: 10/e6ad9474734eac3549dcc7d85e952394856ccaee48107c453bd6a725b82e3b8ed5f427658935df27efa76b411aeef62888edea8a9e347e8e7c82632ec966b30e + languageName: node + linkType: hard + +"open@npm:^8.4.0": version: 8.4.0 resolution: "open@npm:8.4.0" dependencies: @@ -10959,14 +11088,14 @@ __metadata: languageName: node linkType: hard -"openapi-to-postmanv2@npm:^4.21.0": - version: 4.25.0 - resolution: "openapi-to-postmanv2@npm:4.25.0" +"openapi-to-postmanv2@npm:^5.0.0": + version: 5.8.0 + resolution: "openapi-to-postmanv2@npm:5.8.0" dependencies: - ajv: "npm:8.11.0" + ajv: "npm:^8.11.0" ajv-draft-04: "npm:1.0.0" ajv-formats: "npm:2.1.1" - async: "npm:3.2.4" + async: "npm:3.2.6" commander: "npm:2.20.3" graphlib: "npm:2.1.8" js-yaml: "npm:4.1.0" @@ -10977,12 +11106,12 @@ __metadata: oas-resolver-browser: "npm:2.5.6" object-hash: "npm:3.0.0" path-browserify: "npm:1.0.1" - postman-collection: "npm:^4.4.0" + postman-collection: "npm:^5.0.0" swagger2openapi: "npm:7.0.8" yaml: "npm:1.10.2" bin: openapi2postmanv2: bin/openapi2postmanv2.js - checksum: 10/1f4dceab7cc5c3e7dd866c1fe2e6870279792a8a194cc5323cfd1d277457cf4a87354aa9b9c24b8c6ac0a29fe95014b93a824fbc167ff544493507d4714b87e8 + checksum: 10/da324b99a223a9621ae4471c151571d9835c40b706c8c42caaedc70fc79a73c69dc023ba27e373613f585407b855c68ee8d5e3ed530000ab03f39c36b1d644ef languageName: node linkType: hard @@ -10995,13 +11124,6 @@ __metadata: languageName: node linkType: hard -"os-browserify@npm:^0.3.0": - version: 0.3.0 - resolution: "os-browserify@npm:0.3.0" - checksum: 10/16e37ba3c0e6a4c63443c7b55799ce4066d59104143cb637ecb9fce586d5da319cdca786ba1c867abbe3890d2cbf37953f2d51eea85e20dd6c4570d6c54bfebf - languageName: node - linkType: hard - "p-cancelable@npm:^3.0.0": version: 3.0.0 resolution: "p-cancelable@npm:3.0.0" @@ -11009,21 +11131,10 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^2.0.0": - version: 2.3.0 - resolution: "p-limit@npm:2.3.0" - dependencies: - p-try: "npm:^2.0.0" - checksum: 10/84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 - languageName: node - linkType: hard - -"p-limit@npm:^3.0.2": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: "npm:^0.1.0" - checksum: 10/7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 +"p-finally@npm:^1.0.0": + version: 1.0.0 + resolution: "p-finally@npm:1.0.0" + checksum: 10/93a654c53dc805dd5b5891bab16eb0ea46db8f66c4bfd99336ae929323b1af2b70a8b0654f8f1eae924b2b73d037031366d645f1fd18b3d30cbd15950cc4b1d4 languageName: node linkType: hard @@ -11036,24 +11147,6 @@ __metadata: languageName: node linkType: hard -"p-locate@npm:^3.0.0": - version: 3.0.0 - resolution: "p-locate@npm:3.0.0" - dependencies: - p-limit: "npm:^2.0.0" - checksum: 10/83991734a9854a05fe9dbb29f707ea8a0599391f52daac32b86f08e21415e857ffa60f0e120bfe7ce0cc4faf9274a50239c7895fc0d0579d08411e513b83a4ae - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: "npm:^3.0.2" - checksum: 10/1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 - languageName: node - linkType: hard - "p-locate@npm:^6.0.0": version: 6.0.0 resolution: "p-locate@npm:6.0.0" @@ -11072,20 +11165,33 @@ __metadata: languageName: node linkType: hard -"p-retry@npm:^4.5.0": - version: 4.6.2 - resolution: "p-retry@npm:4.6.2" +"p-queue@npm:^6.6.2": + version: 6.6.2 + resolution: "p-queue@npm:6.6.2" dependencies: - "@types/retry": "npm:0.12.0" - retry: "npm:^0.13.1" - checksum: 10/45c270bfddaffb4a895cea16cb760dcc72bdecb6cb45fef1971fa6ea2e91ddeafddefe01e444ac73e33b1b3d5d29fb0dd18a7effb294262437221ddc03ce0f2e + eventemitter3: "npm:^4.0.4" + p-timeout: "npm:^3.2.0" + checksum: 10/60fe227ffce59fbc5b1b081305b61a2f283ff145005853702b7d4d3f99a0176bd21bb126c99a962e51fe1e01cb8aa10f0488b7bbe73b5dc2e84b5cc650b8ffd2 languageName: node linkType: hard -"p-try@npm:^2.0.0": - version: 2.2.0 - resolution: "p-try@npm:2.2.0" - checksum: 10/f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae +"p-retry@npm:^6.2.0": + version: 6.2.1 + resolution: "p-retry@npm:6.2.1" + dependencies: + "@types/retry": "npm:0.12.2" + is-network-error: "npm:^1.0.0" + retry: "npm:^0.13.1" + checksum: 10/7104ef13703b155d70883b0d3654ecc03148407d2711a4516739cf93139e8bec383451e14925e25e3c1ae04dbace3ed53c26dc3853c1e9b9867fcbdde25f4cdc + languageName: node + linkType: hard + +"p-timeout@npm:^3.2.0": + version: 3.2.0 + resolution: "p-timeout@npm:3.2.0" + dependencies: + p-finally: "npm:^1.0.0" + checksum: 10/3dd0eaa048780a6f23e5855df3dd45c7beacff1f820476c1d0d1bcd6648e3298752ba2c877aa1c92f6453c7dd23faaf13d9f5149fc14c0598a142e2c5e8d649c languageName: node linkType: hard @@ -11108,10 +11214,10 @@ __metadata: languageName: node linkType: hard -"pako@npm:~1.0.5": - version: 1.0.11 - resolution: "pako@npm:1.0.11" - checksum: 10/1ad07210e894472685564c4d39a08717e84c2a68a70d3c1d9e657d32394ef1670e22972a433cbfe48976cb98b154ba06855dcd3fcfba77f60f1777634bec48c0 +"pako@npm:^2.1.0": + version: 2.1.0 + resolution: "pako@npm:2.1.0" + checksum: 10/38a04991d0ec4f4b92794a68b8c92bf7340692c5d980255c92148da96eb3e550df7a86a7128b5ac0c65ecddfe5ef3bbe9c6dab13e1bc315086e759b18f7c1401 languageName: node linkType: hard @@ -11134,20 +11240,6 @@ __metadata: languageName: node linkType: hard -"parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.7": - version: 5.1.7 - resolution: "parse-asn1@npm:5.1.7" - dependencies: - asn1.js: "npm:^4.10.1" - browserify-aes: "npm:^1.2.0" - evp_bytestokey: "npm:^1.0.3" - hash-base: "npm:~3.0" - pbkdf2: "npm:^3.1.2" - safe-buffer: "npm:^5.2.1" - checksum: 10/f82c079f4d9a4d33159c7682f9c516680f4d659fde8060697a6b3c1be4795976e826d53a1e5751a81ddc800e9c6d6fa4629b59f6d1f3241ac8447a00c89a67d3 - languageName: node - linkType: hard - "parse-entities@npm:^4.0.0": version: 4.0.1 resolution: "parse-entities@npm:4.0.1" @@ -11164,7 +11256,7 @@ __metadata: languageName: node linkType: hard -"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": +"parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" dependencies: @@ -11193,13 +11285,6 @@ __metadata: languageName: node linkType: hard -"parse5@npm:^6.0.0": - version: 6.0.1 - resolution: "parse5@npm:6.0.1" - checksum: 10/dfb110581f62bd1425725a7c784ae022a24669bd0efc24b58c71fc731c4d868193e2ebd85b74cde2dbb965e4dcf07059b1e651adbec1b3b5267531bd132fdb75 - languageName: node - linkType: hard - "parse5@npm:^7.0.0": version: 7.1.2 resolution: "parse5@npm:7.1.2" @@ -11233,20 +11318,6 @@ __metadata: languageName: node linkType: hard -"path-exists@npm:^3.0.0": - version: 3.0.0 - resolution: "path-exists@npm:3.0.0" - checksum: 10/96e92643aa34b4b28d0de1cd2eba52a1c5313a90c6542d03f62750d82480e20bfa62bc865d5cfc6165f5fcd5aeb0851043c40a39be5989646f223300021bae0a - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 10/505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 - languageName: node - linkType: hard - "path-exists@npm:^5.0.0": version: 5.0.0 resolution: "path-exists@npm:5.0.0" @@ -11292,10 +11363,10 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:2.2.1": - version: 2.2.1 - resolution: "path-to-regexp@npm:2.2.1" - checksum: 10/1a7125f8c1b5904d556a29722333219df4aa779039e903efe2fbfe0cc3ae9246672846fc8ad285664020b70e434347e0bc9af691fd7d61df8eaa7b018dcd56fb +"path-to-regexp@npm:3.3.0": + version: 3.3.0 + resolution: "path-to-regexp@npm:3.3.0" + checksum: 10/8d256383af8db66233ee9027cfcbf8f5a68155efbb4f55e784279d3ab206dcaee554ddb72ff0dae97dd2882af9f7fa802634bb7cffa2e796927977e31b829259 languageName: node linkType: hard @@ -11332,20 +11403,6 @@ __metadata: languageName: node linkType: hard -"pbkdf2@npm:^3.1.2": - version: 3.1.3 - resolution: "pbkdf2@npm:3.1.3" - dependencies: - create-hash: "npm:~1.1.3" - create-hmac: "npm:^1.1.7" - ripemd160: "npm:=2.0.1" - safe-buffer: "npm:^5.2.1" - sha.js: "npm:^2.4.11" - to-buffer: "npm:^1.2.0" - checksum: 10/980cf2977aa84ec3166fde195a28464ab494131c0a5778fc8f20b8894410747e502159c19ef2b41842c728bc52ba49ffee6847e3ee61ac0d482689f85d8a1b30 - languageName: node - linkType: hard - "periscopic@npm:^3.0.0": version: 3.1.0 resolution: "periscopic@npm:3.1.0" @@ -11357,7 +11414,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.1": +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: 10/e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 @@ -11387,12 +11444,17 @@ __metadata: languageName: node linkType: hard -"pkg-up@npm:^3.1.0": - version: 3.1.0 - resolution: "pkg-up@npm:3.1.0" +"pkijs@npm:^3.3.3": + version: 3.3.3 + resolution: "pkijs@npm:3.3.3" dependencies: - find-up: "npm:^3.0.0" - checksum: 10/5bac346b7c7c903613c057ae3ab722f320716199d753f4a7d053d38f2b5955460f3e6ab73b4762c62fd3e947f58e04f1343e92089e7bb6091c90877406fcd8c8 + "@noble/hashes": "npm:1.4.0" + asn1js: "npm:^3.0.6" + bytestreamjs: "npm:^2.0.1" + pvtsutils: "npm:^1.3.6" + pvutils: "npm:^1.1.3" + tslib: "npm:^2.8.1" + checksum: 10/51ef42d8332fcb9e81f5cca9355b1a2aeacdbd77483cacc2a1c589036887a5a1dc6e7a68abd7cca2f0d605f68e038cc877e1fae4c38b3d358fa84a327dccaadd languageName: node linkType: hard @@ -11403,10 +11465,14 @@ __metadata: languageName: node linkType: hard -"possible-typed-array-names@npm:^1.0.0": - version: 1.0.0 - resolution: "possible-typed-array-names@npm:1.0.0" - checksum: 10/8ed3e96dfeea1c5880c1f4c9cb707e5fb26e8be22f14f82ef92df20fd2004e635c62ba47fbe8f2bb63bfd80dac1474be2fb39798da8c2feba2815435d1f749af +"postcss-attribute-case-insensitive@npm:^7.0.1": + version: 7.0.1 + resolution: "postcss-attribute-case-insensitive@npm:7.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/18829dfc6dd2f6b1ca82afa8555f07ec8ac5687fe95612e353aa601b842bdec05ca78fc96016dba2b7d32607b31e085e5087fda00e1e0dfdc6c2a1b07b1b15c2 languageName: node linkType: hard @@ -11422,6 +11488,56 @@ __metadata: languageName: node linkType: hard +"postcss-clamp@npm:^4.1.0": + version: 4.1.0 + resolution: "postcss-clamp@npm:4.1.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4.6 + checksum: 10/fb38286d3e607a8b11ef28c89272bd572a077f5a496e2838c3996697bbc4cfb8f7a5be4b4a8987e6b0223db48c9ce5683c9d840f7afe54210ab0f77127628415 + languageName: node + linkType: hard + +"postcss-color-functional-notation@npm:^7.0.12": + version: 7.0.12 + resolution: "postcss-color-functional-notation@npm:7.0.12" + dependencies: + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/c3f59571330defde7c95256dbc2756ffd298072a6b167eb6751efb2f97ac267c081d7313556e3a4615cff8a46202f3c149bb2a456326805ca0cba5173faf5aad + languageName: node + linkType: hard + +"postcss-color-hex-alpha@npm:^10.0.0": + version: 10.0.0 + resolution: "postcss-color-hex-alpha@npm:10.0.0" + dependencies: + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/2dbbd66d76522c7d281c292589360f21806b6dd31a582484e7e4a848e5244d645d5c5e1b6c6219dd5fb7333808cd94a27dd0d2e1db093d043668ed7b42db59ad + languageName: node + linkType: hard + +"postcss-color-rebeccapurple@npm:^10.0.0": + version: 10.0.0 + resolution: "postcss-color-rebeccapurple@npm:10.0.0" + dependencies: + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/8ca0ee2b6b45ff62abdfc9b6757d8832d398c2e47dd705759485b685f544eaed81ec00f050a1bad67ffb5e6243332085a09807d47526ce3b43456b027119e0ae + languageName: node + linkType: hard + "postcss-colormin@npm:^6.1.0": version: 6.1.0 resolution: "postcss-colormin@npm:6.1.0" @@ -11448,6 +11564,60 @@ __metadata: languageName: node linkType: hard +"postcss-custom-media@npm:^11.0.6": + version: 11.0.6 + resolution: "postcss-custom-media@npm:11.0.6" + dependencies: + "@csstools/cascade-layer-name-parser": "npm:^2.0.5" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/media-query-list-parser": "npm:^4.0.3" + peerDependencies: + postcss: ^8.4 + checksum: 10/0fa7ec309065590ce9921bb455947b0a2b8354a1e2f04dae1b3b01e1e4832fd0bb01c983d2bdfc886ceb7ba5d90ffaffc7082afa696aac350f55de0f960c3786 + languageName: node + linkType: hard + +"postcss-custom-properties@npm:^14.0.6": + version: 14.0.6 + resolution: "postcss-custom-properties@npm:14.0.6" + dependencies: + "@csstools/cascade-layer-name-parser": "npm:^2.0.5" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/fe57781d58990f8061aac2a07c6aedb66c5715b3350af11f4eb26121ff27a735610228a7e18b243a0cfeb24bd10cb5a2359e3056d693ba69c3a09bbef8a8c461 + languageName: node + linkType: hard + +"postcss-custom-selectors@npm:^8.0.5": + version: 8.0.5 + resolution: "postcss-custom-selectors@npm:8.0.5" + dependencies: + "@csstools/cascade-layer-name-parser": "npm:^2.0.5" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/191cfe62ad3eaf3d8bff75ed461baebbb3b9a52de9c1c75bded61da4ed2302d7c53c457e9febfa7cffc9a1fb7f6ed98cab8c4b2a071a1097e487e0117018e6cf + languageName: node + linkType: hard + +"postcss-dir-pseudo-class@npm:^9.0.1": + version: 9.0.1 + resolution: "postcss-dir-pseudo-class@npm:9.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/7f6212fe7f2a83e95d85df14208df3edb75b6b8f89ad865fdfbd1abf5765b6649ff46bb7ff56f7788ff8cfe60546ff305cc2fd2f9b1f9e1647a4386507714070 + languageName: node + linkType: hard + "postcss-discard-comments@npm:^6.0.2": version: 6.0.2 resolution: "postcss-discard-comments@npm:6.0.2" @@ -11495,17 +11665,108 @@ __metadata: languageName: node linkType: hard -"postcss-loader@npm:^7.3.3": - version: 7.3.3 - resolution: "postcss-loader@npm:7.3.3" +"postcss-double-position-gradients@npm:^6.0.4": + version: 6.0.4 + resolution: "postcss-double-position-gradients@npm:6.0.4" dependencies: - cosmiconfig: "npm:^8.2.0" - jiti: "npm:^1.18.2" - semver: "npm:^7.3.8" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/2840202fd819b48f713c63e1bca5e3f6b88ac5374cf2e4ebf6fabad6d5493685f9a3cde6f890ca73f978a7f5cde5ba4b6ec02659715a0b035e9be1063b74fb1f + languageName: node + linkType: hard + +"postcss-focus-visible@npm:^10.0.1": + version: 10.0.1 + resolution: "postcss-focus-visible@npm:10.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/47c038ccf139bad6a4c12cf59c5ac78acbac96ae0517ae08d5db676680d585ae7943e22328bd0d31876d6bacc24e4b717b5f809d26218d76989f7b9a44369793 + languageName: node + linkType: hard + +"postcss-focus-within@npm:^9.0.1": + version: 9.0.1 + resolution: "postcss-focus-within@npm:9.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/cfaef831e370b25787953450271096fc4dbf61de70291e38c2a3e355cb183432bcb6f4cbd8ebef34617d20cd711982a2918b8d5688ed179f43d1d2cc4cb58c7e + languageName: node + linkType: hard + +"postcss-font-variant@npm:^5.0.0": + version: 5.0.0 + resolution: "postcss-font-variant@npm:5.0.0" + peerDependencies: + postcss: ^8.1.0 + checksum: 10/738328282cf71750f6efc72d72017f938a6e76c9c49602aae4cc4337beac6d13e72a4ade608567293cb87cad2af502e6aaef652fdcc500e09b4aba38c3e32fc6 + languageName: node + linkType: hard + +"postcss-gap-properties@npm:^6.0.0": + version: 6.0.0 + resolution: "postcss-gap-properties@npm:6.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/8fa8a208fe254ddfcb0442072a6232576efa1fc3deea917be6d3a0c25dfcb855cc6806572e42a098aa0276a5ad3917f19b269409f5ce1f22d233c0072d72f823 + languageName: node + linkType: hard + +"postcss-image-set-function@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-image-set-function@npm:7.0.0" + dependencies: + "@csstools/utilities": "npm:^2.0.0" + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/44c1e7d8586b36e9a55cc63dde4cc9f2b2632861d51bc8aebc1aca9045de2052b243bed3d0f9838334f3584d19bf04a4d308ed3fea671af30dd404e319fae252 + languageName: node + linkType: hard + +"postcss-lab-function@npm:^7.0.12": + version: 7.0.12 + resolution: "postcss-lab-function@npm:7.0.12" + dependencies: + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/f767b41552cff819587a316693863393b81dd6f03f4e9f484adf166834c3032541ce128688faa4c2cf3f2f1d20adb0f3b9d76b5acc3251671f646880fcdd9900 + languageName: node + linkType: hard + +"postcss-loader@npm:^7.3.4": + version: 7.3.4 + resolution: "postcss-loader@npm:7.3.4" + dependencies: + cosmiconfig: "npm:^8.3.5" + jiti: "npm:^1.20.0" + semver: "npm:^7.5.4" peerDependencies: postcss: ^7.0.0 || ^8.0.1 webpack: ^5.0.0 - checksum: 10/743a4286db68169d271bef31e6e9351874bcf2dfa408b82c648c2d5bfba9c862cbfe3004494d927469654d6ac8b82fe647f2b80a186c1dbd44d81632eec1e838 + checksum: 10/234b01149a966a6190290c6d265b8e3df10f43262dd679451c1e7370bae74e27b746b02e660d204b901e3cf1ad28759c2679a93c64a3eb499169d8dec39df1c1 + languageName: node + linkType: hard + +"postcss-logical@npm:^8.1.0": + version: 8.1.0 + resolution: "postcss-logical@npm:8.1.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/495ce49a1fb831eb30d848909a54430b0170ec7681dcd84da9f1cb531cad167b9fa358dc242b70c2cae5c92b1a3fbbf43e625a54c3e615ea9dcce8d15cee5926 languageName: node linkType: hard @@ -11595,36 +11856,36 @@ __metadata: languageName: node linkType: hard -"postcss-modules-extract-imports@npm:^3.0.0": - version: 3.0.0 - resolution: "postcss-modules-extract-imports@npm:3.0.0" +"postcss-modules-extract-imports@npm:^3.1.0": + version: 3.1.0 + resolution: "postcss-modules-extract-imports@npm:3.1.0" peerDependencies: postcss: ^8.1.0 - checksum: 10/8d68bb735cef4d43f9cdc1053581e6c1c864860b77fcfb670372b39c5feeee018dc5ddb2be4b07fef9bcd601edded4262418bbaeaf1bd4af744446300cebe358 + checksum: 10/00bfd3aff045fc13ded8e3bbfd8dfc73eff9a9708db1b2a132266aef6544c8d2aee7a5d7e021885f6f9bbd5565a9a9ab52990316e21ad9468a2534f87df8e849 languageName: node linkType: hard -"postcss-modules-local-by-default@npm:^4.0.3": - version: 4.0.3 - resolution: "postcss-modules-local-by-default@npm:4.0.3" +"postcss-modules-local-by-default@npm:^4.0.5": + version: 4.2.0 + resolution: "postcss-modules-local-by-default@npm:4.2.0" dependencies: icss-utils: "npm:^5.0.0" - postcss-selector-parser: "npm:^6.0.2" + postcss-selector-parser: "npm:^7.0.0" postcss-value-parser: "npm:^4.1.0" peerDependencies: postcss: ^8.1.0 - checksum: 10/4f671d77cb6a025c8be09540fea00ce2d3dbf3375a3a15b48f927325c7418d7c3c87a83bacbf81c5de6ef8bd1660d5f6f2542b98de5877355a23b739379f8c79 + checksum: 10/552329aa39fbf229b8ac5a04f8aed0b1553e7a3c10b165ee700d1deb020c071875b3df7ab5e3591f6af33d461df66d330ec9c1256229e45fc618a47c60f41536 languageName: node linkType: hard -"postcss-modules-scope@npm:^3.0.0": - version: 3.0.0 - resolution: "postcss-modules-scope@npm:3.0.0" +"postcss-modules-scope@npm:^3.2.0": + version: 3.2.1 + resolution: "postcss-modules-scope@npm:3.2.1" dependencies: - postcss-selector-parser: "npm:^6.0.4" + postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.1.0 - checksum: 10/cc36b8111c6160a1c21ca0e82de9daf0147be95f3b5403aedd83bcaee44ee425cb62b77f677fc53d0c8d51f7981018c1c8f0a4ad3d6f0138b09326ac48c2b297 + checksum: 10/51c747fa15cedf1b2856da472985ea7a7bb510a63daf30f95f250f34fce9e28ef69b802e6cc03f9c01f69043d171bc33279109a9235847c2d3a75c44eac67334 languageName: node linkType: hard @@ -11639,6 +11900,19 @@ __metadata: languageName: node linkType: hard +"postcss-nesting@npm:^13.0.2": + version: 13.0.2 + resolution: "postcss-nesting@npm:13.0.2" + dependencies: + "@csstools/selector-resolve-nested": "npm:^3.1.0" + "@csstools/selector-specificity": "npm:^5.0.0" + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/ac82d7d2d2621d76ca42e065b90728c91206480ef01f874c21d032c5964b723818ab13194b09c7871edee8e4220241160f72d29ece65acbfe8827937a5b6ace0 + languageName: node + linkType: hard + "postcss-normalize-charset@npm:^6.0.2": version: 6.0.2 resolution: "postcss-normalize-charset@npm:6.0.2" @@ -11737,6 +12011,15 @@ __metadata: languageName: node linkType: hard +"postcss-opacity-percentage@npm:^3.0.0": + version: 3.0.0 + resolution: "postcss-opacity-percentage@npm:3.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/dc813113f05f91f1c87ab3c125911f9e5989d1f3fc7cc5586a165901a63c0d02077d134df844391ea5624088680c6b3cee75bc33b8efdcaf340a91046e47e4e1 + languageName: node + linkType: hard + "postcss-ordered-values@npm:^6.0.2": version: 6.0.2 resolution: "postcss-ordered-values@npm:6.0.2" @@ -11749,6 +12032,129 @@ __metadata: languageName: node linkType: hard +"postcss-overflow-shorthand@npm:^6.0.0": + version: 6.0.0 + resolution: "postcss-overflow-shorthand@npm:6.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/80f07e0beb97b7ac5dac590802591fc93392b0d7a9678e17998b4d34ee0cca637665232c7ea88b3a4342192bc9a2a4f5c757ad86b837a5fd59d083d37cc7da16 + languageName: node + linkType: hard + +"postcss-page-break@npm:^3.0.4": + version: 3.0.4 + resolution: "postcss-page-break@npm:3.0.4" + peerDependencies: + postcss: ^8 + checksum: 10/a7d08c945fc691f62c77ac701e64722218b14ec5c8fc1972b8af9c21553492d40808cf95e61b9697b1dacaf7e6180636876d7fee314f079e6c9e39ac1b1edc6f + languageName: node + linkType: hard + +"postcss-place@npm:^10.0.0": + version: 10.0.0 + resolution: "postcss-place@npm:10.0.0" + dependencies: + postcss-value-parser: "npm:^4.2.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/738cd0dc2412cf573bcfb2f7dce8e1cd21887f61c8808f55114f08fb8fbf03715e957fdd8859241eecebe400a5202771f513610b04e0f17c7742f6a5ea3bafb3 + languageName: node + linkType: hard + +"postcss-preset-env@npm:^10.2.1": + version: 10.6.1 + resolution: "postcss-preset-env@npm:10.6.1" + dependencies: + "@csstools/postcss-alpha-function": "npm:^1.0.1" + "@csstools/postcss-cascade-layers": "npm:^5.0.2" + "@csstools/postcss-color-function": "npm:^4.0.12" + "@csstools/postcss-color-function-display-p3-linear": "npm:^1.0.1" + "@csstools/postcss-color-mix-function": "npm:^3.0.12" + "@csstools/postcss-color-mix-variadic-function-arguments": "npm:^1.0.2" + "@csstools/postcss-content-alt-text": "npm:^2.0.8" + "@csstools/postcss-contrast-color-function": "npm:^2.0.12" + "@csstools/postcss-exponential-functions": "npm:^2.0.9" + "@csstools/postcss-font-format-keywords": "npm:^4.0.0" + "@csstools/postcss-gamut-mapping": "npm:^2.0.11" + "@csstools/postcss-gradients-interpolation-method": "npm:^5.0.12" + "@csstools/postcss-hwb-function": "npm:^4.0.12" + "@csstools/postcss-ic-unit": "npm:^4.0.4" + "@csstools/postcss-initial": "npm:^2.0.1" + "@csstools/postcss-is-pseudo-class": "npm:^5.0.3" + "@csstools/postcss-light-dark-function": "npm:^2.0.11" + "@csstools/postcss-logical-float-and-clear": "npm:^3.0.0" + "@csstools/postcss-logical-overflow": "npm:^2.0.0" + "@csstools/postcss-logical-overscroll-behavior": "npm:^2.0.0" + "@csstools/postcss-logical-resize": "npm:^3.0.0" + "@csstools/postcss-logical-viewport-units": "npm:^3.0.4" + "@csstools/postcss-media-minmax": "npm:^2.0.9" + "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^3.0.5" + "@csstools/postcss-nested-calc": "npm:^4.0.0" + "@csstools/postcss-normalize-display-values": "npm:^4.0.1" + "@csstools/postcss-oklab-function": "npm:^4.0.12" + "@csstools/postcss-position-area-property": "npm:^1.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/postcss-property-rule-prelude-list": "npm:^1.0.0" + "@csstools/postcss-random-function": "npm:^2.0.1" + "@csstools/postcss-relative-color-syntax": "npm:^3.0.12" + "@csstools/postcss-scope-pseudo-class": "npm:^4.0.1" + "@csstools/postcss-sign-functions": "npm:^1.1.4" + "@csstools/postcss-stepped-value-functions": "npm:^4.0.9" + "@csstools/postcss-syntax-descriptor-syntax-production": "npm:^1.0.1" + "@csstools/postcss-system-ui-font-family": "npm:^1.0.0" + "@csstools/postcss-text-decoration-shorthand": "npm:^4.0.3" + "@csstools/postcss-trigonometric-functions": "npm:^4.0.9" + "@csstools/postcss-unset-value": "npm:^4.0.0" + autoprefixer: "npm:^10.4.23" + browserslist: "npm:^4.28.1" + css-blank-pseudo: "npm:^7.0.1" + css-has-pseudo: "npm:^7.0.3" + css-prefers-color-scheme: "npm:^10.0.0" + cssdb: "npm:^8.6.0" + postcss-attribute-case-insensitive: "npm:^7.0.1" + postcss-clamp: "npm:^4.1.0" + postcss-color-functional-notation: "npm:^7.0.12" + postcss-color-hex-alpha: "npm:^10.0.0" + postcss-color-rebeccapurple: "npm:^10.0.0" + postcss-custom-media: "npm:^11.0.6" + postcss-custom-properties: "npm:^14.0.6" + postcss-custom-selectors: "npm:^8.0.5" + postcss-dir-pseudo-class: "npm:^9.0.1" + postcss-double-position-gradients: "npm:^6.0.4" + postcss-focus-visible: "npm:^10.0.1" + postcss-focus-within: "npm:^9.0.1" + postcss-font-variant: "npm:^5.0.0" + postcss-gap-properties: "npm:^6.0.0" + postcss-image-set-function: "npm:^7.0.0" + postcss-lab-function: "npm:^7.0.12" + postcss-logical: "npm:^8.1.0" + postcss-nesting: "npm:^13.0.2" + postcss-opacity-percentage: "npm:^3.0.0" + postcss-overflow-shorthand: "npm:^6.0.0" + postcss-page-break: "npm:^3.0.4" + postcss-place: "npm:^10.0.0" + postcss-pseudo-class-any-link: "npm:^10.0.1" + postcss-replace-overflow-wrap: "npm:^4.0.0" + postcss-selector-not: "npm:^8.0.1" + peerDependencies: + postcss: ^8.4 + checksum: 10/e18aa351e18262a9f086a40ce15de4763f8e9e208cb8b92f05ce15ebeaca740b568409c5309d3289a7f880a81ec51b166644a4fa5a82bb4180a5fb24213a646b + languageName: node + linkType: hard + +"postcss-pseudo-class-any-link@npm:^10.0.1": + version: 10.0.1 + resolution: "postcss-pseudo-class-any-link@npm:10.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/376525d1a6fa223d908deb884b93d5cb76f4fa7431c090a8ada63e5ee9657bec7bf8e23eff1c36264c051c5a653928e38392165a862b7c5bf5e39e9364383fce + languageName: node + linkType: hard + "postcss-reduce-idents@npm:^6.0.3": version: 6.0.3 resolution: "postcss-reduce-idents@npm:6.0.3" @@ -11783,7 +12189,27 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.16, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": +"postcss-replace-overflow-wrap@npm:^4.0.0": + version: 4.0.0 + resolution: "postcss-replace-overflow-wrap@npm:4.0.0" + peerDependencies: + postcss: ^8.0.3 + checksum: 10/0629ec17deae65e27dc3059ecec1c6bc833ee65291093b476fce151ab0af45c9e1a56ce250eb9ec4bbc306c19ab318cc982fdbcca8651d347d7dfaa3c9fc9201 + languageName: node + linkType: hard + +"postcss-selector-not@npm:^8.0.1": + version: 8.0.1 + resolution: "postcss-selector-not@npm:8.0.1" + dependencies: + postcss-selector-parser: "npm:^7.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/28c1f7863ac85016ecd695304ee1eb21b1128eacba333d6d4540fd93691c58ff6329ac323b6a640f2da918e95c7b58e8f534c8b6e2ed016f6e31cdfdc743edbc + languageName: node + linkType: hard + +"postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.16": version: 6.1.2 resolution: "postcss-selector-parser@npm:6.1.2" dependencies: @@ -11793,6 +12219,16 @@ __metadata: languageName: node linkType: hard +"postcss-selector-parser@npm:^7.0.0": + version: 7.1.1 + resolution: "postcss-selector-parser@npm:7.1.1" + dependencies: + cssesc: "npm:^3.0.0" + util-deprecate: "npm:^1.0.2" + checksum: 10/bb3c6455b20af26a556e3021e21101d8470252644e673c1612f7348ff8dd41b11321329f0694cf299b5b94863f823480b72d3e2f4bd3a89dc43e2d8c0dbad341 + languageName: node + linkType: hard + "postcss-sort-media-queries@npm:^5.2.0": version: 5.2.0 resolution: "postcss-sort-media-queries@npm:5.2.0" @@ -11843,34 +12279,34 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.21, postcss@npm:^8.4.24, postcss@npm:^8.4.26, postcss@npm:^8.4.38": - version: 8.4.41 - resolution: "postcss@npm:8.4.41" +"postcss@npm:^8.4.21, postcss@npm:^8.4.24, postcss@npm:^8.4.33, postcss@npm:^8.5.4": + version: 8.5.6 + resolution: "postcss@npm:8.5.6" dependencies: - nanoid: "npm:^3.3.7" - picocolors: "npm:^1.0.1" - source-map-js: "npm:^1.2.0" - checksum: 10/6e6176c2407eff60493ca60a706c6b7def20a722c3adda94ea1ece38345eb99964191336fd62b62652279cec6938e79e0b1e1d477142c8d3516e7a725a74ee37 + nanoid: "npm:^3.3.11" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10/9e4fbe97574091e9736d0e82a591e29aa100a0bf60276a926308f8c57249698935f35c5d2f4e80de778d0cbb8dcffab4f383d85fd50c5649aca421c3df729b86 languageName: node linkType: hard -"postman-code-generators@npm:^1.10.1": - version: 1.14.1 - resolution: "postman-code-generators@npm:1.14.1" +"postman-code-generators@npm:^2.0.0": + version: 2.1.0 + resolution: "postman-code-generators@npm:2.1.0" dependencies: async: "npm:3.2.2" detect-package-manager: "npm:3.0.2" lodash: "npm:4.17.21" path: "npm:0.12.7" - postman-collection: "npm:^4.4.0" + postman-collection: "npm:^5.0.0" shelljs: "npm:0.8.5" - checksum: 10/48d6a45a41ddaf9615a11b035daddabb53685c902d7059e39eea7fa7452b2c08c7020832812f0f9dfbbb5196b460a7647b06840649ba8035d80a7ddd477ff188 + checksum: 10/44333af42f96b635930dfa2ee1846f535d1165de51b7c22c773ac21d3655b3af0e7e7973ba9f5c32f4f9c3bdd1c487a40c9ad4284012c437daa01d1b4b31b7bc languageName: node linkType: hard -"postman-collection@npm:^4.4.0": - version: 4.5.0 - resolution: "postman-collection@npm:4.5.0" +"postman-collection@npm:^5.0.0, postman-collection@npm:^5.0.2": + version: 5.2.0 + resolution: "postman-collection@npm:5.2.0" dependencies: "@faker-js/faker": "npm:5.5.3" file-type: "npm:3.9.0" @@ -11878,21 +12314,21 @@ __metadata: iconv-lite: "npm:0.6.3" liquid-json: "npm:0.3.1" lodash: "npm:4.17.21" - mime-format: "npm:2.0.1" - mime-types: "npm:2.1.35" - postman-url-encoder: "npm:3.0.5" - semver: "npm:7.6.3" + mime: "npm:3.0.0" + mime-format: "npm:2.0.2" + postman-url-encoder: "npm:3.0.8" + semver: "npm:7.7.1" uuid: "npm:8.3.2" - checksum: 10/5d1d0a2a7e5450bb62130f511abb4aca02f1a46d9379cc921be39161368a65fb4ed6d40abadfc6510ce8d61d8080f16a815120e80f2bb29fa4b6b44d12f3f6b8 + checksum: 10/7b4feb1c09cd225ad6440488027b9c95329ee7ad3289f96e2d7454c779fc7d19e98157773889ecf72c1a41a695ab7b63ac8a83936a71a01ad09773fc4196ba92 languageName: node linkType: hard -"postman-url-encoder@npm:3.0.5": - version: 3.0.5 - resolution: "postman-url-encoder@npm:3.0.5" +"postman-url-encoder@npm:3.0.8": + version: 3.0.8 + resolution: "postman-url-encoder@npm:3.0.8" dependencies: - punycode: "npm:^2.1.1" - checksum: 10/e4bb3698c9e19cccc33d249b0f45e93645cab043b7a56590f3a25f5c2daf3caa99fdae7801cc12d60e1ec6158ddd75a31c16834a3b4a03d5784f1768f8cfd026 + punycode: "npm:^2.3.1" + checksum: 10/9873c95137ef3f69081cfa466ca8ee8793385770a82889e15524592607f05782bcbf385a69afe31d5730de2886e8f0071728443baca0c5bbf32608dc8dda79b3 languageName: node linkType: hard @@ -11922,7 +12358,7 @@ __metadata: languageName: node linkType: hard -"prism-react-renderer@npm:^2.1.0, prism-react-renderer@npm:^2.3.0, prism-react-renderer@npm:^2.4.0": +"prism-react-renderer@npm:^2.1.0, prism-react-renderer@npm:^2.3.0, prism-react-renderer@npm:^2.4.0, prism-react-renderer@npm:^2.4.1": version: 2.4.1 resolution: "prism-react-renderer@npm:2.4.1" dependencies: @@ -11982,7 +12418,7 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:^15.0.0, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2": +"prop-types@npm:^15.6.2, prop-types@npm:^15.7.2": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -12017,28 +12453,14 @@ __metadata: languageName: node linkType: hard -"public-encrypt@npm:^4.0.3": - version: 4.0.3 - resolution: "public-encrypt@npm:4.0.3" - dependencies: - bn.js: "npm:^4.1.0" - browserify-rsa: "npm:^4.0.0" - create-hash: "npm:^1.1.0" - parse-asn1: "npm:^5.0.0" - randombytes: "npm:^2.0.1" - safe-buffer: "npm:^5.1.2" - checksum: 10/059d64da8ba9ea0733377d23b57b6cbe5be663c8eb187b9c051eec85f799ff95c4e194eb3a69db07cc1f73a2a63519e67716ae9b8630e13e7149840d0abe044d - languageName: node - linkType: hard - -"punycode@npm:^1.3.2, punycode@npm:^1.4.1": +"punycode@npm:^1.4.1": version: 1.4.1 resolution: "punycode@npm:1.4.1" checksum: 10/af2700dde1a116791ff8301348ff344c47d6c224e875057237d1b5112035655fb07a6175cfdb8bf0e3a8cdfd2dc82b3a622e0aefd605566c0e949a6d0d1256a4 languageName: node linkType: hard -"punycode@npm:^2.1.0, punycode@npm:^2.1.1, punycode@npm:^2.3.0": +"punycode@npm:^2.1.0, punycode@npm:^2.3.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: 10/febdc4362bead22f9e2608ff0171713230b57aff9dddc1c273aa2a651fbd366f94b7d6a71d78342a7c0819906750351ca7f2edd26ea41b626d87d6a13d1bd059 @@ -12054,19 +12476,28 @@ __metadata: languageName: node linkType: hard -"qs@npm:^6.12.3, qs@npm:~6.14.0": - version: 6.14.0 - resolution: "qs@npm:6.14.0" +"pvtsutils@npm:^1.3.6": + version: 1.3.6 + resolution: "pvtsutils@npm:1.3.6" dependencies: - side-channel: "npm:^1.1.0" - checksum: 10/a60e49bbd51c935a8a4759e7505677b122e23bf392d6535b8fc31c1e447acba2c901235ecb192764013cd2781723dc1f61978b5fdd93cc31d7043d31cdc01974 + tslib: "npm:^2.8.1" + checksum: 10/d45b12f8526e13ecf15fe09b30cde65501f3300fd2a07c11b28a966d434d1f767c8a61597ecba2e19c7eb19ca0c740341a6babc67a4f741e08b1ef1095c71663 languageName: node linkType: hard -"querystring-es3@npm:^0.2.1": - version: 0.2.1 - resolution: "querystring-es3@npm:0.2.1" - checksum: 10/c99fccfe1a9c4c25ea6194fa7a559fdb83d2628f118f898af6f0ac02c4ffcd7e0576997bb80e7dfa892d193988b60e23d4968122426351819f87051862af991c +"pvutils@npm:^1.1.3": + version: 1.1.5 + resolution: "pvutils@npm:1.1.5" + checksum: 10/9a5a71603c72bf9ea3a4501e8251e3f7a56026ed059bf63a18bd9a30cac6c35cc8250b39eb6291c1cb204cdeb6660663ab9bb2c74e85a512919bb2d614e340ea + languageName: node + linkType: hard + +"qs@npm:^6.12.3, qs@npm:~6.14.0": + version: 6.14.1 + resolution: "qs@npm:6.14.1" + dependencies: + side-channel: "npm:^1.1.0" + checksum: 10/34b5ab00a910df432d55180ef39c1d1375e550f098b5ec153b41787f1a6a6d7e5f9495593c3b112b77dbc6709d0ae18e55b82847a4c2bbbb0de1e8ccbb1794c5 languageName: node linkType: hard @@ -12077,15 +12508,6 @@ __metadata: languageName: node linkType: hard -"queue@npm:6.0.2": - version: 6.0.2 - resolution: "queue@npm:6.0.2" - dependencies: - inherits: "npm:~2.0.3" - checksum: 10/3437954ef1442c86ff01a0fbe3dc6222838823b1ca97f37eff651bc20b868c0c2904424ef2c0d44cba46055f54b578f92866e573125dc9a5e8823d751e4d1585 - languageName: node - linkType: hard - "quick-lru@npm:^5.1.1": version: 5.1.1 resolution: "quick-lru@npm:5.1.1" @@ -12093,7 +12515,7 @@ __metadata: languageName: node linkType: hard -"randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.1.0": +"randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" dependencies: @@ -12102,16 +12524,6 @@ __metadata: languageName: node linkType: hard -"randomfill@npm:^1.0.4": - version: 1.0.4 - resolution: "randomfill@npm:1.0.4" - dependencies: - randombytes: "npm:^2.0.5" - safe-buffer: "npm:^5.1.0" - checksum: 10/33734bb578a868d29ee1b8555e21a36711db084065d94e019a6d03caa67debef8d6a1bfd06a2b597e32901ddc761ab483a85393f0d9a75838f1912461d4dbfc7 - languageName: node - linkType: hard - "range-parser@npm:1.2.0": version: 1.2.0 resolution: "range-parser@npm:1.2.0" @@ -12152,38 +12564,6 @@ __metadata: languageName: node linkType: hard -"react-dev-utils@npm:^12.0.1": - version: 12.0.1 - resolution: "react-dev-utils@npm:12.0.1" - dependencies: - "@babel/code-frame": "npm:^7.16.0" - address: "npm:^1.1.2" - browserslist: "npm:^4.18.1" - chalk: "npm:^4.1.2" - cross-spawn: "npm:^7.0.3" - detect-port-alt: "npm:^1.1.6" - escape-string-regexp: "npm:^4.0.0" - filesize: "npm:^8.0.6" - find-up: "npm:^5.0.0" - fork-ts-checker-webpack-plugin: "npm:^6.5.0" - global-modules: "npm:^2.0.0" - globby: "npm:^11.0.4" - gzip-size: "npm:^6.0.0" - immer: "npm:^9.0.7" - is-root: "npm:^2.1.0" - loader-utils: "npm:^3.2.0" - open: "npm:^8.4.0" - pkg-up: "npm:^3.1.0" - prompts: "npm:^2.4.2" - react-error-overlay: "npm:^6.0.11" - recursive-readdir: "npm:^2.2.2" - shell-quote: "npm:^1.7.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" - checksum: 10/4f6e04a3c4c6bc041bb85586646cff5e611049dd91f505e73cec47e284a854f28a25a4f50ff24b46e7df051b2a82c387870c8e08da232edbbbb36c01d4e94a2b - languageName: node - linkType: hard - "react-dom@npm:^18.0.2": version: 18.3.1 resolution: "react-dom@npm:18.3.1" @@ -12196,13 +12576,6 @@ __metadata: languageName: node linkType: hard -"react-error-overlay@npm:^6.0.11": - version: 6.0.11 - resolution: "react-error-overlay@npm:6.0.11" - checksum: 10/b4ac746fc4fb50da733768aadbc638d34dd56d4e46ed4b2f2d1ac54dced0c5fa5fe47ebbbf90810ada44056ed0713bba5b9b930b69f4e45466e7f59fc806c44e - languageName: node - linkType: hard - "react-fast-compare@npm:^3.2.0": version: 3.2.0 resolution: "react-fast-compare@npm:3.2.0" @@ -12210,9 +12583,9 @@ __metadata: languageName: node linkType: hard -"react-helmet-async@npm:*, react-helmet-async@npm:^1.3.0": +"react-helmet-async@npm:@slorber/react-helmet-async@1.3.0": version: 1.3.0 - resolution: "react-helmet-async@npm:1.3.0" + resolution: "@slorber/react-helmet-async@npm:1.3.0" dependencies: "@babel/runtime": "npm:^7.12.5" invariant: "npm:^2.2.4" @@ -12220,18 +12593,18 @@ __metadata: react-fast-compare: "npm:^3.2.0" shallowequal: "npm:^1.1.0" peerDependencies: - react: ^16.6.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 - checksum: 10/73d6383dd5d5794cad3837cf6b71d7e23afa6f3ba745e50a9d0d6bf42ff0ab175e4292f250ffe757f4bd782e64c37c4583fb884340cd63891deb33e144628661 + react: ^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10/76854c3a9220e1adc7b4aece55926146583d43b6bf08905d8cb6a7e3ee0ac60f7a03b285c2bb6c4aa3110e8d048e5dee4e3bdcea9c4b9b5c00db67ba002b95ce languageName: node linkType: hard -"react-hook-form@npm:^7.43.8": - version: 7.54.2 - resolution: "react-hook-form@npm:7.54.2" +"react-hook-form@npm:^7.59.0": + version: 7.71.1 + resolution: "react-hook-form@npm:7.71.1" peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - checksum: 10/b156d15b6246c76d0275e5722d9056014693e014d0e3dec06e44bf2672ee549aaba4366de5144d18c4cab29e631f3b2b84269d4fd5727ca17aad9b970fde6960 + checksum: 10/54b56aa52a6ac17fb5aa68ce072b08f50b75c2705bf878069f817c346e464c1ebfbf67be372d94cf8e620fa07ca8e64ffca71bb69071dd0290a1ef8f43eefb9d languageName: node linkType: hard @@ -12242,26 +12615,12 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^17.0.2": - version: 17.0.2 - resolution: "react-is@npm:17.0.2" - checksum: 10/73b36281e58eeb27c9cc6031301b6ae19ecdc9f18ae2d518bdb39b0ac564e65c5779405d623f1df9abf378a13858b79442480244bd579968afc1faf9a2ce5e05 - languageName: node - linkType: hard - -"react-is@npm:^18.0.0": - version: 18.3.1 - resolution: "react-is@npm:18.3.1" - checksum: 10/d5f60c87d285af24b1e1e7eaeb123ec256c3c8bdea7061ab3932e3e14685708221bf234ec50b21e10dd07f008f1b966a2730a0ce4ff67905b3872ff2042aec22 - languageName: node - linkType: hard - -"react-json-view-lite@npm:^1.2.0": - version: 1.2.1 - resolution: "react-json-view-lite@npm:1.2.1" +"react-json-view-lite@npm:^2.3.0": + version: 2.5.0 + resolution: "react-json-view-lite@npm:2.5.0" peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 - checksum: 10/2d78abee0ec5f3912d2778816cdbb7c8cafff2d021ae5cfc45baa8c0fcd0a54e969ee4a7c56ba3b4b551e789bc4a4a0b1e63652030d502488ed123790c2a7f0d + react: ^18.0.0 || ^19.0.0 + checksum: 10/196a989d3ecb6d662baeb51260f2cf1e1391e109db405343019c4fa30da1c1e6fc9c0b9aa464444b16cb5ef6867b49db547073aa73abb36b2d7d976e4dcc0dc4 languageName: node linkType: hard @@ -12272,7 +12631,7 @@ __metadata: languageName: node linkType: hard -"react-live@npm:^4.0.0": +"react-live@npm:^4.1.8": version: 4.1.8 resolution: "react-live@npm:4.1.8" dependencies: @@ -12316,33 +12675,29 @@ __metadata: languageName: node linkType: hard -"react-markdown@npm:^8.0.1": - version: 8.0.7 - resolution: "react-markdown@npm:8.0.7" +"react-markdown@npm:^10.1.0": + version: 10.1.0 + resolution: "react-markdown@npm:10.1.0" dependencies: - "@types/hast": "npm:^2.0.0" - "@types/prop-types": "npm:^15.0.0" - "@types/unist": "npm:^2.0.0" - comma-separated-tokens: "npm:^2.0.0" - hast-util-whitespace: "npm:^2.0.0" - prop-types: "npm:^15.0.0" - property-information: "npm:^6.0.0" - react-is: "npm:^18.0.0" - remark-parse: "npm:^10.0.0" - remark-rehype: "npm:^10.0.0" - space-separated-tokens: "npm:^2.0.0" - style-to-object: "npm:^0.4.0" - unified: "npm:^10.0.0" - unist-util-visit: "npm:^4.0.0" - vfile: "npm:^5.0.0" + "@types/hast": "npm:^3.0.0" + "@types/mdast": "npm:^4.0.0" + devlop: "npm:^1.0.0" + hast-util-to-jsx-runtime: "npm:^2.0.0" + html-url-attributes: "npm:^3.0.0" + mdast-util-to-hast: "npm:^13.0.0" + remark-parse: "npm:^11.0.0" + remark-rehype: "npm:^11.0.0" + unified: "npm:^11.0.0" + unist-util-visit: "npm:^5.0.0" + vfile: "npm:^6.0.0" peerDependencies: - "@types/react": ">=16" - react: ">=16" - checksum: 10/5702a2ef0b8a8cb0a085bb5101810d7446e818f7b76291238eff73cce5aaea65b95ffa28f9b4127d1fc785b6cfe0790bba261b11c5a69655ff901399d8ea6896 + "@types/react": ">=18" + react: ">=18" + checksum: 10/886c037d18266e94750abbc00c6096435bccd4da5f2d1727984bcbdf83e9f2a5cc9a6b0eecfe6c30456dc26546fee41c7f6aecbf176e6d7453963df4abefd7df languageName: node linkType: hard -"react-modal@npm:^3.15.1": +"react-modal@npm:^3.16.3": version: 3.16.3 resolution: "react-modal@npm:3.16.3" dependencies: @@ -12357,24 +12712,22 @@ __metadata: languageName: node linkType: hard -"react-redux@npm:^7.2.0": - version: 7.2.9 - resolution: "react-redux@npm:7.2.9" +"react-redux@npm:^9.2.0": + version: 9.2.0 + resolution: "react-redux@npm:9.2.0" dependencies: - "@babel/runtime": "npm:^7.15.4" - "@types/react-redux": "npm:^7.1.20" - hoist-non-react-statics: "npm:^3.3.2" - loose-envify: "npm:^1.4.0" - prop-types: "npm:^15.7.2" - react-is: "npm:^17.0.2" + "@types/use-sync-external-store": "npm:^0.0.6" + use-sync-external-store: "npm:^1.4.0" peerDependencies: - react: ^16.8.3 || ^17 || ^18 + "@types/react": ^18.2.25 || ^19 + react: ^18.0 || ^19 + redux: ^5.0.0 peerDependenciesMeta: - react-dom: + "@types/react": optional: true - react-native: + redux: optional: true - checksum: 10/1c3018bd2601e6d18339281867910b583dcbb3d8856403086e08c00abf0dfe467a94c0d1356bafa8cdf107bf1e2c9899a28486e4778e85c8bc4dfed2076b116f + checksum: 10/b3d2f89f469169475ab0a9f8914d54a336ac9bc6a31af6e8dcfe9901e6fe2cfd8c1a3f6ce7a2f7f3e0928a93fbab833b668804155715598b7f2ad89927d3ff50 languageName: node linkType: hard @@ -12435,7 +12788,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.0.1, readable-stream@npm:^2.3.8": +"readable-stream@npm:^2.0.1": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -12450,7 +12803,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.0.6, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:^3.0.6, readable-stream@npm:^3.6.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -12461,19 +12814,6 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^4.4.2": - version: 4.7.0 - resolution: "readable-stream@npm:4.7.0" - dependencies: - abort-controller: "npm:^3.0.0" - buffer: "npm:^6.0.3" - events: "npm:^3.3.0" - process: "npm:^0.11.10" - string_decoder: "npm:^1.3.0" - checksum: 10/bdf096c8ff59452ce5d08f13da9597f9fcfe400b4facfaa88e74ec057e5ad1fdfa140ffe28e5ed806cf4d2055f0b812806e962bca91dce31bc4cef08e53be3a4 - languageName: node - linkType: hard - "readdirp@npm:^4.0.1": version: 4.0.1 resolution: "readdirp@npm:4.0.1" @@ -12490,13 +12830,6 @@ __metadata: languageName: node linkType: hard -"reading-time@npm:^1.5.0": - version: 1.5.0 - resolution: "reading-time@npm:1.5.0" - checksum: 10/d52921d2563693f34e71ecc6ec97bd48ec960c44dff04384e56c47ee68cfa36749acbcaeec4d0cd1d18113e53ae67825bb067ea63ba1f86107e289573e5f584f - languageName: node - linkType: hard - "rechoir@npm:^0.6.2": version: 0.6.2 resolution: "rechoir@npm:0.6.2" @@ -12506,30 +12839,26 @@ __metadata: languageName: node linkType: hard -"recursive-readdir@npm:^2.2.2": - version: 2.2.3 - resolution: "recursive-readdir@npm:2.2.3" - dependencies: - minimatch: "npm:^3.0.5" - checksum: 10/19298852b0b87810aed5f2c81a73bfaaeb9ade7c9bf363f350fc1443f2cc3df66ecade5e102dfbb153fcd9df20342c301848e11e149e5f78759c1d55aa2c9c39 - languageName: node - linkType: hard - -"redux-thunk@npm:^2.4.2": - version: 2.4.2 - resolution: "redux-thunk@npm:2.4.2" +"redux-thunk@npm:^3.1.0": + version: 3.1.0 + resolution: "redux-thunk@npm:3.1.0" peerDependencies: - redux: ^4 - checksum: 10/9bcb1193835128ecebf1e1a1b1a37bc15e8dfbdf6b6ee1b5566dd4c8e4ca05a81175f0c6dda34ab47f87053cd13b74d9f881d59446691d7b192831852b5d7a72 + redux: ^5.0.0 + checksum: 10/38c563db5f0bbec90d2e65cc27f3c870c1b6102e0c071258734fac41cb0e51d31d894125815c2f4133b20aff231f51f028ad99bccc05a7e3249f1a5d5a959ed3 languageName: node linkType: hard -"redux@npm:^4.0.0, redux@npm:^4.2.1": - version: 4.2.1 - resolution: "redux@npm:4.2.1" - dependencies: - "@babel/runtime": "npm:^7.9.2" - checksum: 10/371e4833b671193303a7dea7803c8fdc8e0d566740c78f580e0a3b77b4161da25037626900a2205a5d616117fa6ad09a4232e5a110bd437186b5c6355a041750 +"redux@npm:^5.0.1": + version: 5.0.1 + resolution: "redux@npm:5.0.1" + checksum: 10/a373f9ed65693ead58bea5ef61c1d6bef39da9f2706db3be6f84815f3a1283230ecd1184efb1b3daa7f807d8211b0181564ca8f336fc6ee0b1e2fa0ba06737c2 + languageName: node + linkType: hard + +"reflect-metadata@npm:^0.2.2": + version: 0.2.2 + resolution: "reflect-metadata@npm:0.2.2" + checksum: 10/1c93f9ac790fea1c852fde80c91b2760420069f4862f28e6fae0c00c6937a56508716b0ed2419ab02869dd488d123c4ab92d062ae84e8739ea7417fae10c4745 languageName: node linkType: hard @@ -12540,12 +12869,12 @@ __metadata: languageName: node linkType: hard -"regenerate-unicode-properties@npm:^10.1.0": - version: 10.1.0 - resolution: "regenerate-unicode-properties@npm:10.1.0" +"regenerate-unicode-properties@npm:^10.2.2": + version: 10.2.2 + resolution: "regenerate-unicode-properties@npm:10.2.2" dependencies: regenerate: "npm:^1.4.2" - checksum: 10/25b268659898955ad105267b4efba20e361e27b233670694b683728a2800314bec3053918d3bf71b0604376fd76fe9bc9c6f80379cfb6d1e209a58de44101aac + checksum: 10/5041ee31185c4700de9dd76783fab9def51c412751190d523d621db5b8e35a6c2d91f1642c12247e7d94f84b8ae388d044baac1e88fc2ba0ac215ca8dc7bed38 languageName: node linkType: hard @@ -12556,33 +12885,17 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:^0.14.0": - version: 0.14.0 - resolution: "regenerator-runtime@npm:0.14.0" - checksum: 10/6c19495baefcf5fbb18a281b56a97f0197b5f219f42e571e80877f095320afac0bdb31dab8f8186858e6126950068c3f17a1226437881e3e70446ea66751897c - languageName: node - linkType: hard - -"regenerator-transform@npm:^0.15.2": - version: 0.15.2 - resolution: "regenerator-transform@npm:0.15.2" +"regexpu-core@npm:^6.3.1": + version: 6.4.0 + resolution: "regexpu-core@npm:6.4.0" dependencies: - "@babel/runtime": "npm:^7.8.4" - checksum: 10/c4fdcb46d11bbe32605b4b9ed76b21b8d3f241a45153e9dc6f5542fed4c7744fed459f42701f650d5d5956786bf7de57547329d1c05a9df2ed9e367b9d903302 - languageName: node - linkType: hard - -"regexpu-core@npm:^5.3.1": - version: 5.3.2 - resolution: "regexpu-core@npm:5.3.2" - dependencies: - "@babel/regjsgen": "npm:^0.8.0" regenerate: "npm:^1.4.2" - regenerate-unicode-properties: "npm:^10.1.0" - regjsparser: "npm:^0.9.1" + regenerate-unicode-properties: "npm:^10.2.2" + regjsgen: "npm:^0.8.0" + regjsparser: "npm:^0.13.0" unicode-match-property-ecmascript: "npm:^2.0.0" - unicode-match-property-value-ecmascript: "npm:^2.1.0" - checksum: 10/ed0d7c66d84c633fbe8db4939d084c780190eca11f6920807dfb8ebac59e2676952cd8f2008d9c86ae8cf0463ea5fd12c5cff09ef2ce7d51ee6b420a5eb4d177 + unicode-match-property-value-ecmascript: "npm:^2.2.1" + checksum: 10/bf5f85a502a17f127a1f922270e2ecc1f0dd071ff76a3ec9afcd6b1c2bf7eae1486d1e3b1a6d621aee8960c8b15139e6b5058a84a68e518e1a92b52e9322faf9 languageName: node linkType: hard @@ -12604,25 +12917,21 @@ __metadata: languageName: node linkType: hard -"regjsparser@npm:^0.9.1": - version: 0.9.1 - resolution: "regjsparser@npm:0.9.1" - dependencies: - jsesc: "npm:~0.5.0" - bin: - regjsparser: bin/parser - checksum: 10/be7757ef76e1db10bf6996001d1021048b5fb12f5cb470a99b8cf7f3ff943f0f0e2291c0dcdbb418b458ddc4ac10e48680a822b69ef487a0284c8b6b77beddc3 +"regjsgen@npm:^0.8.0": + version: 0.8.0 + resolution: "regjsgen@npm:0.8.0" + checksum: 10/b930f03347e4123c917d7b40436b4f87f625b8dd3e705b447ddd44804e4616c3addb7453f0902d6e914ab0446c30e816e445089bb641a4714237fe8141a0ef9d languageName: node linkType: hard -"rehype-raw@npm:^6.1.1": - version: 6.1.1 - resolution: "rehype-raw@npm:6.1.1" +"regjsparser@npm:^0.13.0": + version: 0.13.0 + resolution: "regjsparser@npm:0.13.0" dependencies: - "@types/hast": "npm:^2.0.0" - hast-util-raw: "npm:^7.2.0" - unified: "npm:^10.0.0" - checksum: 10/3599d22c45264bea52c93eec2136f50f119282c0bd4e9604aeb2421fe20db84f9c4536caebf64f29158d8c2403b6fd3b3da634211393fdda9cdd500149d00ae4 + jsesc: "npm:~3.1.0" + bin: + regjsparser: bin/parser + checksum: 10/eeaabd3454f59394cbb3bfeb15fd789e638040f37d0bee9071a9b0b85524ddc52b5f7aaaaa4847304c36fa37429e53d109c4dbf6b878cb5ffa4f4198c1042fb7 languageName: node linkType: hard @@ -12681,21 +12990,9 @@ __metadata: languageName: node linkType: hard -"remark-gfm@npm:3.0.1": - version: 3.0.1 - resolution: "remark-gfm@npm:3.0.1" - dependencies: - "@types/mdast": "npm:^3.0.0" - mdast-util-gfm: "npm:^2.0.0" - micromark-extension-gfm: "npm:^2.0.0" - unified: "npm:^10.0.0" - checksum: 10/8ec301f5fb1f52c548b5a6d7ca6a3422d55db73cd703f147c979d16dca003f065181f55404d6f3f49d33f1faca3fe56ae731ed7fe0acc00cd945a8e605f155f2 - languageName: node - linkType: hard - -"remark-gfm@npm:^4.0.0": - version: 4.0.0 - resolution: "remark-gfm@npm:4.0.0" +"remark-gfm@npm:4.0.1, remark-gfm@npm:^4.0.0": + version: 4.0.1 + resolution: "remark-gfm@npm:4.0.1" dependencies: "@types/mdast": "npm:^4.0.0" mdast-util-gfm: "npm:^3.0.0" @@ -12703,7 +13000,7 @@ __metadata: remark-parse: "npm:^11.0.0" remark-stringify: "npm:^11.0.0" unified: "npm:^11.0.0" - checksum: 10/9f7b17aae0e9dc79ba9c989c2a679baff7161e1831a87307cfa2e0e9b0c492bd8c1900cdf7305855b898a2a9fab9aa8e586d71ce49cbc1ea90f68b714c249c0d + checksum: 10/86899862cf4ae1466664d3f88c6113e30b5e84e35480aef4093890aed2297ab9872506ff1f614c63963bba7d075c326d0027a1591c11bb493f6776dad21b95f6 languageName: node linkType: hard @@ -12717,17 +13014,6 @@ __metadata: languageName: node linkType: hard -"remark-parse@npm:^10.0.0": - version: 10.0.2 - resolution: "remark-parse@npm:10.0.2" - dependencies: - "@types/mdast": "npm:^3.0.0" - mdast-util-from-markdown: "npm:^1.0.0" - unified: "npm:^10.0.0" - checksum: 10/184f48956734a58a7e157d83233e532ea289697f5ecebd1fb082cce79e6d9f5b1d3da72462356b2b3b5843643cee890280ffe3d21c9d4ad2d7d5e20bb5de7f14 - languageName: node - linkType: hard - "remark-parse@npm:^11.0.0": version: 11.0.0 resolution: "remark-parse@npm:11.0.0" @@ -12740,18 +13026,6 @@ __metadata: languageName: node linkType: hard -"remark-rehype@npm:^10.0.0": - version: 10.1.0 - resolution: "remark-rehype@npm:10.1.0" - dependencies: - "@types/hast": "npm:^2.0.0" - "@types/mdast": "npm:^3.0.0" - mdast-util-to-hast: "npm:^12.1.0" - unified: "npm:^10.0.0" - checksum: 10/cf765b639d16872404b50d5945df0ba825d14f1150397dde804e7d9e2e856a7b7343c4dc3796c85e7c18ca84f3c989bd40e476bd194fc00a5a870e8a64ec30d9 - languageName: node - linkType: hard - "remark-rehype@npm:^11.0.0": version: 11.1.0 resolution: "remark-rehype@npm:11.1.0" @@ -12789,6 +13063,13 @@ __metadata: languageName: node linkType: hard +"repeat-string@npm:^1.0.0": + version: 1.6.1 + resolution: "repeat-string@npm:1.6.1" + checksum: 10/1b809fc6db97decdc68f5b12c4d1a671c8e3f65ec4a40c238bc5200e44e85bcc52a54f78268ab9c29fcf5fe4f1343e805420056d1f30fa9a9ee4c2d93e3cc6c0 + languageName: node + linkType: hard + "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -12817,10 +13098,10 @@ __metadata: languageName: node linkType: hard -"reselect@npm:^4.1.8": - version: 4.1.8 - resolution: "reselect@npm:4.1.8" - checksum: 10/199984d9872f71cd207f4aa6e6fd2bd48d95154f7aa9b3aee3398335f39f5491059e732f28c12e9031d5d434adab2c458dc8af5afb6564d0ad37e1644445e09c +"reselect@npm:^5.1.0": + version: 5.1.1 + resolution: "reselect@npm:5.1.1" + checksum: 10/1fdae11a39ed9c8d85a24df19517c8372ee24fefea9cce3fae9eaad8e9cefbba5a3d4940c6fe31296b6addf76e035588c55798f7e6e147e1b7c0855f119e7fa5 languageName: node linkType: hard @@ -12845,29 +13126,29 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.14.2": - version: 1.22.1 - resolution: "resolve@npm:1.22.1" +"resolve@npm:^1.1.6, resolve@npm:^1.22.11": + version: 1.22.11 + resolution: "resolve@npm:1.22.11" dependencies: - is-core-module: "npm:^2.9.0" + is-core-module: "npm:^2.16.1" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10/4adcfac33f0baf6fc46d6c3a11acfad5c9345eab8bb7280d65672dc40a9694ddab6d18be2feebccf6cfc581bedd7ebfa792f6bc86db1903a41d328c23161bd23 + checksum: 10/e1b2e738884a08de03f97ee71494335eba8c2b0feb1de9ae065e82c48997f349f77a2b10e8817e147cf610bfabc4b1cb7891ee8eaf5bf80d4ad514a34c4fab0a languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.14.2#optional!builtin": - version: 1.22.1 - resolution: "resolve@patch:resolve@npm%3A1.22.1#optional!builtin::version=1.22.1&hash=c3c19d" +"resolve@patch:resolve@npm%3A^1.1.6#optional!builtin, resolve@patch:resolve@npm%3A^1.22.11#optional!builtin": + version: 1.22.11 + resolution: "resolve@patch:resolve@npm%3A1.22.11#optional!builtin::version=1.22.11&hash=c3c19d" dependencies: - is-core-module: "npm:^2.9.0" + is-core-module: "npm:^2.16.1" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10/551dd500765cce767c583747f5f21ceb51d437f539b01aee96d6ec39eb2c68a8ff5d646b083d690fe428a81329856bc1bbdb094379b8df4b3f10e7e1f6aa3839 + checksum: 10/fd342cad25e52cd6f4f3d1716e189717f2522bfd6641109fe7aa372f32b5714a296ed7c238ddbe7ebb0c1ddfe0b7f71c9984171024c97cf1b2073e3e40ff71a8 languageName: node linkType: hard @@ -12912,33 +13193,6 @@ __metadata: languageName: node linkType: hard -"ripemd160@npm:=2.0.1": - version: 2.0.1 - resolution: "ripemd160@npm:2.0.1" - dependencies: - hash-base: "npm:^2.0.0" - inherits: "npm:^2.0.1" - checksum: 10/f1a20b72b3ef897a981544c72a1fe15c2bd580f6f40e3062f7839af8e81232f746aa860964686e4b81e90929ad086f14823a9864e4e4bed3367e597fe14a0968 - languageName: node - linkType: hard - -"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": - version: 2.0.2 - resolution: "ripemd160@npm:2.0.2" - dependencies: - hash-base: "npm:^3.0.0" - inherits: "npm:^2.0.1" - checksum: 10/006accc40578ee2beae382757c4ce2908a826b27e2b079efdcd2959ee544ddf210b7b5d7d5e80467807604244e7388427330f5c6d4cd61e6edaddc5773ccc393 - languageName: node - linkType: hard - -"rtl-detect@npm:^1.0.4": - version: 1.0.4 - resolution: "rtl-detect@npm:1.0.4" - checksum: 10/92088ff8c66e283b8a730fe9542e0117e43e39b20f1294ba986a715deadb734c5b67db179943ad4f2acd0e23448038e9d49235e40fc3b999fd8ea3f75cdda69c - languageName: node - linkType: hard - "rtlcss@npm:^4.1.0": version: 4.1.1 resolution: "rtlcss@npm:4.1.1" @@ -12953,6 +13207,13 @@ __metadata: languageName: node linkType: hard +"run-applescript@npm:^7.0.0": + version: 7.1.0 + resolution: "run-applescript@npm:7.1.0" + checksum: 10/8659fb5f2717b2b37a68cbfe5f678254cf24b5a82a6df3372b180c80c7c137dcd757a4166c3887e459f59a090ca414e8ea7ca97cf3ee5123db54b3b4006d7b7a + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -12962,37 +13223,17 @@ __metadata: languageName: node linkType: hard -"sade@npm:^1.7.3": - version: 1.8.1 - resolution: "sade@npm:1.8.1" - dependencies: - mri: "npm:^1.1.0" - checksum: 10/1c67ba03c94083e0ae307ff5564ecb86c2104c0f558042fdaa40ea0054f91a63a9783f14069870f2f784336adabb70f90f22a84dc457b5a25e859aaadefe0910 - languageName: node - linkType: hard - -"safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: 10/7eb5b48f2ed9a594a4795677d5a150faa7eb54483b2318b568dc0c4fc94092a6cce5be02c7288a0500a156282f5276d5688bce7259299568d1053b2150ef374a - languageName: node - linkType: hard - -"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 10/32872cd0ff68a3ddade7a7617b8f4c2ae8764d8b7d884c651b74457967a9e0e886267d3ecc781220629c44a865167b61c375d2da6c720c840ecd73f45d5d9451 languageName: node linkType: hard -"safe-regex-test@npm:^1.1.0": - version: 1.1.0 - resolution: "safe-regex-test@npm:1.1.0" - dependencies: - call-bound: "npm:^1.0.2" - es-errors: "npm:^1.3.0" - is-regex: "npm:^1.2.1" - checksum: 10/ebdb61f305bf4756a5b023ad86067df5a11b26898573afe9e52a548a63c3bd594825d9b0e2dde2eb3c94e57e0e04ac9929d4107c394f7b8e56a4613bed46c69a +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 10/7eb5b48f2ed9a594a4795677d5a150faa7eb54483b2318b568dc0c4fc94092a6cce5be02c7288a0500a156282f5276d5688bce7259299568d1053b2150ef374a languageName: node linkType: hard @@ -13028,9 +13269,9 @@ __metadata: languageName: node linkType: hard -"sass-loader@npm:^16.0.2": - version: 16.0.4 - resolution: "sass-loader@npm:16.0.4" +"sass-loader@npm:^16.0.5": + version: 16.0.6 + resolution: "sass-loader@npm:16.0.6" dependencies: neo-async: "npm:^2.6.2" peerDependencies: @@ -13050,13 +13291,13 @@ __metadata: optional: true webpack: optional: true - checksum: 10/16e3552e04301864d59d99f1c90952e0c97cfa793a38a551b6dc19e49a9c0779ec8b3dd8ab39bc79cc4401972f13e8d5baaf577c96ea39911db5866a0b4bdcdd + checksum: 10/ff4d11c48a4286dbee0de0aa9c9225e96a4390039f8fccc3333e21b7d9ac27c4ed9572212ec733a31723ec740808f6d446aea20f1d05fd47e6ce0f23d4942fb8 languageName: node linkType: hard -"sass@npm:^1.57.1, sass@npm:^1.80.4": - version: 1.94.2 - resolution: "sass@npm:1.94.2" +"sass@npm:^1.57.1, sass@npm:^1.89.2": + version: 1.97.3 + resolution: "sass@npm:1.97.3" dependencies: "@parcel/watcher": "npm:^2.4.1" chokidar: "npm:^4.0.0" @@ -13067,7 +13308,7 @@ __metadata: optional: true bin: sass: sass.js - checksum: 10/e60c214ea93677740c9ddfad55c77fd433255bbfdd9faba137acf1215bed5ba6ad9d83efea81feb87a89283931d01f0435227e3fff37c65c263e0ee05f885328 + checksum: 10/707ef8e525ed32d375e737346140d4b675f44de208df996c2df3407f5e62f3f38226ea1faf41a9fd4b068201e67b3a7e152b9e9c3b098daa847dd480c735f038 languageName: node linkType: hard @@ -13087,18 +13328,14 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:2.7.0": - version: 2.7.0 - resolution: "schema-utils@npm:2.7.0" - dependencies: - "@types/json-schema": "npm:^7.0.4" - ajv: "npm:^6.12.2" - ajv-keywords: "npm:^3.4.1" - checksum: 10/e5afb6ecf8e9c63ce5f964cd8f2a2e7bdc8c3a63f6bc7dd5cfdc475aa90c1b9ade1555a749519c1673a0bfa203a12e04499e7d6d956163f8e7a77aaa3f12935c +"schema-dts@npm:^1.1.2": + version: 1.1.5 + resolution: "schema-dts@npm:1.1.5" + checksum: 10/74f8376449241f008349cbd938e30e2174f0c974bb5155c852bdbbb4873a0f151a12601cf2fe115ae0811a0f7ccaefd3525e21c2a8f0fab7ada9c0309230db0a languageName: node linkType: hard -"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": +"schema-utils@npm:^3.0.0": version: 3.3.0 resolution: "schema-utils@npm:3.3.0" dependencies: @@ -13109,15 +13346,15 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^4.0.0, schema-utils@npm:^4.0.1": - version: 4.2.0 - resolution: "schema-utils@npm:4.2.0" +"schema-utils@npm:^4.0.0, schema-utils@npm:^4.0.1, schema-utils@npm:^4.2.0, schema-utils@npm:^4.3.0, schema-utils@npm:^4.3.3": + version: 4.3.3 + resolution: "schema-utils@npm:4.3.3" dependencies: "@types/json-schema": "npm:^7.0.9" ajv: "npm:^8.9.0" ajv-formats: "npm:^2.1.1" ajv-keywords: "npm:^5.1.0" - checksum: 10/808784735eeb153ab7f3f787f840aa3bc63f423d2a5a7e96c9e70a0e53d0bc62d7b37ea396fc598ce19196e4fb86a72f897154b7c6ce2358bbc426166f205e14 + checksum: 10/dba77a46ad7ff0c906f7f09a1a61109e6cb56388f15a68070b93c47a691f516c6a3eb454f81a8cceb0a0e55b87f8b05770a02bfb1f4e0a3143b5887488b2f900 languageName: node linkType: hard @@ -13138,12 +13375,13 @@ __metadata: languageName: node linkType: hard -"selfsigned@npm:^2.1.1": - version: 2.1.1 - resolution: "selfsigned@npm:2.1.1" +"selfsigned@npm:^5.5.0": + version: 5.5.0 + resolution: "selfsigned@npm:5.5.0" dependencies: - node-forge: "npm:^1" - checksum: 10/6005206e0d005448274aceceaded5195b944f67a42b72d212a6169d2e5f4bdc87c15a3fe45732c544db8c7175702091aaf95403ad6632585294a6ec8cca63638 + "@peculiar/x509": "npm:^1.14.2" + pkijs: "npm:^3.3.3" + checksum: 10/fe9be2647507c3ee21dcaf5cab20e1ae4b8b84eac83d2fe4d82f9a3b6c70636f9aaeeba0089e3343dcb13fbb31ef70c2e72c41f2e2dcf38368040b49830c670e languageName: node linkType: hard @@ -13156,12 +13394,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.6.3, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.4": - version: 7.6.3 - resolution: "semver@npm:7.6.3" +"semver@npm:7.7.1, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.4": + version: 7.7.1 + resolution: "semver@npm:7.7.1" bin: semver: bin/semver.js - checksum: 10/36b1fbe1a2b6f873559cd57b238f1094a053dbfd997ceeb8757d79d1d2089c56d1321b9f1069ce263dc64cfa922fa1d2ad566b39426fe1ac6c723c1487589e10 + checksum: 10/4cfa1eb91ef3751e20fc52e47a935a0118d56d6f15a837ab814da0c150778ba2ca4f1a4d9068b33070ea4273629e615066664c2cfcd7c272caf7a8a0f6518b2c languageName: node linkType: hard @@ -13216,7 +13454,7 @@ __metadata: languageName: node linkType: hard -"serialize-javascript@npm:^6.0.0, serialize-javascript@npm:^6.0.1": +"serialize-javascript@npm:^6.0.0, serialize-javascript@npm:^6.0.1, serialize-javascript@npm:^6.0.2": version: 6.0.2 resolution: "serialize-javascript@npm:6.0.2" dependencies: @@ -13225,19 +13463,18 @@ __metadata: languageName: node linkType: hard -"serve-handler@npm:^6.1.5": - version: 6.1.5 - resolution: "serve-handler@npm:6.1.5" +"serve-handler@npm:^6.1.6": + version: 6.1.6 + resolution: "serve-handler@npm:6.1.6" dependencies: bytes: "npm:3.0.0" content-disposition: "npm:0.5.2" - fast-url-parser: "npm:1.1.3" mime-types: "npm:2.1.18" minimatch: "npm:3.1.2" path-is-inside: "npm:1.0.2" - path-to-regexp: "npm:2.2.1" + path-to-regexp: "npm:3.3.0" range-parser: "npm:1.2.0" - checksum: 10/cab6f381d380ae77ae6da017b5c7b1c25d8f0bed00cf509a18bc768c1830a0043ce53668390ad8a84366e47b353b3f1f7c9d10c7167886179f2e89cb95243a90 + checksum: 10/7e7d93eb7e69fcd9f9c5afc2ef2b46cb0072b4af13cbabef9bca725afb350ddae6857d8c8be2c256f7ce1f7677c20347801399c11caa5805c0090339f894e8f2 languageName: node linkType: hard @@ -13289,13 +13526,6 @@ __metadata: languageName: node linkType: hard -"setimmediate@npm:^1.0.4": - version: 1.0.5 - resolution: "setimmediate@npm:1.0.5" - checksum: 10/76e3f5d7f4b581b6100ff819761f04a984fa3f3990e72a6554b57188ded53efce2d3d6c0932c10f810b7c59414f85e2ab3c11521877d1dea1ce0b56dc906f485 - languageName: node - linkType: hard - "setprototypeof@npm:1.1.0": version: 1.1.0 resolution: "setprototypeof@npm:1.1.0" @@ -13310,19 +13540,6 @@ __metadata: languageName: node linkType: hard -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.11, sha.js@npm:^2.4.8": - version: 2.4.12 - resolution: "sha.js@npm:2.4.12" - dependencies: - inherits: "npm:^2.0.4" - safe-buffer: "npm:^5.2.1" - to-buffer: "npm:^1.2.0" - bin: - sha.js: bin.js - checksum: 10/39c0993592c2ab34eb2daae2199a2a1d502713765aecb611fd97c0c4ab7cd53e902d628e1962aaf384bafd28f55951fef46dcc78799069ce41d74b03aa13b5a7 - languageName: node - linkType: hard - "shallow-clone@npm:^3.0.0": version: 3.0.1 resolution: "shallow-clone@npm:3.0.1" @@ -13355,14 +13572,14 @@ __metadata: languageName: node linkType: hard -"shell-quote@npm:^1.7.3": - version: 1.7.4 - resolution: "shell-quote@npm:1.7.4" - checksum: 10/e5059820d0ffc7e9298f9ee4be528cd5820c45a87d318dac5ad4b62066069fe4e62520801af639d8723b0a36af621ef6330adf8ce532cfaeb0c874c691117f1b +"shell-quote@npm:^1.8.3": + version: 1.8.3 + resolution: "shell-quote@npm:1.8.3" + checksum: 10/5473e354637c2bd698911224129c9a8961697486cff1fb221f234d71c153fc377674029b0223d1d3c953a68d451d79366abfe53d1a0b46ee1f28eb9ade928f4c languageName: node linkType: hard -"shelljs@npm:0.8.5, shelljs@npm:^0.8.5": +"shelljs@npm:0.8.5": version: 0.8.5 resolution: "shelljs@npm:0.8.5" dependencies: @@ -13548,7 +13765,7 @@ __metadata: languageName: node linkType: hard -"slugify@npm:^1.6.5": +"slugify@npm:^1.6.6": version: 1.6.6 resolution: "slugify@npm:1.6.6" checksum: 10/d0737cdedc834c50f74227bc1a1cf4f449f3575893f031b0e8c59f501c73526c866a23e47261b262c7acdaaaaf30d6f9e8aaae22772b3f56e858ac84c35efa7b @@ -13611,10 +13828,10 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.0": - version: 1.2.0 - resolution: "source-map-js@npm:1.2.0" - checksum: 10/74f331cfd2d121c50790c8dd6d3c9de6be21926de80583b23b37029b0f37aefc3e019fa91f9a10a5e120c08135297e1ecf312d561459c45908cb1e0e365f49e5 +"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10/ff9d8c8bf096d534a5b7707e0382ef827b4dd360a577d3f34d2b9f48e12c9d230b5747974ee7c607f0df65113732711bb701fe9ece3c7edbd43cb2294d707df3 languageName: node linkType: hard @@ -13720,32 +13937,10 @@ __metadata: languageName: node linkType: hard -"std-env@npm:^3.0.1": - version: 3.3.1 - resolution: "std-env@npm:3.3.1" - checksum: 10/8106b4ed17791a0ab7797313516f59e5cc90c0d63b72f1f77219c2d085272874cf534b0580775560c106ce99dbb7a3639c4eed4194127206bae05f2ae091b069 - languageName: node - linkType: hard - -"stream-browserify@npm:^3.0.0": - version: 3.0.0 - resolution: "stream-browserify@npm:3.0.0" - dependencies: - inherits: "npm:~2.0.4" - readable-stream: "npm:^3.5.0" - checksum: 10/05a3cd0a0ce2d568dbdeb69914557c26a1b0a9d871839666b692eae42b96189756a3ed685affc90dab64ff588a8524c8aec6d85072c07905a1f0d941ea68f956 - languageName: node - linkType: hard - -"stream-http@npm:^3.2.0": - version: 3.2.0 - resolution: "stream-http@npm:3.2.0" - dependencies: - builtin-status-codes: "npm:^3.0.0" - inherits: "npm:^2.0.4" - readable-stream: "npm:^3.6.0" - xtend: "npm:^4.0.2" - checksum: 10/4f85738cbc6de70ecf0a04bc38b6092b4d91dd5317d3d93c88a84c48e63b82a8724ab5fd591df9f587b5139fe439d1748e4e3db3cb09c2b1e23649cb9d89859e +"std-env@npm:^3.7.0": + version: 3.10.0 + resolution: "std-env@npm:3.10.0" + checksum: 10/19c9cda4f370b1ffae2b8b08c72167d8c3e5cfa972aaf5c6873f85d0ed2faa729407f5abb194dc33380708c00315002febb6f1e1b484736bfcf9361ad366013a languageName: node linkType: hard @@ -13771,7 +13966,7 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": +"string_decoder@npm:^1.1.1": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" dependencies: @@ -13904,15 +14099,6 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: "npm:^3.0.0" - checksum: 10/5f505c6fa3c6e05873b43af096ddeb22159831597649881aeb8572d6fe3b81e798cc10840d0c9735e0026b250368851b7f77b65e84f4e4daa820a4f69947f55b - languageName: node - linkType: hard - "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -13985,29 +14171,22 @@ __metadata: languageName: node linkType: hard -"swc-loader@npm:^0.2.3": - version: 0.2.6 - resolution: "swc-loader@npm:0.2.6" +"swc-loader@npm:^0.2.3, swc-loader@npm:^0.2.6": + version: 0.2.7 + resolution: "swc-loader@npm:0.2.7" dependencies: "@swc/counter": "npm:^0.1.3" peerDependencies: "@swc/core": ^1.2.147 webpack: ">=2" - checksum: 10/fe90948c02a51bb8ffcff1ce3590e01dc12860b0bb7c9e22052b14fa846ed437781ae265614a5e14344bea22001108780f00a6e350e28c0b3499bc4cd11335fb + checksum: 10/15cbc3769209f7e2f927e49c19a5ef30fe03663bd34688289c003d966c7dfe782eec39de77c454aa7465ce84138d8bc31257b736b32ff3be10191f1de88cbbf5 languageName: node linkType: hard -"tapable@npm:^1.0.0": - version: 1.1.3 - resolution: "tapable@npm:1.1.3" - checksum: 10/1cec71f00f9a6cb1d88961b5d4f2dead4e185508b18b1bf1e688c8135039a391dd3e12b0887232b682ef28f1ef6f0c5e9a48794f6f5ef68f35d05de7e7a0a578 - languageName: node - linkType: hard - -"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0": - version: 2.2.1 - resolution: "tapable@npm:2.2.1" - checksum: 10/1769336dd21481ae6347611ca5fca47add0962fd8e80466515032125eca0084a4f0ede11e65341b9c0018ef4e1cf1ad820adbb0fba7cc99865c6005734000b0a +"tapable@npm:^2.0.0, tapable@npm:^2.2.0, tapable@npm:^2.2.1, tapable@npm:^2.3.0": + version: 2.3.0 + resolution: "tapable@npm:2.3.0" + checksum: 10/496a841039960533bb6e44816a01fffc2a1eb428bb2051ecab9e87adf07f19e1f937566cbbbb09dceff31163c0ffd81baafcad84db900b601f0155dd0b37e9f2 languageName: node linkType: hard @@ -14025,15 +14204,15 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.3.10, terser-webpack-plugin@npm:^5.3.9": - version: 5.3.10 - resolution: "terser-webpack-plugin@npm:5.3.10" +"terser-webpack-plugin@npm:^5.3.16, terser-webpack-plugin@npm:^5.3.9": + version: 5.3.16 + resolution: "terser-webpack-plugin@npm:5.3.16" dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.20" + "@jridgewell/trace-mapping": "npm:^0.3.25" jest-worker: "npm:^27.4.5" - schema-utils: "npm:^3.1.1" - serialize-javascript: "npm:^6.0.1" - terser: "npm:^5.26.0" + schema-utils: "npm:^4.3.0" + serialize-javascript: "npm:^6.0.2" + terser: "npm:^5.31.1" peerDependencies: webpack: ^5.1.0 peerDependenciesMeta: @@ -14043,28 +14222,21 @@ __metadata: optional: true uglify-js: optional: true - checksum: 10/fb1c2436ae1b4e983be043fa0a3d355c047b16b68f102437d08c736d7960c001e7420e2f722b9d99ce0dc70ca26a68cc63c0b82bc45f5b48671142b352a9d938 + checksum: 10/09dfbff602acfa114cdd174254b69a04adbc47856021ab351e37982202fd1ec85e0b62ffd5864c98beb8e96aef2f43da490b3448b4541db539c2cff6607394a6 languageName: node linkType: hard -"terser@npm:^5.10.0, terser@npm:^5.15.1, terser@npm:^5.26.0": - version: 5.34.1 - resolution: "terser@npm:5.34.1" +"terser@npm:^5.10.0, terser@npm:^5.15.1, terser@npm:^5.31.1": + version: 5.46.0 + resolution: "terser@npm:5.46.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" - acorn: "npm:^8.8.2" + acorn: "npm:^8.15.0" commander: "npm:^2.20.0" source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10/4389f39b5b841e2a7795ee733b54bf8fc44f8784a78c213dae32c7e6adc66c3bb258ebdcbacb8e7f1fa08fceb20bfc4ce4f7666d42bbfc29ab71126e89614c34 - languageName: node - linkType: hard - -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: 10/4383b5baaeffa9bb4cda2ac33a4aa2e6d1f8aaf811848bf73513a9b88fd76372dc461f6fd6d2e9cb5100f48b473be32c6f95bd983509b7d92bb4d92c10747452 + checksum: 10/331e4f5a165d91d16ac6a95b510d4f5ef24679e4bc9e1b4e4182e89b7245f614d24ce0def583e2ca3ca45f82ba810991e0c5b66dd4353a6e0b7082786af6bd35 languageName: node linkType: hard @@ -14086,6 +14258,15 @@ __metadata: languageName: node linkType: hard +"thingies@npm:^2.5.0": + version: 2.5.0 + resolution: "thingies@npm:2.5.0" + peerDependencies: + tslib: ^2 + checksum: 10/b8b028a474aab798ff12ad5a5648306059976d3e23870327ae4ef640012953314b1d7f208dd5a8e9ebaeee6dd1cdb05503bb829699ee8f36514c37f771f2f035 + languageName: node + linkType: hard + "thunky@npm:^1.0.2": version: 1.1.0 resolution: "thunky@npm:1.1.0" @@ -14093,15 +14274,6 @@ __metadata: languageName: node linkType: hard -"timers-browserify@npm:^2.0.12": - version: 2.0.12 - resolution: "timers-browserify@npm:2.0.12" - dependencies: - setimmediate: "npm:^1.0.4" - checksum: 10/ec37ae299066bef6c464dcac29c7adafba1999e7227a9bdc4e105a459bee0f0b27234a46bfd7ab4041da79619e06a58433472867a913d01c26f8a203f87cee70 - languageName: node - linkType: hard - "tiny-invariant@npm:^1.0.2": version: 1.3.1 resolution: "tiny-invariant@npm:1.3.1" @@ -14116,21 +14288,10 @@ __metadata: languageName: node linkType: hard -"to-buffer@npm:^1.2.0": - version: 1.2.1 - resolution: "to-buffer@npm:1.2.1" - dependencies: - isarray: "npm:^2.0.5" - safe-buffer: "npm:^5.2.1" - typed-array-buffer: "npm:^1.0.3" - checksum: 10/f8d03f070b8567d9c949f1b59c8d47c83ed2e59b50b5449258f931df9a1fcb751aa8bb8756a9345adc529b6b1822521157c48e1a7d01779a47185060d7bf96d4 - languageName: node - linkType: hard - -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: 10/be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 +"tinypool@npm:^1.0.2": + version: 1.1.1 + resolution: "tinypool@npm:1.1.1" + checksum: 10/0d54139e9dbc6ef33349768fa78890a4d708d16a7ab68e4e4ef3bb740609ddf0f9fd13292c2f413fbba756166c97051a657181c8f7ae92ade690604f183cc01d languageName: node linkType: hard @@ -14164,6 +14325,15 @@ __metadata: languageName: node linkType: hard +"tree-dump@npm:^1.0.3, tree-dump@npm:^1.1.0": + version: 1.1.0 + resolution: "tree-dump@npm:1.1.0" + peerDependencies: + tslib: 2 + checksum: 10/2c20118d2671996aa6f1ba1310cef1404fb525bde5d989ab542013f62b23a3633c0f0b32cbd516ee6205051ec21912b2470dabca006d19c9eba0740b567e2b60 + languageName: node + linkType: hard + "trim-lines@npm:^3.0.0": version: 3.0.1 resolution: "trim-lines@npm:3.0.1" @@ -14185,17 +14355,33 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.3, tslib@npm:^2.6.0": - version: 2.6.2 - resolution: "tslib@npm:2.6.2" - checksum: 10/bd26c22d36736513980091a1e356378e8b662ded04204453d353a7f34a4c21ed0afc59b5f90719d4ba756e581a162ecbf93118dc9c6be5acf70aa309188166ca +"tslib@npm:^1.9.3": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: 10/7dbf34e6f55c6492637adb81b555af5e3b4f9cc6b998fb440dac82d3b42bdc91560a35a5fb75e20e24a076c651438234da6743d139e4feabf0783f3cdfe1dddb languageName: node linkType: hard -"tty-browserify@npm:^0.0.1": - version: 0.0.1 - resolution: "tty-browserify@npm:0.0.1" - checksum: 10/93b745d43fa5a7d2b948fa23be8d313576d1d884b48acd957c07710bac1c0d8ac34c0556ad4c57c73d36e11741763ef66b3fb4fb97b06b7e4d525315a3cd45f5 +"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.4.0, tslib@npm:^2.6.0, tslib@npm:^2.8.1": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 + languageName: node + linkType: hard + +"tsyringe@npm:^4.10.0": + version: 4.10.0 + resolution: "tsyringe@npm:4.10.0" + dependencies: + tslib: "npm:^1.9.3" + checksum: 10/b42660dc112cee2db02b3d69f2ef6a6a9d185afd96b18d8f88e47c1e62be94b69a9f5a58fcfdb2a3fbb7c6c175b8162ea00f7db6499bf333ce945e570e31615c + languageName: node + linkType: hard + +"type-fest@npm:^0.21.3": + version: 0.21.3 + resolution: "type-fest@npm:0.21.3" + checksum: 10/f4254070d9c3d83a6e573bcb95173008d73474ceadbbf620dd32d273940ca18734dff39c2b2480282df9afe5d1675ebed5499a00d791758748ea81f61a38961f languageName: node linkType: hard @@ -14213,13 +14399,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^4.4.0": - version: 4.33.0 - resolution: "type-fest@npm:4.33.0" - checksum: 10/0d179e66fa765bd0a25a785b12dc797f90f2f92bdb8c9c8a789f3fd8e5a4492444e7ef83551b3b8463aeab24fd6195761e26b03174722de636b4b75aa5726fb7 - languageName: node - linkType: hard - "type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" @@ -14230,17 +14409,6 @@ __metadata: languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.3": - version: 1.0.3 - resolution: "typed-array-buffer@npm:1.0.3" - dependencies: - call-bound: "npm:^1.0.3" - es-errors: "npm:^1.3.0" - is-typed-array: "npm:^1.1.14" - checksum: 10/3fb91f0735fb413b2bbaaca9fabe7b8fc14a3fa5a5a7546bab8a57e755be0e3788d893195ad9c2b842620592de0e68d4c077d4c2c41f04ec25b8b5bb82fa9a80 - languageName: node - linkType: hard - "typedarray-to-buffer@npm:^3.1.5": version: 3.1.5 resolution: "typedarray-to-buffer@npm:3.1.5" @@ -14294,10 +14462,10 @@ __metadata: languageName: node linkType: hard -"unicode-match-property-value-ecmascript@npm:^2.1.0": - version: 2.1.0 - resolution: "unicode-match-property-value-ecmascript@npm:2.1.0" - checksum: 10/06661bc8aba2a60c7733a7044f3e13085808939ad17924ffd4f5222a650f88009eb7c09481dc9c15cfc593d4ad99bd1cde8d54042733b335672591a81c52601c +"unicode-match-property-value-ecmascript@npm:^2.2.1": + version: 2.2.1 + resolution: "unicode-match-property-value-ecmascript@npm:2.2.1" + checksum: 10/a42bebebab4c82ea6d8363e487b1fb862f82d1b54af1b67eb3fef43672939b685780f092c4f235266b90225863afa1258d57e7be3578d8986a08d8fc309aabe1 languageName: node linkType: hard @@ -14308,21 +14476,6 @@ __metadata: languageName: node linkType: hard -"unified@npm:^10.0.0": - version: 10.1.2 - resolution: "unified@npm:10.1.2" - dependencies: - "@types/unist": "npm:^2.0.0" - bail: "npm:^2.0.0" - extend: "npm:^3.0.0" - is-buffer: "npm:^2.0.0" - is-plain-obj: "npm:^4.0.0" - trough: "npm:^2.0.0" - vfile: "npm:^5.0.0" - checksum: 10/6cffebcefc3290be26d25a58ba714cda943142782baf320fddf374ca3a319bdaabb006f96df4be17b8b367f5e6f6e113b1027c52ef66154846a7a110550f6688 - languageName: node - linkType: hard - "unified@npm:^11.0.0, unified@npm:^11.0.3, unified@npm:^11.0.4": version: 11.0.4 resolution: "unified@npm:11.0.4" @@ -14365,22 +14518,6 @@ __metadata: languageName: node linkType: hard -"unist-util-generated@npm:^2.0.0": - version: 2.0.1 - resolution: "unist-util-generated@npm:2.0.1" - checksum: 10/0528642918683f1518ab7a50cf8c900df10d8717b58bd2fb05aab29393b1c4050fd2740792f18d477b52f942bfb0e6e00023e985c0a7bd63859d3d836b56e4ce - languageName: node - linkType: hard - -"unist-util-is@npm:^5.0.0": - version: 5.2.1 - resolution: "unist-util-is@npm:5.2.1" - dependencies: - "@types/unist": "npm:^2.0.0" - checksum: 10/c10f6c07aad4f4830ffa8ea82b42a2c8d5cd36c7555e27889e5fee953040af321e4e6f4e52c4edb606604de75d7230a5f4bc7b71b8ac3e874a26ab595c2057e4 - languageName: node - linkType: hard - "unist-util-is@npm:^6.0.0": version: 6.0.0 resolution: "unist-util-is@npm:6.0.0" @@ -14399,15 +14536,6 @@ __metadata: languageName: node linkType: hard -"unist-util-position@npm:^4.0.0": - version: 4.0.4 - resolution: "unist-util-position@npm:4.0.4" - dependencies: - "@types/unist": "npm:^2.0.0" - checksum: 10/aedbc5d112cdab85b752a7dacd8f04233655f00e08948a42f6e49682467c6fc0c531c91acc71188da5ac8acfea9e67d72bc054127d1c4b76b31792cfb5132423 - languageName: node - linkType: hard - "unist-util-position@npm:^5.0.0": version: 5.0.0 resolution: "unist-util-position@npm:5.0.0" @@ -14427,15 +14555,6 @@ __metadata: languageName: node linkType: hard -"unist-util-stringify-position@npm:^3.0.0": - version: 3.0.3 - resolution: "unist-util-stringify-position@npm:3.0.3" - dependencies: - "@types/unist": "npm:^2.0.0" - checksum: 10/07913e4fd77fe57d95f8b2f771354f97a29082229c1ad14ceedce6bbc77b2d784ca8296563335471cdca97915e548204bd6f098ea5b808b822b4b54087662cfb - languageName: node - linkType: hard - "unist-util-stringify-position@npm:^4.0.0": version: 4.0.0 resolution: "unist-util-stringify-position@npm:4.0.0" @@ -14445,16 +14564,6 @@ __metadata: languageName: node linkType: hard -"unist-util-visit-parents@npm:^5.0.0, unist-util-visit-parents@npm:^5.1.1": - version: 5.1.3 - resolution: "unist-util-visit-parents@npm:5.1.3" - dependencies: - "@types/unist": "npm:^2.0.0" - unist-util-is: "npm:^5.0.0" - checksum: 10/5381fc57a129d478d983b988d86b72a1266d6f91fc608562b00bfa76596128d6e4d1c2b26ced64d96e55eb5d27d620081b4ee9703979bab63e1210789e781372 - languageName: node - linkType: hard - "unist-util-visit-parents@npm:^6.0.0": version: 6.0.1 resolution: "unist-util-visit-parents@npm:6.0.1" @@ -14465,17 +14574,6 @@ __metadata: languageName: node linkType: hard -"unist-util-visit@npm:^4.0.0": - version: 4.1.2 - resolution: "unist-util-visit@npm:4.1.2" - dependencies: - "@types/unist": "npm:^2.0.0" - unist-util-is: "npm:^5.0.0" - unist-util-visit-parents: "npm:^5.1.1" - checksum: 10/e3b20c6b1f5ae1b7b40bbf9be49103a342d98fad98bdf958110c20d72e5923bd3f12966b6702459bc61ab832facb5af418a79af87cefa7a8a41b892369678b13 - languageName: node - linkType: hard - "unist-util-visit@npm:^5.0.0": version: 5.0.0 resolution: "unist-util-visit@npm:5.0.0" @@ -14501,9 +14599,9 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.1": - version: 1.1.2 - resolution: "update-browserslist-db@npm:1.1.2" +"update-browserslist-db@npm:^1.2.0": + version: 1.2.3 + resolution: "update-browserslist-db@npm:1.2.3" dependencies: escalade: "npm:^3.2.0" picocolors: "npm:^1.1.1" @@ -14511,7 +14609,7 @@ __metadata: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10/e7bf8221dfb21eba4a770cd803df94625bb04f65a706aa94c567de9600fe4eb6133fda016ec471dad43b9e7959c1bffb6580b5e20a87808d2e8a13e3892699a9 + checksum: 10/059f774300efb4b084a49293143c511f3ae946d40397b5c30914e900cd5691a12b8e61b41dd54ed73d3b56c8204165a0333107dd784ccf8f8c81790bcc423175 languageName: node linkType: hard @@ -14570,7 +14668,7 @@ __metadata: languageName: node linkType: hard -"url@npm:^0.11.3": +"url@npm:^0.11.4": version: 0.11.4 resolution: "url@npm:0.11.4" dependencies: @@ -14589,6 +14687,15 @@ __metadata: languageName: node linkType: hard +"use-sync-external-store@npm:^1.4.0": + version: 1.6.0 + resolution: "use-sync-external-store@npm:1.6.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10/b40ad2847ba220695bff2d4ba4f4d60391c0fb4fb012faa7a4c18eb38b69181936f5edc55a522c4d20a788d1a879b73c3810952c9d0fd128d01cb3f22042c09e + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" @@ -14605,19 +14712,6 @@ __metadata: languageName: node linkType: hard -"util@npm:^0.12.5": - version: 0.12.5 - resolution: "util@npm:0.12.5" - dependencies: - inherits: "npm:^2.0.3" - is-arguments: "npm:^1.0.4" - is-generator-function: "npm:^1.0.7" - is-typed-array: "npm:^1.1.3" - which-typed-array: "npm:^1.1.2" - checksum: 10/61a10de7753353dd4d744c917f74cdd7d21b8b46379c1e48e1c4fd8e83f8190e6bd9978fc4e5102ab6a10ebda6019d1b36572fa4a325e175ec8b789a121f6147 - languageName: node - linkType: hard - "utila@npm:~0.4": version: 0.4.0 resolution: "utila@npm:0.4.0" @@ -14648,20 +14742,6 @@ __metadata: languageName: node linkType: hard -"uvu@npm:^0.5.0": - version: 0.5.6 - resolution: "uvu@npm:0.5.6" - dependencies: - dequal: "npm:^2.0.0" - diff: "npm:^5.0.0" - kleur: "npm:^4.0.3" - sade: "npm:^1.7.3" - bin: - uvu: bin.js - checksum: 10/66ba25afc6732249877f9f4f8b6146f3aaa97538c51cf498f55825d602c33dbb903e02c7e1547cbca6bdfbb609e07eb7ea758b5156002ac2dd5072f00606f8d9 - languageName: node - linkType: hard - "validate.io-array@npm:^1.0.3": version: 1.0.6 resolution: "validate.io-array@npm:1.0.6" @@ -14716,16 +14796,6 @@ __metadata: languageName: node linkType: hard -"vfile-location@npm:^4.0.0": - version: 4.1.0 - resolution: "vfile-location@npm:4.1.0" - dependencies: - "@types/unist": "npm:^2.0.0" - vfile: "npm:^5.0.0" - checksum: 10/c894e8e5224170d1f85288f4a1d1ebcee0780823ea2b49d881648ab360ebf01b37ecb09b1c4439a75f9a51f31a9f9742cd045e987763e367c352a1ef7c50d446 - languageName: node - linkType: hard - "vfile-location@npm:^5.0.0": version: 5.0.2 resolution: "vfile-location@npm:5.0.2" @@ -14736,16 +14806,6 @@ __metadata: languageName: node linkType: hard -"vfile-message@npm:^3.0.0": - version: 3.1.4 - resolution: "vfile-message@npm:3.1.4" - dependencies: - "@types/unist": "npm:^2.0.0" - unist-util-stringify-position: "npm:^3.0.0" - checksum: 10/423ca87f4427a403e4688d7ec663a2e6add694eefac47c945746463377428c7553bc613058841f1da83e18b68af886d3dd11cb96d582b5cc3c98e11efb7e55e9 - languageName: node - linkType: hard - "vfile-message@npm:^4.0.0": version: 4.0.2 resolution: "vfile-message@npm:4.0.2" @@ -14756,18 +14816,6 @@ __metadata: languageName: node linkType: hard -"vfile@npm:^5.0.0": - version: 5.3.7 - resolution: "vfile@npm:5.3.7" - dependencies: - "@types/unist": "npm:^2.0.0" - is-buffer: "npm:^2.0.0" - unist-util-stringify-position: "npm:^3.0.0" - vfile-message: "npm:^3.0.0" - checksum: 10/d8f59b419d4c83b3ed24f500cf02393149b728f8803f88519c18fe0733f62544fa9ab0d8425a8bc7835181d848b9ce29c014168dc45af72f416074bbe475f643 - languageName: node - linkType: hard - "vfile@npm:^6.0.0, vfile@npm:^6.0.1": version: 6.0.1 resolution: "vfile@npm:6.0.1" @@ -14779,13 +14827,6 @@ __metadata: languageName: node linkType: hard -"vm-browserify@npm:^1.1.2": - version: 1.1.2 - resolution: "vm-browserify@npm:1.1.2" - checksum: 10/ad5b17c9f7a9d9f1ed0e24c897782ab7a587c1fd40f370152482e1af154c7cf0b0bacc45c5ae76a44289881e083ae4ae127808fdff864aa9b562192aae8b5c3b - languageName: node - linkType: hard - "warning@npm:^4.0.3": version: 4.0.3 resolution: "warning@npm:4.0.3" @@ -14795,13 +14836,13 @@ __metadata: languageName: node linkType: hard -"watchpack@npm:^2.4.1": - version: 2.4.2 - resolution: "watchpack@npm:2.4.2" +"watchpack@npm:^2.4.4": + version: 2.5.1 + resolution: "watchpack@npm:2.5.1" dependencies: glob-to-regexp: "npm:^0.4.1" graceful-fs: "npm:^4.1.2" - checksum: 10/6bd4c051d9af189a6c781c3158dcb3069f432a0c144159eeb0a44117412105c61b2b683a5c9eebc4324625e0e9b76536387d0ba354594fa6cbbdf1ef60bee4c3 + checksum: 10/9c9cdd4a9f9ae146b10d15387f383f52589e4cc27b324da6be8e7e3e755255b062a69dd7f00eef2ce67b2c01e546aae353456e74f8c1350bba00462cc6375549 languageName: node linkType: hard @@ -14828,84 +14869,81 @@ __metadata: languageName: node linkType: hard -"webpack-bundle-analyzer@npm:^4.9.0": - version: 4.9.1 - resolution: "webpack-bundle-analyzer@npm:4.9.1" +"webpack-bundle-analyzer@npm:^4.10.2": + version: 4.10.2 + resolution: "webpack-bundle-analyzer@npm:4.10.2" dependencies: "@discoveryjs/json-ext": "npm:0.5.7" acorn: "npm:^8.0.4" acorn-walk: "npm:^8.0.0" commander: "npm:^7.2.0" + debounce: "npm:^1.2.1" escape-string-regexp: "npm:^4.0.0" gzip-size: "npm:^6.0.0" - is-plain-object: "npm:^5.0.0" - lodash.debounce: "npm:^4.0.8" - lodash.escape: "npm:^4.0.1" - lodash.flatten: "npm:^4.4.0" - lodash.invokemap: "npm:^4.6.0" - lodash.pullall: "npm:^4.2.0" - lodash.uniqby: "npm:^4.7.0" + html-escaper: "npm:^2.0.2" opener: "npm:^1.5.2" picocolors: "npm:^1.0.0" sirv: "npm:^2.0.3" ws: "npm:^7.3.1" bin: webpack-bundle-analyzer: lib/bin/analyzer.js - checksum: 10/1126f7ad46d926316f467523c6e512e063b9d82e3252a74b4f997f69f32005735e51a0f58345db6921a37c876256effcdb3b4cc1b2053cd91d1fe583eda18fea + checksum: 10/cb7ff9d01dc04ef23634f439ab9fe739e022cce5595cb340e01d106ed474605ce4ef50b11b47e444507d341b16650dcb3610e88944020ca6c1c38e88072d43ba languageName: node linkType: hard -"webpack-dev-middleware@npm:^5.3.1": - version: 5.3.4 - resolution: "webpack-dev-middleware@npm:5.3.4" +"webpack-dev-middleware@npm:^7.4.2": + version: 7.4.5 + resolution: "webpack-dev-middleware@npm:7.4.5" dependencies: colorette: "npm:^2.0.10" - memfs: "npm:^3.4.3" - mime-types: "npm:^2.1.31" + memfs: "npm:^4.43.1" + mime-types: "npm:^3.0.1" + on-finished: "npm:^2.4.1" range-parser: "npm:^1.2.1" schema-utils: "npm:^4.0.0" peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - checksum: 10/3004374130f31c2910da39b80e24296009653bb11caa0b8449d962b67e003d7e73d01fbcfda9be1f1f04179f66a9c39f4caf7963df54303b430e39ba5a94f7c2 + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + checksum: 10/50e9b162d740b81f14c0926beb5fa01fc6d2ae16740bab709320dd5ea1a52ebcc48b66f3db5a7262fc4dc31a7e18590db766cef5da90e77a39e3a26d3b5b1001 languageName: node linkType: hard -"webpack-dev-server@npm:^4.15.1": - version: 4.15.1 - resolution: "webpack-dev-server@npm:4.15.1" +"webpack-dev-server@npm:^5.2.2": + version: 5.2.3 + resolution: "webpack-dev-server@npm:5.2.3" dependencies: - "@types/bonjour": "npm:^3.5.9" - "@types/connect-history-api-fallback": "npm:^1.3.5" - "@types/express": "npm:^4.17.13" - "@types/serve-index": "npm:^1.9.1" - "@types/serve-static": "npm:^1.13.10" - "@types/sockjs": "npm:^0.3.33" - "@types/ws": "npm:^8.5.5" + "@types/bonjour": "npm:^3.5.13" + "@types/connect-history-api-fallback": "npm:^1.5.4" + "@types/express": "npm:^4.17.25" + "@types/express-serve-static-core": "npm:^4.17.21" + "@types/serve-index": "npm:^1.9.4" + "@types/serve-static": "npm:^1.15.5" + "@types/sockjs": "npm:^0.3.36" + "@types/ws": "npm:^8.5.10" ansi-html-community: "npm:^0.0.8" - bonjour-service: "npm:^1.0.11" - chokidar: "npm:^3.5.3" + bonjour-service: "npm:^1.2.1" + chokidar: "npm:^3.6.0" colorette: "npm:^2.0.10" - compression: "npm:^1.7.4" + compression: "npm:^1.8.1" connect-history-api-fallback: "npm:^2.0.0" - default-gateway: "npm:^6.0.3" - express: "npm:^4.17.3" + express: "npm:^4.22.1" graceful-fs: "npm:^4.2.6" - html-entities: "npm:^2.3.2" - http-proxy-middleware: "npm:^2.0.3" - ipaddr.js: "npm:^2.0.1" - launch-editor: "npm:^2.6.0" - open: "npm:^8.0.9" - p-retry: "npm:^4.5.0" - rimraf: "npm:^3.0.2" - schema-utils: "npm:^4.0.0" - selfsigned: "npm:^2.1.1" + http-proxy-middleware: "npm:^2.0.9" + ipaddr.js: "npm:^2.1.0" + launch-editor: "npm:^2.6.1" + open: "npm:^10.0.3" + p-retry: "npm:^6.2.0" + schema-utils: "npm:^4.2.0" + selfsigned: "npm:^5.5.0" serve-index: "npm:^1.9.1" sockjs: "npm:^0.3.24" spdy: "npm:^4.0.2" - webpack-dev-middleware: "npm:^5.3.1" - ws: "npm:^8.13.0" + webpack-dev-middleware: "npm:^7.4.2" + ws: "npm:^8.18.0" peerDependencies: - webpack: ^4.37.0 || ^5.0.0 + webpack: ^5.0.0 peerDependenciesMeta: webpack: optional: true @@ -14913,7 +14951,7 @@ __metadata: optional: true bin: webpack-dev-server: bin/webpack-dev-server.js - checksum: 10/fd6dfb6c71eb94696b21930ea4c2f25e95ba85fac1bbc15aa5d03af0a90712eba057901fa9131ed3e901665c95b2379208279aca61e9c48e7cda276c3caa95dd + checksum: 10/6a3d55c5d84d10b5e23a0638e0031ef85b262947fdacc86d96b7392538ad5894ac14aebef1e2b877f8d27302c71247215b7aa6713e01b1c37d31342415b1a150 languageName: node linkType: hard @@ -14927,60 +14965,77 @@ __metadata: languageName: node linkType: hard -"webpack-sources@npm:^3.2.3": - version: 3.2.3 - resolution: "webpack-sources@npm:3.2.3" - checksum: 10/a661f41795d678b7526ae8a88cd1b3d8ce71a7d19b6503da8149b2e667fc7a12f9b899041c1665d39e38245ed3a59ab68de648ea31040c3829aa695a5a45211d +"webpack-merge@npm:^6.0.1": + version: 6.0.1 + resolution: "webpack-merge@npm:6.0.1" + dependencies: + clone-deep: "npm:^4.0.1" + flat: "npm:^5.0.2" + wildcard: "npm:^2.0.1" + checksum: 10/39ab911c26237922295d9b3d0617c8ea0c438c35a3b21b05506616a10423f5ece1962bccbedec932c5db61af57999b6d055d56d1f1755c63e2701bd4a55c3887 languageName: node linkType: hard -"webpack@npm:^5.61.0, webpack@npm:^5.88.1": - version: 5.97.1 - resolution: "webpack@npm:5.97.1" +"webpack-sources@npm:^3.3.3": + version: 3.3.3 + resolution: "webpack-sources@npm:3.3.3" + checksum: 10/ec5d72607e8068467370abccbfff855c596c098baedbe9d198a557ccf198e8546a322836a6f74241492576adba06100286592993a62b63196832cdb53c8bae91 + languageName: node + linkType: hard + +"webpack@npm:^5.88.1, webpack@npm:^5.95.0": + version: 5.104.1 + resolution: "webpack@npm:5.104.1" dependencies: "@types/eslint-scope": "npm:^3.7.7" - "@types/estree": "npm:^1.0.6" + "@types/estree": "npm:^1.0.8" + "@types/json-schema": "npm:^7.0.15" "@webassemblyjs/ast": "npm:^1.14.1" "@webassemblyjs/wasm-edit": "npm:^1.14.1" "@webassemblyjs/wasm-parser": "npm:^1.14.1" - acorn: "npm:^8.14.0" - browserslist: "npm:^4.24.0" + acorn: "npm:^8.15.0" + acorn-import-phases: "npm:^1.0.3" + browserslist: "npm:^4.28.1" chrome-trace-event: "npm:^1.0.2" - enhanced-resolve: "npm:^5.17.1" - es-module-lexer: "npm:^1.2.1" + enhanced-resolve: "npm:^5.17.4" + es-module-lexer: "npm:^2.0.0" eslint-scope: "npm:5.1.1" events: "npm:^3.2.0" glob-to-regexp: "npm:^0.4.1" graceful-fs: "npm:^4.2.11" json-parse-even-better-errors: "npm:^2.3.1" - loader-runner: "npm:^4.2.0" + loader-runner: "npm:^4.3.1" mime-types: "npm:^2.1.27" neo-async: "npm:^2.6.2" - schema-utils: "npm:^3.2.0" - tapable: "npm:^2.1.1" - terser-webpack-plugin: "npm:^5.3.10" - watchpack: "npm:^2.4.1" - webpack-sources: "npm:^3.2.3" + schema-utils: "npm:^4.3.3" + tapable: "npm:^2.3.0" + terser-webpack-plugin: "npm:^5.3.16" + watchpack: "npm:^2.4.4" + webpack-sources: "npm:^3.3.3" peerDependenciesMeta: webpack-cli: optional: true bin: webpack: bin/webpack.js - checksum: 10/665bd3b8c84b20f0b1f250159865e4d3e9b76c682030313d49124d5f8e96357ccdcc799dd9fe0ebf010fdb33dbc59d9863d79676a308e868e360ac98f7c09987 + checksum: 10/c22b58fdf41d993971516154cb621d13b7b61dd744b7e2c6be972e9afcc9942694a8aaa322c07fba46448c69d663023ff53d0aeeb00eb0b125d83ace5ca8fa3c languageName: node linkType: hard -"webpackbar@npm:^5.0.2": - version: 5.0.2 - resolution: "webpackbar@npm:5.0.2" +"webpackbar@npm:^6.0.1": + version: 6.0.1 + resolution: "webpackbar@npm:6.0.1" dependencies: - chalk: "npm:^4.1.0" - consola: "npm:^2.15.3" + ansi-escapes: "npm:^4.3.2" + chalk: "npm:^4.1.2" + consola: "npm:^3.2.3" + figures: "npm:^3.2.0" + markdown-table: "npm:^2.0.0" pretty-time: "npm:^1.1.0" - std-env: "npm:^3.0.1" + std-env: "npm:^3.7.0" + wrap-ansi: "npm:^7.0.0" peerDependencies: webpack: 3 || 4 || 5 - checksum: 10/059d5bed5c52a40636e29271285de4a8f9ac2ebef8941b896fc3fb858df2bf6f7c2fdedab80d6637626b91e03686c553ff644af47deb5c44fedf32edf558396f + checksum: 10/9da47f8dcbc9173b19e41e3e1049fa451b0c02095ffa003e8c09c56aa2cc544334d1c6fff0797162a807b29090db9cf9a269cd5ec453196142543f9275cbbf70 languageName: node linkType: hard @@ -15012,31 +15067,6 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.2": - version: 1.1.18 - resolution: "which-typed-array@npm:1.1.18" - dependencies: - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.8" - call-bound: "npm:^1.0.3" - for-each: "npm:^0.3.3" - gopd: "npm:^1.2.0" - has-tostringtag: "npm:^1.0.2" - checksum: 10/11eed801b2bd08cdbaecb17aff381e0fb03526532f61acc06e6c7b9370e08062c33763a51f27825f13fdf34aabd0df6104007f4e8f96e6eaef7db0ce17a26d6e - languageName: node - linkType: hard - -"which@npm:^1.3.1": - version: 1.3.1 - resolution: "which@npm:1.3.1" - dependencies: - isexe: "npm:^2.0.0" - bin: - which: ./bin/which - checksum: 10/549dcf1752f3ee7fbb64f5af2eead4b9a2f482108b7de3e85c781d6c26d8cf6a52d37cfbe0642a155fa6470483fe892661a859c03157f24c669cf115f3bbab5e - languageName: node - linkType: hard - "which@npm:^2.0.1, which@npm:^2.0.2": version: 2.0.2 resolution: "which@npm:2.0.2" @@ -15066,10 +15096,10 @@ __metadata: languageName: node linkType: hard -"wildcard@npm:^2.0.0": - version: 2.0.0 - resolution: "wildcard@npm:2.0.0" - checksum: 10/56d4f8be540918ab3a676f0e57c9cac1d13009dc9974dbdc751a073bf71ec080376697eded083e8a8f86fcb3479135bfa9d4489e25e6c748666d3a53ee096d24 +"wildcard@npm:^2.0.0, wildcard@npm:^2.0.1": + version: 2.0.1 + resolution: "wildcard@npm:2.0.1" + checksum: 10/e0c60a12a219e4b12065d1199802d81c27b841ed6ad6d9d28240980c73ceec6f856771d575af367cbec2982d9ae7838759168b551776577f155044f5a5ba843c languageName: node linkType: hard @@ -15129,9 +15159,9 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.13.0": - version: 8.13.0 - resolution: "ws@npm:8.13.0" +"ws@npm:^8.18.0": + version: 8.19.0 + resolution: "ws@npm:8.19.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -15140,7 +15170,16 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10/1769532b6fdab9ff659f0b17810e7501831d34ecca23fd179ee64091dd93a51f42c59f6c7bb4c7a384b6c229aca8076fb312aa35626257c18081511ef62a161d + checksum: 10/26e4901e93abaf73af9f26a93707c95b4845e91a7a347ec8c569e6e9be7f9df066f6c2b817b2d685544e208207898a750b78461e6e8d810c11a370771450c31b + languageName: node + linkType: hard + +"wsl-utils@npm:^0.1.0": + version: 0.1.0 + resolution: "wsl-utils@npm:0.1.0" + dependencies: + is-wsl: "npm:^3.1.0" + checksum: 10/de4c92187e04c3c27b4478f410a02e81c351dc85efa3447bf1666f34fc80baacd890a6698ec91995631714086992036013286aea3d77e6974020d40a08e00aec languageName: node linkType: hard @@ -15151,12 +15190,12 @@ __metadata: languageName: node linkType: hard -"xml-formatter@npm:^2.6.1": - version: 2.6.1 - resolution: "xml-formatter@npm:2.6.1" +"xml-formatter@npm:^3.6.6": + version: 3.6.7 + resolution: "xml-formatter@npm:3.6.7" dependencies: - xml-parser-xo: "npm:^3.2.0" - checksum: 10/e18a4f195185d1a36b4918b23f74401d689b214ff3c5d2772e9ae6ec22b0866d0756d2d1b0b123cf2dbed9b5fbad18f01ca6092010b7f70fa037619ad3126333 + xml-parser-xo: "npm:^4.1.5" + checksum: 10/0bd9955ab43b60e0bbf55d092761f27dbe4a9871cc60554cc07f67d31a2ae50423d207b2d8f408aad7c5fb7651cc54cba325056b9ac7abcb5df246fc9826a8e3 languageName: node linkType: hard @@ -15171,17 +15210,10 @@ __metadata: languageName: node linkType: hard -"xml-parser-xo@npm:^3.2.0": - version: 3.2.0 - resolution: "xml-parser-xo@npm:3.2.0" - checksum: 10/666b373f3274e7265a23c82624dd4e89e6253776676057ced25c478c12808f5775525a5d67fa6abe33d40984082e0da35f7eb372cd26f9071287cd604ffb83c8 - languageName: node - linkType: hard - -"xtend@npm:^4.0.2": - version: 4.0.2 - resolution: "xtend@npm:4.0.2" - checksum: 10/ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a +"xml-parser-xo@npm:^4.1.5": + version: 4.1.5 + resolution: "xml-parser-xo@npm:4.1.5" + checksum: 10/0a6d24a2deb757e6595314f500cadd7d1fb2b06b92798a5bf4bdff05fc3b50815c20ec5bd101293602ca5a65f95453ec4a7320e364e060bf33ad8f0520e027a9 languageName: node linkType: hard @@ -15213,18 +15245,17 @@ __metadata: languageName: node linkType: hard -"yaml-loader@npm:^0.8.0": - version: 0.8.1 - resolution: "yaml-loader@npm:0.8.1" +"yaml-loader@npm:^0.9.0": + version: 0.9.0 + resolution: "yaml-loader@npm:0.9.0" dependencies: javascript-stringify: "npm:^2.0.1" - loader-utils: "npm:^2.0.0" yaml: "npm:^2.0.0" - checksum: 10/2969eb7d6083a95a8d95369906bbc73d124125be5f61556506d230a57b7acc872abe836bf631f89aa97d9e8198bee8d100fa68d5a6524be84cd8eb5062cf76d3 + checksum: 10/e9b4dd3363d86f5ed753ef70cacecdc9d5aae2078975b91e71b4c7b88c469140b0d7f6cfc22ba2390bf440a74a16df9ce74223393c089eba994a4750ed8a7b49 languageName: node linkType: hard -"yaml@npm:1.10.2, yaml@npm:^1.10.0, yaml@npm:^1.7.2": +"yaml@npm:1.10.2, yaml@npm:^1.10.0": version: 1.10.2 resolution: "yaml@npm:1.10.2" checksum: 10/e088b37b4d4885b70b50c9fa1b7e54bd2e27f5c87205f9deaffd1fb293ab263d9c964feadb9817a7b129a5bf30a06582cb08750f810568ecc14f3cdbabb79cb3 @@ -15260,13 +15291,6 @@ __metadata: languageName: node linkType: hard -"yocto-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "yocto-queue@npm:0.1.0" - checksum: 10/f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 - languageName: node - linkType: hard - "yocto-queue@npm:^1.0.0": version: 1.0.0 resolution: "yocto-queue@npm:1.0.0" diff --git a/mkdocs.yml b/mkdocs.yml index 45fdd2c9d6..c07ff5afc4 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -135,7 +135,6 @@ nav: - Org Data: 'integrations/ldap/org.md' - Plugins: - Intro to plugins: 'plugins/index.md' - - Existing plugins: 'plugins/existing-plugins.md' - Create a Backstage Plugin: 'plugins/create-a-plugin.md' - Plugin Development: 'plugins/plugin-development.md' - Structure of a plugin: 'plugins/structure-of-a-plugin.md' diff --git a/package.json b/package.json index c257e77d7b..d03937d567 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "root", - "version": "1.46.0", + "version": "1.48.0-next.2", "backstage": { "cli": { "new": { @@ -35,7 +35,6 @@ "clean": "backstage-cli repo clean", "create-plugin": "echo \"use 'yarn new' instead\"", "dev": "echo \"use 'yarn start' instead\"", - "dev:next": "echo \"use 'yarn start:next' instead\"", "docker-build": "yarn tsc && yarn workspace example-backend build && yarn workspace example-backend build-image", "fix": "backstage-cli repo fix --publish", "postinstall": "husky || true", @@ -57,8 +56,8 @@ "start": "backstage-cli repo start", "start-backend": "echo \"Use 'yarn start example-backend' instead\"", "start:docker": "docker compose -f docker-compose.deps.yml up --wait && BACKSTAGE_ENV=docker yarn start", + "start:legacy": "yarn start example-app-legacy example-backend", "start:microsite": "cd microsite/ && yarn start", - "start:next": "yarn start example-app-next example-backend", "storybook": "storybook dev -p 6006", "sync-issue-templates": "node ./.github/ISSUE_TEMPLATE/sync.js", "techdocs-cli": "node scripts/techdocs-cli.js", @@ -134,31 +133,38 @@ "@backstage/eslint-plugin": "workspace:*", "@backstage/repo-tools": "workspace:*", "@changesets/cli": "^2.14.0", + "@jest/environment-jsdom-abstract": "^30", "@octokit/rest": "^19.0.3", "@playwright/test": "^1.32.3", "@spotify/eslint-plugin": "^15.0.0", - "@storybook/addon-a11y": "^10.1.9", - "@storybook/addon-docs": "^10.1.9", - "@storybook/addon-links": "^10.1.9", - "@storybook/addon-themes": "^10.1.9", - "@storybook/addon-vitest": "^10.1.9", - "@storybook/react-vite": "^10.1.9", + "@storybook/addon-a11y": "^10.3.0-alpha.1", + "@storybook/addon-docs": "^10.3.0-alpha.1", + "@storybook/addon-links": "^10.3.0-alpha.1", + "@storybook/addon-mcp": "^0.2.2", + "@storybook/addon-themes": "^10.3.0-alpha.1", + "@storybook/addon-vitest": "^10.3.0-alpha.1", + "@storybook/react-vite": "^10.3.0-alpha.1", "@techdocs/cli": "workspace:*", "@types/cacheable-request": "^8.3.6", + "@types/jest": "^30", + "@types/jsdom": "^27", "@types/memjs": "^1.3.3", "@types/node": "^22.13.14", "@types/webpack": "^5.28.0", "array-to-table": "^1.0.1", "command-exists": "^1.2.9", - "cross-env": "^7.0.0", + "cross-env": "^10.0.0", "e2e-test": "workspace:*", "eslint": "^8.6.0", + "eslint-plugin-node-import": "^1.0.5", "eslint-plugin-notice": "^1.0.0", "eslint-plugin-react": "^7.28.0", - "eslint-plugin-testing-library": "^6.0.0", + "eslint-plugin-testing-library": "^7.0.0", "fs-extra": "^11.2.0", "husky": "^9.0.0", + "jest": "^30", "js-yaml": "^4.1.1", + "jsdom": "^27", "lint-staged": "^15.0.0", "madge": "^8.0.0", "minimist": "^1.2.5", @@ -168,11 +174,12 @@ "shx": "^0.4.0", "sloc": "^0.3.1", "sort-package-json": "^2.8.0", - "storybook": "^10.1.9", + "storybook": "^10.3.0-alpha.1", "ts-morph": "^24.0.0", "typedoc": "^0.28.0", "typescript": "~5.7.0", - "vite": "^7.1.5" + "vite": "^7.1.5", + "zod": "^3.25.76" }, "packageManager": "yarn@4.8.1", "engines": { diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md index cca956654d..2063f62327 100644 --- a/packages/app-defaults/CHANGELOG.md +++ b/packages/app-defaults/CHANGELOG.md @@ -1,5 +1,50 @@ # @backstage/app-defaults +## 1.7.5-next.2 + +### 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/core-app-api@1.19.5-next.1 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-permission-react@0.4.40-next.1 + - @backstage/theme@0.7.2-next.1 + +## 1.7.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.7.2-next.0 + - @backstage/core-components@0.18.7-next.1 + +## 1.7.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.6-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/core-app-api@1.19.4-next.0 + - @backstage/theme@0.7.1 + - @backstage/plugin-permission-react@0.4.40-next.0 + +## 1.7.4 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5 + +## 1.7.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + ## 1.7.3 ### Patch Changes diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json index 878e5b505b..7ce485c5d1 100644 --- a/packages/app-defaults/package.json +++ b/packages/app-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/app-defaults", - "version": "1.7.3", + "version": "1.7.5-next.2", "description": "Provides the default wiring of a Backstage App", "backstage": { "role": "web-library" @@ -52,13 +52,13 @@ "@types/react": "^18.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/app-next-example-plugin/.eslintrc.js b/packages/app-example-plugin/.eslintrc.js similarity index 100% rename from packages/app-next-example-plugin/.eslintrc.js rename to packages/app-example-plugin/.eslintrc.js diff --git a/packages/app-next-example-plugin/CHANGELOG.md b/packages/app-example-plugin/CHANGELOG.md similarity index 97% rename from packages/app-next-example-plugin/CHANGELOG.md rename to packages/app-example-plugin/CHANGELOG.md index ee1e797be4..7cbb2eec34 100644 --- a/packages/app-next-example-plugin/CHANGELOG.md +++ b/packages/app-example-plugin/CHANGELOG.md @@ -1,4 +1,27 @@ -# app-next-example-plugin +# app-example-plugin + +## 0.0.32-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.6-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + +## 0.0.31 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + +## 0.0.31-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 ## 0.0.30 diff --git a/packages/app-next-example-plugin/catalog-info.yaml b/packages/app-example-plugin/catalog-info.yaml similarity index 76% rename from packages/app-next-example-plugin/catalog-info.yaml rename to packages/app-example-plugin/catalog-info.yaml index 53869a83a9..8fef6a1706 100644 --- a/packages/app-next-example-plugin/catalog-info.yaml +++ b/packages/app-example-plugin/catalog-info.yaml @@ -1,8 +1,8 @@ apiVersion: backstage.io/v1alpha1 kind: Component metadata: - name: app-next-example-plugin - title: app-next-example-plugin + name: app-example-plugin + title: app-example-plugin description: Backstage internal example plugin spec: lifecycle: experimental diff --git a/packages/app-example-plugin/knip-report.md b/packages/app-example-plugin/knip-report.md new file mode 100644 index 0000000000..dfb081c3f9 --- /dev/null +++ b/packages/app-example-plugin/knip-report.md @@ -0,0 +1,8 @@ +# Knip report + +## Unused devDependencies (2) + +| Name | Location | Severity | +| :---------- | :----------- | :------- | +| cross-fetch | packages/app-example-plugin/package.json | error | +| msw | packages/app-example-plugin/package.json | error | diff --git a/packages/app-next-example-plugin/package.json b/packages/app-example-plugin/package.json similarity index 87% rename from packages/app-next-example-plugin/package.json rename to packages/app-example-plugin/package.json index f632f00de8..f9e8c9152e 100644 --- a/packages/app-next-example-plugin/package.json +++ b/packages/app-example-plugin/package.json @@ -1,12 +1,12 @@ { - "name": "app-next-example-plugin", - "version": "0.0.30", + "name": "app-example-plugin", + "version": "0.0.32-next.0", "description": "Backstage internal example plugin", "backstage": { "role": "frontend-plugin", "pluginId": "example", "pluginPackages": [ - "app-next-example-plugin" + "app-example-plugin" ] }, "publishConfig": { @@ -22,7 +22,7 @@ "repository": { "type": "git", "url": "https://github.com/backstage/backstage", - "directory": "packages/app-next-example-plugin" + "directory": "packages/app-example-plugin" }, "license": "Apache-2.0", "sideEffects": false, @@ -52,13 +52,13 @@ "msw": "^1.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/app-next-example-plugin/report.api.md b/packages/app-example-plugin/report.api.md similarity index 96% rename from packages/app-next-example-plugin/report.api.md rename to packages/app-example-plugin/report.api.md index bfcafbe2d2..028795ed72 100644 --- a/packages/app-next-example-plugin/report.api.md +++ b/packages/app-example-plugin/report.api.md @@ -1,4 +1,4 @@ -## API Report File for "app-next-example-plugin" +## API Report File for "app-example-plugin" > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). diff --git a/packages/app-next-example-plugin/src/Component.tsx b/packages/app-example-plugin/src/Component.tsx similarity index 100% rename from packages/app-next-example-plugin/src/Component.tsx rename to packages/app-example-plugin/src/Component.tsx diff --git a/packages/app-next-example-plugin/src/ExampleSidebarItem.tsx b/packages/app-example-plugin/src/ExampleSidebarItem.tsx similarity index 100% rename from packages/app-next-example-plugin/src/ExampleSidebarItem.tsx rename to packages/app-example-plugin/src/ExampleSidebarItem.tsx diff --git a/packages/app-next-example-plugin/src/index.ts b/packages/app-example-plugin/src/index.ts similarity index 100% rename from packages/app-next-example-plugin/src/index.ts rename to packages/app-example-plugin/src/index.ts diff --git a/packages/app-next-example-plugin/src/plugin.tsx b/packages/app-example-plugin/src/plugin.tsx similarity index 100% rename from packages/app-next-example-plugin/src/plugin.tsx rename to packages/app-example-plugin/src/plugin.tsx diff --git a/packages/app-legacy/.eslintrc.js b/packages/app-legacy/.eslintrc.js new file mode 100644 index 0000000000..e487f765b2 --- /dev/null +++ b/packages/app-legacy/.eslintrc.js @@ -0,0 +1,5 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, +}); diff --git a/packages/app-legacy/CHANGELOG.md b/packages/app-legacy/CHANGELOG.md new file mode 100644 index 0000000000..f73b970d1e --- /dev/null +++ b/packages/app-legacy/CHANGELOG.md @@ -0,0 +1,13683 @@ +# example-app-legacy + +## 0.2.118-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.0-next.2 + - @backstage/plugin-api-docs@0.13.4-next.2 + - @backstage/plugin-catalog-graph@0.5.7-next.2 + - @backstage/plugin-org@0.6.49-next.2 + - @backstage/plugin-catalog-react@2.0.0-next.2 + - @backstage/cli@0.35.4-next.2 + - @backstage/plugin-catalog@1.33.0-next.2 + - @backstage/core-app-api@1.19.5-next.1 + - @backstage/plugin-kubernetes@0.12.16-next.2 + - @backstage/plugin-scaffolder@1.35.3-next.2 + - @backstage/plugin-techdocs@1.16.3-next.2 + - @backstage/plugin-scaffolder-react@1.19.7-next.2 + - @backstage/plugin-user-settings@0.9.0-next.2 + - @backstage/plugin-home-react@0.1.35-next.1 + - @backstage/plugin-home@0.9.2-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.33-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.26-next.1 + - @backstage/integration-react@1.2.15-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.34-next.2 + - @backstage/frontend-app-api@0.15.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-permission-react@0.4.40-next.1 + - @backstage/plugin-catalog-import@0.13.10-next.2 + - @backstage/plugin-techdocs-react@1.3.8-next.1 + - @backstage/app-defaults@1.7.5-next.2 + - @backstage/plugin-notifications@0.5.14-next.2 + - @backstage/plugin-search-react@1.10.3-next.2 + - @backstage/plugin-auth-react@0.1.24-next.1 + - @backstage/plugin-mui-to-bui@0.2.4-next.2 + - @backstage/plugin-devtools@0.1.36-next.1 + - @backstage/plugin-signals@0.0.28-next.2 + - @backstage/theme@0.7.2-next.1 + - @backstage/plugin-search@1.6.0-next.2 + +## 0.2.118-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-app-api@0.15.0-next.1 + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/plugin-scaffolder@1.35.3-next.1 + - @backstage/plugin-catalog-graph@0.5.7-next.1 + - @backstage/plugin-catalog@1.33.0-next.1 + - @backstage/ui@0.12.0-next.1 + - @backstage/theme@0.7.2-next.0 + - @backstage/cli@0.35.4-next.1 + - @backstage/plugin-mui-to-bui@0.2.4-next.1 + - @backstage/plugin-search@1.6.0-next.1 + - @backstage/plugin-search-react@1.10.3-next.1 + - @backstage/plugin-api-docs@0.13.4-next.1 + - @backstage/plugin-catalog-import@0.13.10-next.1 + - @backstage/plugin-home@0.9.2-next.1 + - @backstage/plugin-kubernetes@0.12.16-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.34-next.1 + - @backstage/plugin-org@0.6.49-next.1 + - @backstage/plugin-scaffolder-react@1.19.7-next.1 + - @backstage/plugin-techdocs@1.16.3-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.33-next.1 + - @backstage/plugin-user-settings@0.8.32-next.1 + - @backstage/app-defaults@1.7.5-next.1 + - @backstage/core-components@0.18.7-next.1 + - @backstage/plugin-notifications@0.5.14-next.1 + - @backstage/plugin-signals@0.0.28-next.1 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/integration-react@1.2.15-next.1 + +## 0.2.118-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-app-api@0.14.1-next.0 + - @backstage/plugin-catalog-react@1.21.6-next.0 + - @backstage/cli@0.35.3-next.0 + - @backstage/ui@0.12.0-next.0 + - @backstage/core-components@0.18.6-next.0 + - @backstage/plugin-search-common@1.2.22-next.0 + - @backstage/plugin-scaffolder@1.35.2-next.0 + - @backstage/plugin-api-docs@0.13.4-next.0 + - @backstage/plugin-scaffolder-react@1.19.6-next.0 + - @backstage/plugin-techdocs@1.16.3-next.0 + - @backstage/plugin-devtools@0.1.36-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/core-app-api@1.19.4-next.0 + - @backstage/plugin-home@0.9.1-next.0 + - @backstage/plugin-search-react@1.10.3-next.0 + - @backstage/plugin-catalog@1.32.3-next.0 + - @backstage/plugin-catalog-graph@0.5.7-next.0 + - @backstage/plugin-catalog-import@0.13.10-next.0 + - @backstage/plugin-kubernetes@0.12.16-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.34-next.0 + - @backstage/plugin-org@0.6.49-next.0 + - @backstage/plugin-search@1.5.4-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.33-next.0 + - @backstage/plugin-user-settings@0.8.32-next.0 + - @backstage/app-defaults@1.7.5-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/integration-react@1.2.15-next.0 + - @backstage/theme@0.7.1 + - @backstage/plugin-auth-react@0.1.24-next.0 + - @backstage/plugin-catalog-common@1.1.8-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.26-next.0 + - @backstage/plugin-mui-to-bui@0.2.4-next.0 + - @backstage/plugin-notifications@0.5.14-next.0 + - @backstage/plugin-permission-react@0.4.40-next.0 + - @backstage/plugin-signals@0.0.28-next.0 + +## 0.2.117 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0 + - @backstage/plugin-catalog@1.32.2 + - @backstage/plugin-home@0.9.0 + - @backstage/cli@0.35.2 + - @backstage/core-components@0.18.5 + - @backstage/plugin-org@0.6.48 + - @backstage/plugin-mui-to-bui@0.2.3 + - @backstage/plugin-notifications@0.5.13 + - @backstage/frontend-app-api@0.14.0 + - @backstage/plugin-api-docs@0.13.3 + - @backstage/plugin-techdocs@1.16.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.25 + - @backstage/plugin-devtools@0.1.35 + - @backstage/plugin-scaffolder@1.35.1 + - @backstage/plugin-catalog-graph@0.5.6 + - @backstage/plugin-search@1.5.3 + - @backstage/plugin-scaffolder-react@1.19.5 + - @backstage/plugin-search-react@1.10.2 + - @backstage/app-defaults@1.7.4 + - @backstage/integration-react@1.2.14 + - @backstage/plugin-auth-react@0.1.23 + - @backstage/plugin-catalog-import@0.13.9 + - @backstage/plugin-catalog-react@1.21.5 + - @backstage/plugin-kubernetes@0.12.15 + - @backstage/plugin-kubernetes-cluster@0.0.33 + - @backstage/plugin-signals@0.0.27 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.32 + - @backstage/plugin-techdocs-react@1.3.7 + - @backstage/plugin-user-settings@0.8.31 + +## 0.2.117-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0-next.1 + - @backstage/plugin-catalog@1.32.2-next.2 + - @backstage/plugin-home@0.9.0-next.2 + - @backstage/plugin-api-docs@0.13.3-next.2 + - @backstage/plugin-scaffolder@1.35.1-next.2 + - @backstage/cli@0.35.2-next.1 + +## 0.2.117-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/plugin-catalog-graph@0.5.5-next.1 + - @backstage/plugin-search@1.5.2-next.1 + - @backstage/app-defaults@1.7.4-next.0 + - @backstage/cli@0.35.2-next.1 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-api-docs@0.13.3-next.1 + - @backstage/plugin-auth-react@0.1.23-next.0 + - @backstage/plugin-catalog@1.32.2-next.1 + - @backstage/plugin-catalog-import@0.13.9-next.1 + - @backstage/plugin-catalog-react@1.21.5-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.25-next.0 + - @backstage/plugin-devtools@0.1.35-next.1 + - @backstage/plugin-home@0.8.16-next.1 + - @backstage/plugin-kubernetes@0.12.15-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.33-next.1 + - @backstage/plugin-notifications@0.5.13-next.0 + - @backstage/plugin-org@0.6.48-next.1 + - @backstage/plugin-scaffolder@1.35.1-next.1 + - @backstage/plugin-scaffolder-react@1.19.5-next.1 + - @backstage/plugin-search-react@1.10.2-next.0 + - @backstage/plugin-signals@0.0.27-next.0 + - @backstage/plugin-techdocs@1.16.2-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.32-next.1 + - @backstage/plugin-techdocs-react@1.3.7-next.0 + - @backstage/plugin-user-settings@0.8.31-next.1 + +## 0.2.117-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.35.2-next.1 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-catalog-import@0.13.9-next.0 + - @backstage/plugin-scaffolder@1.35.1-next.0 + - @backstage/plugin-techdocs@1.16.2-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.32-next.0 + - @backstage/plugin-catalog@1.32.2-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.0 + - @backstage/plugin-scaffolder-react@1.19.5-next.0 + - @backstage/frontend-app-api@0.13.4-next.0 + - @backstage/plugin-api-docs@0.13.3-next.0 + - @backstage/plugin-catalog-graph@0.5.5-next.0 + - @backstage/plugin-org@0.6.48-next.0 + - @backstage/plugin-user-settings@0.8.31-next.0 + - @backstage/plugin-home@0.8.16-next.0 + - @backstage/plugin-kubernetes@0.12.15-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.33-next.0 + - @backstage/plugin-search@1.5.2-next.0 + - @backstage/plugin-search-react@1.10.1 + - @backstage/plugin-devtools@0.1.35-next.0 + +## 0.2.117-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0-next.0 + - @backstage/cli@0.35.2-next.0 + - @backstage/plugin-mui-to-bui@0.2.3-next.0 + - @backstage/app-defaults@1.7.3 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.3 + - @backstage/core-components@0.18.4 + - @backstage/core-plugin-api@1.12.1 + - @backstage/frontend-app-api@0.13.3 + - @backstage/integration-react@1.2.13 + - @backstage/theme@0.7.1 + - @backstage/plugin-api-docs@0.13.2 + - @backstage/plugin-auth-react@0.1.22 + - @backstage/plugin-catalog@1.32.1 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-graph@0.5.4 + - @backstage/plugin-catalog-import@0.13.8 + - @backstage/plugin-catalog-react@1.21.4 + - @backstage/plugin-catalog-unprocessed-entities@0.2.24 + - @backstage/plugin-devtools@0.1.34 + - @backstage/plugin-home@0.8.15 + - @backstage/plugin-kubernetes@0.12.14 + - @backstage/plugin-kubernetes-cluster@0.0.32 + - @backstage/plugin-notifications@0.5.12 + - @backstage/plugin-org@0.6.47 + - @backstage/plugin-permission-react@0.4.39 + - @backstage/plugin-scaffolder@1.35.0 + - @backstage/plugin-scaffolder-react@1.19.4 + - @backstage/plugin-search@1.5.1 + - @backstage/plugin-search-common@1.2.21 + - @backstage/plugin-search-react@1.10.1 + - @backstage/plugin-signals@0.0.26 + - @backstage/plugin-techdocs@1.16.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.31 + - @backstage/plugin-techdocs-react@1.3.6 + - @backstage/plugin-user-settings@0.8.30 + +## 0.2.116 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.19.3 + - @backstage/cli@0.35.0 + - @backstage/ui@0.10.0 + - @backstage/plugin-catalog-graph@0.5.4 + - @backstage/plugin-api-docs@0.13.2 + - @backstage/plugin-techdocs@1.16.1 + - @backstage/plugin-catalog@1.32.1 + - @backstage/plugin-search@1.5.1 + - @backstage/plugin-org@0.6.47 + - @backstage/plugin-scaffolder-react@1.19.4 + - @backstage/core-components@0.18.4 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.31 + - @backstage/plugin-catalog-react@1.21.4 + - @backstage/plugin-kubernetes@0.12.14 + - @backstage/plugin-search-react@1.10.1 + - @backstage/core-plugin-api@1.12.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.24 + - @backstage/plugin-catalog-import@0.13.8 + - @backstage/plugin-notifications@0.5.12 + - @backstage/plugin-user-settings@0.8.30 + - @backstage/plugin-scaffolder@1.35.0 + - @backstage/plugin-devtools@0.1.34 + - @backstage/plugin-home@0.8.15 + - @backstage/theme@0.7.1 + - @backstage/plugin-kubernetes-cluster@0.0.32 + - @backstage/app-defaults@1.7.3 + - @backstage/frontend-app-api@0.13.3 + - @backstage/integration-react@1.2.13 + - @backstage/plugin-auth-react@0.1.22 + - @backstage/plugin-mui-to-bui@0.2.2 + - @backstage/plugin-permission-react@0.4.39 + - @backstage/plugin-signals@0.0.26 + - @backstage/plugin-techdocs-react@1.3.6 + +## 0.2.116-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.19.3-next.1 + - @backstage/cli@0.35.0-next.2 + - @backstage/plugin-catalog-graph@0.5.4-next.1 + - @backstage/plugin-api-docs@0.13.2-next.1 + - @backstage/plugin-techdocs@1.16.1-next.2 + - @backstage/plugin-catalog@1.32.1-next.1 + - @backstage/plugin-search@1.5.1-next.1 + - @backstage/plugin-org@0.6.47-next.1 + - @backstage/plugin-scaffolder-react@1.19.4-next.2 + - @backstage/plugin-catalog-react@1.21.4-next.2 + - @backstage/core-components@0.18.4-next.2 + - @backstage/plugin-home@0.8.15-next.1 + - @backstage/plugin-scaffolder@1.34.4-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.32-next.2 + - @backstage/app-defaults@1.7.3-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/frontend-app-api@0.13.3-next.0 + - @backstage/integration-react@1.2.13-next.0 + - @backstage/theme@0.7.1-next.0 + - @backstage/ui@0.10.0-next.1 + - @backstage/plugin-auth-react@0.1.22-next.0 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-catalog-import@0.13.8-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.24-next.1 + - @backstage/plugin-devtools@0.1.34-next.0 + - @backstage/plugin-kubernetes@0.12.14-next.1 + - @backstage/plugin-mui-to-bui@0.2.2-next.1 + - @backstage/plugin-notifications@0.5.12-next.0 + - @backstage/plugin-permission-react@0.4.39-next.0 + - @backstage/plugin-search-common@1.2.21 + - @backstage/plugin-search-react@1.10.1-next.0 + - @backstage/plugin-signals@0.0.26-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.31-next.1 + - @backstage/plugin-techdocs-react@1.3.6-next.0 + - @backstage/plugin-user-settings@0.8.30-next.0 + +## 0.2.116-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.10.0-next.1 + - @backstage/core-components@0.18.4-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.31-next.1 + - @backstage/plugin-catalog-react@1.21.4-next.1 + - @backstage/plugin-scaffolder-react@1.19.4-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.24-next.1 + - @backstage/cli@0.34.6-next.1 + - @backstage/plugin-techdocs@1.16.1-next.1 + - @backstage/plugin-mui-to-bui@0.2.2-next.1 + - @backstage/plugin-kubernetes@0.12.14-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.32-next.1 + +## 0.2.116-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-graph@0.5.4-next.0 + - @backstage/ui@0.9.1-next.0 + - @backstage/plugin-kubernetes@0.12.14-next.0 + - @backstage/core-app-api@1.19.3-next.0 + - @backstage/core-plugin-api@1.12.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.24-next.0 + - @backstage/plugin-catalog-import@0.13.8-next.0 + - @backstage/plugin-catalog-react@1.21.4-next.0 + - @backstage/plugin-notifications@0.5.12-next.0 + - @backstage/plugin-user-settings@0.8.30-next.0 + - @backstage/plugin-scaffolder@1.34.4-next.0 + - @backstage/plugin-api-docs@0.13.2-next.0 + - @backstage/plugin-devtools@0.1.34-next.0 + - @backstage/plugin-techdocs@1.16.1-next.0 + - @backstage/plugin-catalog@1.32.1-next.0 + - @backstage/plugin-search@1.5.1-next.0 + - @backstage/plugin-home@0.8.15-next.0 + - @backstage/plugin-org@0.6.47-next.0 + - @backstage/cli@0.34.6-next.0 + - @backstage/theme@0.7.1-next.0 + - @backstage/plugin-mui-to-bui@0.2.2-next.0 + - @backstage/frontend-app-api@0.13.3-next.0 + - @backstage/plugin-scaffolder-react@1.19.4-next.0 + - @backstage/plugin-search-react@1.10.1-next.0 + - @backstage/plugin-signals@0.0.26-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.31-next.0 + - @backstage/plugin-techdocs-react@1.3.6-next.0 + - @backstage/integration-react@1.2.13-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.32-next.0 + - @backstage/app-defaults@1.7.3-next.0 + - @backstage/core-components@0.18.4-next.0 + - @backstage/config@1.3.6 + - @backstage/plugin-auth-react@0.1.22-next.0 + - @backstage/plugin-permission-react@0.4.39-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-search-common@1.2.21 + +## 0.2.115 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-api-docs@0.13.1 + - @backstage/ui@0.9.0 + - @backstage/plugin-org@0.6.46 + - @backstage/cli@0.34.5 + - @backstage/plugin-techdocs@1.16.0 + - @backstage/plugin-signals@0.0.25 + - @backstage/frontend-app-api@0.13.2 + - @backstage/plugin-search-react@1.10.0 + - @backstage/plugin-catalog@1.32.0 + - @backstage/plugin-search@1.5.0 + - @backstage/plugin-home@0.8.14 + - @backstage/plugin-catalog-react@1.21.3 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.30 + - @backstage/plugin-scaffolder-react@1.19.3 + - @backstage/plugin-catalog-graph@0.5.3 + - @backstage/core-components@0.18.3 + - @backstage/plugin-user-settings@0.8.29 + - @backstage/core-plugin-api@1.12.0 + - @backstage/core-app-api@1.19.2 + - @backstage/plugin-catalog-import@0.13.7 + - @backstage/plugin-permission-react@0.4.38 + - @backstage/plugin-scaffolder@1.34.3 + - @backstage/plugin-catalog-unprocessed-entities@0.2.23 + - @backstage/config@1.3.6 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-mui-to-bui@0.2.1 + - @backstage/plugin-devtools@0.1.33 + - @backstage/plugin-kubernetes@0.12.13 + - @backstage/plugin-notifications@0.5.11 + - @backstage/plugin-techdocs-react@1.3.5 + - @backstage/app-defaults@1.7.2 + - @backstage/integration-react@1.2.12 + - @backstage/plugin-auth-react@0.1.21 + - @backstage/plugin-catalog-common@1.1.7 + - @backstage/plugin-kubernetes-cluster@0.0.31 + - @backstage/plugin-search-common@1.2.21 + +## 0.2.115-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.9.0-next.2 + - @backstage/plugin-techdocs@1.16.0-next.1 + - @backstage/plugin-signals@0.0.25-next.1 + - @backstage/plugin-search-react@1.10.0-next.1 + - @backstage/plugin-catalog@1.32.0-next.1 + - @backstage/plugin-search@1.5.0-next.1 + - @backstage/cli@0.34.5-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.30-next.1 + - @backstage/plugin-catalog-react@1.21.3-next.1 + - @backstage/core-components@0.18.3-next.1 + - @backstage/core-plugin-api@1.11.2-next.1 + - @backstage/core-app-api@1.19.2-next.1 + - @backstage/plugin-catalog-graph@0.5.3-next.1 + - @backstage/plugin-scaffolder@1.34.3-next.0 + - @backstage/plugin-api-docs@0.13.1-next.1 + - @backstage/plugin-catalog-import@0.13.7-next.0 + - @backstage/plugin-org@0.6.46-next.0 + - @backstage/plugin-scaffolder-react@1.19.3-next.0 + - @backstage/plugin-user-settings@0.8.29-next.0 + +## 0.2.115-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.9.0-next.1 + - @backstage/plugin-mui-to-bui@0.2.1-next.1 + +## 0.2.115-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.34.5-next.0 + - @backstage/ui@0.8.2-next.0 + - @backstage/plugin-scaffolder-react@1.19.3-next.0 + - @backstage/plugin-techdocs@1.15.2-next.0 + - @backstage/plugin-user-settings@0.8.29-next.0 + - @backstage/plugin-permission-react@0.4.38-next.0 + - @backstage/plugin-search-react@1.9.6-next.0 + - @backstage/plugin-signals@0.0.25-next.0 + - @backstage/plugin-catalog-react@1.21.3-next.0 + - @backstage/plugin-scaffolder@1.34.3-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.23-next.0 + - @backstage/core-app-api@1.19.2-next.0 + - @backstage/core-plugin-api@1.11.2-next.0 + - @backstage/frontend-app-api@0.13.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/plugin-catalog-import@0.13.7-next.0 + - @backstage/app-defaults@1.7.2-next.0 + - @backstage/integration-react@1.2.12-next.0 + - @backstage/theme@0.7.0 + - @backstage/plugin-api-docs@0.13.1-next.0 + - @backstage/plugin-auth-react@0.1.21-next.0 + - @backstage/plugin-catalog@1.31.5-next.0 + - @backstage/plugin-catalog-common@1.1.7-next.0 + - @backstage/plugin-catalog-graph@0.5.3-next.0 + - @backstage/plugin-devtools@0.1.33-next.0 + - @backstage/plugin-home@0.8.14-next.0 + - @backstage/plugin-kubernetes@0.12.13-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.31-next.0 + - @backstage/plugin-mui-to-bui@0.2.1-next.0 + - @backstage/plugin-notifications@0.5.11-next.0 + - @backstage/plugin-org@0.6.46-next.0 + - @backstage/plugin-search@1.4.32-next.0 + - @backstage/plugin-search-common@1.2.21-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.30-next.0 + - @backstage/plugin-techdocs-react@1.3.5-next.0 + +## 0.2.114 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.8.0 + - @backstage/plugin-mui-to-bui@0.2.0 + - @backstage/plugin-catalog-graph@0.5.2 + - @backstage/plugin-scaffolder-react@1.19.2 + - @backstage/plugin-catalog-react@1.21.2 + - @backstage/core-components@0.18.2 + - @backstage/plugin-signals@0.0.24 + - @backstage/cli@0.34.4 + - @backstage/plugin-home@0.8.13 + - @backstage/plugin-org@0.6.45 + - @backstage/plugin-scaffolder@1.34.2 + - @backstage/plugin-search-react@1.9.5 + - @backstage/plugin-search@1.4.31 + - @backstage/plugin-notifications@0.5.10 + - @backstage/plugin-api-docs@0.13.0 + - @backstage/config@1.3.5 + - @backstage/plugin-user-settings@0.8.27 + - @backstage/theme@0.7.0 + - @backstage/plugin-kubernetes-cluster@0.0.30 + - @backstage/plugin-kubernetes@0.12.12 + - @backstage/frontend-app-api@0.13.1 + - @backstage/plugin-catalog@1.31.4 + - @backstage/app-defaults@1.7.1 + - @backstage/plugin-techdocs@1.15.1 + - @backstage/plugin-techdocs-react@1.3.4 + - @backstage/core-app-api@1.19.1 + - @backstage/core-plugin-api@1.11.1 + - @backstage/integration-react@1.2.11 + - @backstage/plugin-auth-react@0.1.20 + - @backstage/plugin-catalog-common@1.1.6 + - @backstage/plugin-catalog-import@0.13.6 + - @backstage/plugin-catalog-unprocessed-entities@0.2.22 + - @backstage/plugin-devtools@0.1.32 + - @backstage/plugin-permission-react@0.4.37 + - @backstage/plugin-search-common@1.2.20 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.29 + +## 0.2.114-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-mui-to-bui@0.2.0-next.0 + - @backstage/plugin-scaffolder-react@1.19.2-next.2 + - @backstage/plugin-org@0.6.45-next.2 + - @backstage/cli@0.34.4-next.2 + - @backstage/ui@0.7.2-next.1 + - @backstage/core-components@0.18.2-next.2 + - @backstage/theme@0.6.9-next.0 + - @backstage/plugin-scaffolder@1.34.2-next.2 + - @backstage/app-defaults@1.7.1-next.2 + - @backstage/plugin-home@0.8.13-next.2 + - @backstage/plugin-notifications@0.5.10-next.2 + - @backstage/plugin-search-react@1.9.5-next.2 + - @backstage/plugin-signals@0.0.24-next.2 + - @backstage/plugin-techdocs@1.15.1-next.2 + - @backstage/plugin-techdocs-react@1.3.4-next.1 + - @backstage/plugin-user-settings@0.8.27-next.2 + +## 0.2.114-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.4-next.0 + - @backstage/cli@0.34.4-next.1 + - @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/frontend-app-api@0.13.1-next.1 + - @backstage/integration-react@1.2.11-next.1 + - @backstage/plugin-catalog-import@0.13.6-next.1 + - @backstage/plugin-home@0.8.13-next.1 + - @backstage/plugin-permission-react@0.4.37-next.0 + - @backstage/plugin-techdocs@1.15.1-next.1 + - @backstage/plugin-techdocs-react@1.3.4-next.1 + - @backstage/app-defaults@1.7.1-next.1 + - @backstage/plugin-api-docs@0.13.0-next.1 + - @backstage/plugin-catalog@1.31.4-next.1 + - @backstage/plugin-catalog-graph@0.5.2-next.1 + - @backstage/plugin-catalog-react@1.21.2-next.1 + - @backstage/plugin-notifications@0.5.10-next.1 + - @backstage/plugin-org@0.6.45-next.1 + - @backstage/plugin-scaffolder@1.34.2-next.1 + - @backstage/plugin-scaffolder-react@1.19.2-next.1 + - @backstage/plugin-search@1.4.31-next.1 + - @backstage/plugin-search-react@1.9.5-next.1 + - @backstage/plugin-signals@0.0.24-next.1 + - @backstage/plugin-user-settings@0.8.27-next.1 + - @backstage/plugin-auth-react@0.1.20-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.22-next.1 + - @backstage/plugin-devtools@0.1.32-next.1 + - @backstage/plugin-kubernetes@0.12.12-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.30-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.29-next.1 + - @backstage/plugin-catalog-common@1.1.6-next.0 + - @backstage/plugin-search-common@1.2.20-next.0 + +## 0.2.114-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.7.2-next.0 + - @backstage/plugin-catalog-graph@0.5.2-next.0 + - @backstage/plugin-catalog-react@1.21.2-next.0 + - @backstage/core-components@0.18.2-next.0 + - @backstage/cli@0.34.4-next.0 + - @backstage/plugin-scaffolder@1.34.2-next.0 + - @backstage/plugin-api-docs@0.13.0-next.0 + - @backstage/plugin-catalog@1.31.4-next.0 + - @backstage/plugin-catalog-import@0.13.6-next.0 + - @backstage/plugin-home@0.8.13-next.0 + - @backstage/plugin-kubernetes@0.12.12-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.30-next.0 + - @backstage/plugin-org@0.6.45-next.0 + - @backstage/plugin-scaffolder-react@1.19.2-next.0 + - @backstage/plugin-search@1.4.31-next.0 + - @backstage/plugin-techdocs@1.15.1-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.29-next.0 + - @backstage/plugin-user-settings@0.8.27-next.0 + - @backstage/app-defaults@1.7.1-next.0 + - @backstage/integration-react@1.2.11-next.0 + - @backstage/plugin-auth-react@0.1.20-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.22-next.0 + - @backstage/plugin-devtools@0.1.32-next.0 + - @backstage/plugin-notifications@0.5.10-next.0 + - @backstage/plugin-search-react@1.9.5-next.0 + - @backstage/plugin-signals@0.0.24-next.0 + - @backstage/plugin-techdocs-react@1.3.4-next.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/frontend-app-api@0.13.1-next.0 + - @backstage/theme@0.6.8 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-permission-react@0.4.36 + - @backstage/plugin-search-common@1.2.19 + +## 0.2.113 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.34.2 + - @backstage/ui@0.7.1 + - @backstage/plugin-techdocs@1.15.0 + - @backstage/plugin-catalog-react@1.21.0 + - @backstage/plugin-notifications@0.5.9 + - @backstage/app-defaults@1.7.0 + - @backstage/plugin-catalog-graph@0.5.0 + - @backstage/plugin-org@0.6.44 + - @backstage/plugin-techdocs-react@1.3.3 + - @backstage/plugin-auth-react@0.1.19 + - @backstage/plugin-home@0.8.12 + - @backstage/core-plugin-api@1.11.0 + - @backstage/plugin-scaffolder@1.34.1 + - @backstage/plugin-user-settings@0.8.26 + - @backstage/plugin-catalog@1.31.3 + - @backstage/core-components@0.18.0 + - @backstage/frontend-app-api@0.13.0 + - @backstage/plugin-scaffolder-react@1.19.1 + - @backstage/core-app-api@1.19.0 + - @backstage/plugin-api-docs@0.12.11 + - @backstage/plugin-catalog-import@0.13.5 + - @backstage/plugin-catalog-unprocessed-entities@0.2.21 + - @backstage/plugin-devtools@0.1.31 + - @backstage/plugin-kubernetes@0.12.11 + - @backstage/plugin-search@1.4.30 + - @backstage/plugin-search-react@1.9.4 + - @backstage/plugin-signals@0.0.23 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.28 + - @backstage/integration-react@1.2.10 + - @backstage/plugin-kubernetes-cluster@0.0.29 + +## 0.2.113-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.7.1-next.0 + - @backstage/plugin-auth-react@0.1.19-next.1 + - @backstage/plugin-home@0.8.12-next.2 + - @backstage/plugin-scaffolder@1.34.1-next.2 + - @backstage/plugin-catalog-react@1.21.0-next.2 + - @backstage/core-components@0.17.6-next.1 + - @backstage/plugin-user-settings@0.8.26-next.2 + - @backstage/plugin-scaffolder-react@1.19.1-next.2 + - @backstage/plugin-catalog@1.31.3-next.2 + - @backstage/cli@0.34.2-next.2 + - @backstage/plugin-catalog-graph@0.4.23-next.2 + - @backstage/plugin-catalog-import@0.13.5-next.2 + - @backstage/plugin-org@0.6.44-next.2 + - @backstage/plugin-techdocs@1.14.2-next.2 + - @backstage/plugin-api-docs@0.12.11-next.2 + - @backstage/plugin-kubernetes@0.12.11-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.29-next.2 + - @backstage/plugin-search@1.4.30-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.28-next.0 + +## 0.2.113-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.20.2-next.1 + - @backstage/cli@0.34.2-next.1 + - @backstage/core-components@0.17.6-next.0 + - @backstage/frontend-app-api@0.12.1-next.0 + - @backstage/plugin-api-docs@0.12.11-next.1 + - @backstage/plugin-catalog@1.31.3-next.1 + - @backstage/plugin-catalog-graph@0.4.23-next.1 + - @backstage/plugin-catalog-import@0.13.5-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.21-next.1 + - @backstage/plugin-devtools@0.1.31-next.1 + - @backstage/plugin-home@0.8.12-next.1 + - @backstage/plugin-kubernetes@0.12.11-next.1 + - @backstage/plugin-notifications@0.5.9-next.1 + - @backstage/plugin-org@0.6.44-next.1 + - @backstage/plugin-scaffolder@1.34.1-next.1 + - @backstage/plugin-scaffolder-react@1.19.1-next.1 + - @backstage/plugin-search@1.4.30-next.1 + - @backstage/plugin-search-react@1.9.4-next.0 + - @backstage/plugin-signals@0.0.23-next.1 + - @backstage/plugin-techdocs@1.14.2-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.28-next.0 + - @backstage/plugin-techdocs-react@1.3.3-next.0 + - @backstage/plugin-user-settings@0.8.26-next.1 + - @backstage/integration-react@1.2.10-next.0 + - @backstage/app-defaults@1.6.6-next.0 + - @backstage/plugin-auth-react@0.1.19-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.29-next.1 + +## 0.2.113-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.34.1-next.0 + - @backstage/plugin-org@0.6.44-next.0 + - @backstage/plugin-techdocs@1.14.2-next.0 + - @backstage/plugin-catalog@1.31.3-next.0 + - @backstage/plugin-catalog-react@1.20.2-next.0 + - @backstage/app-defaults@1.6.5 + - @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-app-api@0.12.0 + - @backstage/integration-react@1.2.9 + - @backstage/theme@0.6.8 + - @backstage/ui@0.7.0 + - @backstage/plugin-api-docs@0.12.11-next.0 + - @backstage/plugin-auth-react@0.1.18 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-graph@0.4.23-next.0 + - @backstage/plugin-catalog-import@0.13.5-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.21-next.0 + - @backstage/plugin-devtools@0.1.31-next.0 + - @backstage/plugin-home@0.8.12-next.0 + - @backstage/plugin-kubernetes@0.12.11-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.29-next.0 + - @backstage/plugin-notifications@0.5.9-next.0 + - @backstage/plugin-permission-react@0.4.36 + - @backstage/plugin-scaffolder@1.34.1-next.0 + - @backstage/plugin-scaffolder-react@1.19.1-next.0 + - @backstage/plugin-search@1.4.30-next.0 + - @backstage/plugin-search-common@1.2.19 + - @backstage/plugin-search-react@1.9.3 + - @backstage/plugin-signals@0.0.23-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.27 + - @backstage/plugin-techdocs-react@1.3.2 + - @backstage/plugin-user-settings@0.8.26-next.0 + +## 0.2.112 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.31.2 + - @backstage/plugin-org@0.6.42 + - @backstage/core-components@0.17.5 + - @backstage/plugin-scaffolder-react@1.19.0 + - @backstage/plugin-scaffolder@1.34.0 + - @backstage/frontend-app-api@0.12.0 + - @backstage/ui@0.7.0 + - @backstage/cli@0.34.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.20 + - @backstage/plugin-catalog-import@0.13.4 + - @backstage/plugin-catalog-graph@0.4.22 + - @backstage/plugin-notifications@0.5.8 + - @backstage/plugin-user-settings@0.8.25 + - @backstage/plugin-search-react@1.9.3 + - @backstage/plugin-kubernetes@0.12.10 + - @backstage/plugin-api-docs@0.12.10 + - @backstage/plugin-devtools@0.1.30 + - @backstage/plugin-techdocs@1.14.0 + - @backstage/plugin-search@1.4.29 + - @backstage/plugin-home@0.8.11 + - @backstage/plugin-signals@0.0.22 + - @backstage/plugin-catalog-react@1.20.0 + - @backstage/theme@0.6.8 + - @backstage/app-defaults@1.6.5 + - @backstage/plugin-auth-react@0.1.18 + - @backstage/plugin-kubernetes-cluster@0.0.28 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.27 + - @backstage/plugin-techdocs-react@1.3.2 + +## 0.2.112-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-app-api@0.12.0-next.2 + - @backstage/cli@0.34.0-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.20-next.2 + - @backstage/plugin-catalog-import@0.13.4-next.2 + - @backstage/plugin-catalog-graph@0.4.22-next.2 + - @backstage/plugin-notifications@0.5.8-next.2 + - @backstage/plugin-user-settings@0.8.25-next.2 + - @backstage/plugin-search-react@1.9.3-next.1 + - @backstage/plugin-kubernetes@0.12.10-next.2 + - @backstage/plugin-scaffolder@1.34.0-next.2 + - @backstage/plugin-api-docs@0.12.10-next.2 + - @backstage/plugin-devtools@0.1.30-next.2 + - @backstage/plugin-techdocs@1.14.0-next.2 + - @backstage/plugin-catalog@1.31.2-next.2 + - @backstage/plugin-search@1.4.29-next.2 + - @backstage/plugin-home@0.8.11-next.2 + - @backstage/ui@0.7.0-next.2 + - @backstage/plugin-catalog-react@1.20.0-next.2 + - @backstage/plugin-signals@0.0.22-next.2 + - @backstage/core-components@0.17.5-next.1 + - @backstage/app-defaults@1.6.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 + - @backstage/integration-react@1.2.9 + - @backstage/theme@0.6.8-next.0 + - @backstage/plugin-auth-react@0.1.18-next.0 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-kubernetes-cluster@0.0.28-next.1 + - @backstage/plugin-org@0.6.42-next.2 + - @backstage/plugin-permission-react@0.4.36 + - @backstage/plugin-scaffolder-react@1.19.0-next.1 + - @backstage/plugin-search-common@1.2.19 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.27-next.0 + - @backstage/plugin-techdocs-react@1.3.2-next.0 + +## 0.2.112-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.31.2-next.1 + - @backstage/plugin-scaffolder-react@1.19.0-next.1 + - @backstage/plugin-scaffolder@1.34.0-next.1 + - @backstage/ui@0.7.0-next.1 + - @backstage/plugin-home@0.8.11-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.20-next.1 + - @backstage/frontend-app-api@0.11.5-next.1 + - @backstage/plugin-catalog-import@0.13.4-next.1 + - @backstage/plugin-notifications@0.5.8-next.1 + - @backstage/plugin-kubernetes@0.12.10-next.1 + - @backstage/plugin-api-docs@0.12.10-next.1 + - @backstage/plugin-devtools@0.1.30-next.1 + - @backstage/plugin-techdocs@1.14.0-next.1 + - @backstage/plugin-signals@0.0.22-next.1 + - @backstage/plugin-search@1.4.29-next.1 + - @backstage/plugin-catalog-react@1.20.0-next.1 + - @backstage/theme@0.6.8-next.0 + - @backstage/cli@0.33.2-next.0 + - @backstage/plugin-catalog-graph@0.4.22-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.28-next.1 + - @backstage/plugin-org@0.6.42-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.27-next.0 + - @backstage/plugin-user-settings@0.8.25-next.1 + - @backstage/plugin-search-react@1.9.3-next.0 + - @backstage/plugin-techdocs-react@1.3.2-next.0 + - @backstage/app-defaults@1.6.5-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 + - @backstage/integration-react@1.2.9 + - @backstage/plugin-auth-react@0.1.18-next.0 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-permission-react@0.4.36 + - @backstage/plugin-search-common@1.2.19 + +## 0.2.112-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-org@0.6.42-next.0 + - @backstage/plugin-catalog-react@1.19.2-next.0 + - @backstage/ui@0.7.0-next.0 + - @backstage/plugin-catalog@1.31.2-next.0 + - @backstage/plugin-api-docs@0.12.10-next.0 + - @backstage/plugin-catalog-graph@0.4.22-next.0 + - @backstage/plugin-catalog-import@0.13.4-next.0 + - @backstage/plugin-home@0.8.11-next.0 + - @backstage/plugin-kubernetes@0.12.10-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.28-next.0 + - @backstage/plugin-scaffolder@1.33.1-next.0 + - @backstage/plugin-scaffolder-react@1.18.1-next.0 + - @backstage/plugin-search@1.4.29-next.0 + - @backstage/plugin-techdocs@1.13.3-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.26 + - @backstage/plugin-user-settings@0.8.25-next.0 + - @backstage/frontend-app-api@0.11.5-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.20-next.0 + - @backstage/plugin-devtools@0.1.30-next.0 + - @backstage/plugin-notifications@0.5.8-next.0 + - @backstage/plugin-signals@0.0.22-next.0 + - @backstage/cli@0.33.1 + - @backstage/integration-react@1.2.9 + - @backstage/plugin-search-react@1.9.2 + +## 0.2.111 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.8.10 + - @backstage/plugin-techdocs@1.13.2 + - @backstage/plugin-catalog-react@1.19.1 + - @backstage/plugin-catalog-graph@0.4.21 + - @backstage/config@1.3.3 + - @backstage/frontend-app-api@0.11.4 + - @backstage/catalog-model@1.7.5 + - @backstage/plugin-scaffolder@1.33.0 + - @backstage/ui@0.6.0 + - @backstage/cli@0.33.1 + - @backstage/plugin-scaffolder-react@1.18.0 + - @backstage/plugin-catalog@1.31.1 + - @backstage/core-components@0.17.4 + - @backstage/core-plugin-api@1.10.9 + - @backstage/plugin-org@0.6.41 + - @backstage/theme@0.6.7 + - @backstage/plugin-catalog-import@0.13.3 + - @backstage/core-app-api@1.18.0 + - @backstage/plugin-user-settings@0.8.24 + - @backstage/integration-react@1.2.9 + - @backstage/plugin-signals@0.0.21 + - @backstage/app-defaults@1.6.4 + - @backstage/plugin-api-docs@0.12.9 + - @backstage/plugin-auth-react@0.1.17 + - @backstage/plugin-catalog-common@1.1.5 + - @backstage/plugin-catalog-unprocessed-entities@0.2.19 + - @backstage/plugin-devtools@0.1.29 + - @backstage/plugin-kubernetes@0.12.9 + - @backstage/plugin-kubernetes-cluster@0.0.27 + - @backstage/plugin-notifications@0.5.7 + - @backstage/plugin-permission-react@0.4.36 + - @backstage/plugin-search@1.4.28 + - @backstage/plugin-search-common@1.2.19 + - @backstage/plugin-search-react@1.9.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.26 + - @backstage/plugin-techdocs-react@1.3.1 + +## 0.2.111-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.8.10-next.2 + - @backstage/canon@0.6.0-next.1 + - @backstage/cli@0.33.1-next.2 + - @backstage/plugin-scaffolder-react@1.18.0-next.2 + - @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/plugin-user-settings@0.8.24-next.2 + - @backstage/plugin-scaffolder@1.33.0-next.2 + - @backstage/plugin-signals@0.0.21-next.2 + - @backstage/app-defaults@1.6.4-next.2 + - @backstage/core-plugin-api@1.10.9-next.0 + - @backstage/frontend-app-api@0.11.4-next.2 + - @backstage/plugin-api-docs@0.12.9-next.1 + - @backstage/plugin-catalog@1.31.1-next.2 + - @backstage/plugin-catalog-graph@0.4.21-next.1 + - @backstage/plugin-catalog-import@0.13.3-next.1 + - @backstage/plugin-catalog-react@1.19.1-next.1 + - @backstage/plugin-notifications@0.5.7-next.1 + - @backstage/plugin-org@0.6.41-next.1 + - @backstage/plugin-search@1.4.28-next.1 + - @backstage/plugin-search-react@1.9.2-next.1 + - @backstage/plugin-techdocs@1.13.2-next.1 + +## 0.2.111-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.3.3-next.0 + - @backstage/frontend-app-api@0.11.4-next.1 + - @backstage/catalog-model@1.7.5-next.0 + - @backstage/plugin-catalog-react@1.19.1-next.1 + - @backstage/cli@0.33.1-next.1 + - @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/integration-react@1.2.9-next.1 + - @backstage/plugin-catalog-import@0.13.3-next.1 + - @backstage/plugin-home@0.8.10-next.1 + - @backstage/plugin-permission-react@0.4.36-next.0 + - @backstage/plugin-techdocs@1.13.2-next.1 + - @backstage/plugin-techdocs-react@1.3.1-next.1 + - @backstage/plugin-catalog@1.31.1-next.1 + - @backstage/plugin-catalog-common@1.1.5-next.0 + - @backstage/plugin-org@0.6.41-next.1 + - @backstage/plugin-scaffolder@1.32.1-next.1 + - @backstage/plugin-scaffolder-react@1.17.1-next.1 + - @backstage/plugin-search-common@1.2.19-next.0 + - @backstage/plugin-api-docs@0.12.9-next.1 + - @backstage/plugin-catalog-graph@0.4.21-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.19-next.1 + - @backstage/plugin-kubernetes@0.12.9-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.27-next.1 + - @backstage/plugin-user-settings@0.8.24-next.1 + - @backstage/app-defaults@1.6.4-next.1 + - @backstage/plugin-notifications@0.5.7-next.1 + - @backstage/plugin-search@1.4.28-next.1 + - @backstage/plugin-search-react@1.9.2-next.1 + - @backstage/plugin-signals@0.0.21-next.1 + - @backstage/plugin-auth-react@0.1.17-next.1 + - @backstage/plugin-devtools@0.1.29-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.26-next.1 + +## 0.2.111-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.13.2-next.0 + - @backstage/plugin-catalog-graph@0.4.21-next.0 + - @backstage/canon@0.6.0-next.0 + - @backstage/plugin-scaffolder@1.32.1-next.0 + - @backstage/plugin-catalog-import@0.13.2-next.0 + - @backstage/integration-react@1.2.9-next.0 + - @backstage/theme@0.6.7-next.0 + - @backstage/cli@0.33.1-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.26-next.0 + - @backstage/plugin-catalog@1.31.1-next.0 + - @backstage/plugin-catalog-react@1.19.1-next.0 + - @backstage/app-defaults@1.6.4-next.0 + - @backstage/core-components@0.17.4-next.0 + - @backstage/plugin-home@0.8.10-next.0 + - @backstage/plugin-notifications@0.5.7-next.0 + - @backstage/plugin-scaffolder-react@1.17.1-next.0 + - @backstage/plugin-search-react@1.9.2-next.0 + - @backstage/plugin-signals@0.0.21-next.0 + - @backstage/plugin-techdocs-react@1.3.1-next.0 + - @backstage/plugin-user-settings@0.8.24-next.0 + - @backstage/catalog-model@1.7.4 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.17.1 + - @backstage/core-plugin-api@1.10.8 + - @backstage/frontend-app-api@0.11.4-next.0 + - @backstage/plugin-api-docs@0.12.9-next.0 + - @backstage/plugin-auth-react@0.1.17-next.0 + - @backstage/plugin-catalog-common@1.1.4 + - @backstage/plugin-catalog-unprocessed-entities@0.2.19-next.0 + - @backstage/plugin-devtools@0.1.29-next.0 + - @backstage/plugin-kubernetes@0.12.9-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.27-next.0 + - @backstage/plugin-org@0.6.41-next.0 + - @backstage/plugin-permission-react@0.4.35 + - @backstage/plugin-search@1.4.28-next.0 + - @backstage/plugin-search-common@1.2.18 + +## 0.2.110 + +### Patch Changes + +- Updated dependencies + - @backstage/canon@0.5.0 + - @backstage/core-components@0.17.3 + - @backstage/cli@0.33.0 + - @backstage/plugin-scaffolder-react@1.17.0 + - @backstage/plugin-scaffolder@1.32.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.18 + - @backstage/plugin-catalog-import@0.13.1 + - @backstage/plugin-catalog-graph@0.4.20 + - @backstage/plugin-notifications@0.5.6 + - @backstage/plugin-user-settings@0.8.23 + - @backstage/plugin-kubernetes@0.12.8 + - @backstage/plugin-api-docs@0.12.8 + - @backstage/plugin-devtools@0.1.28 + - @backstage/plugin-techdocs@1.13.0 + - @backstage/plugin-catalog@1.31.0 + - @backstage/plugin-signals@0.0.20 + - @backstage/plugin-search@1.4.27 + - @backstage/plugin-home@0.8.9 + - @backstage/plugin-org@0.6.40 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.25 + - @backstage/core-plugin-api@1.10.8 + - @backstage/frontend-app-api@0.11.3 + - @backstage/plugin-catalog-react@1.19.0 + - @backstage/plugin-techdocs-react@1.3.0 + - @backstage/plugin-search-react@1.9.1 + - @backstage/app-defaults@1.6.3 + - @backstage/integration-react@1.2.8 + - @backstage/plugin-auth-react@0.1.16 + - @backstage/plugin-kubernetes-cluster@0.0.26 + - @backstage/catalog-model@1.7.4 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.17.1 + - @backstage/theme@0.6.6 + - @backstage/plugin-catalog-common@1.1.4 + - @backstage/plugin-permission-react@0.4.35 + - @backstage/plugin-search-common@1.2.18 + +## 0.2.110-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.33.0-next.2 + - @backstage/app-defaults@1.6.3-next.0 + - @backstage/canon@0.5.0-next.2 + - @backstage/catalog-model@1.7.4 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.17.0 + - @backstage/core-components@0.17.3-next.0 + - @backstage/core-plugin-api@1.10.7 + - @backstage/frontend-app-api@0.11.3-next.1 + - @backstage/integration-react@1.2.7 + - @backstage/theme@0.6.6 + - @backstage/plugin-api-docs@0.12.8-next.2 + - @backstage/plugin-auth-react@0.1.16-next.0 + - @backstage/plugin-catalog@1.31.0-next.2 + - @backstage/plugin-catalog-common@1.1.4 + - @backstage/plugin-catalog-graph@0.4.20-next.2 + - @backstage/plugin-catalog-import@0.13.1-next.2 + - @backstage/plugin-catalog-react@1.19.0-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.18-next.2 + - @backstage/plugin-devtools@0.1.28-next.2 + - @backstage/plugin-home@0.8.9-next.2 + - @backstage/plugin-kubernetes@0.12.8-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.26-next.2 + - @backstage/plugin-notifications@0.5.6-next.2 + - @backstage/plugin-org@0.6.40-next.2 + - @backstage/plugin-permission-react@0.4.34 + - @backstage/plugin-scaffolder@1.32.0-next.2 + - @backstage/plugin-scaffolder-react@1.16.1-next.2 + - @backstage/plugin-search@1.4.27-next.2 + - @backstage/plugin-search-common@1.2.18 + - @backstage/plugin-search-react@1.9.1-next.1 + - @backstage/plugin-signals@0.0.20-next.1 + - @backstage/plugin-techdocs@1.13.0-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.25-next.2 + - @backstage/plugin-techdocs-react@1.3.0-next.1 + - @backstage/plugin-user-settings@0.8.23-next.2 + +## 0.2.110-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.17.3-next.0 + - @backstage/cli@0.33.0-next.1 + - @backstage/canon@0.5.0-next.2 + - @backstage/plugin-notifications@0.5.6-next.2 + - @backstage/plugin-scaffolder@1.32.0-next.2 + - @backstage/plugin-catalog@1.31.0-next.2 + - @backstage/plugin-techdocs@1.13.0-next.2 + - @backstage/plugin-catalog-react@1.19.0-next.2 + - @backstage/plugin-catalog-import@0.13.1-next.2 + - @backstage/plugin-home@0.8.9-next.2 + - @backstage/plugin-search-react@1.9.1-next.1 + - @backstage/app-defaults@1.6.3-next.0 + - @backstage/integration-react@1.2.7 + - @backstage/plugin-api-docs@0.12.8-next.2 + - @backstage/plugin-auth-react@0.1.16-next.0 + - @backstage/plugin-catalog-graph@0.4.20-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.18-next.2 + - @backstage/plugin-devtools@0.1.28-next.2 + - @backstage/plugin-kubernetes@0.12.8-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.26-next.2 + - @backstage/plugin-org@0.6.40-next.2 + - @backstage/plugin-scaffolder-react@1.16.1-next.2 + - @backstage/plugin-search@1.4.27-next.2 + - @backstage/plugin-signals@0.0.20-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.25-next.2 + - @backstage/plugin-techdocs-react@1.3.0-next.1 + - @backstage/plugin-user-settings@0.8.23-next.2 + - @backstage/catalog-model@1.7.4 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.17.0 + - @backstage/core-plugin-api@1.10.7 + - @backstage/frontend-app-api@0.11.3-next.1 + - @backstage/theme@0.6.6 + - @backstage/plugin-catalog-common@1.1.4 + - @backstage/plugin-permission-react@0.4.34 + - @backstage/plugin-search-common@1.2.18 + +## 0.2.110-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/canon@0.5.0-next.1 + - @backstage/cli@0.32.2-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.25-next.1 + - @backstage/plugin-techdocs@1.13.0-next.1 + - @backstage/plugin-org@0.6.40-next.1 + - @backstage/plugin-user-settings@0.8.23-next.1 + - @backstage/plugin-notifications@0.5.6-next.1 + - @backstage/plugin-catalog@1.31.0-next.1 + - @backstage/plugin-catalog-graph@0.4.20-next.1 + - @backstage/plugin-catalog-import@0.13.1-next.1 + - @backstage/plugin-catalog-react@1.18.1-next.1 + - @backstage/plugin-home@0.8.9-next.1 + - @backstage/plugin-scaffolder@1.31.1-next.1 + - @backstage/plugin-scaffolder-react@1.16.1-next.1 + - @backstage/app-defaults@1.6.2 + - @backstage/catalog-model@1.7.4 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.17.0 + - @backstage/core-components@0.17.2 + - @backstage/core-plugin-api@1.10.7 + - @backstage/frontend-app-api@0.11.3-next.0 + - @backstage/integration-react@1.2.7 + - @backstage/theme@0.6.6 + - @backstage/plugin-api-docs@0.12.8-next.1 + - @backstage/plugin-auth-react@0.1.15 + - @backstage/plugin-catalog-common@1.1.4 + - @backstage/plugin-catalog-unprocessed-entities@0.2.18-next.1 + - @backstage/plugin-devtools@0.1.28-next.1 + - @backstage/plugin-kubernetes@0.12.8-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.26-next.1 + - @backstage/plugin-permission-react@0.4.34 + - @backstage/plugin-search@1.4.27-next.1 + - @backstage/plugin-search-common@1.2.18 + - @backstage/plugin-search-react@1.9.1-next.0 + - @backstage/plugin-signals@0.0.20-next.0 + - @backstage/plugin-techdocs-react@1.3.0-next.0 + +## 0.2.110-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder@1.31.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.18-next.0 + - @backstage/plugin-catalog-import@0.13.1-next.0 + - @backstage/plugin-catalog-graph@0.4.20-next.0 + - @backstage/plugin-notifications@0.5.6-next.0 + - @backstage/plugin-user-settings@0.8.23-next.0 + - @backstage/plugin-kubernetes@0.12.8-next.0 + - @backstage/plugin-api-docs@0.12.8-next.0 + - @backstage/plugin-devtools@0.1.28-next.0 + - @backstage/plugin-techdocs@1.13.0-next.0 + - @backstage/plugin-catalog@1.31.0-next.0 + - @backstage/plugin-signals@0.0.20-next.0 + - @backstage/plugin-search@1.4.27-next.0 + - @backstage/plugin-home@0.8.9-next.0 + - @backstage/plugin-org@0.6.40-next.0 + - @backstage/plugin-techdocs-react@1.3.0-next.0 + - @backstage/frontend-app-api@0.11.3-next.0 + - @backstage/canon@0.5.0-next.0 + - @backstage/plugin-scaffolder-react@1.16.1-next.0 + - @backstage/cli@0.32.1 + - @backstage/plugin-catalog-react@1.18.1-next.0 + - @backstage/plugin-search-react@1.9.1-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.25-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.26-next.0 + - @backstage/integration-react@1.2.7 + +## 0.2.109 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.6.6 + - @backstage/core-app-api@1.17.0 + - @backstage/canon@0.4.0 + - @backstage/cli@0.32.1 + - @backstage/plugin-user-settings@0.8.22 + - @backstage/core-components@0.17.2 + - @backstage/plugin-home@0.8.8 + - @backstage/catalog-model@1.7.4 + - @backstage/plugin-scaffolder@1.31.0 + - @backstage/frontend-app-api@0.11.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.17 + - @backstage/plugin-catalog-import@0.13.0 + - @backstage/plugin-catalog-graph@0.4.19 + - @backstage/plugin-notifications@0.5.5 + - @backstage/plugin-kubernetes@0.12.7 + - @backstage/plugin-api-docs@0.12.7 + - @backstage/plugin-devtools@0.1.27 + - @backstage/plugin-techdocs@1.12.6 + - @backstage/plugin-catalog@1.30.0 + - @backstage/plugin-signals@0.0.19 + - @backstage/plugin-search@1.4.26 + - @backstage/plugin-org@0.6.39 + - @backstage/plugin-search-react@1.9.0 + - @backstage/plugin-catalog-react@1.18.0 + - @backstage/plugin-scaffolder-react@1.16.0 + - @backstage/plugin-kubernetes-cluster@0.0.25 + - @backstage/plugin-techdocs-react@1.2.17 + - @backstage/plugin-auth-react@0.1.15 + - @backstage/core-plugin-api@1.10.7 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.24 + - @backstage/app-defaults@1.6.2 + - @backstage/config@1.3.2 + - @backstage/integration-react@1.2.7 + - @backstage/plugin-permission-react@0.4.34 + - @backstage/plugin-catalog-common@1.1.4 + - @backstage/plugin-search-common@1.2.18 + +## 0.2.109-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.17.0-next.1 + - @backstage/canon@0.4.0-next.3 + - @backstage/cli@0.32.1-next.3 + - @backstage/plugin-home@0.8.8-next.3 + - @backstage/plugin-catalog@1.30.0-next.3 + - @backstage/frontend-app-api@0.11.2-next.3 + - @backstage/plugin-search-react@1.9.0-next.2 + - @backstage/plugin-scaffolder@1.31.0-next.3 + - @backstage/plugin-search@1.4.26-next.3 + - @backstage/app-defaults@1.6.2-next.2 + - @backstage/core-components@0.17.2-next.1 + - @backstage/core-plugin-api@1.10.7-next.0 + - @backstage/plugin-api-docs@0.12.7-next.3 + - @backstage/plugin-catalog-graph@0.4.19-next.3 + - @backstage/plugin-catalog-import@0.13.0-next.3 + - @backstage/plugin-catalog-react@1.18.0-next.3 + - @backstage/plugin-notifications@0.5.5-next.3 + - @backstage/plugin-org@0.6.39-next.3 + - @backstage/plugin-scaffolder-react@1.16.0-next.3 + - @backstage/plugin-signals@0.0.19-next.1 + - @backstage/plugin-techdocs@1.12.6-next.3 + - @backstage/plugin-user-settings@0.8.22-next.3 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/integration-react@1.2.7-next.3 + - @backstage/theme@0.6.6-next.0 + - @backstage/plugin-auth-react@0.1.15-next.1 + - @backstage/plugin-catalog-common@1.1.4-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.17-next.3 + - @backstage/plugin-devtools@0.1.27-next.3 + - @backstage/plugin-kubernetes@0.12.7-next.3 + - @backstage/plugin-kubernetes-cluster@0.0.25-next.3 + - @backstage/plugin-permission-react@0.4.34-next.1 + - @backstage/plugin-search-common@1.2.18-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.24-next.3 + - @backstage/plugin-techdocs-react@1.2.17-next.1 + +## 0.2.109-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.16.2-next.0 + - @backstage/canon@0.4.0-next.2 + - @backstage/plugin-catalog-import@0.13.0-next.2 + - @backstage/plugin-techdocs@1.12.6-next.2 + - @backstage/core-plugin-api@1.10.7-next.0 + - @backstage/plugin-catalog@1.29.1-next.2 + - @backstage/app-defaults@1.6.2-next.1 + - @backstage/cli@0.32.1-next.2 + - @backstage/config@1.3.2 + - @backstage/core-components@0.17.2-next.1 + - @backstage/frontend-app-api@0.11.2-next.2 + - @backstage/integration-react@1.2.7-next.2 + - @backstage/plugin-api-docs@0.12.7-next.2 + - @backstage/plugin-auth-react@0.1.15-next.1 + - @backstage/plugin-catalog-graph@0.4.19-next.2 + - @backstage/plugin-catalog-react@1.18.0-next.2 + - @backstage/plugin-home@0.8.8-next.2 + - @backstage/plugin-kubernetes@0.12.7-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.25-next.2 + - @backstage/plugin-notifications@0.5.5-next.2 + - @backstage/plugin-org@0.6.39-next.2 + - @backstage/plugin-permission-react@0.4.34-next.1 + - @backstage/plugin-scaffolder@1.31.0-next.2 + - @backstage/plugin-scaffolder-react@1.16.0-next.2 + - @backstage/plugin-search@1.4.26-next.2 + - @backstage/plugin-search-react@1.9.0-next.1 + - @backstage/plugin-signals@0.0.19-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.24-next.2 + - @backstage/plugin-techdocs-react@1.2.17-next.1 + - @backstage/plugin-user-settings@0.8.22-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.17-next.2 + - @backstage/plugin-devtools@0.1.27-next.2 + - @backstage/catalog-model@1.7.3 + - @backstage/theme@0.6.6-next.0 + - @backstage/plugin-catalog-common@1.1.4-next.0 + - @backstage/plugin-search-common@1.2.18-next.0 + +## 0.2.109-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.6.6-next.0 + - @backstage/core-components@0.17.2-next.0 + - @backstage/cli@0.32.1-next.1 + - @backstage/canon@0.4.0-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.17-next.1 + - @backstage/plugin-catalog-import@0.12.14-next.1 + - @backstage/plugin-catalog-graph@0.4.19-next.1 + - @backstage/plugin-notifications@0.5.5-next.1 + - @backstage/plugin-user-settings@0.8.22-next.1 + - @backstage/plugin-kubernetes@0.12.7-next.1 + - @backstage/plugin-scaffolder@1.31.0-next.1 + - @backstage/plugin-api-docs@0.12.7-next.1 + - @backstage/plugin-devtools@0.1.27-next.1 + - @backstage/plugin-techdocs@1.12.6-next.1 + - @backstage/plugin-catalog@1.29.1-next.1 + - @backstage/plugin-signals@0.0.19-next.0 + - @backstage/plugin-search@1.4.26-next.1 + - @backstage/plugin-home@0.8.8-next.1 + - @backstage/plugin-org@0.6.39-next.1 + - @backstage/plugin-search-react@1.9.0-next.0 + - @backstage/plugin-catalog-react@1.18.0-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.25-next.1 + - @backstage/frontend-app-api@0.11.2-next.1 + - @backstage/plugin-scaffolder-react@1.16.0-next.1 + - @backstage/plugin-techdocs-react@1.2.17-next.0 + - @backstage/plugin-auth-react@0.1.15-next.0 + - @backstage/app-defaults@1.6.2-next.0 + - @backstage/integration-react@1.2.7-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.24-next.1 + - @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 + - @backstage/plugin-catalog-common@1.1.4-next.0 + - @backstage/plugin-permission-react@0.4.34-next.0 + - @backstage/plugin-search-common@1.2.18-next.0 + +## 0.2.109-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/canon@0.3.2-next.0 + - @backstage/plugin-user-settings@0.8.22-next.0 + - @backstage/plugin-scaffolder@1.31.0-next.0 + - @backstage/cli@0.32.1-next.0 + - @backstage/plugin-catalog-react@1.18.0-next.0 + - @backstage/plugin-scaffolder-react@1.16.0-next.0 + - @backstage/integration-react@1.2.7-next.0 + - @backstage/plugin-catalog-import@0.12.14-next.0 + - @backstage/plugin-techdocs@1.12.6-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.24-next.0 + - @backstage/app-defaults@1.6.1 + - @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-app-api@0.11.2-next.0 + - @backstage/theme@0.6.5 + - @backstage/plugin-api-docs@0.12.7-next.0 + - @backstage/plugin-auth-react@0.1.14 + - @backstage/plugin-catalog@1.29.1-next.0 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-graph@0.4.19-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.17-next.0 + - @backstage/plugin-devtools@0.1.27-next.0 + - @backstage/plugin-home@0.8.8-next.0 + - @backstage/plugin-kubernetes@0.12.7-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.25-next.0 + - @backstage/plugin-notifications@0.5.5-next.0 + - @backstage/plugin-org@0.6.39-next.0 + - @backstage/plugin-permission-react@0.4.33 + - @backstage/plugin-search@1.4.26-next.0 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-search-react@1.8.8 + - @backstage/plugin-signals@0.0.18 + - @backstage/plugin-techdocs-react@1.2.16 + +## 0.2.108 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.29.0 + - @backstage/plugin-api-docs@0.12.6 + - @backstage/plugin-devtools@0.1.26 + - @backstage/plugin-search@1.4.25 + - @backstage/plugin-techdocs-react@1.2.16 + - @backstage/cli@0.32.0 + - @backstage/canon@0.3.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.16 + - @backstage/plugin-kubernetes@0.12.6 + - @backstage/plugin-catalog-react@1.17.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.23 + - @backstage/integration-react@1.2.6 + - @backstage/plugin-kubernetes-cluster@0.0.24 + - @backstage/frontend-app-api@0.11.1 + - @backstage/core-components@0.17.1 + - @backstage/core-plugin-api@1.10.6 + - @backstage/plugin-permission-react@0.4.33 + - @backstage/plugin-scaffolder-react@1.15.0 + - @backstage/plugin-catalog-import@0.12.13 + - @backstage/app-defaults@1.6.1 + - @backstage/core-app-api@1.16.1 + - @backstage/plugin-catalog-graph@0.4.18 + - @backstage/plugin-notifications@0.5.4 + - @backstage/plugin-user-settings@0.8.21 + - @backstage/plugin-search-react@1.8.8 + - @backstage/plugin-auth-react@0.1.14 + - @backstage/plugin-scaffolder@1.30.0 + - @backstage/plugin-techdocs@1.12.5 + - @backstage/theme@0.6.5 + - @backstage/plugin-home@0.8.7 + - @backstage/plugin-org@0.6.38 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-signals@0.0.18 + +## 0.2.108-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-devtools@0.1.26-next.2 + - @backstage/plugin-catalog@1.29.0-next.2 + - @backstage/plugin-search@1.4.25-next.2 + - @backstage/cli@0.32.0-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.23-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.2 + - @backstage/integration-react@1.2.6-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.24-next.2 + - @backstage/frontend-app-api@0.11.1-next.1 + - @backstage/core-components@0.17.1-next.1 + - @backstage/core-plugin-api@1.10.6-next.0 + - @backstage/plugin-permission-react@0.4.33-next.0 + - @backstage/plugin-scaffolder-react@1.15.0-next.2 + - @backstage/plugin-catalog-import@0.12.13-next.2 + - @backstage/plugin-techdocs-react@1.2.16-next.1 + - @backstage/app-defaults@1.6.1-next.1 + - @backstage/core-app-api@1.16.1-next.0 + - @backstage/plugin-catalog-graph@0.4.18-next.2 + - @backstage/plugin-catalog-react@1.17.0-next.2 + - @backstage/plugin-notifications@0.5.4-next.2 + - @backstage/plugin-user-settings@0.8.21-next.2 + - @backstage/plugin-search-react@1.8.8-next.1 + - @backstage/plugin-auth-react@0.1.14-next.1 + - @backstage/plugin-kubernetes@0.12.6-next.2 + - @backstage/plugin-scaffolder@1.30.0-next.2 + - @backstage/plugin-api-docs@0.12.6-next.2 + - @backstage/plugin-techdocs@1.12.5-next.2 + - @backstage/canon@0.3.0-next.2 + - @backstage/theme@0.6.5-next.0 + - @backstage/plugin-home@0.8.7-next.2 + - @backstage/plugin-org@0.6.38-next.2 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-signals@0.0.18-next.1 + +## 0.2.108-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-react@1.2.16-next.0 + - @backstage/plugin-kubernetes@0.12.6-next.1 + - @backstage/canon@0.2.1-next.1 + - @backstage/core-components@0.17.1-next.0 + - @backstage/plugin-catalog-import@0.12.12-next.1 + - @backstage/integration-react@1.2.6-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.23-next.0 + - @backstage/plugin-techdocs@1.12.5-next.1 + - @backstage/app-defaults@1.6.1-next.0 + - @backstage/cli@0.32.0-next.1 + - @backstage/plugin-api-docs@0.12.6-next.1 + - @backstage/plugin-auth-react@0.1.14-next.0 + - @backstage/plugin-catalog@1.29.0-next.1 + - @backstage/plugin-catalog-graph@0.4.18-next.1 + - @backstage/plugin-catalog-react@1.16.1-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.1 + - @backstage/plugin-devtools@0.1.26-next.1 + - @backstage/plugin-home@0.8.7-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.24-next.1 + - @backstage/plugin-notifications@0.5.4-next.1 + - @backstage/plugin-org@0.6.38-next.1 + - @backstage/plugin-scaffolder@1.30.0-next.1 + - @backstage/plugin-scaffolder-react@1.15.0-next.1 + - @backstage/plugin-search@1.4.25-next.1 + - @backstage/plugin-search-react@1.8.8-next.0 + - @backstage/plugin-signals@0.0.18-next.0 + - @backstage/plugin-user-settings@0.8.21-next.1 + - @backstage/frontend-app-api@0.11.1-next.0 + - @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 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-search-common@1.2.17 + +## 0.2.108-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.29.0-next.0 + - @backstage/cli@0.32.0-next.0 + - @backstage/canon@0.2.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.16-next.0 + - @backstage/plugin-scaffolder-react@1.15.0-next.0 + - @backstage/plugin-catalog-react@1.16.1-next.0 + - @backstage/plugin-scaffolder@1.30.0-next.0 + - @backstage/plugin-api-docs@0.12.6-next.0 + - @backstage/plugin-catalog-graph@0.4.18-next.0 + - @backstage/plugin-catalog-import@0.12.12-next.0 + - @backstage/plugin-org@0.6.38-next.0 + - @backstage/plugin-techdocs@1.12.5-next.0 + - @backstage/plugin-user-settings@0.8.21-next.0 + - @backstage/app-defaults@1.6.0 + - @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-app-api@0.11.0 + - @backstage/integration-react@1.2.5 + - @backstage/theme@0.6.4 + - @backstage/plugin-auth-react@0.1.13 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-devtools@0.1.26-next.0 + - @backstage/plugin-home@0.8.7-next.0 + - @backstage/plugin-kubernetes@0.12.6-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.24-next.0 + - @backstage/plugin-notifications@0.5.4-next.0 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/plugin-search@1.4.25-next.0 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-search-react@1.8.7 + - @backstage/plugin-signals@0.0.17 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.22 + - @backstage/plugin-techdocs-react@1.2.15 + +## 0.2.107 + +### Patch Changes + +- Updated dependencies + - @backstage/canon@0.2.0 + - @backstage/core-components@0.17.0 + - @backstage/plugin-catalog@1.28.0 + - @backstage/plugin-techdocs@1.12.4 + - @backstage/core-plugin-api@1.10.5 + - @backstage/cli@0.31.0 + - @backstage/frontend-app-api@0.11.0 + - @backstage/plugin-search-react@1.8.7 + - @backstage/plugin-home@0.8.6 + - @backstage/plugin-kubernetes@0.12.5 + - @backstage/core-app-api@1.16.0 + - @backstage/plugin-catalog-react@1.16.0 + - @backstage/plugin-scaffolder@1.29.0 + - @backstage/plugin-scaffolder-react@1.14.6 + - @backstage/plugin-signals@0.0.17 + - @backstage/plugin-search@1.4.24 + - @backstage/app-defaults@1.6.0 + - @backstage/plugin-api-docs@0.12.5 + - @backstage/plugin-techdocs-react@1.2.15 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.22 + - @backstage/integration-react@1.2.5 + - @backstage/plugin-auth-react@0.1.13 + - @backstage/plugin-catalog-graph@0.4.17 + - @backstage/plugin-catalog-import@0.12.11 + - @backstage/plugin-catalog-unprocessed-entities@0.2.15 + - @backstage/plugin-devtools@0.1.25 + - @backstage/plugin-kubernetes-cluster@0.0.23 + - @backstage/plugin-notifications@0.5.3 + - @backstage/plugin-org@0.6.37 + - @backstage/plugin-user-settings@0.8.20 + - @backstage/plugin-permission-react@0.4.32 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/theme@0.6.4 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-search-common@1.2.17 + +## 0.2.107-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.28.0-next.2 + - @backstage/frontend-app-api@0.11.0-next.2 + - @backstage/cli@0.31.0-next.1 + - @backstage/core-app-api@1.16.0-next.0 + - @backstage/plugin-catalog-react@1.16.0-next.2 + - @backstage/plugin-signals@0.0.17-next.2 + - @backstage/core-components@0.16.5-next.1 + - @backstage/plugin-scaffolder-react@1.14.6-next.2 + - @backstage/app-defaults@1.6.0-next.1 + - @backstage/plugin-scaffolder@1.29.0-next.2 + - @backstage/plugin-api-docs@0.12.5-next.2 + - @backstage/plugin-catalog-graph@0.4.17-next.2 + - @backstage/plugin-catalog-import@0.12.11-next.2 + - @backstage/plugin-org@0.6.37-next.2 + - @backstage/plugin-techdocs@1.12.4-next.2 + - @backstage/plugin-user-settings@0.8.20-next.2 + - @backstage/plugin-search-react@1.8.7-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.15-next.2 + - @backstage/plugin-devtools@0.1.25-next.2 + - @backstage/plugin-home@0.8.6-next.2 + - @backstage/plugin-kubernetes@0.12.5-next.2 + - @backstage/plugin-notifications@0.5.3-next.2 + - @backstage/plugin-search@1.4.24-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.22-next.2 + - @backstage/plugin-techdocs-react@1.2.15-next.2 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-plugin-api@1.10.4 + - @backstage/integration-react@1.2.5-next.0 + - @backstage/theme@0.6.4 + - @backstage/plugin-auth-react@0.1.13-next.1 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-kubernetes-cluster@0.0.23-next.2 + - @backstage/plugin-permission-react@0.4.31 + - @backstage/plugin-search-common@1.2.17 + +## 0.2.107-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.12.4-next.1 + - @backstage/cli@0.30.1-next.0 + - @backstage/core-components@0.16.5-next.0 + - @backstage/plugin-scaffolder-react@1.14.6-next.1 + - @backstage/plugin-catalog-react@1.16.0-next.1 + - @backstage/plugin-catalog@1.28.0-next.1 + - @backstage/app-defaults@1.5.18-next.0 + - @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-app-api@0.10.6-next.1 + - @backstage/integration-react@1.2.4 + - @backstage/theme@0.6.4 + - @backstage/plugin-api-docs@0.12.5-next.1 + - @backstage/plugin-auth-react@0.1.13-next.0 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-graph@0.4.17-next.1 + - @backstage/plugin-catalog-import@0.12.11-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.15-next.1 + - @backstage/plugin-devtools@0.1.25-next.1 + - @backstage/plugin-home@0.8.6-next.1 + - @backstage/plugin-kubernetes@0.12.5-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.23-next.1 + - @backstage/plugin-notifications@0.5.3-next.1 + - @backstage/plugin-org@0.6.37-next.1 + - @backstage/plugin-permission-react@0.4.31 + - @backstage/plugin-scaffolder@1.29.0-next.1 + - @backstage/plugin-search@1.4.24-next.1 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-search-react@1.8.7-next.1 + - @backstage/plugin-signals@0.0.17-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.22-next.1 + - @backstage/plugin-techdocs-react@1.2.15-next.1 + - @backstage/plugin-user-settings@0.8.20-next.1 + +## 0.2.107-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-react@1.8.7-next.0 + - @backstage/plugin-kubernetes@0.12.5-next.0 + - @backstage/plugin-scaffolder@1.29.0-next.0 + - @backstage/plugin-catalog-react@1.16.0-next.0 + - @backstage/plugin-scaffolder-react@1.14.6-next.0 + - @backstage/plugin-catalog@1.28.0-next.0 + - @backstage/plugin-techdocs@1.12.4-next.0 + - @backstage/plugin-techdocs-react@1.2.15-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.22-next.0 + - @backstage/plugin-search@1.4.24-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.23-next.0 + - @backstage/plugin-api-docs@0.12.5-next.0 + - @backstage/plugin-catalog-graph@0.4.17-next.0 + - @backstage/plugin-catalog-import@0.12.11-next.0 + - @backstage/plugin-home@0.8.6-next.0 + - @backstage/plugin-org@0.6.37-next.0 + - @backstage/plugin-user-settings@0.8.20-next.0 + - @backstage/frontend-app-api@0.10.6-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.15-next.0 + - @backstage/plugin-devtools@0.1.25-next.0 + - @backstage/plugin-notifications@0.5.3-next.0 + - @backstage/plugin-signals@0.0.17-next.0 + - @backstage/cli@0.30.0 + - @backstage/integration-react@1.2.4 + +## 0.2.106 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.30.0 + - @backstage/plugin-scaffolder-react@1.14.5 + - @backstage/plugin-notifications@0.5.2 + - @backstage/plugin-search-react@1.8.6 + - @backstage/plugin-search@1.4.23 + - @backstage/plugin-kubernetes-cluster@0.0.22 + - @backstage/core-components@0.16.4 + - @backstage/plugin-scaffolder@1.28.0 + - @backstage/plugin-techdocs@1.12.3 + - @backstage/plugin-home@0.8.5 + - @backstage/plugin-catalog@1.27.0 + - @backstage/plugin-org@0.6.36 + - @backstage/plugin-kubernetes@0.12.4 + - @backstage/plugin-signals@0.0.16 + - @backstage/plugin-catalog-graph@0.4.16 + - @backstage/plugin-catalog-react@1.15.2 + - @backstage/frontend-app-api@0.10.5 + - @backstage/plugin-catalog-unprocessed-entities@0.2.14 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.21 + - @backstage/integration-react@1.2.4 + - @backstage/core-plugin-api@1.10.4 + - @backstage/plugin-permission-react@0.4.31 + - @backstage/plugin-catalog-import@0.12.10 + - @backstage/plugin-techdocs-react@1.2.14 + - @backstage/app-defaults@1.5.17 + - @backstage/core-app-api@1.15.5 + - @backstage/plugin-user-settings@0.8.19 + - @backstage/plugin-auth-react@0.1.12 + - @backstage/plugin-api-docs@0.12.4 + - @backstage/plugin-devtools@0.1.24 + - @backstage/theme@0.6.4 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-search-common@1.2.17 + +## 0.2.106-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.27.0-next.3 + - @backstage/cli@0.30.0-next.3 + - @backstage/plugin-scaffolder@1.28.0-next.3 + - @backstage/frontend-app-api@0.10.5-next.3 + - @backstage/plugin-api-docs@0.12.4-next.3 + - @backstage/plugin-catalog-graph@0.4.16-next.3 + - @backstage/plugin-catalog-import@0.12.10-next.3 + - @backstage/plugin-org@0.6.36-next.3 + - @backstage/plugin-scaffolder-react@1.14.5-next.3 + - @backstage/plugin-techdocs@1.12.3-next.3 + - @backstage/plugin-user-settings@0.8.19-next.3 + - @backstage/app-defaults@1.5.17-next.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/integration-react@1.2.4-next.0 + - @backstage/theme@0.6.4-next.0 + - @backstage/plugin-auth-react@0.1.12-next.1 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-react@1.15.2-next.3 + - @backstage/plugin-catalog-unprocessed-entities@0.2.14-next.1 + - @backstage/plugin-devtools@0.1.24-next.3 + - @backstage/plugin-home@0.8.5-next.3 + - @backstage/plugin-kubernetes@0.12.4-next.3 + - @backstage/plugin-kubernetes-cluster@0.0.22-next.3 + - @backstage/plugin-notifications@0.5.2-next.2 + - @backstage/plugin-permission-react@0.4.31-next.0 + - @backstage/plugin-search@1.4.23-next.3 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-search-react@1.8.6-next.3 + - @backstage/plugin-signals@0.0.16-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.21-next.1 + - @backstage/plugin-techdocs-react@1.2.14-next.1 + +## 0.2.106-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.14.5-next.2 + - @backstage/cli@0.30.0-next.2 + - @backstage/plugin-scaffolder@1.28.0-next.2 + - @backstage/plugin-techdocs@1.12.3-next.2 + - @backstage/plugin-home@0.8.5-next.2 + - @backstage/core-components@0.16.4-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.22-next.2 + - @backstage/plugin-kubernetes@0.12.4-next.2 + - @backstage/plugin-catalog-graph@0.4.16-next.2 + - @backstage/plugin-catalog-react@1.15.2-next.2 + - @backstage/plugin-catalog@1.27.0-next.2 + - @backstage/app-defaults@1.5.17-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.15.5-next.0 + - @backstage/core-plugin-api@1.10.4-next.0 + - @backstage/frontend-app-api@0.10.5-next.2 + - @backstage/integration-react@1.2.4-next.0 + - @backstage/theme@0.6.4-next.0 + - @backstage/plugin-api-docs@0.12.4-next.2 + - @backstage/plugin-auth-react@0.1.12-next.1 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-import@0.12.10-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.14-next.1 + - @backstage/plugin-devtools@0.1.24-next.2 + - @backstage/plugin-notifications@0.5.2-next.2 + - @backstage/plugin-org@0.6.36-next.2 + - @backstage/plugin-permission-react@0.4.31-next.0 + - @backstage/plugin-search@1.4.23-next.2 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-search-react@1.8.6-next.2 + - @backstage/plugin-signals@0.0.16-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.21-next.1 + - @backstage/plugin-techdocs-react@1.2.14-next.1 + - @backstage/plugin-user-settings@0.8.19-next.2 + +## 0.2.106-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-cluster@0.0.22-next.1 + - @backstage/core-components@0.16.4-next.0 + - @backstage/plugin-techdocs@1.12.2-next.1 + - @backstage/plugin-scaffolder@1.28.0-next.1 + - @backstage/cli@0.30.0-next.1 + - @backstage/plugin-home@0.8.5-next.1 + - @backstage/plugin-org@0.6.36-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.21-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.14-next.0 + - @backstage/integration-react@1.2.4-next.0 + - @backstage/frontend-app-api@0.10.5-next.1 + - @backstage/core-plugin-api@1.10.4-next.0 + - @backstage/plugin-permission-react@0.4.31-next.0 + - @backstage/plugin-scaffolder-react@1.14.4-next.1 + - @backstage/plugin-catalog-import@0.12.10-next.1 + - @backstage/plugin-techdocs-react@1.2.14-next.0 + - @backstage/app-defaults@1.5.17-next.0 + - @backstage/core-app-api@1.15.5-next.0 + - @backstage/plugin-catalog-graph@0.4.16-next.1 + - @backstage/plugin-catalog-react@1.15.2-next.1 + - @backstage/plugin-notifications@0.5.2-next.1 + - @backstage/plugin-user-settings@0.8.19-next.1 + - @backstage/plugin-search-react@1.8.6-next.1 + - @backstage/plugin-auth-react@0.1.12-next.0 + - @backstage/plugin-kubernetes@0.12.4-next.1 + - @backstage/plugin-api-docs@0.12.4-next.1 + - @backstage/plugin-devtools@0.1.24-next.1 + - @backstage/plugin-catalog@1.26.2-next.1 + - @backstage/plugin-signals@0.0.16-next.0 + - @backstage/theme@0.6.4-next.0 + - @backstage/plugin-search@1.4.23-next.1 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-search-common@1.2.17 + +## 0.2.106-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.30.0-next.0 + - @backstage/plugin-notifications@0.5.2-next.0 + - @backstage/plugin-search-react@1.8.6-next.0 + - @backstage/plugin-search@1.4.23-next.0 + - @backstage/plugin-techdocs@1.12.2-next.0 + - @backstage/plugin-scaffolder@1.27.5-next.0 + - @backstage/plugin-scaffolder-react@1.14.4-next.0 + - @backstage/frontend-app-api@0.10.5-next.0 + - @backstage/app-defaults@1.5.16 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.15.4 + - @backstage/core-components@0.16.3 + - @backstage/core-plugin-api@1.10.3 + - @backstage/integration-react@1.2.3 + - @backstage/theme@0.6.3 + - @backstage/plugin-api-docs@0.12.4-next.0 + - @backstage/plugin-auth-react@0.1.11 + - @backstage/plugin-catalog@1.26.2-next.0 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-graph@0.4.16-next.0 + - @backstage/plugin-catalog-import@0.12.10-next.0 + - @backstage/plugin-catalog-react@1.15.2-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.13 + - @backstage/plugin-devtools@0.1.24-next.0 + - @backstage/plugin-home@0.8.5-next.0 + - @backstage/plugin-kubernetes@0.12.4-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.22-next.0 + - @backstage/plugin-org@0.6.36-next.0 + - @backstage/plugin-permission-react@0.4.30 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-signals@0.0.15 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.20 + - @backstage/plugin-techdocs-react@1.2.13 + - @backstage/plugin-user-settings@0.8.19-next.0 + +## 0.2.105 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.8.4 + - @backstage/cli@0.29.5 + - @backstage/plugin-catalog-react@1.15.1 + - @backstage/plugin-techdocs@1.12.1 + - @backstage/plugin-scaffolder-react@1.14.3 + - @backstage/core-plugin-api@1.10.3 + - @backstage/core-components@0.16.3 + - @backstage/plugin-catalog@1.26.1 + - @backstage/plugin-scaffolder@1.27.4 + - @backstage/plugin-api-docs@0.12.3 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.20 + - @backstage/app-defaults@1.5.16 + - @backstage/catalog-model@1.7.3 + - @backstage/config@1.3.2 + - @backstage/core-app-api@1.15.4 + - @backstage/frontend-app-api@0.10.4 + - @backstage/integration-react@1.2.3 + - @backstage/theme@0.6.3 + - @backstage/plugin-auth-react@0.1.11 + - @backstage/plugin-catalog-common@1.1.3 + - @backstage/plugin-catalog-graph@0.4.15 + - @backstage/plugin-catalog-import@0.12.9 + - @backstage/plugin-catalog-unprocessed-entities@0.2.13 + - @backstage/plugin-devtools@0.1.23 + - @backstage/plugin-kubernetes@0.12.3 + - @backstage/plugin-kubernetes-cluster@0.0.21 + - @backstage/plugin-notifications@0.5.1 + - @backstage/plugin-org@0.6.35 + - @backstage/plugin-permission-react@0.4.30 + - @backstage/plugin-search@1.4.22 + - @backstage/plugin-search-common@1.2.17 + - @backstage/plugin-search-react@1.8.5 + - @backstage/plugin-signals@0.0.15 + - @backstage/plugin-techdocs-react@1.2.13 + - @backstage/plugin-user-settings@0.8.18 + +## 0.2.105-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.12.1-next.1 + - @backstage/plugin-scaffolder-react@1.14.3-next.2 + - @backstage/core-plugin-api@1.10.3-next.0 + - @backstage/plugin-catalog@1.26.1-next.1 + - @backstage/plugin-api-docs@0.12.3-next.1 + - @backstage/plugin-scaffolder@1.27.4-next.2 + - @backstage/frontend-app-api@0.10.4-next.0 + - @backstage/plugin-catalog-graph@0.4.15-next.1 + - @backstage/plugin-catalog-import@0.12.9-next.1 + - @backstage/plugin-catalog-react@1.15.1-next.1 + - @backstage/plugin-devtools@0.1.23-next.0 + - @backstage/plugin-home@0.8.4-next.2 + - @backstage/plugin-kubernetes@0.12.3-next.1 + - @backstage/plugin-org@0.6.35-next.1 + - @backstage/plugin-search@1.4.22-next.1 + - @backstage/plugin-search-react@1.8.5-next.0 + - @backstage/plugin-user-settings@0.8.18-next.1 + - @backstage/app-defaults@1.5.16-next.0 + - @backstage/cli@0.29.5-next.1 + - @backstage/core-app-api@1.15.4-next.0 + - @backstage/core-components@0.16.3-next.0 + - @backstage/integration-react@1.2.3-next.0 + - @backstage/plugin-auth-react@0.1.11-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.13-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.21-next.1 + - @backstage/plugin-notifications@0.5.1-next.0 + - @backstage/plugin-permission-react@0.4.30-next.0 + - @backstage/plugin-signals@0.0.15-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.20-next.1 + - @backstage/plugin-techdocs-react@1.2.13-next.0 + - @backstage/catalog-model@1.7.3-next.0 + - @backstage/config@1.3.2-next.0 + - @backstage/plugin-search-common@1.2.17-next.0 + - @backstage/plugin-catalog-common@1.1.3-next.0 + - @backstage/theme@0.6.3 + +## 0.2.105-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.1-next.0 + - @backstage/plugin-home@0.8.4-next.1 + - @backstage/plugin-scaffolder-react@1.14.3-next.1 + - @backstage/plugin-scaffolder@1.27.4-next.1 + - @backstage/plugin-api-docs@0.12.3-next.0 + - @backstage/plugin-catalog@1.26.1-next.0 + - @backstage/plugin-catalog-graph@0.4.15-next.0 + - @backstage/plugin-catalog-import@0.12.9-next.0 + - @backstage/plugin-kubernetes@0.12.3-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.21-next.0 + - @backstage/plugin-org@0.6.35-next.0 + - @backstage/plugin-search@1.4.22-next.0 + - @backstage/plugin-techdocs@1.12.1-next.0 + - @backstage/plugin-user-settings@0.8.18-next.0 + - @backstage/cli@0.29.5-next.0 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12 + - @backstage/plugin-devtools@0.1.22 + - @backstage/plugin-notifications@0.5.0 + - @backstage/plugin-signals@0.0.14 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.20-next.0 + +## 0.2.105-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.8.4-next.0 + - @backstage/cli@0.29.5-next.0 + - @backstage/plugin-scaffolder-react@1.14.3-next.0 + - @backstage/plugin-scaffolder@1.27.4-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.20-next.0 + - @backstage/app-defaults@1.5.15 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-app-api@1.15.3 + - @backstage/core-components@0.16.2 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-app-api@0.10.3 + - @backstage/integration-react@1.2.2 + - @backstage/theme@0.6.3 + - @backstage/plugin-api-docs@0.12.2 + - @backstage/plugin-auth-react@0.1.10 + - @backstage/plugin-catalog@1.26.0 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-graph@0.4.14 + - @backstage/plugin-catalog-import@0.12.8 + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12 + - @backstage/plugin-devtools@0.1.22 + - @backstage/plugin-kubernetes@0.12.2 + - @backstage/plugin-kubernetes-cluster@0.0.20 + - @backstage/plugin-notifications@0.5.0 + - @backstage/plugin-org@0.6.34 + - @backstage/plugin-permission-react@0.4.29 + - @backstage/plugin-search@1.4.21 + - @backstage/plugin-search-common@1.2.16 + - @backstage/plugin-search-react@1.8.4 + - @backstage/plugin-signals@0.0.14 + - @backstage/plugin-techdocs@1.12.0 + - @backstage/plugin-techdocs-react@1.2.12 + - @backstage/plugin-user-settings@0.8.17 + +## 0.2.104 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.15.0 + - @backstage/cli@0.29.4 + - @backstage/plugin-home@0.8.3 + - @backstage/plugin-techdocs@1.12.0 + - @backstage/core-app-api@1.15.3 + - @backstage/plugin-catalog@1.26.0 + - @backstage/plugin-scaffolder-react@1.14.2 + - @backstage/plugin-scaffolder@1.27.2 + - @backstage/plugin-search-react@1.8.4 + - @backstage/plugin-search@1.4.21 + - @backstage/plugin-notifications@0.5.0 + - @backstage/theme@0.6.3 + - @backstage/plugin-api-docs@0.12.2 + - @backstage/core-components@0.16.2 + - @backstage/plugin-catalog-graph@0.4.14 + - @backstage/plugin-catalog-import@0.12.8 + - @backstage/plugin-kubernetes@0.12.2 + - @backstage/plugin-kubernetes-cluster@0.0.20 + - @backstage/plugin-org@0.6.34 + - @backstage/plugin-user-settings@0.8.17 + - @backstage/app-defaults@1.5.15 + - @backstage/catalog-model@1.7.2 + - @backstage/config@1.3.1 + - @backstage/core-plugin-api@1.10.2 + - @backstage/frontend-app-api@0.10.3 + - @backstage/integration-react@1.2.2 + - @backstage/plugin-auth-react@0.1.10 + - @backstage/plugin-catalog-common@1.1.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12 + - @backstage/plugin-devtools@0.1.22 + - @backstage/plugin-permission-react@0.4.29 + - @backstage/plugin-search-common@1.2.16 + - @backstage/plugin-signals@0.0.14 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.19 + - @backstage/plugin-techdocs-react@1.2.12 + +## 0.2.104-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.26.0-next.2 + - @backstage/plugin-notifications@0.5.0-next.2 + - @backstage/cli@0.29.3-next.2 + - @backstage/plugin-catalog-react@1.14.3-next.2 + - @backstage/plugin-scaffolder-react@1.14.2-next.2 + - @backstage/plugin-scaffolder@1.27.2-next.2 + - @backstage/plugin-api-docs@0.12.2-next.2 + - @backstage/plugin-catalog-graph@0.4.14-next.2 + - @backstage/plugin-catalog-import@0.12.8-next.2 + - @backstage/plugin-org@0.6.34-next.2 + - @backstage/plugin-user-settings@0.8.17-next.2 + - @backstage/app-defaults@1.5.15-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-app-api@0.10.3-next.2 + - @backstage/integration-react@1.2.2-next.1 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-auth-react@0.1.10-next.2 + - @backstage/plugin-catalog-common@1.1.2-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12-next.2 + - @backstage/plugin-devtools@0.1.22-next.2 + - @backstage/plugin-home@0.8.3-next.2 + - @backstage/plugin-kubernetes@0.12.2-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.20-next.2 + - @backstage/plugin-permission-react@0.4.29-next.0 + - @backstage/plugin-search@1.4.21-next.2 + - @backstage/plugin-search-common@1.2.16-next.0 + - @backstage/plugin-search-react@1.8.4-next.2 + - @backstage/plugin-signals@0.0.14-next.2 + - @backstage/plugin-techdocs@1.11.3-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.19-next.2 + - @backstage/plugin-techdocs-react@1.2.12-next.2 + +## 0.2.104-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.8.3-next.1 + - @backstage/plugin-catalog-react@1.14.3-next.1 + - @backstage/plugin-scaffolder-react@1.14.2-next.1 + - @backstage/cli@0.29.3-next.1 + - @backstage/core-components@0.16.2-next.1 + - @backstage/plugin-api-docs@0.12.2-next.1 + - @backstage/plugin-catalog@1.25.2-next.1 + - @backstage/plugin-catalog-graph@0.4.14-next.1 + - @backstage/plugin-catalog-import@0.12.8-next.1 + - @backstage/plugin-kubernetes@0.12.2-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.20-next.1 + - @backstage/plugin-org@0.6.34-next.1 + - @backstage/plugin-scaffolder@1.27.2-next.1 + - @backstage/plugin-search@1.4.21-next.1 + - @backstage/plugin-techdocs@1.11.3-next.1 + - @backstage/plugin-user-settings@0.8.17-next.1 + - @backstage/app-defaults@1.5.15-next.1 + - @backstage/catalog-model@1.7.1 + - @backstage/config@1.3.0 + - @backstage/core-app-api@1.15.3-next.0 + - @backstage/core-plugin-api@1.10.1 + - @backstage/frontend-app-api@0.10.3-next.1 + - @backstage/integration-react@1.2.2-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-auth-react@0.1.10-next.1 + - @backstage/plugin-catalog-common@1.1.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12-next.1 + - @backstage/plugin-devtools@0.1.22-next.1 + - @backstage/plugin-notifications@0.4.2-next.1 + - @backstage/plugin-permission-react@0.4.28 + - @backstage/plugin-search-common@1.2.15 + - @backstage/plugin-search-react@1.8.4-next.1 + - @backstage/plugin-signals@0.0.14-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.19-next.1 + - @backstage/plugin-techdocs-react@1.2.12-next.1 + +## 0.2.104-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.29.3-next.0 + - @backstage/core-app-api@1.15.3-next.0 + - @backstage/plugin-scaffolder-react@1.14.2-next.0 + - @backstage/plugin-scaffolder@1.27.2-next.0 + - @backstage/plugin-search-react@1.8.4-next.0 + - @backstage/plugin-search@1.4.21-next.0 + - @backstage/plugin-catalog-react@1.14.3-next.0 + - @backstage/plugin-techdocs@1.11.3-next.0 + - @backstage/plugin-home@0.8.3-next.0 + - @backstage/theme@0.6.3-next.0 + - @backstage/plugin-api-docs@0.12.2-next.0 + - @backstage/app-defaults@1.5.15-next.0 + - @backstage/catalog-model@1.7.1 + - @backstage/config@1.3.0 + - @backstage/core-components@0.16.2-next.0 + - @backstage/core-plugin-api@1.10.1 + - @backstage/frontend-app-api@0.10.3-next.0 + - @backstage/integration-react@1.2.2-next.0 + - @backstage/plugin-auth-react@0.1.10-next.0 + - @backstage/plugin-catalog@1.25.2-next.0 + - @backstage/plugin-catalog-common@1.1.1 + - @backstage/plugin-catalog-graph@0.4.14-next.0 + - @backstage/plugin-catalog-import@0.12.8-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.12-next.0 + - @backstage/plugin-devtools@0.1.22-next.0 + - @backstage/plugin-kubernetes@0.12.2-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.20-next.0 + - @backstage/plugin-notifications@0.4.2-next.0 + - @backstage/plugin-org@0.6.34-next.0 + - @backstage/plugin-permission-react@0.4.28 + - @backstage/plugin-search-common@1.2.15 + - @backstage/plugin-signals@0.0.14-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.19-next.0 + - @backstage/plugin-techdocs-react@1.2.12-next.0 + - @backstage/plugin-user-settings@0.8.17-next.0 + +## 0.2.103 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.29.0 + - @backstage/plugin-catalog@1.25.0 + - @backstage/plugin-api-docs@0.12.0 + - @backstage/config@1.3.0 + - @backstage/theme@0.6.1 + - @backstage/plugin-notifications@0.4.0 + - @backstage/plugin-techdocs@1.11.1 + - @backstage/plugin-search@1.4.19 + - @backstage/plugin-org@0.6.32 + - @backstage/plugin-scaffolder-react@1.14.0 + - @backstage/plugin-catalog-react@1.14.1 + - @backstage/plugin-scaffolder@1.27.0 + - @backstage/plugin-catalog-import@0.12.6 + - @backstage/core-components@0.16.0 + - @backstage/plugin-kubernetes@0.12.0 + - @backstage/plugin-home@0.8.1 + - @backstage/plugin-techdocs-react@1.2.10 + - @backstage/core-app-api@1.15.2 + - @backstage/plugin-signals@0.0.12 + - @backstage/plugin-kubernetes-cluster@0.0.18 + - @backstage/app-defaults@1.5.13 + - @backstage/catalog-model@1.7.1 + - @backstage/core-plugin-api@1.10.1 + - @backstage/frontend-app-api@0.10.1 + - @backstage/integration-react@1.2.1 + - @backstage/plugin-auth-react@0.1.8 + - @backstage/plugin-catalog-common@1.1.1 + - @backstage/plugin-catalog-graph@0.4.12 + - @backstage/plugin-catalog-unprocessed-entities@0.2.10 + - @backstage/plugin-devtools@0.1.20 + - @backstage/plugin-permission-react@0.4.28 + - @backstage/plugin-search-common@1.2.15 + - @backstage/plugin-search-react@1.8.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.17 + - @backstage/plugin-user-settings@0.8.15 + +## 0.2.103-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.25.0-next.3 + - @backstage/cli@0.29.0-next.3 + - @backstage/plugin-search@1.4.19-next.3 + - @backstage/plugin-techdocs@1.11.1-next.3 + - @backstage/plugin-scaffolder-react@1.14.0-next.3 + - @backstage/plugin-scaffolder@1.27.0-next.3 + - @backstage/core-components@0.16.0-next.2 + - @backstage/plugin-catalog-react@1.14.1-next.3 + - @backstage/plugin-api-docs@0.11.12-next.3 + - @backstage/plugin-catalog-graph@0.4.12-next.3 + - @backstage/plugin-catalog-import@0.12.6-next.3 + - @backstage/plugin-org@0.6.32-next.3 + - @backstage/plugin-user-settings@0.8.15-next.3 + - @backstage/app-defaults@1.5.13-next.2 + - @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-app-api@0.10.1-next.2 + - @backstage/integration-react@1.2.0 + - @backstage/theme@0.6.1-next.0 + - @backstage/plugin-auth-react@0.1.8-next.2 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.10-next.2 + - @backstage/plugin-devtools@0.1.20-next.2 + - @backstage/plugin-home@0.8.1-next.3 + - @backstage/plugin-kubernetes@0.12.0-next.3 + - @backstage/plugin-kubernetes-cluster@0.0.18-next.3 + - @backstage/plugin-notifications@0.3.3-next.2 + - @backstage/plugin-permission-react@0.4.27 + - @backstage/plugin-search-common@1.2.14 + - @backstage/plugin-search-react@1.8.2-next.2 + - @backstage/plugin-signals@0.0.12-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.17-next.2 + - @backstage/plugin-techdocs-react@1.2.10-next.2 + +## 0.2.103-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.29.0-next.2 + - @backstage/plugin-catalog-import@0.12.6-next.2 + - @backstage/plugin-scaffolder@1.26.3-next.2 + - @backstage/plugin-catalog@1.24.1-next.2 + - @backstage/plugin-catalog-graph@0.4.12-next.2 + - @backstage/plugin-catalog-react@1.14.1-next.2 + - @backstage/plugin-home@0.8.1-next.2 + - @backstage/plugin-org@0.6.32-next.2 + - @backstage/plugin-scaffolder-react@1.13.3-next.2 + - @backstage/app-defaults@1.5.13-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.15.1 + - @backstage/core-components@0.16.0-next.1 + - @backstage/core-plugin-api@1.10.0 + - @backstage/frontend-app-api@0.10.1-next.1 + - @backstage/integration-react@1.2.0 + - @backstage/theme@0.6.1-next.0 + - @backstage/plugin-api-docs@0.11.12-next.2 + - @backstage/plugin-auth-react@0.1.8-next.1 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.10-next.1 + - @backstage/plugin-devtools@0.1.20-next.1 + - @backstage/plugin-kubernetes@0.12.0-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.18-next.2 + - @backstage/plugin-notifications@0.3.3-next.1 + - @backstage/plugin-permission-react@0.4.27 + - @backstage/plugin-search@1.4.19-next.2 + - @backstage/plugin-search-common@1.2.14 + - @backstage/plugin-search-react@1.8.2-next.1 + - @backstage/plugin-signals@0.0.12-next.1 + - @backstage/plugin-techdocs@1.11.1-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.17-next.1 + - @backstage/plugin-techdocs-react@1.2.10-next.1 + - @backstage/plugin-user-settings@0.8.15-next.2 + +## 0.2.103-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.29.0-next.1 + - @backstage/theme@0.6.1-next.0 + - @backstage/plugin-techdocs@1.11.1-next.1 + - @backstage/plugin-kubernetes@0.12.0-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.18-next.1 + - @backstage/app-defaults@1.5.13-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.15.1 + - @backstage/core-components@0.16.0-next.1 + - @backstage/core-plugin-api@1.10.0 + - @backstage/frontend-app-api@0.10.1-next.1 + - @backstage/integration-react@1.2.0 + - @backstage/plugin-api-docs@0.11.12-next.1 + - @backstage/plugin-auth-react@0.1.8-next.1 + - @backstage/plugin-catalog@1.24.1-next.1 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-graph@0.4.12-next.1 + - @backstage/plugin-catalog-import@0.12.6-next.1 + - @backstage/plugin-catalog-react@1.14.1-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.10-next.1 + - @backstage/plugin-devtools@0.1.20-next.1 + - @backstage/plugin-home@0.8.1-next.1 + - @backstage/plugin-notifications@0.3.3-next.1 + - @backstage/plugin-org@0.6.32-next.1 + - @backstage/plugin-permission-react@0.4.27 + - @backstage/plugin-scaffolder@1.26.3-next.1 + - @backstage/plugin-scaffolder-react@1.13.3-next.1 + - @backstage/plugin-search@1.4.19-next.1 + - @backstage/plugin-search-common@1.2.14 + - @backstage/plugin-search-react@1.8.2-next.1 + - @backstage/plugin-signals@0.0.12-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.17-next.1 + - @backstage/plugin-techdocs-react@1.2.10-next.1 + - @backstage/plugin-user-settings@0.8.15-next.1 + +## 0.2.103-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.29.0-next.0 + - @backstage/plugin-api-docs@0.11.12-next.0 + - @backstage/plugin-scaffolder-react@1.13.2-next.0 + - @backstage/plugin-techdocs@1.11.1-next.0 + - @backstage/core-components@0.16.0-next.0 + - @backstage/plugin-home@0.8.1-next.0 + - @backstage/plugin-scaffolder@1.26.2-next.0 + - @backstage/plugin-techdocs-react@1.2.10-next.0 + - @backstage/plugin-notifications@0.3.3-next.0 + - @backstage/app-defaults@1.5.13-next.0 + - @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-app-api@0.10.1-next.0 + - @backstage/integration-react@1.2.0 + - @backstage/theme@0.6.0 + - @backstage/plugin-auth-react@0.1.8-next.0 + - @backstage/plugin-catalog@1.24.1-next.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-graph@0.4.12-next.0 + - @backstage/plugin-catalog-import@0.12.6-next.0 + - @backstage/plugin-catalog-react@1.14.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.10-next.0 + - @backstage/plugin-devtools@0.1.20-next.0 + - @backstage/plugin-kubernetes@0.11.17-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.18-next.0 + - @backstage/plugin-org@0.6.32-next.0 + - @backstage/plugin-permission-react@0.4.27 + - @backstage/plugin-search@1.4.19-next.0 + - @backstage/plugin-search-common@1.2.14 + - @backstage/plugin-search-react@1.8.2-next.0 + - @backstage/plugin-signals@0.0.12-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.17-next.0 + - @backstage/plugin-user-settings@0.8.15-next.0 + +## 0.2.102 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.28.0 + - @backstage/core-components@0.15.1 + - @backstage/plugin-scaffolder@1.26.0 + - @backstage/plugin-scaffolder-react@1.13.0 + - @backstage/plugin-catalog@1.24.0 + - @backstage/plugin-signals@0.0.11 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.16 + - @backstage/plugin-catalog-unprocessed-entities@0.2.9 + - @backstage/integration-react@1.2.0 + - @backstage/plugin-kubernetes-cluster@0.0.17 + - @backstage/frontend-app-api@0.10.0 + - @backstage/core-plugin-api@1.10.0 + - @backstage/plugin-permission-react@0.4.27 + - @backstage/plugin-catalog-import@0.12.5 + - @backstage/plugin-techdocs-react@1.2.9 + - @backstage/app-defaults@1.5.12 + - @backstage/core-app-api@1.15.1 + - @backstage/plugin-catalog-graph@0.4.11 + - @backstage/plugin-catalog-react@1.14.0 + - @backstage/plugin-notifications@0.3.2 + - @backstage/plugin-user-settings@0.8.14 + - @backstage/plugin-search-react@1.8.1 + - @backstage/plugin-auth-react@0.1.7 + - @backstage/plugin-kubernetes@0.11.16 + - @backstage/plugin-api-docs@0.11.11 + - @backstage/plugin-devtools@0.1.19 + - @backstage/plugin-techdocs@1.11.0 + - @backstage/theme@0.6.0 + - @backstage/plugin-search@1.4.18 + - @backstage/plugin-home@0.8.0 + - @backstage/plugin-org@0.6.31 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-search-common@1.2.14 + +## 0.2.102-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.28.0-next.2 + - @backstage/plugin-scaffolder@1.26.0-next.2 + - @backstage/plugin-catalog@1.24.0-next.2 + - @backstage/plugin-catalog-react@1.14.0-next.2 + - @backstage/plugin-home@0.8.0-next.2 + - @backstage/plugin-techdocs@1.11.0-next.2 + - @backstage/plugin-catalog-import@0.12.5-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.16-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.17-next.2 + - @backstage/plugin-kubernetes@0.11.16-next.2 + - @backstage/plugin-search@1.4.18-next.2 + - @backstage/plugin-user-settings@0.8.14-next.2 + - @backstage/theme@0.6.0-next.1 + - @backstage/plugin-catalog-graph@0.4.11-next.2 + - @backstage/app-defaults@1.5.12-next.2 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/core-components@0.15.1-next.2 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/frontend-app-api@0.10.0-next.2 + - @backstage/integration-react@1.2.0-next.2 + - @backstage/plugin-api-docs@0.11.11-next.2 + - @backstage/plugin-auth-react@0.1.7-next.2 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.9-next.2 + - @backstage/plugin-devtools@0.1.19-next.2 + - @backstage/plugin-notifications@0.3.2-next.2 + - @backstage/plugin-org@0.6.31-next.2 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/plugin-scaffolder-react@1.13.0-next.2 + - @backstage/plugin-search-common@1.2.14 + - @backstage/plugin-search-react@1.8.1-next.2 + - @backstage/plugin-signals@0.0.11-next.2 + - @backstage/plugin-techdocs-react@1.2.9-next.2 + +## 0.2.102-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.15.1-next.1 + - @backstage/cli@0.28.0-next.1 + - @backstage/plugin-scaffolder@1.26.0-next.1 + - @backstage/plugin-signals@0.0.11-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.16-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.9-next.1 + - @backstage/integration-react@1.2.0-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.17-next.1 + - @backstage/frontend-app-api@0.10.0-next.1 + - @backstage/core-plugin-api@1.10.0-next.1 + - @backstage/plugin-permission-react@0.4.27-next.1 + - @backstage/plugin-scaffolder-react@1.13.0-next.1 + - @backstage/plugin-catalog-import@0.12.5-next.1 + - @backstage/plugin-techdocs-react@1.2.9-next.1 + - @backstage/app-defaults@1.5.12-next.1 + - @backstage/core-app-api@1.15.1-next.1 + - @backstage/plugin-catalog-graph@0.4.11-next.1 + - @backstage/plugin-catalog-react@1.14.0-next.1 + - @backstage/plugin-notifications@0.3.2-next.1 + - @backstage/plugin-user-settings@0.8.14-next.1 + - @backstage/plugin-search-react@1.8.1-next.1 + - @backstage/plugin-auth-react@0.1.7-next.1 + - @backstage/plugin-kubernetes@0.11.16-next.1 + - @backstage/plugin-api-docs@0.11.11-next.1 + - @backstage/plugin-devtools@0.1.19-next.1 + - @backstage/plugin-techdocs@1.10.11-next.1 + - @backstage/plugin-catalog@1.24.0-next.1 + - @backstage/theme@0.5.8-next.0 + - @backstage/plugin-search@1.4.18-next.1 + - @backstage/plugin-home@0.7.12-next.1 + - @backstage/plugin-org@0.6.31-next.1 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-search-common@1.2.14 + +## 0.2.102-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder@1.26.0-next.0 + - @backstage/plugin-catalog@1.24.0-next.0 + - @backstage/cli@0.28.0-next.0 + - @backstage/plugin-scaffolder-react@1.13.0-next.0 + - @backstage/plugin-api-docs@0.11.10-next.0 + - @backstage/frontend-app-api@0.10.0-next.0 + - @backstage/plugin-techdocs@1.10.10-next.0 + - @backstage/app-defaults@1.5.12-next.0 + - @backstage/core-components@0.15.1-next.0 + - @backstage/core-plugin-api@1.10.0-next.0 + - @backstage/plugin-catalog-graph@0.4.10-next.0 + - @backstage/plugin-catalog-import@0.12.4-next.0 + - @backstage/plugin-catalog-react@1.13.1-next.0 + - @backstage/plugin-devtools@0.1.19-next.0 + - @backstage/plugin-home@0.7.11-next.0 + - @backstage/plugin-kubernetes@0.11.15-next.0 + - @backstage/plugin-org@0.6.30-next.0 + - @backstage/plugin-search@1.4.17-next.0 + - @backstage/plugin-search-react@1.8.1-next.0 + - @backstage/plugin-user-settings@0.8.13-next.0 + - @backstage/catalog-model@1.7.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.15.1-next.0 + - @backstage/integration-react@1.1.32-next.0 + - @backstage/theme@0.5.7 + - @backstage/plugin-auth-react@0.1.7-next.0 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.9-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.16-next.0 + - @backstage/plugin-notifications@0.3.2-next.0 + - @backstage/plugin-permission-react@0.4.27-next.0 + - @backstage/plugin-search-common@1.2.14 + - @backstage/plugin-signals@0.0.11-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.15-next.0 + - @backstage/plugin-techdocs-react@1.2.9-next.0 + +## 0.2.101 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.15.0 + - @backstage/plugin-catalog-react@1.13.0 + - @backstage/plugin-techdocs@1.10.9 + - @backstage/plugin-catalog@1.23.0 + - @backstage/plugin-home@0.7.10 + - @backstage/cli@0.27.1 + - @backstage/plugin-techdocs-react@1.2.8 + - @backstage/core-app-api@1.15.0 + - @backstage/frontend-app-api@0.9.0 + - @backstage/plugin-catalog-import@0.12.3 + - @backstage/plugin-catalog-graph@0.4.9 + - @backstage/plugin-user-settings@0.8.12 + - @backstage/plugin-search-react@1.8.0 + - @backstage/plugin-kubernetes@0.11.14 + - @backstage/plugin-scaffolder@1.25.0 + - @backstage/plugin-api-docs@0.11.9 + - @backstage/plugin-devtools@0.1.18 + - @backstage/plugin-search@1.4.16 + - @backstage/plugin-org@0.6.29 + - @backstage/integration-react@1.1.31 + - @backstage/plugin-notifications@0.3.1 + - @backstage/catalog-model@1.7.0 + - @backstage/plugin-scaffolder-react@1.12.0 + - @backstage/app-defaults@1.5.11 + - @backstage/plugin-catalog-common@1.1.0 + - @backstage/core-plugin-api@1.9.4 + - @backstage/theme@0.5.7 + - @backstage/plugin-auth-react@0.1.6 + - @backstage/plugin-catalog-unprocessed-entities@0.2.8 + - @backstage/plugin-kubernetes-cluster@0.0.15 + - @backstage/plugin-permission-react@0.4.26 + - @backstage/plugin-signals@0.0.10 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.14 + - @backstage/config@1.2.0 + - @backstage/plugin-search-common@1.2.14 + +## 0.2.101-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.11-next.1 + - @backstage/plugin-catalog-react@1.13.0-next.2 + - @backstage/plugin-techdocs@1.10.9-next.2 + - @backstage/plugin-catalog@1.23.0-next.2 + - @backstage/plugin-home@0.7.10-next.2 + - @backstage/cli@0.27.1-next.2 + - @backstage/core-app-api@1.14.3-next.0 + - @backstage/integration-react@1.1.31-next.0 + - @backstage/plugin-scaffolder@1.25.0-next.2 + - @backstage/plugin-notifications@0.3.1-next.2 + - @backstage/plugin-scaffolder-react@1.12.0-next.2 + - @backstage/app-defaults@1.5.11-next.1 + - @backstage/plugin-catalog-import@0.12.3-next.2 + - @backstage/plugin-search-react@1.8.0-next.2 + - @backstage/core-plugin-api@1.9.4-next.0 + - @backstage/frontend-app-api@0.9.0-next.2 + - @backstage/theme@0.5.7-next.0 + - @backstage/plugin-api-docs@0.11.9-next.2 + - @backstage/plugin-auth-react@0.1.6-next.1 + - @backstage/plugin-catalog-graph@0.4.9-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.8-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.15-next.2 + - @backstage/plugin-kubernetes@0.11.14-next.2 + - @backstage/plugin-org@0.6.29-next.2 + - @backstage/plugin-permission-react@0.4.26-next.0 + - @backstage/plugin-search@1.4.16-next.2 + - @backstage/plugin-signals@0.0.10-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.14-next.2 + - @backstage/plugin-techdocs-react@1.2.8-next.2 + - @backstage/plugin-user-settings@0.8.12-next.2 + - @backstage/plugin-devtools@0.1.18-next.2 + - @backstage/catalog-model@1.6.0 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.0.26 + - @backstage/plugin-search-common@1.2.14 + +## 0.2.101-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.27.1-next.1 + - @backstage/frontend-app-api@0.9.0-next.1 + - @backstage/core-components@0.14.11-next.0 + - @backstage/plugin-catalog-graph@0.4.9-next.1 + - @backstage/plugin-scaffolder-react@1.12.0-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.8-next.0 + - @backstage/plugin-signals@0.0.10-next.1 + - @backstage/plugin-catalog-react@1.12.4-next.1 + - @backstage/app-defaults@1.5.11-next.0 + - @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/integration-react@1.1.30 + - @backstage/theme@0.5.6 + - @backstage/plugin-api-docs@0.11.9-next.1 + - @backstage/plugin-auth-react@0.1.6-next.0 + - @backstage/plugin-catalog@1.22.1-next.1 + - @backstage/plugin-catalog-common@1.0.26 + - @backstage/plugin-catalog-import@0.12.3-next.1 + - @backstage/plugin-devtools@0.1.18-next.1 + - @backstage/plugin-home@0.7.10-next.1 + - @backstage/plugin-kubernetes@0.11.14-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.15-next.1 + - @backstage/plugin-notifications@0.3.1-next.1 + - @backstage/plugin-org@0.6.29-next.1 + - @backstage/plugin-permission-react@0.4.25 + - @backstage/plugin-scaffolder@1.25.0-next.1 + - @backstage/plugin-search@1.4.16-next.1 + - @backstage/plugin-search-common@1.2.14 + - @backstage/plugin-search-react@1.8.0-next.1 + - @backstage/plugin-techdocs@1.10.9-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.14-next.1 + - @backstage/plugin-techdocs-react@1.2.8-next.1 + - @backstage/plugin-user-settings@0.8.12-next.1 + +## 0.2.101-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs-react@1.2.8-next.0 + - @backstage/frontend-app-api@0.9.0-next.0 + - @backstage/plugin-catalog-import@0.12.3-next.0 + - @backstage/plugin-catalog-graph@0.4.9-next.0 + - @backstage/plugin-catalog-react@1.12.4-next.0 + - @backstage/plugin-user-settings@0.8.12-next.0 + - @backstage/plugin-search-react@1.8.0-next.0 + - @backstage/plugin-kubernetes@0.11.14-next.0 + - @backstage/plugin-scaffolder@1.25.0-next.0 + - @backstage/plugin-api-docs@0.11.9-next.0 + - @backstage/plugin-devtools@0.1.18-next.0 + - @backstage/plugin-techdocs@1.10.9-next.0 + - @backstage/plugin-catalog@1.22.1-next.0 + - @backstage/plugin-search@1.4.16-next.0 + - @backstage/plugin-home@0.7.10-next.0 + - @backstage/plugin-org@0.6.29-next.0 + - @backstage/plugin-scaffolder-react@1.12.0-next.0 + - @backstage/cli@0.27.1-next.0 + - @backstage/plugin-signals@0.0.10-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.14-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.15-next.0 + - @backstage/app-defaults@1.5.10 + - @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/integration-react@1.1.30 + - @backstage/theme@0.5.6 + - @backstage/plugin-auth-react@0.1.5 + - @backstage/plugin-catalog-common@1.0.26 + - @backstage/plugin-catalog-unprocessed-entities@0.2.7 + - @backstage/plugin-notifications@0.3.1-next.0 + - @backstage/plugin-permission-react@0.4.25 + - @backstage/plugin-search-common@1.2.14 + +## 0.2.100 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.22.0 + - @backstage/plugin-scaffolder@1.24.0 + - @backstage/plugin-scaffolder-react@1.11.0 + - @backstage/cli@0.27.0 + - @backstage/plugin-notifications@0.3.0 + - @backstage/plugin-catalog-react@1.12.3 + - @backstage/plugin-search-react@1.7.14 + - @backstage/plugin-home@0.7.9 + - @backstage/plugin-techdocs@1.10.8 + - @backstage/core-components@0.14.10 + - @backstage/plugin-api-docs@0.11.8 + - @backstage/frontend-app-api@0.8.0 + - @backstage/plugin-catalog-graph@0.4.8 + - @backstage/plugin-catalog-import@0.12.2 + - @backstage/plugin-devtools@0.1.17 + - @backstage/plugin-org@0.6.28 + - @backstage/plugin-search@1.4.15 + - @backstage/plugin-user-settings@0.8.11 + - @backstage/plugin-search-common@1.2.14 + - @backstage/plugin-kubernetes@0.11.13 + - @backstage/core-app-api@1.14.2 + - @backstage/plugin-auth-react@0.1.5 + - @backstage/catalog-model@1.6.0 + - @backstage/app-defaults@1.5.10 + - @backstage/config@1.2.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/integration-react@1.1.30 + - @backstage/theme@0.5.6 + - @backstage/plugin-catalog-common@1.0.26 + - @backstage/plugin-catalog-unprocessed-entities@0.2.7 + - @backstage/plugin-kubernetes-cluster@0.0.14 + - @backstage/plugin-permission-react@0.4.25 + - @backstage/plugin-signals@0.0.9 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.13 + - @backstage/plugin-techdocs-react@1.2.7 + +## 0.2.100-next.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder@1.24.0-next.3 + - @backstage/plugin-notifications@0.3.0-next.1 + - @backstage/cli@0.27.0-next.4 + - @backstage/plugin-techdocs@1.10.8-next.3 + - @backstage/plugin-api-docs@0.11.8-next.3 + - @backstage/plugin-catalog@1.22.0-next.3 + - @backstage/catalog-model@1.6.0-next.0 + - @backstage/frontend-app-api@0.7.5-next.3 + - @backstage/plugin-catalog-graph@0.4.8-next.4 + - @backstage/plugin-catalog-import@0.12.2-next.3 + - @backstage/plugin-catalog-react@1.12.3-next.3 + - @backstage/plugin-devtools@0.1.17-next.3 + - @backstage/plugin-home@0.7.9-next.3 + - @backstage/plugin-kubernetes@0.11.13-next.3 + - @backstage/plugin-org@0.6.28-next.3 + - @backstage/plugin-search@1.4.15-next.3 + - @backstage/plugin-search-react@1.7.14-next.3 + - @backstage/plugin-user-settings@0.8.11-next.3 + - @backstage/app-defaults@1.5.10-next.2 + - @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/integration-react@1.1.30-next.0 + - @backstage/theme@0.5.6 + - @backstage/plugin-auth-react@0.1.5-next.0 + - @backstage/plugin-catalog-common@1.0.26-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.7-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.14-next.3 + - @backstage/plugin-permission-react@0.4.25-next.1 + - @backstage/plugin-scaffolder-react@1.11.0-next.3 + - @backstage/plugin-search-common@1.2.14-next.1 + - @backstage/plugin-signals@0.0.9-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.13-next.1 + - @backstage/plugin-techdocs-react@1.2.7-next.1 + +## 0.2.100-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.11.0-next.2 + - @backstage/plugin-catalog@1.22.0-next.2 + - @backstage/cli@0.27.0-next.3 + - @backstage/frontend-app-api@0.7.5-next.2 + - @backstage/plugin-search-common@1.2.14-next.1 + - @backstage/plugin-search-react@1.7.14-next.2 + - @backstage/plugin-search@1.4.15-next.2 + - @backstage/plugin-api-docs@0.11.8-next.2 + - @backstage/plugin-techdocs@1.10.8-next.2 + - @backstage/plugin-scaffolder@1.24.0-next.2 + - @backstage/plugin-catalog-react@1.12.3-next.2 + - @backstage/plugin-catalog-graph@0.4.8-next.3 + - @backstage/plugin-catalog-import@0.12.2-next.2 + - @backstage/plugin-org@0.6.28-next.2 + - @backstage/plugin-user-settings@0.8.11-next.2 + - @backstage/plugin-devtools@0.1.17-next.2 + - @backstage/plugin-home@0.7.9-next.2 + - @backstage/plugin-kubernetes@0.11.13-next.2 + - @backstage/plugin-catalog-common@1.0.26-next.1 + - @backstage/plugin-permission-react@0.4.25-next.1 + - @backstage/app-defaults@1.5.10-next.2 + - @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/integration-react@1.1.30-next.0 + - @backstage/theme@0.5.6 + - @backstage/plugin-auth-react@0.1.5-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.7-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.14-next.2 + - @backstage/plugin-notifications@0.2.4-next.0 + - @backstage/plugin-signals@0.0.9-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.13-next.0 + - @backstage/plugin-techdocs-react@1.2.7-next.0 + +## 0.2.100-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.27.0-next.2 + - @backstage/plugin-catalog-graph@0.4.8-next.2 + - @backstage/app-defaults@1.5.10-next.1 + - @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/frontend-app-api@0.7.5-next.1 + - @backstage/integration-react@1.1.30-next.0 + - @backstage/theme@0.5.6 + - @backstage/plugin-api-docs@0.11.8-next.1 + - @backstage/plugin-auth-react@0.1.5-next.0 + - @backstage/plugin-catalog@1.21.2-next.1 + - @backstage/plugin-catalog-common@1.0.26-next.0 + - @backstage/plugin-catalog-import@0.12.2-next.1 + - @backstage/plugin-catalog-react@1.12.3-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.7-next.0 + - @backstage/plugin-devtools@0.1.17-next.1 + - @backstage/plugin-home@0.7.9-next.1 + - @backstage/plugin-kubernetes@0.11.13-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.14-next.1 + - @backstage/plugin-notifications@0.2.4-next.0 + - @backstage/plugin-org@0.6.28-next.1 + - @backstage/plugin-permission-react@0.4.25-next.0 + - @backstage/plugin-scaffolder@1.23.1-next.1 + - @backstage/plugin-scaffolder-react@1.11.0-next.1 + - @backstage/plugin-search@1.4.15-next.1 + - @backstage/plugin-search-common@1.2.14-next.0 + - @backstage/plugin-search-react@1.7.14-next.1 + - @backstage/plugin-signals@0.0.9-next.0 + - @backstage/plugin-techdocs@1.10.8-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.13-next.0 + - @backstage/plugin-techdocs-react@1.2.7-next.0 + - @backstage/plugin-user-settings@0.8.11-next.1 + +## 0.2.100-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.10.8-next.1 + - @backstage/plugin-catalog-react@1.12.3-next.1 + - @backstage/frontend-app-api@0.7.5-next.1 + - @backstage/plugin-kubernetes@0.11.13-next.1 + - @backstage/cli@0.27.0-next.1 + - @backstage/plugin-scaffolder@1.23.1-next.1 + - @backstage/plugin-user-settings@0.8.11-next.1 + - @backstage/plugin-search-react@1.7.14-next.1 + - @backstage/plugin-catalog@1.21.2-next.1 + - @backstage/plugin-search@1.4.15-next.1 + - @backstage/plugin-api-docs@0.11.8-next.1 + - @backstage/plugin-catalog-graph@0.4.8-next.1 + - @backstage/plugin-catalog-import@0.12.2-next.1 + - @backstage/plugin-home@0.7.9-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.14-next.1 + - @backstage/plugin-org@0.6.28-next.1 + - @backstage/plugin-scaffolder-react@1.11.0-next.1 + - @backstage/plugin-catalog-common@1.0.26-next.0 + - @backstage/plugin-permission-react@0.4.25-next.0 + - @backstage/plugin-search-common@1.2.14-next.0 + - @backstage/plugin-devtools@0.1.17-next.1 + - @backstage/app-defaults@1.5.10-next.1 + - @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/integration-react@1.1.30-next.0 + - @backstage/theme@0.5.6 + - @backstage/plugin-auth-react@0.1.5-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.7-next.0 + - @backstage/plugin-notifications@0.2.4-next.0 + - @backstage/plugin-signals@0.0.9-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.13-next.0 + - @backstage/plugin-techdocs-react@1.2.7-next.0 + +## 0.2.100-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.27.0-next.0 + - @backstage/plugin-catalog-react@1.12.3-next.0 + - @backstage/plugin-search-react@1.7.14-next.0 + - @backstage/plugin-home@0.7.8-next.0 + - @backstage/core-components@0.14.10-next.0 + - @backstage/plugin-scaffolder-react@1.11.0-next.0 + - @backstage/frontend-app-api@0.7.4-next.0 + - @backstage/plugin-catalog-graph@0.4.8-next.0 + - @backstage/plugin-scaffolder@1.23.1-next.0 + - @backstage/core-app-api@1.14.1-next.0 + - @backstage/plugin-auth-react@0.1.5-next.0 + - @backstage/app-defaults@1.5.9-next.0 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/integration-react@1.1.30-next.0 + - @backstage/theme@0.5.6 + - @backstage/plugin-api-docs@0.11.8-next.0 + - @backstage/plugin-catalog@1.21.2-next.0 + - @backstage/plugin-catalog-common@1.0.25 + - @backstage/plugin-catalog-import@0.12.2-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.7-next.0 + - @backstage/plugin-devtools@0.1.17-next.0 + - @backstage/plugin-kubernetes@0.11.13-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.14-next.0 + - @backstage/plugin-notifications@0.2.4-next.0 + - @backstage/plugin-org@0.6.28-next.0 + - @backstage/plugin-permission-react@0.4.24 + - @backstage/plugin-search@1.4.15-next.0 + - @backstage/plugin-search-common@1.2.13 + - @backstage/plugin-signals@0.0.9-next.0 + - @backstage/plugin-techdocs@1.10.8-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.13-next.0 + - @backstage/plugin-techdocs-react@1.2.7-next.0 + - @backstage/plugin-user-settings@0.8.10-next.0 + +## 0.2.99 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder@1.23.0 + - @backstage/plugin-techdocs@1.10.7 + - @backstage/plugin-techdocs-react@1.2.6 + - @backstage/core-components@0.14.9 + - @backstage/cli@0.26.11 + - @backstage/core-app-api@1.14.0 + - @backstage/frontend-app-api@0.7.3 + - @backstage/plugin-org@0.6.27 + - @backstage/plugin-catalog-react@1.12.2 + - @backstage/plugin-catalog@1.21.1 + - @backstage/plugin-notifications@0.2.3 + - @backstage/plugin-home@0.7.7 + - @backstage/plugin-scaffolder-react@1.10.0 + - @backstage/plugin-permission-react@0.4.24 + - @backstage/plugin-search@1.4.14 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.12 + - @backstage/plugin-catalog-common@1.0.25 + - @backstage/plugin-search-common@1.2.13 + - @backstage/app-defaults@1.5.8 + - @backstage/integration-react@1.1.29 + - @backstage/plugin-api-docs@0.11.7 + - @backstage/plugin-auth-react@0.1.4 + - @backstage/plugin-catalog-graph@0.4.7 + - @backstage/plugin-catalog-import@0.12.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.6 + - @backstage/plugin-devtools@0.1.16 + - @backstage/plugin-kubernetes@0.11.12 + - @backstage/plugin-kubernetes-cluster@0.0.13 + - @backstage/plugin-search-react@1.7.13 + - @backstage/plugin-signals@0.0.8 + - @backstage/plugin-user-settings@0.8.9 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/theme@0.5.6 + +## 0.2.99-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.10.7-next.2 + - @backstage/core-components@0.14.9-next.1 + - @backstage/plugin-search@1.4.14-next.2 + - @backstage/app-defaults@1.5.8-next.2 + - @backstage/cli@0.26.11-next.1 + - @backstage/frontend-app-api@0.7.3-next.2 + - @backstage/integration-react@1.1.29-next.0 + - @backstage/plugin-api-docs@0.11.7-next.2 + - @backstage/plugin-auth-react@0.1.4-next.1 + - @backstage/plugin-catalog@1.21.1-next.2 + - @backstage/plugin-catalog-graph@0.4.7-next.2 + - @backstage/plugin-catalog-import@0.12.1-next.2 + - @backstage/plugin-catalog-react@1.12.2-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.6-next.1 + - @backstage/plugin-devtools@0.1.16-next.1 + - @backstage/plugin-home@0.7.7-next.2 + - @backstage/plugin-kubernetes@0.11.12-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.13-next.2 + - @backstage/plugin-notifications@0.2.3-next.2 + - @backstage/plugin-org@0.6.27-next.2 + - @backstage/plugin-scaffolder@1.22.1-next.2 + - @backstage/plugin-scaffolder-react@1.10.0-next.2 + - @backstage/plugin-search-react@1.7.13-next.1 + - @backstage/plugin-signals@0.0.8-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.12-next.1 + - @backstage/plugin-techdocs-react@1.2.6-next.1 + - @backstage/plugin-user-settings@0.8.9-next.2 + +## 0.2.99-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-org@0.6.27-next.1 + - @backstage/core-app-api@1.13.1-next.1 + - @backstage/plugin-catalog-react@1.12.2-next.1 + - @backstage/plugin-catalog@1.21.1-next.1 + - @backstage/plugin-techdocs@1.10.7-next.1 + - @backstage/plugin-notifications@0.2.3-next.1 + - @backstage/plugin-home@0.7.7-next.1 + - @backstage/plugin-scaffolder-react@1.10.0-next.1 + - @backstage/plugin-scaffolder@1.22.1-next.1 + - @backstage/cli@0.26.11-next.1 + - @backstage/app-defaults@1.5.8-next.1 + - @backstage/core-components@0.14.9-next.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/frontend-app-api@0.7.3-next.1 + - @backstage/plugin-api-docs@0.11.7-next.1 + - @backstage/plugin-catalog-graph@0.4.7-next.1 + - @backstage/plugin-catalog-import@0.12.1-next.1 + - @backstage/plugin-search@1.4.13-next.1 + - @backstage/plugin-search-react@1.7.13-next.0 + - @backstage/plugin-signals@0.0.8-next.0 + - @backstage/plugin-user-settings@0.8.9-next.1 + - @backstage/plugin-kubernetes@0.11.12-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.13-next.1 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/integration-react@1.1.29-next.0 + - @backstage/theme@0.5.6 + - @backstage/plugin-auth-react@0.1.4-next.0 + - @backstage/plugin-catalog-common@1.0.24 + - @backstage/plugin-catalog-unprocessed-entities@0.2.6-next.0 + - @backstage/plugin-devtools@0.1.16-next.0 + - @backstage/plugin-permission-react@0.4.23 + - @backstage/plugin-search-common@1.2.12 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.12-next.0 + - @backstage/plugin-techdocs-react@1.2.6-next.0 + +## 0.2.99-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder@1.22.0-next.0 + - @backstage/plugin-techdocs-react@1.2.6-next.0 + - @backstage/plugin-techdocs@1.10.7-next.0 + - @backstage/core-components@0.14.9-next.0 + - @backstage/core-app-api@1.13.0-next.0 + - @backstage/frontend-app-api@0.7.2-next.0 + - @backstage/cli@0.26.10-next.0 + - @backstage/plugin-org@0.6.27-next.0 + - @backstage/plugin-catalog-react@1.12.2-next.0 + - @backstage/plugin-catalog@1.21.1-next.0 + - @backstage/plugin-scaffolder-react@1.10.0-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.12-next.0 + - @backstage/app-defaults@1.5.7-next.0 + - @backstage/integration-react@1.1.29-next.0 + - @backstage/plugin-api-docs@0.11.7-next.0 + - @backstage/plugin-auth-react@0.1.4-next.0 + - @backstage/plugin-catalog-graph@0.4.7-next.0 + - @backstage/plugin-catalog-import@0.12.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.6-next.0 + - @backstage/plugin-devtools@0.1.16-next.0 + - @backstage/plugin-home@0.7.6-next.0 + - @backstage/plugin-kubernetes@0.11.12-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.13-next.0 + - @backstage/plugin-notifications@0.2.3-next.0 + - @backstage/plugin-search@1.4.13-next.0 + - @backstage/plugin-search-react@1.7.13-next.0 + - @backstage/plugin-signals@0.0.8-next.0 + - @backstage/plugin-user-settings@0.8.8-next.0 + - @backstage/core-plugin-api@1.9.3 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/theme@0.5.6 + - @backstage/plugin-catalog-common@1.0.24 + - @backstage/plugin-permission-react@0.4.23 + - @backstage/plugin-search-common@1.2.12 + +## 0.2.98 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.8 + - @backstage/plugin-techdocs@1.10.6 + - @backstage/plugin-api-docs@0.11.6 + - @backstage/cli@0.26.7 + - @backstage/plugin-scaffolder@1.21.0 + - @backstage/plugin-catalog-import@0.12.0 + - @backstage/plugin-kubernetes@0.11.11 + - @backstage/plugin-search@1.4.12 + - @backstage/plugin-catalog-graph@0.4.6 + - @backstage/plugin-notifications@0.2.2 + - @backstage/plugin-org@0.6.26 + - @backstage/core-plugin-api@1.9.3 + - @backstage/plugin-scaffolder-react@1.9.0 + - @backstage/theme@0.5.6 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.11 + - @backstage/plugin-catalog-unprocessed-entities@0.2.5 + - @backstage/plugin-kubernetes-cluster@0.0.12 + - @backstage/plugin-permission-react@0.4.23 + - @backstage/plugin-catalog-common@1.0.24 + - @backstage/plugin-techdocs-react@1.2.5 + - @backstage/plugin-catalog-react@1.12.1 + - @backstage/plugin-search-common@1.2.12 + - @backstage/plugin-user-settings@0.8.7 + - @backstage/plugin-search-react@1.7.12 + - @backstage/plugin-auth-react@0.1.3 + - @backstage/plugin-devtools@0.1.15 + - @backstage/plugin-catalog@1.21.0 + - @backstage/plugin-signals@0.0.7 + - @backstage/plugin-home@0.7.5 + - @backstage/core-app-api@1.12.6 + - @backstage/integration-react@1.1.28 + - @backstage/app-defaults@1.5.6 + - @backstage/frontend-app-api@0.7.1 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + +## 0.2.98-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-graph@0.4.6-next.2 + - @backstage/core-components@0.14.8-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.11-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.2.5-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.12-next.3 + - @backstage/plugin-permission-react@0.4.23-next.1 + - @backstage/plugin-scaffolder-react@1.8.7-next.3 + - @backstage/plugin-catalog-common@1.0.24-next.0 + - @backstage/plugin-catalog-import@0.12.0-next.3 + - @backstage/plugin-techdocs-react@1.2.5-next.2 + - @backstage/plugin-catalog-react@1.12.1-next.2 + - @backstage/plugin-notifications@0.2.2-next.3 + - @backstage/plugin-search-common@1.2.12-next.0 + - @backstage/plugin-user-settings@0.8.7-next.2 + - @backstage/plugin-search-react@1.7.12-next.2 + - @backstage/plugin-auth-react@0.1.3-next.2 + - @backstage/plugin-kubernetes@0.11.11-next.3 + - @backstage/plugin-scaffolder@1.21.0-next.3 + - @backstage/plugin-api-docs@0.11.6-next.2 + - @backstage/plugin-devtools@0.1.15-next.2 + - @backstage/plugin-techdocs@1.10.6-next.2 + - @backstage/plugin-catalog@1.21.0-next.3 + - @backstage/plugin-signals@0.0.7-next.2 + - @backstage/plugin-search@1.4.12-next.3 + - @backstage/plugin-home@0.7.5-next.2 + - @backstage/plugin-org@0.6.26-next.2 + - @backstage/integration-react@1.1.28-next.1 + - @backstage/cli@0.26.7-next.3 + - @backstage/app-defaults@1.5.6-next.2 + - @backstage/frontend-app-api@0.7.1-next.2 + - @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.2.98-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.14.8-next.1 + - @backstage/plugin-api-docs@0.11.6-next.1 + - @backstage/plugin-scaffolder@1.21.0-next.2 + - @backstage/plugin-techdocs@1.10.6-next.1 + - @backstage/plugin-org@0.6.26-next.1 + - @backstage/core-plugin-api@1.9.3-next.0 + - @backstage/plugin-catalog-graph@0.4.6-next.1 + - @backstage/plugin-catalog@1.21.0-next.2 + - @backstage/core-app-api@1.12.6-next.0 + - @backstage/cli@0.26.7-next.2 + - @backstage/app-defaults@1.5.6-next.1 + - @backstage/frontend-app-api@0.7.1-next.1 + - @backstage/integration-react@1.1.28-next.0 + - @backstage/plugin-auth-react@0.1.3-next.1 + - @backstage/plugin-catalog-import@0.12.0-next.2 + - @backstage/plugin-catalog-react@1.12.1-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.5-next.1 + - @backstage/plugin-devtools@0.1.15-next.1 + - @backstage/plugin-home@0.7.5-next.1 + - @backstage/plugin-kubernetes@0.11.11-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.12-next.2 + - @backstage/plugin-notifications@0.2.2-next.2 + - @backstage/plugin-scaffolder-react@1.8.7-next.2 + - @backstage/plugin-search@1.4.12-next.2 + - @backstage/plugin-search-react@1.7.12-next.1 + - @backstage/plugin-signals@0.0.7-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.11-next.1 + - @backstage/plugin-techdocs-react@1.2.5-next.1 + - @backstage/plugin-user-settings@0.8.7-next.1 + - @backstage/plugin-permission-react@0.4.23-next.0 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/theme@0.5.6-next.0 + - @backstage/plugin-catalog-common@1.0.23 + - @backstage/plugin-search-common@1.2.11 + +## 0.2.98-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.26.7-next.1 + - @backstage/plugin-catalog-import@0.12.0-next.1 + - @backstage/plugin-kubernetes@0.11.11-next.1 + - @backstage/plugin-search@1.4.12-next.1 + - @backstage/plugin-notifications@0.2.2-next.1 + - @backstage/plugin-scaffolder-react@1.8.7-next.1 + - @backstage/plugin-scaffolder@1.20.2-next.1 + - @backstage/plugin-catalog@1.20.1-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.12-next.1 + - @backstage/plugin-catalog-react@1.12.1-next.0 + +## 0.2.98-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.10.6-next.0 + - @backstage/plugin-notifications@0.2.2-next.0 + - @backstage/plugin-scaffolder-react@1.8.6-next.0 + - @backstage/theme@0.5.6-next.0 + - @backstage/plugin-api-docs@0.11.6-next.0 + - @backstage/cli@0.26.6-next.0 + - @backstage/plugin-scaffolder@1.20.1-next.0 + - @backstage/app-defaults@1.5.6-next.0 + - @backstage/core-components@0.14.8-next.0 + - @backstage/frontend-app-api@0.7.1-next.0 + - @backstage/plugin-home@0.7.5-next.0 + - @backstage/plugin-search-react@1.7.12-next.0 + - @backstage/plugin-signals@0.0.7-next.0 + - @backstage/plugin-techdocs-react@1.2.5-next.0 + - @backstage/plugin-user-settings@0.8.7-next.0 + - @backstage/catalog-model@1.5.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.12.5 + - @backstage/core-plugin-api@1.9.2 + - @backstage/integration-react@1.1.27 + - @backstage/plugin-auth-react@0.1.3-next.0 + - @backstage/plugin-catalog@1.20.1-next.0 + - @backstage/plugin-catalog-common@1.0.23 + - @backstage/plugin-catalog-graph@0.4.6-next.0 + - @backstage/plugin-catalog-import@0.11.1-next.0 + - @backstage/plugin-catalog-react@1.12.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.5-next.0 + - @backstage/plugin-devtools@0.1.15-next.0 + - @backstage/plugin-kubernetes@0.11.11-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.12-next.0 + - @backstage/plugin-org@0.6.26-next.0 + - @backstage/plugin-permission-react@0.4.22 + - @backstage/plugin-search@1.4.12-next.0 + - @backstage/plugin-search-common@1.2.11 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.11-next.0 + +## 0.2.97 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.8.5 + - @backstage/plugin-scaffolder@1.20.0 + - @backstage/plugin-user-settings@0.8.6 + - @backstage/plugin-catalog@1.20.0 + - @backstage/plugin-notifications@0.2.1 + - @backstage/plugin-api-docs@0.11.5 + - @backstage/plugin-home@0.7.4 + - @backstage/cli@0.26.5 + - @backstage/core-components@0.14.7 + - @backstage/catalog-model@1.5.0 + - @backstage/plugin-techdocs@1.10.5 + - @backstage/plugin-catalog-import@0.11.0 + - @backstage/frontend-app-api@0.7.0 + - @backstage/plugin-auth-react@0.1.2 + - @backstage/plugin-catalog-react@1.12.0 + - @backstage/theme@0.5.4 + - @backstage/core-app-api@1.12.5 + - @backstage/plugin-catalog-graph@0.4.5 + - @backstage/plugin-search@1.4.11 + - @backstage/plugin-org@0.6.25 + - @backstage/app-defaults@1.5.5 + - @backstage/integration-react@1.1.27 + - @backstage/plugin-catalog-common@1.0.23 + - @backstage/plugin-catalog-unprocessed-entities@0.2.4 + - @backstage/plugin-devtools@0.1.14 + - @backstage/plugin-kubernetes@0.11.10 + - @backstage/plugin-kubernetes-cluster@0.0.11 + - @backstage/plugin-search-react@1.7.11 + - @backstage/plugin-signals@0.0.6 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.10 + - @backstage/plugin-techdocs-react@1.2.4 + +## 0.2.97-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.26.5-next.1 + - @backstage/frontend-app-api@0.7.0-next.2 + - @backstage/plugin-techdocs@1.10.5-next.2 + - @backstage/plugin-notifications@0.2.1-next.2 + - @backstage/plugin-catalog-react@1.12.0-next.2 + - @backstage/plugin-catalog@1.20.0-next.2 + - @backstage/plugin-api-docs@0.11.5-next.2 + - @backstage/core-components@0.14.7-next.2 + - @backstage/plugin-scaffolder@1.19.4-next.2 + - @backstage/plugin-search@1.4.11-next.2 + - @backstage/plugin-org@0.6.25-next.2 + - @backstage/plugin-search-react@1.7.11-next.1 + - @backstage/plugin-catalog-graph@0.4.5-next.2 + - @backstage/plugin-catalog-import@0.10.11-next.2 + - @backstage/plugin-home@0.7.4-next.2 + - @backstage/plugin-kubernetes@0.11.10-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.11-next.2 + - @backstage/plugin-scaffolder-react@1.8.5-next.2 + - @backstage/plugin-user-settings@0.8.6-next.2 + - @backstage/integration-react@1.1.27-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.10-next.2 + +## 0.2.97-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.8.5-next.1 + - @backstage/plugin-scaffolder@1.19.4-next.1 + - @backstage/plugin-notifications@0.2.1-next.1 + - @backstage/core-components@0.14.6-next.1 + - @backstage/plugin-catalog@1.19.1-next.1 + - @backstage/plugin-catalog-react@1.11.4-next.1 + - @backstage/app-defaults@1.5.5-next.1 + - @backstage/cli@0.26.5-next.0 + - @backstage/frontend-app-api@0.6.5-next.1 + - @backstage/integration-react@1.1.26 + - @backstage/plugin-api-docs@0.11.5-next.1 + - @backstage/plugin-auth-react@0.1.2-next.1 + - @backstage/plugin-catalog-graph@0.4.5-next.1 + - @backstage/plugin-catalog-import@0.10.11-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.4-next.1 + - @backstage/plugin-devtools@0.1.14-next.1 + - @backstage/plugin-home@0.7.4-next.1 + - @backstage/plugin-kubernetes@0.11.10-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.11-next.1 + - @backstage/plugin-org@0.6.25-next.1 + - @backstage/plugin-search@1.4.11-next.1 + - @backstage/plugin-search-react@1.7.11-next.1 + - @backstage/plugin-signals@0.0.6-next.1 + - @backstage/plugin-techdocs@1.10.5-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.10-next.1 + - @backstage/plugin-techdocs-react@1.2.4-next.1 + - @backstage/plugin-user-settings@0.8.6-next.1 + +## 0.2.97-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-notifications@0.2.1-next.0 + - @backstage/plugin-api-docs@0.11.5-next.0 + - @backstage/plugin-catalog@1.19.1-next.0 + - @backstage/plugin-home@0.7.4-next.0 + - @backstage/catalog-model@1.5.0-next.0 + - @backstage/plugin-techdocs@1.10.5-next.0 + - @backstage/cli@0.26.5-next.0 + - @backstage/plugin-auth-react@0.1.1-next.0 + - @backstage/theme@0.5.4-next.0 + - @backstage/core-components@0.14.5-next.0 + - @backstage/plugin-scaffolder-react@1.8.5-next.0 + - @backstage/plugin-scaffolder@1.19.4-next.0 + - @backstage/plugin-catalog-graph@0.4.5-next.0 + - @backstage/plugin-catalog-import@0.10.11-next.0 + - @backstage/plugin-devtools@0.1.14-next.0 + - @backstage/plugin-org@0.6.25-next.0 + - @backstage/plugin-search@1.4.11-next.0 + - @backstage/plugin-user-settings@0.8.6-next.0 + - @backstage/plugin-catalog-common@1.0.23-next.0 + - @backstage/plugin-catalog-react@1.11.4-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.4-next.0 + - @backstage/plugin-kubernetes@0.11.10-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.11-next.0 + - @backstage/plugin-techdocs-react@1.2.4-next.0 + - @backstage/app-defaults@1.5.5-next.0 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.12.4 + - @backstage/core-plugin-api@1.9.2 + - @backstage/frontend-app-api@0.6.5-next.0 + - @backstage/integration-react@1.1.26 + - @backstage/plugin-permission-react@0.4.22 + - @backstage/plugin-search-common@1.2.11 + - @backstage/plugin-search-react@1.7.11-next.0 + - @backstage/plugin-signals@0.0.6-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.10-next.0 + +## 0.2.96 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-github-pull-requests-board@0.2.0 + - @backstage/plugin-azure-devops@0.4.3 + - @backstage/plugin-catalog@1.19.0 + - @backstage/plugin-techdocs-react@1.2.3 + - @backstage/plugin-notifications@0.2.0 + - @backstage/plugin-github-actions@0.6.15 + - @backstage/cli@0.26.3 + - @backstage/plugin-search-react@1.7.10 + - @backstage/plugin-auth-react@0.1.0 + - @backstage/plugin-catalog-react@1.11.3 + - @backstage/plugin-gocd@0.1.40 + - @backstage/frontend-app-api@0.6.4 + - @backstage/plugin-scaffolder@1.19.3 + - @backstage/plugin-graphiql@0.3.7 + - @backstage/core-components@0.14.4 + - @backstage/plugin-cloudbuild@0.5.1 + - @backstage/core-app-api@1.12.4 + - @backstage/app-defaults@1.5.4 + - @backstage/core-plugin-api@1.9.2 + - @backstage/theme@0.5.3 + - @backstage/plugin-adr@0.6.17 + - @backstage/plugin-airbrake@0.3.34 + - @backstage/plugin-apache-airflow@0.2.24 + - @backstage/plugin-api-docs@0.11.4 + - @backstage/plugin-azure-sites@0.1.23 + - @backstage/plugin-catalog-graph@0.4.4 + - @backstage/plugin-catalog-import@0.10.10 + - @backstage/plugin-catalog-unprocessed-entities@0.2.3 + - @backstage/plugin-code-coverage@0.2.27 + - @backstage/plugin-cost-insights@0.12.23 + - @backstage/plugin-dynatrace@10.0.3 + - @backstage/plugin-entity-feedback@0.2.17 + - @backstage/plugin-explore@0.4.20 + - @backstage/plugin-gcalendar@0.3.27 + - @backstage/plugin-gcp-projects@0.3.50 + - @backstage/plugin-home@0.7.3 + - @backstage/plugin-jenkins@0.9.9 + - @backstage/plugin-kafka@0.3.34 + - @backstage/plugin-kubernetes-cluster@0.0.10 + - @backstage/plugin-kubernetes@0.11.9 + - @backstage/plugin-lighthouse@0.4.19 + - @backstage/plugin-microsoft-calendar@0.1.16 + - @backstage/plugin-newrelic@0.3.49 + - @backstage/plugin-nomad@0.1.15 + - @backstage/plugin-octopus-deploy@0.2.16 + - @backstage/plugin-org@0.6.24 + - @backstage/plugin-pagerduty@0.7.6 + - @backstage/plugin-permission-react@0.4.22 + - @backstage/plugin-playlist@0.2.8 + - @backstage/plugin-puppetdb@0.1.17 + - @backstage/plugin-rollbar@0.4.34 + - @backstage/plugin-scaffolder-react@1.8.4 + - @backstage/plugin-search@1.4.10 + - @backstage/plugin-sentry@0.5.19 + - @backstage/plugin-shortcuts@0.3.23 + - @backstage/plugin-signals@0.0.5 + - @backstage/plugin-stack-overflow@0.1.29 + - @backstage/plugin-stackstorm@0.1.15 + - @backstage/plugin-tech-insights@0.3.26 + - @backstage/plugin-tech-radar@0.7.3 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.9 + - @backstage/plugin-techdocs@1.10.4 + - @backstage/plugin-todo@0.2.38 + - @backstage/plugin-user-settings@0.8.5 + - @backstage/integration-react@1.1.26 + - @backstage/plugin-badges@0.2.58 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/plugin-catalog-common@1.0.22 + - @backstage/plugin-devtools@0.1.13 + - @backstage/plugin-linguist@0.1.19 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-newrelic-dashboard@0.3.9 + - @backstage/plugin-search-common@1.2.11 + +## 0.2.96-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-azure-devops@0.4.3-next.1 + - @backstage/plugin-catalog@1.19.0-next.1 + - @backstage/cli@0.26.3-next.1 + - @backstage/plugin-auth-react@0.1.0-next.1 + - @backstage/plugin-scaffolder@1.19.3-next.1 + - @backstage/core-app-api@1.12.4-next.0 + - @backstage/frontend-app-api@0.6.4-next.1 + - @backstage/plugin-scaffolder-react@1.8.4-next.1 + - @backstage/plugin-cost-insights@0.12.23-next.1 + - @backstage/plugin-signals@0.0.5-next.1 + - @backstage/plugin-notifications@0.2.0-next.1 + - @backstage/plugin-api-docs@0.11.4-next.1 + - @backstage/plugin-catalog-graph@0.4.4-next.1 + - @backstage/plugin-explore@0.4.20-next.1 + - @backstage/plugin-org@0.6.24-next.1 + - @backstage/plugin-user-settings@0.8.5-next.1 + - @backstage/plugin-kubernetes@0.11.9-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.10-next.1 + - @backstage/app-defaults@1.5.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/integration-react@1.1.26-next.0 + - @backstage/theme@0.5.2 + - @backstage/plugin-adr@0.6.17-next.1 + - @backstage/plugin-airbrake@0.3.34-next.1 + - @backstage/plugin-apache-airflow@0.2.24-next.0 + - @backstage/plugin-azure-sites@0.1.23-next.1 + - @backstage/plugin-badges@0.2.58-next.1 + - @backstage/plugin-catalog-common@1.0.22 + - @backstage/plugin-catalog-import@0.10.10-next.1 + - @backstage/plugin-catalog-react@1.11.3-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.3-next.0 + - @backstage/plugin-cloudbuild@0.5.1-next.1 + - @backstage/plugin-code-coverage@0.2.27-next.1 + - @backstage/plugin-devtools@0.1.13-next.1 + - @backstage/plugin-dynatrace@10.0.3-next.1 + - @backstage/plugin-entity-feedback@0.2.17-next.1 + - @backstage/plugin-gcalendar@0.3.27-next.0 + - @backstage/plugin-gcp-projects@0.3.50-next.0 + - @backstage/plugin-github-actions@0.6.15-next.1 + - @backstage/plugin-github-pull-requests-board@0.1.28-next.1 + - @backstage/plugin-gocd@0.1.40-next.1 + - @backstage/plugin-graphiql@0.3.7-next.1 + - @backstage/plugin-home@0.7.3-next.1 + - @backstage/plugin-jenkins@0.9.9-next.1 + - @backstage/plugin-kafka@0.3.34-next.1 + - @backstage/plugin-lighthouse@0.4.19-next.1 + - @backstage/plugin-linguist@0.1.19-next.1 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-microsoft-calendar@0.1.16-next.0 + - @backstage/plugin-newrelic@0.3.49-next.0 + - @backstage/plugin-newrelic-dashboard@0.3.9-next.1 + - @backstage/plugin-nomad@0.1.15-next.1 + - @backstage/plugin-octopus-deploy@0.2.16-next.1 + - @backstage/plugin-pagerduty@0.7.6-next.1 + - @backstage/plugin-permission-react@0.4.21 + - @backstage/plugin-playlist@0.2.8-next.1 + - @backstage/plugin-puppetdb@0.1.17-next.1 + - @backstage/plugin-rollbar@0.4.34-next.1 + - @backstage/plugin-search@1.4.10-next.1 + - @backstage/plugin-search-common@1.2.11 + - @backstage/plugin-search-react@1.7.10-next.1 + - @backstage/plugin-sentry@0.5.19-next.1 + - @backstage/plugin-shortcuts@0.3.23-next.0 + - @backstage/plugin-stack-overflow@0.1.29-next.1 + - @backstage/plugin-stackstorm@0.1.15-next.0 + - @backstage/plugin-tech-insights@0.3.26-next.1 + - @backstage/plugin-tech-radar@0.7.3-next.1 + - @backstage/plugin-techdocs@1.10.4-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.9-next.0 + - @backstage/plugin-techdocs-react@1.2.3-next.0 + - @backstage/plugin-todo@0.2.38-next.1 + +## 0.2.96-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-gocd@0.1.40-next.0 + - @backstage/plugin-scaffolder@1.19.3-next.0 + - @backstage/cli@0.26.3-next.0 + - @backstage/plugin-github-pull-requests-board@0.1.28-next.0 + - @backstage/core-components@0.14.4-next.0 + - @backstage/plugin-catalog@1.19.0-next.0 + - @backstage/app-defaults@1.5.4-next.0 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/core-app-api@1.12.3 + - @backstage/core-plugin-api@1.9.1 + - @backstage/frontend-app-api@0.6.4-next.0 + - @backstage/integration-react@1.1.26-next.0 + - @backstage/theme@0.5.2 + - @backstage/plugin-adr@0.6.17-next.0 + - @backstage/plugin-airbrake@0.3.34-next.0 + - @backstage/plugin-apache-airflow@0.2.24-next.0 + - @backstage/plugin-api-docs@0.11.4-next.0 + - @backstage/plugin-azure-devops@0.4.3-next.0 + - @backstage/plugin-azure-sites@0.1.23-next.0 + - @backstage/plugin-badges@0.2.58-next.0 + - @backstage/plugin-catalog-common@1.0.22 + - @backstage/plugin-catalog-graph@0.4.4-next.0 + - @backstage/plugin-catalog-import@0.10.10-next.0 + - @backstage/plugin-catalog-react@1.11.3-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.2.3-next.0 + - @backstage/plugin-cloudbuild@0.5.1-next.0 + - @backstage/plugin-code-coverage@0.2.27-next.0 + - @backstage/plugin-cost-insights@0.12.23-next.0 + - @backstage/plugin-devtools@0.1.13-next.0 + - @backstage/plugin-dynatrace@10.0.3-next.0 + - @backstage/plugin-entity-feedback@0.2.17-next.0 + - @backstage/plugin-explore@0.4.20-next.0 + - @backstage/plugin-gcalendar@0.3.27-next.0 + - @backstage/plugin-gcp-projects@0.3.50-next.0 + - @backstage/plugin-github-actions@0.6.15-next.0 + - @backstage/plugin-graphiql@0.3.7-next.0 + - @backstage/plugin-home@0.7.3-next.0 + - @backstage/plugin-jenkins@0.9.9-next.0 + - @backstage/plugin-kafka@0.3.34-next.0 + - @backstage/plugin-kubernetes@0.11.9-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.10-next.0 + - @backstage/plugin-lighthouse@0.4.19-next.0 + - @backstage/plugin-linguist@0.1.19-next.0 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-microsoft-calendar@0.1.16-next.0 + - @backstage/plugin-newrelic@0.3.49-next.0 + - @backstage/plugin-newrelic-dashboard@0.3.9-next.0 + - @backstage/plugin-nomad@0.1.15-next.0 + - @backstage/plugin-notifications@0.1.3-next.0 + - @backstage/plugin-octopus-deploy@0.2.16-next.0 + - @backstage/plugin-org@0.6.24-next.0 + - @backstage/plugin-pagerduty@0.7.6-next.0 + - @backstage/plugin-permission-react@0.4.21 + - @backstage/plugin-playlist@0.2.8-next.0 + - @backstage/plugin-puppetdb@0.1.17-next.0 + - @backstage/plugin-rollbar@0.4.34-next.0 + - @backstage/plugin-scaffolder-react@1.8.4-next.0 + - @backstage/plugin-search@1.4.10-next.0 + - @backstage/plugin-search-common@1.2.11 + - @backstage/plugin-search-react@1.7.10-next.0 + - @backstage/plugin-sentry@0.5.19-next.0 + - @backstage/plugin-shortcuts@0.3.23-next.0 + - @backstage/plugin-signals@0.0.5-next.0 + - @backstage/plugin-stack-overflow@0.1.29-next.0 + - @backstage/plugin-stackstorm@0.1.15-next.0 + - @backstage/plugin-tech-insights@0.3.26-next.0 + - @backstage/plugin-tech-radar@0.7.3-next.0 + - @backstage/plugin-techdocs@1.10.4-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.9-next.0 + - @backstage/plugin-techdocs-react@1.2.3-next.0 + - @backstage/plugin-todo@0.2.38-next.0 + - @backstage/plugin-user-settings@0.8.5-next.0 + +## 0.2.95 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-nomad@0.1.14 + - @backstage/plugin-newrelic@0.3.48 + - @backstage/plugin-tech-radar@0.7.2 + - @backstage/plugin-entity-feedback@0.2.16 + - @backstage/plugin-pagerduty@0.7.5 + - @backstage/plugin-microsoft-calendar@0.1.15 + - @backstage/plugin-gcp-projects@0.3.49 + - @backstage/plugin-newrelic-dashboard@0.3.8 + - @backstage/plugin-catalog-unprocessed-entities@0.2.2 + - @backstage/plugin-kubernetes-cluster@0.0.9 + - @backstage/core-components@0.14.3 + - @backstage/plugin-scaffolder-react@1.8.3 + - @backstage/plugin-apache-airflow@0.2.23 + - @backstage/plugin-catalog-import@0.10.9 + - @backstage/plugin-github-actions@0.6.14 + - @backstage/plugin-octopus-deploy@0.2.15 + - @backstage/plugin-stack-overflow@0.1.28 + - @backstage/plugin-techdocs-react@1.2.2 + - @backstage/core-app-api@1.12.3 + - @backstage/plugin-catalog-graph@0.4.3 + - @backstage/plugin-catalog-react@1.11.2 + - @backstage/plugin-code-coverage@0.2.26 + - @backstage/plugin-cost-insights@0.12.22 + - @backstage/plugin-notifications@0.1.2 + - @backstage/plugin-tech-insights@0.3.25 + - @backstage/plugin-user-settings@0.8.4 + - @backstage/plugin-azure-devops@0.4.2 + - @backstage/plugin-search-react@1.7.9 + - @backstage/plugin-azure-sites@0.1.22 + - @backstage/plugin-cloudbuild@0.5.0 + - @backstage/plugin-lighthouse@0.4.18 + - @backstage/plugin-scaffolder@1.19.2 + - @backstage/plugin-stackstorm@0.1.14 + - @backstage/plugin-dynatrace@10.0.2 + - @backstage/plugin-gcalendar@0.3.26 + - @backstage/plugin-shortcuts@0.3.22 + - @backstage/plugin-airbrake@0.3.33 + - @backstage/plugin-devtools@0.1.12 + - @backstage/plugin-graphiql@0.3.6 + - @backstage/plugin-linguist@0.1.18 + - @backstage/plugin-playlist@0.2.7 + - @backstage/plugin-puppetdb@0.1.16 + - @backstage/plugin-techdocs@1.10.3 + - @backstage/plugin-catalog@1.18.2 + - @backstage/plugin-explore@0.4.19 + - @backstage/plugin-jenkins@0.9.8 + - @backstage/plugin-rollbar@0.4.33 + - @backstage/plugin-badges@0.2.57 + - @backstage/plugin-search@1.4.9 + - @backstage/plugin-sentry@0.5.18 + - @backstage/plugin-kafka@0.3.33 + - @backstage/plugin-gocd@0.1.39 + - @backstage/plugin-home@0.7.2 + - @backstage/plugin-adr@0.6.16 + - @backstage/plugin-org@0.6.23 + - @backstage/cli@0.26.2 + - @backstage/app-defaults@1.5.3 + - @backstage/frontend-app-api@0.6.3 + - @backstage/integration-react@1.1.25 + - @backstage/plugin-api-docs@0.11.3 + - @backstage/plugin-github-pull-requests-board@0.1.27 + - @backstage/plugin-kubernetes@0.11.8 + - @backstage/plugin-signals@0.0.4 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.8 + - @backstage/plugin-todo@0.2.37 + - @backstage/core-plugin-api@1.9.1 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/theme@0.5.2 + - @backstage/plugin-catalog-common@1.0.22 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-permission-react@0.4.21 + - @backstage/plugin-search-common@1.2.11 + +## 0.2.94 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-nomad@0.1.13 + - @backstage/plugin-newrelic@0.3.47 + - @backstage/plugin-tech-radar@0.7.1 + - @backstage/plugin-entity-feedback@0.2.15 + - @backstage/plugin-pagerduty@0.7.4 + - @backstage/plugin-microsoft-calendar@0.1.14 + - @backstage/plugin-gcp-projects@0.3.48 + - @backstage/plugin-newrelic-dashboard@0.3.7 + - @backstage/plugin-catalog-unprocessed-entities@0.2.1 + - @backstage/plugin-kubernetes-cluster@0.0.8 + - @backstage/core-components@0.14.2 + - @backstage/plugin-scaffolder-react@1.8.2 + - @backstage/plugin-apache-airflow@0.2.22 + - @backstage/plugin-catalog-import@0.10.8 + - @backstage/plugin-github-actions@0.6.13 + - @backstage/plugin-octopus-deploy@0.2.14 + - @backstage/plugin-stack-overflow@0.1.27 + - @backstage/plugin-techdocs-react@1.2.1 + - @backstage/core-app-api@1.12.2 + - @backstage/plugin-catalog-graph@0.4.2 + - @backstage/plugin-catalog-react@1.11.1 + - @backstage/plugin-code-coverage@0.2.25 + - @backstage/plugin-cost-insights@0.12.21 + - @backstage/plugin-notifications@0.1.1 + - @backstage/plugin-tech-insights@0.3.24 + - @backstage/plugin-user-settings@0.8.3 + - @backstage/plugin-azure-devops@0.4.1 + - @backstage/plugin-search-react@1.7.8 + - @backstage/plugin-azure-sites@0.1.21 + - @backstage/plugin-cloudbuild@0.4.2 + - @backstage/plugin-lighthouse@0.4.17 + - @backstage/plugin-scaffolder@1.19.1 + - @backstage/plugin-stackstorm@0.1.13 + - @backstage/plugin-dynatrace@10.0.1 + - @backstage/plugin-gcalendar@0.3.25 + - @backstage/plugin-shortcuts@0.3.21 + - @backstage/plugin-airbrake@0.3.32 + - @backstage/plugin-devtools@0.1.11 + - @backstage/plugin-graphiql@0.3.5 + - @backstage/plugin-linguist@0.1.17 + - @backstage/plugin-playlist@0.2.6 + - @backstage/plugin-puppetdb@0.1.15 + - @backstage/plugin-techdocs@1.10.2 + - @backstage/plugin-catalog@1.18.1 + - @backstage/plugin-explore@0.4.18 + - @backstage/plugin-jenkins@0.9.7 + - @backstage/plugin-rollbar@0.4.32 + - @backstage/plugin-badges@0.2.56 + - @backstage/plugin-search@1.4.8 + - @backstage/plugin-sentry@0.5.17 + - @backstage/plugin-kafka@0.3.32 + - @backstage/plugin-gocd@0.1.38 + - @backstage/plugin-home@0.7.1 + - @backstage/plugin-adr@0.6.15 + - @backstage/plugin-org@0.6.22 + - @backstage/cli@0.26.1 + - @backstage/app-defaults@1.5.2 + - @backstage/frontend-app-api@0.6.2 + - @backstage/integration-react@1.1.25 + - @backstage/plugin-api-docs@0.11.2 + - @backstage/plugin-github-pull-requests-board@0.1.26 + - @backstage/plugin-kubernetes@0.11.7 + - @backstage/plugin-signals@0.0.3 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.7 + - @backstage/plugin-todo@0.2.36 + - @backstage/core-plugin-api@1.9.1 + - @backstage/catalog-model@1.4.5 + - @backstage/config@1.2.0 + - @backstage/theme@0.5.2 + - @backstage/plugin-catalog-common@1.0.22 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-permission-react@0.4.21 + - @backstage/plugin-search-common@1.2.11 + +## 0.2.93 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-apache-airflow@0.2.21 + - @backstage/plugin-catalog-import@0.10.7 + - @backstage/cli@0.26.0 + - @backstage/plugin-shortcuts@0.3.20 + - @backstage/plugin-github-pull-requests-board@0.1.25 + - @backstage/plugin-techdocs@1.10.1 + - @backstage/config@1.2.0 + - @backstage/plugin-adr@0.6.14 + - @backstage/plugin-api-docs@0.11.1 + - @backstage/core-components@0.14.1 + - @backstage/plugin-notifications@0.1.0 + - @backstage/plugin-stack-overflow@0.1.26 + - @backstage/plugin-rollbar@0.4.31 + - @backstage/plugin-search@1.4.7 + - @backstage/theme@0.5.2 + - @backstage/plugin-explore@0.4.17 + - @backstage/integration-react@1.1.25 + - @backstage/plugin-catalog@1.18.0 + - @backstage/plugin-github-actions@0.6.12 + - @backstage/plugin-dynatrace@10.0.0 + - @backstage/plugin-scaffolder@1.19.0 + - @backstage/plugin-techdocs-react@1.2.0 + - @backstage/plugin-gcalendar@0.3.24 + - @backstage/plugin-airbrake@0.3.31 + - @backstage/plugin-catalog-react@1.11.0 + - @backstage/plugin-azure-devops@0.4.0 + - @backstage/plugin-user-settings@0.8.2 + - @backstage/plugin-org@0.6.21 + - @backstage/plugin-linguist@0.1.16 + - @backstage/plugin-badges@0.2.55 + - @backstage/plugin-cloudbuild@0.4.1 + - @backstage/plugin-catalog-unprocessed-entities@0.2.0 + - @backstage/plugin-tech-radar@0.7.0 + - @backstage/frontend-app-api@0.6.1 + - @backstage/plugin-search-common@1.2.11 + - @backstage/plugin-devtools@0.1.10 + - @backstage/plugin-cost-insights@0.12.20 + - @backstage/plugin-entity-feedback@0.2.14 + - @backstage/plugin-kubernetes@0.11.6 + - @backstage/plugin-stackstorm@0.1.12 + - @backstage/plugin-scaffolder-react@1.8.1 + - @backstage/plugin-azure-sites@0.1.20 + - @backstage/plugin-playlist@0.2.5 + - @backstage/plugin-home@0.7.0 + - @backstage/plugin-signals@0.0.2 + - @backstage/plugin-lighthouse@0.4.16 + - @backstage/plugin-sentry@0.5.16 + - @backstage/plugin-tech-insights@0.3.23 + - @backstage/plugin-octopus-deploy@0.2.13 + - @backstage/plugin-catalog-graph@0.4.1 + - @backstage/plugin-kafka@0.3.31 + - @backstage/plugin-jenkins@0.9.6 + - @backstage/plugin-code-coverage@0.2.24 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.6 + - @backstage/app-defaults@1.5.1 + - @backstage/catalog-model@1.4.5 + - @backstage/core-app-api@1.12.1 + - @backstage/core-plugin-api@1.9.1 + - @backstage/plugin-catalog-common@1.0.22 + - @backstage/plugin-gcp-projects@0.3.47 + - @backstage/plugin-gocd@0.1.37 + - @backstage/plugin-graphiql@0.3.4 + - @backstage/plugin-kubernetes-cluster@0.0.7 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-microsoft-calendar@0.1.13 + - @backstage/plugin-newrelic@0.3.46 + - @backstage/plugin-newrelic-dashboard@0.3.6 + - @backstage/plugin-nomad@0.1.12 + - @backstage/plugin-pagerduty@0.7.3 + - @backstage/plugin-permission-react@0.4.21 + - @backstage/plugin-puppetdb@0.1.14 + - @backstage/plugin-search-react@1.7.7 + - @backstage/plugin-todo@0.2.35 + +## 0.2.93-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.10.1-next.2 + - @backstage/plugin-search@1.4.7-next.2 + - @backstage/plugin-scaffolder@1.19.0-next.2 + - @backstage/plugin-techdocs-react@1.2.0-next.2 + - @backstage/plugin-notifications@0.1.0-next.2 + - @backstage/core-components@0.14.1-next.2 + - @backstage/plugin-tech-radar@0.7.0-next.2 + - @backstage/plugin-catalog-react@1.11.0-next.2 + - @backstage/plugin-azure-devops@0.4.0-next.2 + - @backstage/plugin-devtools@0.1.10-next.2 + - @backstage/plugin-azure-sites@0.1.20-next.2 + - @backstage/plugin-catalog@1.18.0-next.2 + - @backstage/plugin-linguist@0.1.16-next.2 + - @backstage/plugin-catalog-import@0.10.7-next.2 + - @backstage/plugin-home@0.7.0-next.2 + - @backstage/plugin-github-actions@0.6.12-next.2 + - @backstage/cli@0.25.3-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.6-next.2 + - @backstage/integration-react@1.1.25-next.2 + - @backstage/plugin-github-pull-requests-board@0.1.25-next.2 + - @backstage/app-defaults@1.5.1-next.2 + - @backstage/frontend-app-api@0.6.1-next.2 + - @backstage/plugin-adr@0.6.14-next.2 + - @backstage/plugin-airbrake@0.3.31-next.2 + - @backstage/plugin-apache-airflow@0.2.21-next.2 + - @backstage/plugin-api-docs@0.11.1-next.2 + - @backstage/plugin-badges@0.2.55-next.2 + - @backstage/plugin-catalog-graph@0.4.1-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.1.9-next.2 + - @backstage/plugin-cloudbuild@0.4.1-next.2 + - @backstage/plugin-code-coverage@0.2.24-next.2 + - @backstage/plugin-cost-insights@0.12.20-next.2 + - @backstage/plugin-dynatrace@10.0.0-next.2 + - @backstage/plugin-entity-feedback@0.2.14-next.2 + - @backstage/plugin-explore@0.4.17-next.2 + - @backstage/plugin-gcalendar@0.3.24-next.2 + - @backstage/plugin-gcp-projects@0.3.47-next.2 + - @backstage/plugin-gocd@0.1.37-next.2 + - @backstage/plugin-graphiql@0.3.4-next.2 + - @backstage/plugin-jenkins@0.9.6-next.2 + - @backstage/plugin-kafka@0.3.31-next.2 + - @backstage/plugin-kubernetes@0.11.6-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.7-next.2 + - @backstage/plugin-lighthouse@0.4.16-next.2 + - @backstage/plugin-microsoft-calendar@0.1.13-next.2 + - @backstage/plugin-newrelic@0.3.46-next.2 + - @backstage/plugin-newrelic-dashboard@0.3.6-next.2 + - @backstage/plugin-nomad@0.1.12-next.2 + - @backstage/plugin-octopus-deploy@0.2.13-next.2 + - @backstage/plugin-org@0.6.21-next.2 + - @backstage/plugin-pagerduty@0.7.3-next.2 + - @backstage/plugin-playlist@0.2.5-next.2 + - @backstage/plugin-puppetdb@0.1.14-next.2 + - @backstage/plugin-rollbar@0.4.31-next.2 + - @backstage/plugin-scaffolder-react@1.8.1-next.2 + - @backstage/plugin-search-react@1.7.7-next.2 + - @backstage/plugin-sentry@0.5.16-next.2 + - @backstage/plugin-shortcuts@0.3.20-next.2 + - @backstage/plugin-signals@0.0.2-next.2 + - @backstage/plugin-stack-overflow@0.1.26-next.2 + - @backstage/plugin-stackstorm@0.1.12-next.2 + - @backstage/plugin-tech-insights@0.3.23-next.2 + - @backstage/plugin-todo@0.2.35-next.2 + - @backstage/plugin-user-settings@0.8.2-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 + - @backstage/plugin-catalog-common@1.0.22-next.1 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-permission-react@0.4.21-next.1 + - @backstage/plugin-search-common@1.2.11-next.1 + +## 0.2.93-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/config@1.2.0-next.1 + - @backstage/core-components@0.14.1-next.1 + - @backstage/plugin-github-actions@0.6.12-next.1 + - @backstage/cli@0.25.3-next.1 + - @backstage/plugin-catalog-react@1.10.1-next.1 + - @backstage/plugin-entity-feedback@0.2.14-next.1 + - @backstage/plugin-api-docs@0.11.1-next.1 + - @backstage/plugin-notifications@0.1.0-next.1 + - @backstage/plugin-catalog@1.17.1-next.1 + - @backstage/plugin-azure-devops@0.4.0-next.1 + - @backstage/plugin-org@0.6.21-next.1 + - @backstage/core-app-api@1.12.1-next.1 + - @backstage/core-plugin-api@1.9.1-next.1 + - @backstage/frontend-app-api@0.6.1-next.1 + - @backstage/integration-react@1.1.25-next.1 + - @backstage/plugin-catalog-import@0.10.7-next.1 + - @backstage/plugin-cost-insights@0.12.20-next.1 + - @backstage/plugin-home@0.6.3-next.1 + - @backstage/plugin-permission-react@0.4.21-next.1 + - @backstage/plugin-stack-overflow@0.1.26-next.1 + - @backstage/plugin-techdocs@1.10.1-next.1 + - @backstage/plugin-techdocs-react@1.1.17-next.1 + - @backstage/app-defaults@1.5.1-next.1 + - @backstage/plugin-adr@0.6.14-next.1 + - @backstage/plugin-airbrake@0.3.31-next.1 + - @backstage/plugin-apache-airflow@0.2.21-next.1 + - @backstage/plugin-azure-sites@0.1.20-next.1 + - @backstage/plugin-badges@0.2.55-next.1 + - @backstage/plugin-catalog-graph@0.4.1-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.9-next.1 + - @backstage/plugin-cloudbuild@0.4.1-next.1 + - @backstage/plugin-code-coverage@0.2.24-next.1 + - @backstage/plugin-devtools@0.1.10-next.1 + - @backstage/plugin-dynatrace@9.0.1-next.1 + - @backstage/plugin-explore@0.4.17-next.1 + - @backstage/plugin-gcalendar@0.3.24-next.1 + - @backstage/plugin-gcp-projects@0.3.47-next.1 + - @backstage/plugin-github-pull-requests-board@0.1.25-next.1 + - @backstage/plugin-gocd@0.1.37-next.1 + - @backstage/plugin-graphiql@0.3.4-next.1 + - @backstage/plugin-jenkins@0.9.6-next.1 + - @backstage/plugin-kafka@0.3.31-next.1 + - @backstage/plugin-kubernetes@0.11.6-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.7-next.1 + - @backstage/plugin-lighthouse@0.4.16-next.1 + - @backstage/plugin-linguist@0.1.16-next.1 + - @backstage/plugin-microsoft-calendar@0.1.13-next.1 + - @backstage/plugin-newrelic@0.3.46-next.1 + - @backstage/plugin-newrelic-dashboard@0.3.6-next.1 + - @backstage/plugin-nomad@0.1.12-next.1 + - @backstage/plugin-octopus-deploy@0.2.13-next.1 + - @backstage/plugin-pagerduty@0.7.3-next.1 + - @backstage/plugin-playlist@0.2.5-next.1 + - @backstage/plugin-puppetdb@0.1.14-next.1 + - @backstage/plugin-rollbar@0.4.31-next.1 + - @backstage/plugin-scaffolder@1.18.1-next.1 + - @backstage/plugin-scaffolder-react@1.8.1-next.1 + - @backstage/plugin-search@1.4.7-next.1 + - @backstage/plugin-search-react@1.7.7-next.1 + - @backstage/plugin-sentry@0.5.16-next.1 + - @backstage/plugin-shortcuts@0.3.20-next.1 + - @backstage/plugin-signals@0.0.2-next.1 + - @backstage/plugin-stackstorm@0.1.12-next.1 + - @backstage/plugin-tech-insights@0.3.23-next.1 + - @backstage/plugin-tech-radar@0.6.14-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.6-next.1 + - @backstage/plugin-todo@0.2.35-next.1 + - @backstage/plugin-user-settings@0.8.2-next.1 + - @backstage/catalog-model@1.4.5-next.0 + - @backstage/theme@0.5.2-next.0 + - @backstage/plugin-catalog-common@1.0.22-next.1 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.11-next.1 + +## 0.2.93-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-github-pull-requests-board@0.1.25-next.0 + - @backstage/plugin-adr@0.6.14-next.0 + - @backstage/plugin-stack-overflow@0.1.26-next.0 + - @backstage/theme@0.5.2-next.0 + - @backstage/core-components@0.14.1-next.0 + - @backstage/plugin-notifications@0.1.0-next.0 + - @backstage/integration-react@1.1.25-next.0 + - @backstage/cli@0.25.3-next.0 + - @backstage/plugin-catalog-react@1.10.1-next.0 + - @backstage/plugin-azure-devops@0.4.0-next.0 + - @backstage/plugin-linguist@0.1.16-next.0 + - @backstage/plugin-catalog@1.17.1-next.0 + - @backstage/plugin-org@0.6.21-next.0 + - @backstage/plugin-search-common@1.2.11-next.0 + - @backstage/plugin-search@1.4.7-next.0 + - @backstage/plugin-devtools@0.1.10-next.0 + - @backstage/plugin-tech-radar@0.6.14-next.0 + - @backstage/plugin-scaffolder-react@1.8.1-next.0 + - @backstage/plugin-api-docs@0.11.1-next.0 + - @backstage/plugin-cost-insights@0.12.20-next.0 + - @backstage/plugin-home@0.6.3-next.0 + - @backstage/plugin-scaffolder@1.18.1-next.0 + - @backstage/plugin-shortcuts@0.3.20-next.0 + - @backstage/plugin-signals@0.0.2-next.0 + - @backstage/plugin-catalog-import@0.10.7-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-app-api@0.6.1-next.0 + - @backstage/plugin-badges@0.2.55-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.1.9-next.0 + - @backstage/plugin-code-coverage@0.2.24-next.0 + - @backstage/plugin-entity-feedback@0.2.14-next.0 + - @backstage/plugin-explore@0.4.17-next.0 + - @backstage/plugin-gcalendar@0.3.24-next.0 + - @backstage/plugin-gocd@0.1.37-next.0 + - @backstage/plugin-jenkins@0.9.6-next.0 + - @backstage/plugin-microsoft-calendar@0.1.13-next.0 + - @backstage/plugin-newrelic-dashboard@0.3.6-next.0 + - @backstage/plugin-pagerduty@0.7.3-next.0 + - @backstage/plugin-playlist@0.2.5-next.0 + - @backstage/plugin-puppetdb@0.1.14-next.0 + - @backstage/plugin-stackstorm@0.1.12-next.0 + - @backstage/plugin-tech-insights@0.3.23-next.0 + - @backstage/plugin-techdocs@1.10.1-next.0 + - @backstage/plugin-todo@0.2.35-next.0 + - @backstage/plugin-user-settings@0.8.2-next.0 + - @backstage/app-defaults@1.5.1-next.0 + - @backstage/plugin-azure-sites@0.1.20-next.0 + - @backstage/plugin-search-react@1.7.7-next.0 + - @backstage/plugin-techdocs-react@1.1.17-next.0 + - @backstage/plugin-airbrake@0.3.31-next.0 + - @backstage/plugin-apache-airflow@0.2.21-next.0 + - @backstage/plugin-catalog-graph@0.4.1-next.0 + - @backstage/plugin-cloudbuild@0.4.1-next.0 + - @backstage/plugin-dynatrace@9.0.1-next.0 + - @backstage/plugin-gcp-projects@0.3.47-next.0 + - @backstage/plugin-github-actions@0.6.12-next.0 + - @backstage/plugin-graphiql@0.3.4-next.0 + - @backstage/plugin-kafka@0.3.31-next.0 + - @backstage/plugin-kubernetes@0.11.6-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.7-next.0 + - @backstage/plugin-lighthouse@0.4.16-next.0 + - @backstage/plugin-newrelic@0.3.46-next.0 + - @backstage/plugin-nomad@0.1.12-next.0 + - @backstage/plugin-octopus-deploy@0.2.13-next.0 + - @backstage/plugin-rollbar@0.4.31-next.0 + - @backstage/plugin-sentry@0.5.16-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.6-next.0 + - @backstage/core-app-api@1.12.1-next.0 + - @backstage/plugin-catalog-common@1.0.22-next.0 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-permission-react@0.4.21-next.0 + +## 0.2.92 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-azure-devops@0.3.12 + - @backstage/frontend-app-api@0.6.0 + - @backstage/plugin-scaffolder-react@1.8.0 + - @backstage/plugin-catalog-react@1.10.0 + - @backstage/plugin-catalog-import@0.10.6 + - @backstage/plugin-catalog-graph@0.4.0 + - @backstage/plugin-catalog@1.17.0 + - @backstage/plugin-azure-sites@0.1.19 + - @backstage/plugin-api-docs@0.11.0 + - @backstage/plugin-adr@0.6.13 + - @backstage/app-defaults@1.5.0 + - @backstage/plugin-gcp-projects@0.3.46 + - @backstage/plugin-airbrake@0.3.30 + - @backstage/plugin-scaffolder@1.18.0 + - @backstage/plugin-devtools@0.1.9 + - @backstage/cli@0.25.2 + - @backstage/core-components@0.14.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.5 + - @backstage/plugin-signals@0.0.1 + - @backstage/plugin-kubernetes@0.11.5 + - @backstage/plugin-notifications@0.0.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.8 + - @backstage/plugin-microsoft-calendar@0.1.12 + - @backstage/plugin-github-actions@0.6.11 + - @backstage/plugin-octopus-deploy@0.2.12 + - @backstage/plugin-techdocs-react@1.1.16 + - @backstage/core-app-api@1.12.0 + - @backstage/plugin-code-coverage@0.2.23 + - @backstage/plugin-cost-insights@0.12.19 + - @backstage/plugin-tech-insights@0.3.22 + - @backstage/plugin-lighthouse@0.4.15 + - @backstage/plugin-tech-radar@0.6.13 + - @backstage/plugin-dynatrace@9.0.0 + - @backstage/plugin-shortcuts@0.3.19 + - @backstage/plugin-graphiql@0.3.3 + - @backstage/plugin-linguist@0.1.15 + - @backstage/plugin-newrelic@0.3.45 + - @backstage/plugin-jenkins@0.9.5 + - @backstage/plugin-rollbar@0.4.30 + - @backstage/plugin-badges@0.2.54 + - @backstage/plugin-sentry@0.5.15 + - @backstage/plugin-nomad@0.1.11 + - @backstage/plugin-home@0.6.2 + - @backstage/catalog-model@1.4.4 + - @backstage/plugin-explore@0.4.16 + - @backstage/plugin-user-settings@0.8.1 + - @backstage/plugin-techdocs@1.10.0 + - @backstage/plugin-search@1.4.6 + - @backstage/theme@0.5.1 + - @backstage/core-plugin-api@1.9.0 + - @backstage/plugin-playlist@0.2.4 + - @backstage/plugin-apache-airflow@0.2.20 + - @backstage/plugin-cloudbuild@0.4.0 + - @backstage/plugin-entity-feedback@0.2.13 + - @backstage/plugin-gcalendar@0.3.23 + - @backstage/plugin-kafka@0.3.30 + - @backstage/plugin-kubernetes-cluster@0.0.6 + - @backstage/plugin-newrelic-dashboard@0.3.5 + - @backstage/plugin-org@0.6.20 + - @backstage/plugin-pagerduty@0.7.2 + - @backstage/plugin-permission-react@0.4.20 + - @backstage/plugin-puppetdb@0.1.13 + - @backstage/plugin-search-react@1.7.6 + - @backstage/plugin-stack-overflow@0.1.25 + - @backstage/plugin-stackstorm@0.1.11 + - @backstage/plugin-gocd@0.1.36 + - @backstage/plugin-todo@0.2.34 + - @backstage/config@1.1.1 + - @backstage/integration-react@1.1.24 + - @backstage/plugin-catalog-common@1.0.21 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.10 + +## 0.2.92-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-api-docs@0.11.0-next.3 + - @backstage/cli@0.25.2-next.3 + - @backstage/plugin-kubernetes@0.11.5-next.3 + - @backstage/theme@0.5.1-next.1 + - @backstage/plugin-playlist@0.2.4-next.3 + - @backstage/plugin-catalog@1.17.0-next.3 + - @backstage/frontend-app-api@0.6.0-next.3 + - @backstage/plugin-notifications@0.0.1-next.1 + - @backstage/plugin-signals@0.0.1-next.3 + - @backstage/core-components@0.14.0-next.2 + - @backstage/plugin-catalog-react@1.10.0-next.3 + - @backstage/plugin-gcp-projects@0.3.46-next.2 + - @backstage/plugin-scaffolder-react@1.8.0-next.3 + - @backstage/plugin-scaffolder@1.18.0-next.3 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.5-next.3 + - @backstage/plugin-home@0.6.2-next.3 + - @backstage/plugin-gcalendar@0.3.23-next.2 + - @backstage/plugin-microsoft-calendar@0.1.12-next.2 + - @backstage/plugin-techdocs@1.10.0-next.3 + - @backstage/plugin-catalog-import@0.10.6-next.3 + - @backstage/plugin-github-actions@0.6.11-next.3 + - @backstage/plugin-dynatrace@9.0.0-next.3 + - @backstage/plugin-kubernetes-cluster@0.0.6-next.3 + - @backstage/app-defaults@1.5.0-next.3 + - @backstage/catalog-model@1.4.4-next.0 + - @backstage/config@1.1.1 + - @backstage/core-app-api@1.12.0-next.1 + - @backstage/core-plugin-api@1.9.0-next.1 + - @backstage/integration-react@1.1.24-next.2 + - @backstage/plugin-adr@0.6.13-next.3 + - @backstage/plugin-airbrake@0.3.30-next.3 + - @backstage/plugin-apache-airflow@0.2.20-next.2 + - @backstage/plugin-azure-devops@0.3.12-next.3 + - @backstage/plugin-azure-sites@0.1.19-next.3 + - @backstage/plugin-badges@0.2.54-next.3 + - @backstage/plugin-catalog-common@1.0.21-next.0 + - @backstage/plugin-catalog-graph@0.4.0-next.3 + - @backstage/plugin-catalog-unprocessed-entities@0.1.8-next.2 + - @backstage/plugin-cloudbuild@0.4.0-next.3 + - @backstage/plugin-code-coverage@0.2.23-next.3 + - @backstage/plugin-cost-insights@0.12.19-next.3 + - @backstage/plugin-devtools@0.1.9-next.3 + - @backstage/plugin-entity-feedback@0.2.13-next.3 + - @backstage/plugin-explore@0.4.16-next.3 + - @backstage/plugin-gocd@0.1.36-next.3 + - @backstage/plugin-graphiql@0.3.3-next.3 + - @backstage/plugin-jenkins@0.9.5-next.3 + - @backstage/plugin-kafka@0.3.30-next.3 + - @backstage/plugin-lighthouse@0.4.15-next.3 + - @backstage/plugin-linguist@0.1.15-next.3 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-newrelic@0.3.45-next.2 + - @backstage/plugin-newrelic-dashboard@0.3.5-next.3 + - @backstage/plugin-nomad@0.1.11-next.3 + - @backstage/plugin-octopus-deploy@0.2.12-next.3 + - @backstage/plugin-org@0.6.20-next.3 + - @backstage/plugin-pagerduty@0.7.2-next.3 + - @backstage/plugin-permission-react@0.4.20-next.1 + - @backstage/plugin-puppetdb@0.1.13-next.3 + - @backstage/plugin-rollbar@0.4.30-next.3 + - @backstage/plugin-search@1.4.6-next.3 + - @backstage/plugin-search-common@1.2.10 + - @backstage/plugin-search-react@1.7.6-next.3 + - @backstage/plugin-sentry@0.5.15-next.3 + - @backstage/plugin-shortcuts@0.3.19-next.2 + - @backstage/plugin-stack-overflow@0.1.25-next.3 + - @backstage/plugin-stackstorm@0.1.11-next.2 + - @backstage/plugin-tech-insights@0.3.22-next.3 + - @backstage/plugin-tech-radar@0.6.13-next.3 + - @backstage/plugin-techdocs-react@1.1.16-next.2 + - @backstage/plugin-todo@0.2.34-next.3 + - @backstage/plugin-user-settings@0.8.1-next.3 + +## 0.2.92-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-azure-devops@0.3.12-next.2 + - @backstage/plugin-azure-sites@0.1.19-next.2 + - @backstage/core-components@0.14.0-next.1 + - @backstage/plugin-catalog-graph@0.4.0-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.5-next.2 + - @backstage/plugin-signals@0.0.1-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.1.8-next.1 + - @backstage/plugin-microsoft-calendar@0.1.12-next.1 + - @backstage/plugin-catalog-import@0.10.6-next.2 + - @backstage/plugin-github-actions@0.6.11-next.2 + - @backstage/plugin-octopus-deploy@0.2.12-next.2 + - @backstage/plugin-techdocs-react@1.1.16-next.1 + - @backstage/app-defaults@1.5.0-next.2 + - @backstage/core-app-api@1.12.0-next.1 + - @backstage/plugin-code-coverage@0.2.23-next.2 + - @backstage/plugin-cost-insights@0.12.19-next.2 + - @backstage/plugin-tech-insights@0.3.22-next.2 + - @backstage/plugin-lighthouse@0.4.15-next.2 + - @backstage/plugin-scaffolder@1.18.0-next.2 + - @backstage/plugin-tech-radar@0.6.13-next.2 + - @backstage/plugin-dynatrace@9.0.0-next.2 + - @backstage/plugin-shortcuts@0.3.19-next.1 + - @backstage/plugin-airbrake@0.3.30-next.2 + - @backstage/plugin-api-docs@0.10.4-next.2 + - @backstage/plugin-devtools@0.1.9-next.2 + - @backstage/plugin-graphiql@0.3.3-next.2 + - @backstage/plugin-linguist@0.1.15-next.2 + - @backstage/plugin-newrelic@0.3.45-next.1 + - @backstage/plugin-catalog@1.17.0-next.2 + - @backstage/plugin-jenkins@0.9.5-next.2 + - @backstage/plugin-rollbar@0.4.30-next.2 + - @backstage/plugin-badges@0.2.54-next.2 + - @backstage/plugin-sentry@0.5.15-next.2 + - @backstage/plugin-nomad@0.1.11-next.2 + - @backstage/plugin-home@0.6.2-next.2 + - @backstage/core-plugin-api@1.9.0-next.1 + - @backstage/plugin-catalog-react@1.10.0-next.2 + - @backstage/frontend-app-api@0.6.0-next.2 + - @backstage/plugin-adr@0.6.13-next.2 + - @backstage/plugin-apache-airflow@0.2.20-next.1 + - @backstage/plugin-cloudbuild@0.4.0-next.2 + - @backstage/plugin-entity-feedback@0.2.13-next.2 + - @backstage/plugin-explore@0.4.16-next.2 + - @backstage/plugin-gcalendar@0.3.23-next.1 + - @backstage/plugin-kafka@0.3.30-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.6-next.2 + - @backstage/plugin-kubernetes@0.11.5-next.2 + - @backstage/plugin-newrelic-dashboard@0.3.5-next.2 + - @backstage/plugin-org@0.6.20-next.2 + - @backstage/plugin-pagerduty@0.7.2-next.2 + - @backstage/plugin-permission-react@0.4.20-next.1 + - @backstage/plugin-playlist@0.2.4-next.2 + - @backstage/plugin-puppetdb@0.1.13-next.2 + - @backstage/plugin-scaffolder-react@1.8.0-next.2 + - @backstage/plugin-search-react@1.7.6-next.2 + - @backstage/plugin-search@1.4.6-next.2 + - @backstage/plugin-stack-overflow@0.1.25-next.2 + - @backstage/plugin-stackstorm@0.1.11-next.1 + - @backstage/plugin-techdocs@1.10.0-next.2 + - @backstage/plugin-user-settings@0.8.1-next.2 + - @backstage/theme@0.5.1-next.0 + - @backstage/cli@0.25.2-next.2 + - @backstage/plugin-notifications@0.0.1-next.0 + - @backstage/integration-react@1.1.24-next.1 + - @backstage/plugin-gcp-projects@0.3.46-next.1 + - @backstage/plugin-gocd@0.1.36-next.2 + - @backstage/plugin-todo@0.2.34-next.2 + - @backstage/config@1.1.1 + - @backstage/catalog-model@1.4.4-next.0 + - @backstage/plugin-catalog-common@1.0.21-next.0 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.10 + +## 0.2.92-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-app-api@0.6.0-next.1 + - @backstage/plugin-scaffolder-react@1.8.0-next.1 + - @backstage/plugin-adr@0.6.13-next.1 + - @backstage/plugin-catalog-graph@0.3.4-next.1 + - @backstage/core-components@0.14.0-next.0 + - @backstage/plugin-scaffolder@1.18.0-next.1 + - @backstage/cli@0.25.2-next.1 + - @backstage/catalog-model@1.4.4-next.0 + - @backstage/plugin-explore@0.4.16-next.1 + - @backstage/plugin-catalog@1.17.0-next.1 + - @backstage/core-plugin-api@1.8.3-next.0 + - @backstage/app-defaults@1.4.8-next.1 + - @backstage/core-app-api@1.11.4-next.0 + - @backstage/plugin-techdocs@1.10.0-next.1 + - @backstage/plugin-azure-sites@0.1.19-next.1 + - @backstage/plugin-home@0.6.2-next.1 + - @backstage/plugin-catalog-import@0.10.6-next.1 + - @backstage/plugin-catalog-react@1.9.4-next.1 + - @backstage/plugin-devtools@0.1.9-next.1 + - @backstage/plugin-graphiql@0.3.3-next.1 + - @backstage/plugin-linguist@0.1.15-next.1 + - @backstage/plugin-search@1.4.6-next.1 + - @backstage/plugin-search-react@1.7.6-next.1 + - @backstage/plugin-stack-overflow@0.1.25-next.1 + - @backstage/plugin-tech-radar@0.6.13-next.1 + - @backstage/plugin-user-settings@0.8.1-next.1 + - @backstage/integration-react@1.1.24-next.0 + - @backstage/plugin-airbrake@0.3.30-next.1 + - @backstage/plugin-apache-airflow@0.2.20-next.0 + - @backstage/plugin-api-docs@0.10.4-next.1 + - @backstage/plugin-azure-devops@0.3.12-next.1 + - @backstage/plugin-badges@0.2.54-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.8-next.0 + - @backstage/plugin-cloudbuild@0.4.0-next.1 + - @backstage/plugin-code-coverage@0.2.23-next.1 + - @backstage/plugin-cost-insights@0.12.19-next.1 + - @backstage/plugin-dynatrace@8.0.4-next.1 + - @backstage/plugin-entity-feedback@0.2.13-next.1 + - @backstage/plugin-gcalendar@0.3.23-next.0 + - @backstage/plugin-gcp-projects@0.3.46-next.0 + - @backstage/plugin-github-actions@0.6.11-next.1 + - @backstage/plugin-gocd@0.1.36-next.1 + - @backstage/plugin-jenkins@0.9.5-next.1 + - @backstage/plugin-kafka@0.3.30-next.1 + - @backstage/plugin-kubernetes@0.11.5-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.6-next.1 + - @backstage/plugin-lighthouse@0.4.15-next.1 + - @backstage/plugin-microsoft-calendar@0.1.12-next.0 + - @backstage/plugin-newrelic@0.3.45-next.0 + - @backstage/plugin-newrelic-dashboard@0.3.5-next.1 + - @backstage/plugin-nomad@0.1.11-next.1 + - @backstage/plugin-octopus-deploy@0.2.12-next.1 + - @backstage/plugin-org@0.6.20-next.1 + - @backstage/plugin-pagerduty@0.7.2-next.1 + - @backstage/plugin-playlist@0.2.4-next.1 + - @backstage/plugin-puppetdb@0.1.13-next.1 + - @backstage/plugin-rollbar@0.4.30-next.1 + - @backstage/plugin-sentry@0.5.15-next.1 + - @backstage/plugin-shortcuts@0.3.19-next.0 + - @backstage/plugin-signals@0.0.1-next.1 + - @backstage/plugin-stackstorm@0.1.11-next.0 + - @backstage/plugin-tech-insights@0.3.22-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.5-next.1 + - @backstage/plugin-techdocs-react@1.1.16-next.0 + - @backstage/plugin-todo@0.2.34-next.1 + - @backstage/config@1.1.1 + - @backstage/theme@0.5.0 + - @backstage/plugin-catalog-common@1.0.21-next.0 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-permission-react@0.4.20-next.0 + - @backstage/plugin-search-common@1.2.10 + +## 0.2.92-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-import@0.10.6-next.0 + - @backstage/plugin-catalog-graph@0.3.4-next.0 + - @backstage/plugin-catalog-react@1.9.4-next.0 + - @backstage/plugin-catalog@1.17.0-next.0 + - @backstage/plugin-adr@0.6.13-next.0 + - @backstage/app-defaults@1.4.8-next.0 + - @backstage/frontend-app-api@0.6.0-next.0 + - @backstage/plugin-scaffolder-react@1.8.0-next.0 + - @backstage/plugin-scaffolder@1.18.0-next.0 + - @backstage/plugin-devtools@0.1.9-next.0 + - @backstage/plugin-user-settings@0.8.1-next.0 + - @backstage/plugin-tech-radar@0.6.13-next.0 + - @backstage/plugin-graphiql@0.3.3-next.0 + - @backstage/plugin-techdocs@1.9.4-next.0 + - @backstage/plugin-search@1.4.6-next.0 + - @backstage/plugin-api-docs@0.10.4-next.0 + - @backstage/cli@0.25.2-next.0 + - @backstage/plugin-stack-overflow@0.1.25-next.0 + - @backstage/plugin-signals@0.0.1-next.0 + - @backstage/plugin-home@0.6.2-next.0 + - @backstage/plugin-cloudbuild@0.4.0-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.5-next.0 + - @backstage/plugin-azure-devops@0.3.12-next.0 + - @backstage/plugin-linguist@0.1.15-next.0 + - @backstage/plugin-airbrake@0.3.30-next.0 + - @backstage/plugin-azure-sites@0.1.19-next.0 + - @backstage/plugin-badges@0.2.54-next.0 + - @backstage/plugin-code-coverage@0.2.23-next.0 + - @backstage/plugin-cost-insights@0.12.19-next.0 + - @backstage/plugin-dynatrace@8.0.4-next.0 + - @backstage/plugin-entity-feedback@0.2.13-next.0 + - @backstage/plugin-explore@0.4.16-next.0 + - @backstage/plugin-github-actions@0.6.11-next.0 + - @backstage/plugin-gocd@0.1.36-next.0 + - @backstage/plugin-jenkins@0.9.5-next.0 + - @backstage/plugin-kafka@0.3.30-next.0 + - @backstage/plugin-kubernetes@0.11.5-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.6-next.0 + - @backstage/plugin-lighthouse@0.4.15-next.0 + - @backstage/plugin-newrelic-dashboard@0.3.5-next.0 + - @backstage/plugin-nomad@0.1.11-next.0 + - @backstage/plugin-octopus-deploy@0.2.12-next.0 + - @backstage/plugin-org@0.6.20-next.0 + - @backstage/plugin-pagerduty@0.7.2-next.0 + - @backstage/plugin-playlist@0.2.4-next.0 + - @backstage/plugin-puppetdb@0.1.13-next.0 + - @backstage/plugin-rollbar@0.4.30-next.0 + - @backstage/plugin-sentry@0.5.15-next.0 + - @backstage/plugin-tech-insights@0.3.22-next.0 + - @backstage/plugin-todo@0.2.34-next.0 + - @backstage/core-components@0.13.10 + - @backstage/plugin-search-react@1.7.6-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/core-app-api@1.11.3 + - @backstage/core-plugin-api@1.8.2 + - @backstage/integration-react@1.1.23 + - @backstage/theme@0.5.0 + - @backstage/plugin-apache-airflow@0.2.19 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-catalog-unprocessed-entities@0.1.7 + - @backstage/plugin-gcalendar@0.3.22 + - @backstage/plugin-gcp-projects@0.3.45 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-microsoft-calendar@0.1.11 + - @backstage/plugin-newrelic@0.3.44 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/plugin-search-common@1.2.10 + - @backstage/plugin-shortcuts@0.3.18 + - @backstage/plugin-stackstorm@0.1.10 + - @backstage/plugin-techdocs-react@1.1.15 + +## 0.2.91 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-api-docs@0.10.3 + - @backstage/plugin-scaffolder-react@1.7.1 + - @backstage/core-components@0.13.10 + - @backstage/plugin-user-settings@0.8.0 + - @backstage/plugin-azure-sites@0.1.18 + - @backstage/cli@0.25.1 + - @backstage/core-plugin-api@1.8.2 + - @backstage/plugin-octopus-deploy@0.2.11 + - @backstage/frontend-app-api@0.5.0 + - @backstage/plugin-kubernetes@0.11.4 + - @backstage/plugin-home@0.6.1 + - @backstage/plugin-scaffolder@1.17.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.4 + - @backstage/plugin-catalog-unprocessed-entities@0.1.7 + - @backstage/plugin-kubernetes-cluster@0.0.5 + - @backstage/plugin-microsoft-calendar@0.1.11 + - @backstage/plugin-newrelic-dashboard@0.3.4 + - @backstage/plugin-permission-react@0.4.19 + - @backstage/plugin-entity-feedback@0.2.12 + - @backstage/plugin-apache-airflow@0.2.19 + - @backstage/plugin-github-actions@0.6.10 + - @backstage/plugin-stack-overflow@0.1.24 + - @backstage/plugin-techdocs-react@1.1.15 + - @backstage/plugin-catalog-graph@0.3.3 + - @backstage/plugin-catalog-react@1.9.3 + - @backstage/plugin-code-coverage@0.2.22 + - @backstage/plugin-cost-insights@0.12.18 + - @backstage/plugin-tech-insights@0.3.21 + - @backstage/plugin-azure-devops@0.3.11 + - @backstage/plugin-gcp-projects@0.3.45 + - @backstage/plugin-cloudbuild@0.3.29 + - @backstage/plugin-lighthouse@0.4.14 + - @backstage/plugin-stackstorm@0.1.10 + - @backstage/plugin-tech-radar@0.6.12 + - @backstage/plugin-dynatrace@8.0.3 + - @backstage/plugin-gcalendar@0.3.22 + - @backstage/plugin-pagerduty@0.7.1 + - @backstage/plugin-shortcuts@0.3.18 + - @backstage/plugin-airbrake@0.3.29 + - @backstage/plugin-devtools@0.1.8 + - @backstage/plugin-graphiql@0.3.2 + - @backstage/plugin-linguist@0.1.14 + - @backstage/plugin-newrelic@0.3.44 + - @backstage/plugin-playlist@0.2.3 + - @backstage/plugin-puppetdb@0.1.12 + - @backstage/plugin-techdocs@1.9.3 + - @backstage/plugin-catalog@1.16.1 + - @backstage/plugin-explore@0.4.15 + - @backstage/plugin-jenkins@0.9.4 + - @backstage/plugin-rollbar@0.4.29 + - @backstage/plugin-badges@0.2.53 + - @backstage/plugin-search@1.4.5 + - @backstage/plugin-sentry@0.5.14 + - @backstage/plugin-kafka@0.3.29 + - @backstage/plugin-nomad@0.1.10 + - @backstage/plugin-gocd@0.1.35 + - @backstage/plugin-todo@0.2.33 + - @backstage/plugin-adr@0.6.12 + - @backstage/plugin-org@0.6.19 + - @backstage/plugin-catalog-import@0.10.5 + - @backstage/plugin-search-react@1.7.5 + - @backstage/app-defaults@1.4.7 + - @backstage/integration-react@1.1.23 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/core-app-api@1.11.3 + - @backstage/theme@0.5.0 + - @backstage/plugin-catalog-common@1.0.20 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.10 + +## 0.2.91-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-user-settings@0.8.0-next.2 + - @backstage/plugin-octopus-deploy@0.2.11-next.2 + - @backstage/frontend-app-api@0.4.1-next.2 + - @backstage/plugin-home@0.6.1-next.2 + - @backstage/plugin-scaffolder-react@1.7.1-next.2 + - @backstage/plugin-scaffolder@1.17.1-next.2 + - @backstage/plugin-linguist@0.1.14-next.2 + - @backstage/plugin-catalog@1.16.1-next.2 + - @backstage/plugin-catalog-import@0.10.5-next.2 + - @backstage/plugin-graphiql@0.3.2-next.2 + - @backstage/plugin-search@1.4.5-next.2 + - @backstage/plugin-tech-radar@0.6.12-next.2 + - @backstage/plugin-techdocs@1.9.3-next.2 + - @backstage/plugin-adr@0.6.12-next.2 + - @backstage/plugin-catalog-react@1.9.3-next.2 + - @backstage/plugin-explore@0.4.15-next.2 + - @backstage/plugin-search-react@1.7.5-next.2 + - @backstage/plugin-stack-overflow@0.1.24-next.2 + - @backstage/cli@0.25.1-next.1 + - @backstage/plugin-pagerduty@0.7.1-next.2 + - @backstage/plugin-api-docs@0.10.3-next.2 + - @backstage/plugin-catalog-graph@0.3.3-next.2 + - @backstage/plugin-org@0.6.19-next.2 + - @backstage/plugin-airbrake@0.3.29-next.2 + - @backstage/plugin-azure-devops@0.3.11-next.2 + - @backstage/plugin-azure-sites@0.1.18-next.2 + - @backstage/plugin-badges@0.2.53-next.2 + - @backstage/plugin-cloudbuild@0.3.29-next.2 + - @backstage/plugin-code-coverage@0.2.22-next.2 + - @backstage/plugin-cost-insights@0.12.18-next.2 + - @backstage/plugin-dynatrace@8.0.3-next.2 + - @backstage/plugin-entity-feedback@0.2.12-next.2 + - @backstage/plugin-github-actions@0.6.10-next.2 + - @backstage/plugin-gocd@0.1.35-next.2 + - @backstage/plugin-jenkins@0.9.4-next.2 + - @backstage/plugin-kafka@0.3.29-next.2 + - @backstage/plugin-kubernetes@0.11.4-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.5-next.2 + - @backstage/plugin-lighthouse@0.4.14-next.2 + - @backstage/plugin-newrelic-dashboard@0.3.4-next.2 + - @backstage/plugin-nomad@0.1.10-next.2 + - @backstage/plugin-playlist@0.2.3-next.2 + - @backstage/plugin-puppetdb@0.1.12-next.2 + - @backstage/plugin-rollbar@0.4.29-next.2 + - @backstage/plugin-sentry@0.5.14-next.2 + - @backstage/plugin-tech-insights@0.3.21-next.2 + - @backstage/plugin-todo@0.2.33-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.4-next.1 + - @backstage/integration-react@1.1.23-next.0 + - @backstage/plugin-apache-airflow@0.2.19-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.7-next.1 + - @backstage/plugin-devtools@0.1.8-next.1 + - @backstage/plugin-gcalendar@0.3.22-next.1 + - @backstage/plugin-gcp-projects@0.3.45-next.1 + - @backstage/plugin-microsoft-calendar@0.1.11-next.1 + - @backstage/plugin-newrelic@0.3.44-next.1 + - @backstage/plugin-shortcuts@0.3.18-next.1 + - @backstage/plugin-stackstorm@0.1.10-next.1 + +## 0.2.91-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-azure-sites@0.1.18-next.1 + - @backstage/core-plugin-api@1.8.2-next.0 + - @backstage/plugin-user-settings@0.8.0-next.1 + - @backstage/plugin-kubernetes@0.11.4-next.1 + - @backstage/core-components@0.13.10-next.1 + - @backstage/app-defaults@1.4.7-next.1 + - @backstage/cli@0.25.1-next.1 + - @backstage/core-app-api@1.11.3-next.0 + - @backstage/frontend-app-api@0.4.1-next.1 + - @backstage/integration-react@1.1.23-next.0 + - @backstage/plugin-adr@0.6.12-next.1 + - @backstage/plugin-airbrake@0.3.29-next.1 + - @backstage/plugin-apache-airflow@0.2.19-next.1 + - @backstage/plugin-api-docs@0.10.3-next.1 + - @backstage/plugin-azure-devops@0.3.11-next.1 + - @backstage/plugin-badges@0.2.53-next.1 + - @backstage/plugin-catalog@1.16.1-next.1 + - @backstage/plugin-catalog-graph@0.3.3-next.1 + - @backstage/plugin-catalog-import@0.10.5-next.1 + - @backstage/plugin-catalog-react@1.9.3-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.7-next.1 + - @backstage/plugin-cloudbuild@0.3.29-next.1 + - @backstage/plugin-code-coverage@0.2.22-next.1 + - @backstage/plugin-cost-insights@0.12.18-next.1 + - @backstage/plugin-devtools@0.1.8-next.1 + - @backstage/plugin-dynatrace@8.0.3-next.1 + - @backstage/plugin-entity-feedback@0.2.12-next.1 + - @backstage/plugin-explore@0.4.15-next.1 + - @backstage/plugin-gcalendar@0.3.22-next.1 + - @backstage/plugin-gcp-projects@0.3.45-next.1 + - @backstage/plugin-github-actions@0.6.10-next.1 + - @backstage/plugin-gocd@0.1.35-next.1 + - @backstage/plugin-graphiql@0.3.2-next.1 + - @backstage/plugin-home@0.6.1-next.1 + - @backstage/plugin-jenkins@0.9.4-next.1 + - @backstage/plugin-kafka@0.3.29-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.5-next.1 + - @backstage/plugin-lighthouse@0.4.14-next.1 + - @backstage/plugin-linguist@0.1.14-next.1 + - @backstage/plugin-microsoft-calendar@0.1.11-next.1 + - @backstage/plugin-newrelic@0.3.44-next.1 + - @backstage/plugin-newrelic-dashboard@0.3.4-next.1 + - @backstage/plugin-nomad@0.1.10-next.1 + - @backstage/plugin-octopus-deploy@0.2.11-next.1 + - @backstage/plugin-org@0.6.19-next.1 + - @backstage/plugin-pagerduty@0.7.1-next.1 + - @backstage/plugin-permission-react@0.4.19-next.1 + - @backstage/plugin-playlist@0.2.3-next.1 + - @backstage/plugin-puppetdb@0.1.12-next.1 + - @backstage/plugin-rollbar@0.4.29-next.1 + - @backstage/plugin-scaffolder@1.17.1-next.1 + - @backstage/plugin-scaffolder-react@1.7.1-next.1 + - @backstage/plugin-search@1.4.5-next.1 + - @backstage/plugin-search-react@1.7.5-next.1 + - @backstage/plugin-sentry@0.5.14-next.1 + - @backstage/plugin-shortcuts@0.3.18-next.1 + - @backstage/plugin-stack-overflow@0.1.24-next.1 + - @backstage/plugin-stackstorm@0.1.10-next.1 + - @backstage/plugin-tech-insights@0.3.21-next.1 + - @backstage/plugin-tech-radar@0.6.12-next.1 + - @backstage/plugin-techdocs@1.9.3-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.4-next.1 + - @backstage/plugin-techdocs-react@1.1.15-next.1 + - @backstage/plugin-todo@0.2.33-next.1 + - @backstage/config@1.1.1 + - @backstage/catalog-model@1.4.3 + - @backstage/theme@0.5.0 + - @backstage/plugin-catalog-common@1.0.19 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.9 + +## 0.2.91-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.7.1-next.0 + - @backstage/core-components@0.13.10-next.0 + - @backstage/cli@0.25.1-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.4-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.1.7-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.5-next.0 + - @backstage/plugin-microsoft-calendar@0.1.11-next.0 + - @backstage/plugin-newrelic-dashboard@0.3.4-next.0 + - @backstage/plugin-permission-react@0.4.19-next.0 + - @backstage/plugin-entity-feedback@0.2.12-next.0 + - @backstage/plugin-apache-airflow@0.2.19-next.0 + - @backstage/plugin-github-actions@0.6.10-next.0 + - @backstage/plugin-octopus-deploy@0.2.11-next.0 + - @backstage/plugin-stack-overflow@0.1.24-next.0 + - @backstage/plugin-techdocs-react@1.1.15-next.0 + - @backstage/plugin-catalog-graph@0.3.3-next.0 + - @backstage/plugin-catalog-react@1.9.3-next.0 + - @backstage/plugin-code-coverage@0.2.22-next.0 + - @backstage/plugin-cost-insights@0.12.18-next.0 + - @backstage/plugin-tech-insights@0.3.21-next.0 + - @backstage/plugin-user-settings@0.7.15-next.0 + - @backstage/plugin-azure-devops@0.3.11-next.0 + - @backstage/plugin-gcp-projects@0.3.45-next.0 + - @backstage/plugin-azure-sites@0.1.18-next.0 + - @backstage/plugin-cloudbuild@0.3.29-next.0 + - @backstage/plugin-kubernetes@0.11.4-next.0 + - @backstage/plugin-lighthouse@0.4.14-next.0 + - @backstage/plugin-scaffolder@1.17.1-next.0 + - @backstage/plugin-stackstorm@0.1.10-next.0 + - @backstage/plugin-tech-radar@0.6.12-next.0 + - @backstage/plugin-dynatrace@8.0.3-next.0 + - @backstage/plugin-gcalendar@0.3.22-next.0 + - @backstage/plugin-pagerduty@0.7.1-next.0 + - @backstage/plugin-shortcuts@0.3.18-next.0 + - @backstage/plugin-airbrake@0.3.29-next.0 + - @backstage/plugin-api-docs@0.10.3-next.0 + - @backstage/plugin-devtools@0.1.8-next.0 + - @backstage/plugin-graphiql@0.3.2-next.0 + - @backstage/plugin-linguist@0.1.14-next.0 + - @backstage/plugin-newrelic@0.3.44-next.0 + - @backstage/plugin-playlist@0.2.3-next.0 + - @backstage/plugin-puppetdb@0.1.12-next.0 + - @backstage/plugin-techdocs@1.9.3-next.0 + - @backstage/plugin-catalog@1.16.1-next.0 + - @backstage/plugin-explore@0.4.15-next.0 + - @backstage/plugin-jenkins@0.9.4-next.0 + - @backstage/plugin-rollbar@0.4.29-next.0 + - @backstage/plugin-badges@0.2.53-next.0 + - @backstage/plugin-search@1.4.5-next.0 + - @backstage/plugin-sentry@0.5.14-next.0 + - @backstage/plugin-kafka@0.3.29-next.0 + - @backstage/plugin-nomad@0.1.10-next.0 + - @backstage/plugin-gocd@0.1.35-next.0 + - @backstage/plugin-home@0.6.1-next.0 + - @backstage/plugin-todo@0.2.33-next.0 + - @backstage/plugin-adr@0.6.12-next.0 + - @backstage/plugin-org@0.6.19-next.0 + - @backstage/app-defaults@1.4.7-next.0 + - @backstage/frontend-app-api@0.4.1-next.0 + - @backstage/integration-react@1.1.22 + - @backstage/plugin-catalog-import@0.10.5-next.0 + - @backstage/plugin-search-react@1.7.5-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/core-app-api@1.11.2 + - @backstage/core-plugin-api@1.8.1 + - @backstage/theme@0.5.0 + - @backstage/plugin-catalog-common@1.0.19 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.9 + +## 0.2.90 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.1 + - @backstage/frontend-app-api@0.4.0 + - @backstage/plugin-catalog-react@1.9.2 + - @backstage/plugin-api-docs@0.10.2 + - @backstage/core-components@0.13.9 + - @backstage/cli@0.25.0 + - @backstage/theme@0.5.0 + - @backstage/plugin-scaffolder@1.17.0 + - @backstage/plugin-home@0.6.0 + - @backstage/plugin-catalog@1.16.0 + - @backstage/plugin-scaffolder-react@1.7.0 + - @backstage/plugin-kubernetes@0.11.3 + - @backstage/plugin-org@0.6.18 + - @backstage/plugin-github-actions@0.6.9 + - @backstage/plugin-azure-devops@0.3.10 + - @backstage/core-app-api@1.11.2 + - @backstage/plugin-lighthouse@0.4.13 + - @backstage/plugin-explore@0.4.14 + - @backstage/plugin-catalog-import@0.10.4 + - @backstage/plugin-user-settings@0.7.14 + - @backstage/plugin-tech-radar@0.6.11 + - @backstage/plugin-graphiql@0.3.1 + - @backstage/plugin-techdocs@1.9.2 + - @backstage/plugin-search@1.4.4 + - @backstage/plugin-search-react@1.7.4 + - @backstage/plugin-stack-overflow@0.1.23 + - @backstage/plugin-adr@0.6.11 + - @backstage/plugin-gcp-projects@0.3.44 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.3 + - @backstage/plugin-pagerduty@0.7.0 + - @backstage/app-defaults@1.4.6 + - @backstage/integration-react@1.1.22 + - @backstage/plugin-airbrake@0.3.28 + - @backstage/plugin-apache-airflow@0.2.18 + - @backstage/plugin-azure-sites@0.1.17 + - @backstage/plugin-badges@0.2.52 + - @backstage/plugin-catalog-graph@0.3.2 + - @backstage/plugin-catalog-unprocessed-entities@0.1.6 + - @backstage/plugin-cloudbuild@0.3.28 + - @backstage/plugin-code-coverage@0.2.21 + - @backstage/plugin-cost-insights@0.12.17 + - @backstage/plugin-devtools@0.1.7 + - @backstage/plugin-dynatrace@8.0.2 + - @backstage/plugin-entity-feedback@0.2.11 + - @backstage/plugin-gcalendar@0.3.21 + - @backstage/plugin-gocd@0.1.34 + - @backstage/plugin-jenkins@0.9.3 + - @backstage/plugin-kafka@0.3.28 + - @backstage/plugin-kubernetes-cluster@0.0.4 + - @backstage/plugin-linguist@0.1.13 + - @backstage/plugin-microsoft-calendar@0.1.10 + - @backstage/plugin-newrelic@0.3.43 + - @backstage/plugin-newrelic-dashboard@0.3.3 + - @backstage/plugin-nomad@0.1.9 + - @backstage/plugin-octopus-deploy@0.2.10 + - @backstage/plugin-permission-react@0.4.18 + - @backstage/plugin-playlist@0.2.2 + - @backstage/plugin-puppetdb@0.1.11 + - @backstage/plugin-rollbar@0.4.28 + - @backstage/plugin-sentry@0.5.13 + - @backstage/plugin-shortcuts@0.3.17 + - @backstage/plugin-stackstorm@0.1.9 + - @backstage/plugin-tech-insights@0.3.20 + - @backstage/plugin-techdocs-react@1.1.14 + - @backstage/plugin-todo@0.2.32 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-catalog-common@1.0.19 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.9 + +## 0.2.90-next.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.6.0-next.3 + - @backstage/plugin-org@0.6.18-next.3 + - @backstage/plugin-azure-devops@0.3.10-next.3 + - @backstage/cli@0.25.0-next.3 + - @backstage/plugin-api-docs@0.10.2-next.4 + - @backstage/plugin-scaffolder-react@1.6.2-next.3 + - @backstage/plugin-scaffolder@1.16.2-next.3 + - @backstage/core-components@0.13.9-next.3 + - @backstage/app-defaults@1.4.6-next.3 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/core-app-api@1.11.2-next.1 + - @backstage/core-plugin-api@1.8.1-next.1 + - @backstage/frontend-app-api@0.4.0-next.3 + - @backstage/integration-react@1.1.22-next.1 + - @backstage/theme@0.5.0-next.1 + - @backstage/plugin-adr@0.6.11-next.3 + - @backstage/plugin-airbrake@0.3.28-next.3 + - @backstage/plugin-apache-airflow@0.2.18-next.3 + - @backstage/plugin-azure-sites@0.1.17-next.3 + - @backstage/plugin-badges@0.2.52-next.3 + - @backstage/plugin-catalog@1.16.0-next.4 + - @backstage/plugin-catalog-common@1.0.18 + - @backstage/plugin-catalog-graph@0.3.2-next.3 + - @backstage/plugin-catalog-import@0.10.4-next.4 + - @backstage/plugin-catalog-react@1.9.2-next.3 + - @backstage/plugin-catalog-unprocessed-entities@0.1.6-next.3 + - @backstage/plugin-cloudbuild@0.3.28-next.3 + - @backstage/plugin-code-coverage@0.2.21-next.3 + - @backstage/plugin-cost-insights@0.12.17-next.3 + - @backstage/plugin-devtools@0.1.7-next.3 + - @backstage/plugin-dynatrace@8.0.2-next.3 + - @backstage/plugin-entity-feedback@0.2.11-next.3 + - @backstage/plugin-explore@0.4.14-next.3 + - @backstage/plugin-gcalendar@0.3.21-next.3 + - @backstage/plugin-gcp-projects@0.3.44-next.3 + - @backstage/plugin-github-actions@0.6.9-next.3 + - @backstage/plugin-gocd@0.1.34-next.3 + - @backstage/plugin-graphiql@0.3.1-next.4 + - @backstage/plugin-jenkins@0.9.3-next.3 + - @backstage/plugin-kafka@0.3.28-next.3 + - @backstage/plugin-kubernetes@0.11.3-next.3 + - @backstage/plugin-kubernetes-cluster@0.0.4-next.3 + - @backstage/plugin-lighthouse@0.4.13-next.3 + - @backstage/plugin-linguist@0.1.13-next.3 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-microsoft-calendar@0.1.10-next.3 + - @backstage/plugin-newrelic@0.3.43-next.3 + - @backstage/plugin-newrelic-dashboard@0.3.3-next.3 + - @backstage/plugin-nomad@0.1.9-next.3 + - @backstage/plugin-octopus-deploy@0.2.10-next.3 + - @backstage/plugin-pagerduty@0.7.0-next.3 + - @backstage/plugin-permission-react@0.4.18-next.1 + - @backstage/plugin-playlist@0.2.2-next.3 + - @backstage/plugin-puppetdb@0.1.11-next.3 + - @backstage/plugin-rollbar@0.4.28-next.3 + - @backstage/plugin-search@1.4.4-next.4 + - @backstage/plugin-search-common@1.2.8 + - @backstage/plugin-search-react@1.7.4-next.3 + - @backstage/plugin-sentry@0.5.13-next.3 + - @backstage/plugin-shortcuts@0.3.17-next.3 + - @backstage/plugin-stack-overflow@0.1.23-next.3 + - @backstage/plugin-stackstorm@0.1.9-next.3 + - @backstage/plugin-tech-insights@0.3.20-next.3 + - @backstage/plugin-tech-radar@0.6.11-next.4 + - @backstage/plugin-techdocs@1.9.2-next.4 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.3-next.3 + - @backstage/plugin-techdocs-react@1.1.14-next.3 + - @backstage/plugin-todo@0.2.32-next.3 + - @backstage/plugin-user-settings@0.7.14-next.4 + +## 0.2.90-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-app-api@0.4.0-next.2 + - @backstage/cli@0.25.0-next.2 + - @backstage/theme@0.5.0-next.1 + - @backstage/plugin-kubernetes@0.11.3-next.2 + - @backstage/plugin-lighthouse@0.4.13-next.2 + - @backstage/plugin-catalog-import@0.10.4-next.3 + - @backstage/plugin-user-settings@0.7.14-next.3 + - @backstage/plugin-tech-radar@0.6.11-next.3 + - @backstage/plugin-graphiql@0.3.1-next.3 + - @backstage/plugin-techdocs@1.9.2-next.3 + - @backstage/plugin-catalog@1.16.0-next.3 + - @backstage/plugin-search@1.4.4-next.3 + - @backstage/plugin-home@0.6.0-next.2 + - @backstage/plugin-catalog-react@1.9.2-next.2 + - @backstage/plugin-stack-overflow@0.1.23-next.2 + - @backstage/plugin-search-react@1.7.4-next.2 + - @backstage/plugin-explore@0.4.14-next.2 + - @backstage/plugin-adr@0.6.11-next.2 + - @backstage/plugin-scaffolder-react@1.6.2-next.2 + - @backstage/app-defaults@1.4.6-next.2 + - @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/integration-react@1.1.22-next.1 + - @backstage/plugin-airbrake@0.3.28-next.2 + - @backstage/plugin-apache-airflow@0.2.18-next.2 + - @backstage/plugin-api-docs@0.10.2-next.3 + - @backstage/plugin-azure-devops@0.3.10-next.2 + - @backstage/plugin-azure-sites@0.1.17-next.2 + - @backstage/plugin-badges@0.2.52-next.2 + - @backstage/plugin-catalog-common@1.0.18 + - @backstage/plugin-catalog-graph@0.3.2-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.1.6-next.2 + - @backstage/plugin-cloudbuild@0.3.28-next.2 + - @backstage/plugin-code-coverage@0.2.21-next.2 + - @backstage/plugin-cost-insights@0.12.17-next.2 + - @backstage/plugin-devtools@0.1.7-next.2 + - @backstage/plugin-dynatrace@8.0.2-next.2 + - @backstage/plugin-entity-feedback@0.2.11-next.2 + - @backstage/plugin-gcalendar@0.3.21-next.2 + - @backstage/plugin-gcp-projects@0.3.44-next.2 + - @backstage/plugin-github-actions@0.6.9-next.2 + - @backstage/plugin-gocd@0.1.34-next.2 + - @backstage/plugin-jenkins@0.9.3-next.2 + - @backstage/plugin-kafka@0.3.28-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.4-next.2 + - @backstage/plugin-linguist@0.1.13-next.2 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-microsoft-calendar@0.1.10-next.2 + - @backstage/plugin-newrelic@0.3.43-next.2 + - @backstage/plugin-newrelic-dashboard@0.3.3-next.2 + - @backstage/plugin-nomad@0.1.9-next.2 + - @backstage/plugin-octopus-deploy@0.2.10-next.2 + - @backstage/plugin-org@0.6.18-next.2 + - @backstage/plugin-pagerduty@0.7.0-next.2 + - @backstage/plugin-permission-react@0.4.18-next.1 + - @backstage/plugin-playlist@0.2.2-next.2 + - @backstage/plugin-puppetdb@0.1.11-next.2 + - @backstage/plugin-rollbar@0.4.28-next.2 + - @backstage/plugin-scaffolder@1.16.2-next.2 + - @backstage/plugin-search-common@1.2.8 + - @backstage/plugin-sentry@0.5.13-next.2 + - @backstage/plugin-shortcuts@0.3.17-next.2 + - @backstage/plugin-stackstorm@0.1.9-next.2 + - @backstage/plugin-tech-insights@0.3.20-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.3-next.2 + - @backstage/plugin-techdocs-react@1.1.14-next.2 + - @backstage/plugin-todo@0.2.32-next.2 + +## 0.2.90-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-app-api@0.4.0-next.1 + - @backstage/core-components@0.13.9-next.1 + - @backstage/core-plugin-api@1.8.1-next.1 + - @backstage/cli@0.25.0-next.1 + - @backstage/plugin-catalog-react@1.9.2-next.1 + - @backstage/plugin-catalog@1.16.0-next.2 + - @backstage/plugin-scaffolder-react@1.6.2-next.1 + - @backstage/plugin-home@0.6.0-next.1 + - @backstage/plugin-github-actions@0.6.9-next.1 + - @backstage/core-app-api@1.11.2-next.1 + - @backstage/plugin-search-react@1.7.4-next.1 + - @backstage/plugin-azure-devops@0.3.10-next.1 + - @backstage/plugin-scaffolder@1.16.2-next.1 + - @backstage/plugin-api-docs@0.10.2-next.2 + - @backstage/plugin-gcp-projects@0.3.44-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.3-next.1 + - @backstage/plugin-user-settings@0.7.14-next.2 + - @backstage/plugin-adr@0.6.11-next.1 + - @backstage/plugin-pagerduty@0.7.0-next.1 + - @backstage/plugin-catalog-import@0.10.4-next.2 + - @backstage/plugin-explore@0.4.14-next.1 + - @backstage/plugin-graphiql@0.3.1-next.2 + - @backstage/plugin-search@1.4.4-next.2 + - @backstage/plugin-stack-overflow@0.1.23-next.1 + - @backstage/plugin-tech-radar@0.6.11-next.2 + - @backstage/plugin-techdocs@1.9.2-next.2 + - @backstage/app-defaults@1.4.6-next.1 + - @backstage/integration-react@1.1.22-next.1 + - @backstage/plugin-airbrake@0.3.28-next.1 + - @backstage/plugin-apache-airflow@0.2.18-next.1 + - @backstage/plugin-azure-sites@0.1.17-next.1 + - @backstage/plugin-badges@0.2.52-next.1 + - @backstage/plugin-catalog-graph@0.3.2-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.6-next.1 + - @backstage/plugin-cloudbuild@0.3.28-next.1 + - @backstage/plugin-code-coverage@0.2.21-next.1 + - @backstage/plugin-cost-insights@0.12.17-next.1 + - @backstage/plugin-devtools@0.1.7-next.1 + - @backstage/plugin-dynatrace@8.0.2-next.1 + - @backstage/plugin-entity-feedback@0.2.11-next.1 + - @backstage/plugin-gcalendar@0.3.21-next.1 + - @backstage/plugin-gocd@0.1.34-next.1 + - @backstage/plugin-jenkins@0.9.3-next.1 + - @backstage/plugin-kafka@0.3.28-next.1 + - @backstage/plugin-kubernetes@0.11.3-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.4-next.1 + - @backstage/plugin-lighthouse@0.4.13-next.1 + - @backstage/plugin-linguist@0.1.13-next.1 + - @backstage/plugin-microsoft-calendar@0.1.10-next.1 + - @backstage/plugin-newrelic@0.3.43-next.1 + - @backstage/plugin-newrelic-dashboard@0.3.3-next.1 + - @backstage/plugin-nomad@0.1.9-next.1 + - @backstage/plugin-octopus-deploy@0.2.10-next.1 + - @backstage/plugin-org@0.6.18-next.1 + - @backstage/plugin-playlist@0.2.2-next.1 + - @backstage/plugin-puppetdb@0.1.11-next.1 + - @backstage/plugin-rollbar@0.4.28-next.1 + - @backstage/plugin-sentry@0.5.13-next.1 + - @backstage/plugin-shortcuts@0.3.17-next.1 + - @backstage/plugin-stackstorm@0.1.9-next.1 + - @backstage/plugin-tech-insights@0.3.20-next.1 + - @backstage/plugin-techdocs-react@1.1.14-next.1 + - @backstage/plugin-todo@0.2.32-next.1 + - @backstage/plugin-permission-react@0.4.18-next.1 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/theme@0.5.0-next.0 + - @backstage/plugin-catalog-common@1.0.18 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.8 + +## 0.2.90-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.16.0-next.1 + - @backstage/plugin-catalog-import@0.10.4-next.1 + - @backstage/plugin-graphiql@0.3.1-next.1 + - @backstage/plugin-search@1.4.4-next.1 + - @backstage/plugin-tech-radar@0.6.11-next.1 + - @backstage/plugin-techdocs@1.9.2-next.1 + - @backstage/plugin-user-settings@0.7.14-next.1 + - @backstage/plugin-api-docs@0.10.2-next.1 + - @backstage/plugin-catalog-graph@0.3.2-next.0 + - @backstage/plugin-explore@0.4.14-next.0 + - @backstage/plugin-org@0.6.18-next.0 + - @backstage/plugin-scaffolder@1.16.2-next.0 + - @backstage/plugin-scaffolder-react@1.6.2-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.3-next.0 + +## 0.2.90-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.8.1-next.0 + - @backstage/plugin-catalog-react@1.9.2-next.0 + - @backstage/plugin-api-docs@0.10.2-next.0 + - @backstage/core-components@0.13.9-next.0 + - @backstage/plugin-scaffolder@1.16.2-next.0 + - @backstage/plugin-catalog@1.16.0-next.0 + - @backstage/frontend-app-api@0.3.1-next.0 + - @backstage/plugin-org@0.6.18-next.0 + - @backstage/plugin-scaffolder-react@1.6.2-next.0 + - @backstage/plugin-catalog-import@0.10.4-next.0 + - @backstage/plugin-user-settings@0.7.14-next.0 + - @backstage/plugin-tech-radar@0.6.11-next.0 + - @backstage/plugin-graphiql@0.3.1-next.0 + - @backstage/plugin-techdocs@1.9.2-next.0 + - @backstage/plugin-search@1.4.4-next.0 + - @backstage/plugin-search-react@1.7.4-next.0 + - @backstage/cli@0.24.1-next.0 + - @backstage/plugin-home@0.5.12-next.0 + - @backstage/plugin-kubernetes@0.11.3-next.0 + - @backstage/theme@0.5.0-next.0 + - @backstage/app-defaults@1.4.6-next.0 + - @backstage/core-app-api@1.11.2-next.0 + - @backstage/integration-react@1.1.22-next.0 + - @backstage/plugin-adr@0.6.11-next.0 + - @backstage/plugin-airbrake@0.3.28-next.0 + - @backstage/plugin-apache-airflow@0.2.18-next.0 + - @backstage/plugin-azure-devops@0.3.10-next.0 + - @backstage/plugin-azure-sites@0.1.17-next.0 + - @backstage/plugin-badges@0.2.52-next.0 + - @backstage/plugin-catalog-graph@0.3.2-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.1.6-next.0 + - @backstage/plugin-circleci@0.3.28-next.0 + - @backstage/plugin-cloudbuild@0.3.28-next.0 + - @backstage/plugin-code-coverage@0.2.21-next.0 + - @backstage/plugin-cost-insights@0.12.17-next.0 + - @backstage/plugin-devtools@0.1.7-next.0 + - @backstage/plugin-dynatrace@8.0.2-next.0 + - @backstage/plugin-entity-feedback@0.2.11-next.0 + - @backstage/plugin-explore@0.4.14-next.0 + - @backstage/plugin-gcalendar@0.3.21-next.0 + - @backstage/plugin-gcp-projects@0.3.44-next.0 + - @backstage/plugin-github-actions@0.6.9-next.0 + - @backstage/plugin-gocd@0.1.34-next.0 + - @backstage/plugin-jenkins@0.9.3-next.0 + - @backstage/plugin-kafka@0.3.28-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.4-next.0 + - @backstage/plugin-lighthouse@0.4.13-next.0 + - @backstage/plugin-linguist@0.1.13-next.0 + - @backstage/plugin-microsoft-calendar@0.1.10-next.0 + - @backstage/plugin-newrelic@0.3.43-next.0 + - @backstage/plugin-newrelic-dashboard@0.3.3-next.0 + - @backstage/plugin-nomad@0.1.9-next.0 + - @backstage/plugin-octopus-deploy@0.2.10-next.0 + - @backstage/plugin-pagerduty@0.6.9-next.0 + - @backstage/plugin-permission-react@0.4.18-next.0 + - @backstage/plugin-playlist@0.2.2-next.0 + - @backstage/plugin-puppetdb@0.1.11-next.0 + - @backstage/plugin-rollbar@0.4.28-next.0 + - @backstage/plugin-sentry@0.5.13-next.0 + - @backstage/plugin-shortcuts@0.3.17-next.0 + - @backstage/plugin-stack-overflow@0.1.23-next.0 + - @backstage/plugin-stackstorm@0.1.9-next.0 + - @backstage/plugin-tech-insights@0.3.20-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.3-next.0 + - @backstage/plugin-techdocs-react@1.1.14-next.0 + - @backstage/plugin-todo@0.2.32-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-catalog-common@1.0.18 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.8 + +## 0.2.89 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-api-docs@0.10.0 + - @backstage/plugin-catalog-import@0.10.2 + - @backstage/cli@0.24.0 + - @backstage/plugin-catalog-react@1.9.0 + - @backstage/plugin-shortcuts@0.3.16 + - @backstage/plugin-home@0.5.10 + - @backstage/core-components@0.13.8 + - @backstage/plugin-catalog@1.15.0 + - @backstage/plugin-graphiql@0.3.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.2 + - @backstage/plugin-techdocs@1.9.0 + - @backstage/plugin-cloudbuild@0.3.26 + - @backstage/plugin-scaffolder@1.16.0 + - @backstage/frontend-app-api@0.3.0 + - @backstage/plugin-user-settings@0.7.12 + - @backstage/plugin-tech-radar@0.6.10 + - @backstage/plugin-search@1.4.2 + - @backstage/plugin-catalog-unprocessed-entities@0.1.5 + - @backstage/integration-react@1.1.21 + - @backstage/plugin-kubernetes-cluster@0.0.2 + - @backstage/plugin-microsoft-calendar@0.1.9 + - @backstage/plugin-newrelic-dashboard@0.3.1 + - @backstage/core-plugin-api@1.8.0 + - @backstage/plugin-permission-react@0.4.17 + - @backstage/plugin-scaffolder-react@1.6.0 + - @backstage/plugin-entity-feedback@0.2.9 + - @backstage/plugin-apache-airflow@0.2.17 + - @backstage/plugin-github-actions@0.6.7 + - @backstage/plugin-octopus-deploy@0.2.8 + - @backstage/plugin-stack-overflow@0.1.22 + - @backstage/plugin-techdocs-react@1.1.13 + - @backstage/app-defaults@1.4.5 + - @backstage/core-app-api@1.11.1 + - @backstage/plugin-catalog-graph@0.3.0 + - @backstage/plugin-code-coverage@0.2.19 + - @backstage/plugin-cost-insights@0.12.15 + - @backstage/plugin-tech-insights@0.3.18 + - @backstage/plugin-azure-devops@0.3.8 + - @backstage/plugin-gcp-projects@0.3.43 + - @backstage/plugin-search-react@1.7.2 + - @backstage/plugin-azure-sites@0.1.15 + - @backstage/plugin-kubernetes@0.11.1 + - @backstage/plugin-lighthouse@0.4.11 + - @backstage/plugin-stackstorm@0.1.8 + - @backstage/plugin-dynatrace@8.0.0 + - @backstage/plugin-gcalendar@0.3.20 + - @backstage/plugin-pagerduty@0.6.7 + - @backstage/plugin-airbrake@0.3.26 + - @backstage/plugin-circleci@0.3.26 + - @backstage/plugin-devtools@0.1.6 + - @backstage/plugin-linguist@0.1.11 + - @backstage/plugin-newrelic@0.3.42 + - @backstage/plugin-playlist@0.2.0 + - @backstage/plugin-puppetdb@0.1.9 + - @backstage/plugin-explore@0.4.12 + - @backstage/plugin-jenkins@0.9.1 + - @backstage/plugin-rollbar@0.4.26 + - @backstage/theme@0.4.4 + - @backstage/plugin-badges@0.2.50 + - @backstage/plugin-sentry@0.5.11 + - @backstage/plugin-kafka@0.3.26 + - @backstage/plugin-nomad@0.1.7 + - @backstage/plugin-gocd@0.1.32 + - @backstage/plugin-todo@0.2.30 + - @backstage/plugin-adr@0.6.9 + - @backstage/plugin-org@0.6.16 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-catalog-common@1.0.18 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.8 + +## 0.2.89-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-api-docs@0.10.0-next.2 + - @backstage/plugin-shortcuts@0.3.16-next.2 + - @backstage/core-components@0.13.8-next.2 + - @backstage/plugin-catalog@1.15.0-next.2 + - @backstage/plugin-scaffolder@1.16.0-next.2 + - @backstage/frontend-app-api@0.3.0-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.1.5-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.2-next.2 + - @backstage/plugin-newrelic-dashboard@0.3.1-next.2 + - @backstage/plugin-github-actions@0.6.7-next.2 + - @backstage/plugin-code-coverage@0.2.19-next.2 + - @backstage/plugin-azure-sites@0.1.15-next.2 + - @backstage/plugin-cloudbuild@0.3.26-next.2 + - @backstage/plugin-kubernetes@0.11.1-next.2 + - @backstage/plugin-lighthouse@0.4.11-next.2 + - @backstage/plugin-dynatrace@8.0.0-next.2 + - @backstage/plugin-airbrake@0.3.26-next.2 + - @backstage/plugin-circleci@0.3.26-next.2 + - @backstage/plugin-puppetdb@0.1.9-next.2 + - @backstage/plugin-techdocs@1.9.0-next.2 + - @backstage/plugin-jenkins@0.9.1-next.2 + - @backstage/plugin-rollbar@0.4.26-next.2 + - @backstage/plugin-sentry@0.5.11-next.2 + - @backstage/plugin-kafka@0.3.26-next.2 + - @backstage/plugin-nomad@0.1.7-next.2 + - @backstage/plugin-gocd@0.1.32-next.2 + - @backstage/plugin-adr@0.6.9-next.2 + - @backstage/plugin-catalog-react@1.9.0-next.2 + - @backstage/app-defaults@1.4.5-next.2 + - @backstage/cli@0.24.0-next.1 + - @backstage/integration-react@1.1.21-next.1 + - @backstage/plugin-apache-airflow@0.2.17-next.2 + - @backstage/plugin-azure-devops@0.3.8-next.2 + - @backstage/plugin-badges@0.2.50-next.2 + - @backstage/plugin-catalog-graph@0.2.38-next.2 + - @backstage/plugin-catalog-import@0.10.2-next.2 + - @backstage/plugin-cost-insights@0.12.15-next.2 + - @backstage/plugin-devtools@0.1.6-next.2 + - @backstage/plugin-entity-feedback@0.2.9-next.2 + - @backstage/plugin-explore@0.4.12-next.2 + - @backstage/plugin-gcalendar@0.3.20-next.2 + - @backstage/plugin-gcp-projects@0.3.43-next.2 + - @backstage/plugin-graphiql@0.3.0-next.2 + - @backstage/plugin-home@0.5.10-next.2 + - @backstage/plugin-linguist@0.1.11-next.2 + - @backstage/plugin-microsoft-calendar@0.1.9-next.2 + - @backstage/plugin-newrelic@0.3.42-next.2 + - @backstage/plugin-octopus-deploy@0.2.8-next.2 + - @backstage/plugin-org@0.6.16-next.2 + - @backstage/plugin-pagerduty@0.6.7-next.2 + - @backstage/plugin-playlist@0.1.18-next.2 + - @backstage/plugin-scaffolder-react@1.6.0-next.2 + - @backstage/plugin-search@1.4.2-next.2 + - @backstage/plugin-search-react@1.7.2-next.2 + - @backstage/plugin-stack-overflow@0.1.22-next.2 + - @backstage/plugin-stackstorm@0.1.8-next.2 + - @backstage/plugin-tech-insights@0.3.18-next.2 + - @backstage/plugin-tech-radar@0.6.10-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.2-next.2 + - @backstage/plugin-techdocs-react@1.1.13-next.2 + - @backstage/plugin-todo@0.2.30-next.2 + - @backstage/plugin-user-settings@0.7.12-next.2 + +## 0.2.89-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.5.10-next.1 + - @backstage/plugin-cost-insights@0.12.15-next.1 + - @backstage/plugin-scaffolder@1.16.0-next.1 + - @backstage/frontend-app-api@0.3.0-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.2-next.1 + - @backstage/plugin-microsoft-calendar@0.1.9-next.1 + - @backstage/plugin-scaffolder-react@1.6.0-next.1 + - @backstage/plugin-catalog-graph@0.2.38-next.1 + - @backstage/plugin-tech-insights@0.3.18-next.1 + - @backstage/plugin-gcalendar@0.3.20-next.1 + - @backstage/plugin-api-docs@0.9.13-next.1 + - @backstage/plugin-playlist@0.1.18-next.1 + - @backstage/plugin-catalog@1.15.0-next.1 + - @backstage/plugin-explore@0.4.12-next.1 + - @backstage/plugin-search@1.4.2-next.1 + - @backstage/plugin-org@0.6.16-next.1 + - @backstage/plugin-catalog-react@1.9.0-next.1 + - @backstage/plugin-graphiql@0.3.0-next.1 + - @backstage/plugin-search-react@1.7.2-next.1 + - @backstage/cli@0.24.0-next.1 + - @backstage/integration-react@1.1.21-next.1 + - @backstage/plugin-catalog-import@0.10.2-next.1 + - @backstage/plugin-github-actions@0.6.7-next.1 + - @backstage/plugin-techdocs@1.8.1-next.1 + - @backstage/plugin-kubernetes@0.11.1-next.1 + - @backstage/plugin-kubernetes-cluster@0.0.2-next.1 + - @backstage/plugin-newrelic@0.3.42-next.1 + - @backstage/plugin-adr@0.6.9-next.1 + - @backstage/plugin-stack-overflow@0.1.22-next.1 + - @backstage/plugin-tech-radar@0.6.10-next.1 + - @backstage/plugin-user-settings@0.7.12-next.1 + - @backstage/core-components@0.13.8-next.1 + - @backstage/plugin-airbrake@0.3.26-next.1 + - @backstage/plugin-azure-devops@0.3.8-next.1 + - @backstage/plugin-azure-sites@0.1.15-next.1 + - @backstage/plugin-badges@0.2.50-next.1 + - @backstage/plugin-circleci@0.3.26-next.1 + - @backstage/plugin-cloudbuild@0.3.26-next.1 + - @backstage/plugin-code-coverage@0.2.19-next.1 + - @backstage/plugin-dynatrace@8.0.0-next.1 + - @backstage/plugin-entity-feedback@0.2.9-next.1 + - @backstage/plugin-gocd@0.1.32-next.1 + - @backstage/plugin-jenkins@0.9.1-next.1 + - @backstage/plugin-kafka@0.3.26-next.1 + - @backstage/plugin-lighthouse@0.4.11-next.1 + - @backstage/plugin-linguist@0.1.11-next.1 + - @backstage/plugin-newrelic-dashboard@0.3.1-next.1 + - @backstage/plugin-nomad@0.1.7-next.1 + - @backstage/plugin-octopus-deploy@0.2.8-next.1 + - @backstage/plugin-pagerduty@0.6.7-next.1 + - @backstage/plugin-puppetdb@0.1.9-next.1 + - @backstage/plugin-rollbar@0.4.26-next.1 + - @backstage/plugin-sentry@0.5.11-next.1 + - @backstage/plugin-todo@0.2.30-next.1 + - @backstage/app-defaults@1.4.5-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/plugin-apache-airflow@0.2.17-next.1 + - @backstage/plugin-catalog-common@1.0.17 + - @backstage/plugin-catalog-unprocessed-entities@0.1.5-next.1 + - @backstage/plugin-devtools@0.1.6-next.1 + - @backstage/plugin-gcp-projects@0.3.43-next.1 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-permission-react@0.4.17-next.0 + - @backstage/plugin-search-common@1.2.7 + - @backstage/plugin-shortcuts@0.3.16-next.1 + - @backstage/plugin-stackstorm@0.1.8-next.1 + - @backstage/plugin-techdocs-react@1.1.13-next.1 + +## 0.2.89-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-import@0.10.2-next.0 + - @backstage/cli@0.24.0-next.0 + - @backstage/core-components@0.13.7-next.0 + - @backstage/plugin-home@0.5.10-next.0 + - @backstage/plugin-catalog@1.15.0-next.0 + - @backstage/plugin-graphiql@0.3.0-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.2-next.0 + - @backstage/plugin-techdocs@1.8.1-next.0 + - @backstage/frontend-app-api@0.3.0-next.0 + - @backstage/plugin-catalog-react@1.9.0-next.0 + - @backstage/plugin-user-settings@0.7.12-next.0 + - @backstage/plugin-tech-radar@0.6.10-next.0 + - @backstage/plugin-search@1.4.2-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.1.5-next.0 + - @backstage/integration-react@1.1.21-next.0 + - @backstage/plugin-kubernetes-cluster@0.0.2-next.0 + - @backstage/plugin-microsoft-calendar@0.1.9-next.0 + - @backstage/plugin-newrelic-dashboard@0.3.1-next.0 + - @backstage/core-plugin-api@1.8.0-next.0 + - @backstage/plugin-permission-react@0.4.17-next.0 + - @backstage/plugin-scaffolder-react@1.6.0-next.0 + - @backstage/plugin-entity-feedback@0.2.9-next.0 + - @backstage/plugin-apache-airflow@0.2.17-next.0 + - @backstage/plugin-github-actions@0.6.7-next.0 + - @backstage/plugin-octopus-deploy@0.2.8-next.0 + - @backstage/plugin-stack-overflow@0.1.22-next.0 + - @backstage/plugin-techdocs-react@1.1.13-next.0 + - @backstage/app-defaults@1.4.5-next.0 + - @backstage/core-app-api@1.11.1-next.0 + - @backstage/plugin-catalog-graph@0.2.38-next.0 + - @backstage/plugin-code-coverage@0.2.19-next.0 + - @backstage/plugin-cost-insights@0.12.15-next.0 + - @backstage/plugin-tech-insights@0.3.18-next.0 + - @backstage/plugin-azure-devops@0.3.8-next.0 + - @backstage/plugin-gcp-projects@0.3.43-next.0 + - @backstage/plugin-search-react@1.7.2-next.0 + - @backstage/plugin-azure-sites@0.1.15-next.0 + - @backstage/plugin-cloudbuild@0.3.26-next.0 + - @backstage/plugin-kubernetes@0.11.1-next.0 + - @backstage/plugin-lighthouse@0.4.11-next.0 + - @backstage/plugin-scaffolder@1.16.0-next.0 + - @backstage/plugin-stackstorm@0.1.8-next.0 + - @backstage/plugin-dynatrace@8.0.0-next.0 + - @backstage/plugin-gcalendar@0.3.20-next.0 + - @backstage/plugin-pagerduty@0.6.7-next.0 + - @backstage/plugin-shortcuts@0.3.16-next.0 + - @backstage/plugin-airbrake@0.3.26-next.0 + - @backstage/plugin-api-docs@0.9.13-next.0 + - @backstage/plugin-circleci@0.3.26-next.0 + - @backstage/plugin-devtools@0.1.6-next.0 + - @backstage/plugin-linguist@0.1.11-next.0 + - @backstage/plugin-newrelic@0.3.42-next.0 + - @backstage/plugin-playlist@0.1.18-next.0 + - @backstage/plugin-puppetdb@0.1.9-next.0 + - @backstage/plugin-explore@0.4.12-next.0 + - @backstage/plugin-jenkins@0.9.1-next.0 + - @backstage/plugin-rollbar@0.4.26-next.0 + - @backstage/theme@0.4.4-next.0 + - @backstage/plugin-badges@0.2.50-next.0 + - @backstage/plugin-sentry@0.5.11-next.0 + - @backstage/plugin-kafka@0.3.26-next.0 + - @backstage/plugin-nomad@0.1.7-next.0 + - @backstage/plugin-gocd@0.1.32-next.0 + - @backstage/plugin-todo@0.2.30-next.0 + - @backstage/plugin-adr@0.6.9-next.0 + - @backstage/plugin-org@0.6.16-next.0 + - @backstage/catalog-model@1.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-catalog-common@1.0.17 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.7 + +## 0.2.88 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-app-api@0.2.0 + - @backstage/plugin-pagerduty@0.6.6 + - @backstage/plugin-org@0.6.15 + - @backstage/plugin-code-coverage@0.2.18 + - @backstage/plugin-catalog-react@1.8.5 + - @backstage/plugin-catalog@1.14.0 + - @backstage/cli@0.23.0 + - @backstage/core-app-api@1.11.0 + - @backstage/plugin-techdocs@1.8.0 + - @backstage/core-plugin-api@1.7.0 + - @backstage/plugin-home@0.5.9 + - @backstage/plugin-newrelic@0.3.41 + - @backstage/plugin-user-settings@0.7.11 + - @backstage/plugin-scaffolder@1.15.1 + - @backstage/core-components@0.13.6 + - @backstage/plugin-entity-feedback@0.2.8 + - @backstage/integration-react@1.1.20 + - @backstage/catalog-model@1.4.3 + - @backstage/plugin-tech-radar@0.6.9 + - @backstage/plugin-adr@0.6.8 + - @backstage/app-defaults@1.4.4 + - @backstage/plugin-graphiql@0.2.55 + - @backstage/plugin-search@1.4.1 + - @backstage/plugin-jenkins@0.9.0 + - @backstage/plugin-search-react@1.7.1 + - @backstage/plugin-api-docs@0.9.12 + - @backstage/plugin-kubernetes@0.11.0 + - @backstage/plugin-airbrake@0.3.25 + - @backstage/plugin-apache-airflow@0.2.16 + - @backstage/plugin-azure-devops@0.3.7 + - @backstage/plugin-azure-sites@0.1.14 + - @backstage/plugin-badges@0.2.49 + - @backstage/plugin-catalog-graph@0.2.37 + - @backstage/plugin-catalog-import@0.10.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.4 + - @backstage/plugin-circleci@0.3.25 + - @backstage/plugin-cloudbuild@0.3.25 + - @backstage/plugin-cost-insights@0.12.14 + - @backstage/plugin-devtools@0.1.5 + - @backstage/plugin-dynatrace@7.0.5 + - @backstage/plugin-explore@0.4.11 + - @backstage/plugin-gcalendar@0.3.19 + - @backstage/plugin-gcp-projects@0.3.42 + - @backstage/plugin-github-actions@0.6.6 + - @backstage/plugin-gocd@0.1.31 + - @backstage/plugin-kafka@0.3.25 + - @backstage/plugin-kubernetes-cluster@0.0.1 + - @backstage/plugin-lighthouse@0.4.10 + - @backstage/plugin-linguist@0.1.10 + - @backstage/plugin-microsoft-calendar@0.1.8 + - @backstage/plugin-newrelic-dashboard@0.3.0 + - @backstage/plugin-nomad@0.1.6 + - @backstage/plugin-octopus-deploy@0.2.7 + - @backstage/plugin-permission-react@0.4.16 + - @backstage/plugin-playlist@0.1.17 + - @backstage/plugin-puppetdb@0.1.8 + - @backstage/plugin-rollbar@0.4.25 + - @backstage/plugin-scaffolder-react@1.5.6 + - @backstage/plugin-sentry@0.5.10 + - @backstage/plugin-shortcuts@0.3.15 + - @backstage/plugin-stack-overflow@0.1.21 + - @backstage/plugin-stackstorm@0.1.7 + - @backstage/plugin-tech-insights@0.3.17 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.1 + - @backstage/plugin-techdocs-react@1.1.12 + - @backstage/plugin-todo@0.2.28 + - @backstage/theme@0.4.3 + - @backstage/config@1.1.1 + - @backstage/plugin-catalog-common@1.0.17 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.7 + +## 0.2.88-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.23.0-next.2 + - @backstage/frontend-app-api@0.2.0-next.2 + - @backstage/core-app-api@1.11.0-next.2 + - @backstage/plugin-techdocs@1.7.1-next.2 + - @backstage/plugin-newrelic@0.3.41-next.2 + - @backstage/plugin-scaffolder@1.15.1-next.2 + - @backstage/integration-react@1.1.20-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/plugin-tech-radar@0.6.9-next.2 + - @backstage/plugin-catalog@1.14.0-next.2 + - @backstage/plugin-adr@0.6.8-next.2 + - @backstage/plugin-graphiql@0.2.55-next.2 + - @backstage/plugin-search-react@1.7.1-next.2 + - @backstage/plugin-newrelic-dashboard@0.3.0-next.2 + - @backstage/plugin-kubernetes-cluster@0.0.1-next.0 + - @backstage/plugin-kubernetes@0.11.0-next.2 + - @backstage/theme@0.4.3-next.0 + - @backstage/plugin-jenkins@0.8.7-next.2 + - @backstage/plugin-tech-insights@0.3.17-next.2 + - @backstage/plugin-playlist@0.1.17-next.2 + - @backstage/app-defaults@1.4.4-next.2 + - @backstage/config@1.1.1-next.0 + - @backstage/plugin-airbrake@0.3.25-next.2 + - @backstage/plugin-apache-airflow@0.2.16-next.2 + - @backstage/plugin-api-docs@0.9.12-next.2 + - @backstage/plugin-azure-devops@0.3.7-next.2 + - @backstage/plugin-azure-sites@0.1.14-next.2 + - @backstage/plugin-badges@0.2.49-next.2 + - @backstage/plugin-catalog-common@1.0.17-next.0 + - @backstage/plugin-catalog-graph@0.2.37-next.2 + - @backstage/plugin-catalog-import@0.10.1-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.1.4-next.2 + - @backstage/plugin-circleci@0.3.25-next.2 + - @backstage/plugin-cloudbuild@0.3.25-next.2 + - @backstage/plugin-code-coverage@0.2.18-next.2 + - @backstage/plugin-cost-insights@0.12.14-next.2 + - @backstage/plugin-devtools@0.1.5-next.2 + - @backstage/plugin-dynatrace@7.0.5-next.2 + - @backstage/plugin-entity-feedback@0.2.8-next.2 + - @backstage/plugin-explore@0.4.11-next.2 + - @backstage/plugin-gcalendar@0.3.19-next.2 + - @backstage/plugin-gcp-projects@0.3.42-next.2 + - @backstage/plugin-github-actions@0.6.6-next.2 + - @backstage/plugin-gocd@0.1.31-next.2 + - @backstage/plugin-home@0.5.9-next.2 + - @backstage/plugin-kafka@0.3.25-next.2 + - @backstage/plugin-lighthouse@0.4.10-next.2 + - @backstage/plugin-linguist@0.1.10-next.2 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-microsoft-calendar@0.1.8-next.2 + - @backstage/plugin-nomad@0.1.6-next.2 + - @backstage/plugin-octopus-deploy@0.2.7-next.2 + - @backstage/plugin-org@0.6.15-next.2 + - @backstage/plugin-pagerduty@0.6.6-next.2 + - @backstage/plugin-permission-react@0.4.16-next.1 + - @backstage/plugin-puppetdb@0.1.8-next.2 + - @backstage/plugin-rollbar@0.4.25-next.2 + - @backstage/plugin-scaffolder-react@1.5.6-next.2 + - @backstage/plugin-search@1.4.1-next.2 + - @backstage/plugin-search-common@1.2.7-next.0 + - @backstage/plugin-sentry@0.5.10-next.2 + - @backstage/plugin-shortcuts@0.3.15-next.2 + - @backstage/plugin-stack-overflow@0.1.21-next.2 + - @backstage/plugin-stackstorm@0.1.7-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.1-next.2 + - @backstage/plugin-techdocs-react@1.1.12-next.2 + - @backstage/plugin-todo@0.2.28-next.2 + - @backstage/plugin-user-settings@0.7.11-next.2 + +## 0.2.88-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-org@0.6.15-next.1 + - @backstage/plugin-code-coverage@0.2.18-next.1 + - @backstage/plugin-catalog@1.14.0-next.1 + - @backstage/plugin-techdocs@1.7.1-next.1 + - @backstage/plugin-home@0.5.9-next.1 + - @backstage/core-components@0.13.6-next.1 + - @backstage/core-app-api@1.10.1-next.1 + - @backstage/app-defaults@1.4.4-next.1 + - @backstage/frontend-app-api@0.2.0-next.1 + - @backstage/plugin-search@1.4.1-next.1 + - @backstage/cli@0.23.0-next.1 + - @backstage/plugin-cost-insights@0.12.14-next.1 + - @backstage/plugin-kubernetes@0.11.0-next.1 + - @backstage/plugin-adr@0.6.8-next.1 + - @backstage/plugin-explore@0.4.11-next.1 + - @backstage/plugin-search-react@1.7.1-next.1 + - @backstage/plugin-api-docs@0.9.12-next.1 + - @backstage/plugin-catalog-graph@0.2.37-next.1 + - @backstage/plugin-scaffolder@1.15.1-next.1 + - @backstage/plugin-scaffolder-react@1.5.6-next.1 + - @backstage/plugin-user-settings@0.7.11-next.1 + - @backstage/plugin-graphiql@0.2.55-next.1 + - @backstage/plugin-tech-radar@0.6.9-next.1 + - @backstage/integration-react@1.1.20-next.1 + - @backstage/plugin-airbrake@0.3.25-next.1 + - @backstage/plugin-apache-airflow@0.2.16-next.1 + - @backstage/plugin-azure-devops@0.3.7-next.1 + - @backstage/plugin-azure-sites@0.1.14-next.1 + - @backstage/plugin-badges@0.2.49-next.1 + - @backstage/plugin-catalog-import@0.10.1-next.1 + - @backstage/plugin-catalog-react@1.8.5-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.4-next.1 + - @backstage/plugin-circleci@0.3.25-next.1 + - @backstage/plugin-cloudbuild@0.3.25-next.1 + - @backstage/plugin-devtools@0.1.5-next.1 + - @backstage/plugin-dynatrace@7.0.5-next.1 + - @backstage/plugin-entity-feedback@0.2.8-next.1 + - @backstage/plugin-gcalendar@0.3.19-next.1 + - @backstage/plugin-gcp-projects@0.3.42-next.1 + - @backstage/plugin-github-actions@0.6.6-next.1 + - @backstage/plugin-gocd@0.1.31-next.1 + - @backstage/plugin-jenkins@0.8.7-next.1 + - @backstage/plugin-kafka@0.3.25-next.1 + - @backstage/plugin-lighthouse@0.4.10-next.1 + - @backstage/plugin-linguist@0.1.10-next.1 + - @backstage/plugin-microsoft-calendar@0.1.8-next.1 + - @backstage/plugin-newrelic@0.3.41-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.18-next.1 + - @backstage/plugin-nomad@0.1.6-next.1 + - @backstage/plugin-octopus-deploy@0.2.7-next.1 + - @backstage/plugin-pagerduty@0.6.6-next.1 + - @backstage/plugin-playlist@0.1.17-next.1 + - @backstage/plugin-puppetdb@0.1.8-next.1 + - @backstage/plugin-rollbar@0.4.25-next.1 + - @backstage/plugin-sentry@0.5.10-next.1 + - @backstage/plugin-shortcuts@0.3.15-next.1 + - @backstage/plugin-stack-overflow@0.1.21-next.1 + - @backstage/plugin-stackstorm@0.1.7-next.1 + - @backstage/plugin-tech-insights@0.3.17-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.1-next.1 + - @backstage/plugin-techdocs-react@1.1.12-next.1 + - @backstage/plugin-todo@0.2.28-next.1 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/config@1.1.0 + - @backstage/plugin-permission-react@0.4.16-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.6 + +## 0.2.88-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-app-api@0.2.0-next.0 + - @backstage/plugin-pagerduty@0.6.6-next.0 + - @backstage/plugin-catalog-react@1.8.5-next.0 + - @backstage/cli@0.23.0-next.0 + - @backstage/core-plugin-api@1.7.0-next.0 + - @backstage/plugin-catalog@1.14.0-next.0 + - @backstage/plugin-scaffolder@1.15.1-next.0 + - @backstage/plugin-tech-radar@0.6.9-next.0 + - @backstage/plugin-user-settings@0.7.11-next.0 + - @backstage/plugin-api-docs@0.9.12-next.0 + - @backstage/plugin-code-coverage@0.2.18-next.0 + - @backstage/plugin-cost-insights@0.12.14-next.0 + - @backstage/core-components@0.13.6-next.0 + - @backstage/integration-react@1.1.20-next.0 + - @backstage/plugin-catalog-import@0.10.1-next.0 + - @backstage/plugin-github-actions@0.6.6-next.0 + - @backstage/plugin-techdocs@1.7.1-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.1-next.0 + - @backstage/plugin-adr@0.6.8-next.0 + - @backstage/plugin-airbrake@0.3.25-next.0 + - @backstage/plugin-azure-devops@0.3.7-next.0 + - @backstage/plugin-azure-sites@0.1.14-next.0 + - @backstage/plugin-badges@0.2.49-next.0 + - @backstage/plugin-catalog-graph@0.2.37-next.0 + - @backstage/plugin-circleci@0.3.25-next.0 + - @backstage/plugin-cloudbuild@0.3.25-next.0 + - @backstage/plugin-dynatrace@7.0.5-next.0 + - @backstage/plugin-entity-feedback@0.2.8-next.0 + - @backstage/plugin-explore@0.4.11-next.0 + - @backstage/plugin-gocd@0.1.31-next.0 + - @backstage/plugin-home@0.5.9-next.0 + - @backstage/plugin-jenkins@0.8.7-next.0 + - @backstage/plugin-kafka@0.3.25-next.0 + - @backstage/plugin-kubernetes@0.10.4-next.0 + - @backstage/plugin-lighthouse@0.4.10-next.0 + - @backstage/plugin-linguist@0.1.10-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.18-next.0 + - @backstage/plugin-nomad@0.1.6-next.0 + - @backstage/plugin-octopus-deploy@0.2.7-next.0 + - @backstage/plugin-org@0.6.15-next.0 + - @backstage/plugin-playlist@0.1.17-next.0 + - @backstage/plugin-puppetdb@0.1.8-next.0 + - @backstage/plugin-rollbar@0.4.25-next.0 + - @backstage/plugin-scaffolder-react@1.5.6-next.0 + - @backstage/plugin-search@1.4.1-next.0 + - @backstage/plugin-sentry@0.5.10-next.0 + - @backstage/plugin-tech-insights@0.3.17-next.0 + - @backstage/plugin-todo@0.2.28-next.0 + - @backstage/app-defaults@1.4.4-next.0 + - @backstage/config@1.1.0 + - @backstage/core-app-api@1.10.1-next.0 + - @backstage/plugin-apache-airflow@0.2.16-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.1.4-next.0 + - @backstage/plugin-devtools@0.1.5-next.0 + - @backstage/plugin-gcalendar@0.3.19-next.0 + - @backstage/plugin-gcp-projects@0.3.42-next.0 + - @backstage/plugin-graphiql@0.2.55-next.0 + - @backstage/plugin-microsoft-calendar@0.1.8-next.0 + - @backstage/plugin-newrelic@0.3.41-next.0 + - @backstage/plugin-permission-react@0.4.16-next.0 + - @backstage/plugin-search-react@1.7.1-next.0 + - @backstage/plugin-shortcuts@0.3.15-next.0 + - @backstage/plugin-stack-overflow@0.1.21-next.0 + - @backstage/plugin-stackstorm@0.1.7-next.0 + - @backstage/plugin-techdocs-react@1.1.12-next.0 + - @backstage/catalog-model@1.4.2 + - @backstage/theme@0.4.2 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-search-common@1.2.6 + +## 0.2.87 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes@0.10.3 + - @backstage/plugin-playlist@0.1.16 + - @backstage/plugin-home@0.5.8 + - @backstage/cli@0.22.13 + - @backstage/plugin-catalog-unprocessed-entities@0.1.3 + - @backstage/integration-react@1.1.19 + - @backstage/plugin-microsoft-calendar@0.1.7 + - @backstage/plugin-newrelic-dashboard@0.2.17 + - @backstage/plugin-apache-airflow@0.2.15 + - @backstage/plugin-github-actions@0.6.5 + - @backstage/plugin-octopus-deploy@0.2.6 + - @backstage/plugin-azure-devops@0.3.6 + - @backstage/plugin-gcp-projects@0.3.41 + - @backstage/plugin-azure-sites@0.1.13 + - @backstage/plugin-cloudbuild@0.3.24 + - @backstage/plugin-lighthouse@0.4.9 + - @backstage/plugin-tech-radar@0.6.8 + - @backstage/plugin-dynatrace@7.0.4 + - @backstage/plugin-gcalendar@0.3.18 + - @backstage/plugin-shortcuts@0.3.14 + - @backstage/plugin-airbrake@0.3.24 + - @backstage/plugin-circleci@0.3.24 + - @backstage/plugin-graphiql@0.2.54 + - @backstage/plugin-linguist@0.1.9 + - @backstage/plugin-newrelic@0.3.40 + - @backstage/plugin-puppetdb@0.1.7 + - @backstage/plugin-jenkins@0.8.6 + - @backstage/plugin-rollbar@0.4.24 + - @backstage/plugin-badges@0.2.48 + - @backstage/plugin-sentry@0.5.9 + - @backstage/plugin-kafka@0.3.24 + - @backstage/plugin-nomad@0.1.5 + - @backstage/plugin-todo@0.2.26 + - @backstage/plugin-org@0.6.14 + - @backstage/frontend-app-api@0.1.0 + - @backstage/plugin-techdocs@1.7.0 + - @backstage/plugin-catalog-react@1.8.4 + - @backstage/core-components@0.13.5 + - @backstage/plugin-entity-feedback@0.2.7 + - @backstage/plugin-pagerduty@0.6.5 + - @backstage/config@1.1.0 + - @backstage/app-defaults@1.4.3 + - @backstage/catalog-model@1.4.2 + - @backstage/core-app-api@1.10.0 + - @backstage/core-plugin-api@1.6.0 + - @backstage/plugin-adr@0.6.7 + - @backstage/plugin-api-docs@0.9.11 + - @backstage/plugin-catalog-common@1.0.16 + - @backstage/plugin-catalog-graph@0.2.36 + - @backstage/plugin-catalog-import@0.10.0 + - @backstage/plugin-code-coverage@0.2.17 + - @backstage/plugin-cost-insights@0.12.13 + - @backstage/plugin-devtools@0.1.4 + - @backstage/plugin-explore@0.4.10 + - @backstage/plugin-gocd@0.1.30 + - @backstage/plugin-linguist-common@0.1.2 + - @backstage/plugin-permission-react@0.4.15 + - @backstage/plugin-scaffolder@1.15.0 + - @backstage/plugin-scaffolder-react@1.5.5 + - @backstage/plugin-search@1.4.0 + - @backstage/plugin-search-common@1.2.6 + - @backstage/plugin-search-react@1.7.0 + - @backstage/plugin-stack-overflow@0.1.20 + - @backstage/plugin-stackstorm@0.1.6 + - @backstage/plugin-tech-insights@0.3.16 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.0 + - @backstage/plugin-techdocs-react@1.1.10 + - @backstage/plugin-user-settings@0.7.9 + - @backstage/theme@0.4.2 + - @internal/plugin-catalog-customized@0.0.14 + +## 0.2.87-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.5.8-next.3 + - @backstage/plugin-graphiql@0.2.54-next.3 + - @backstage/cli@0.22.13-next.3 + - @backstage/plugin-kubernetes@0.10.3-next.3 + - @backstage/app-defaults@1.4.3-next.3 + - @backstage/catalog-model@1.4.2-next.2 + - @backstage/config@1.1.0-next.2 + - @backstage/core-app-api@1.10.0-next.3 + - @backstage/core-components@0.13.5-next.3 + - @backstage/core-plugin-api@1.6.0-next.3 + - @backstage/integration-react@1.1.19-next.3 + - @backstage/plugin-adr@0.6.7-next.3 + - @backstage/plugin-airbrake@0.3.24-next.3 + - @backstage/plugin-apache-airflow@0.2.15-next.3 + - @backstage/plugin-api-docs@0.9.11-next.3 + - @backstage/plugin-azure-devops@0.3.6-next.3 + - @backstage/plugin-azure-sites@0.1.13-next.3 + - @backstage/plugin-badges@0.2.48-next.3 + - @backstage/plugin-catalog-common@1.0.16-next.2 + - @backstage/plugin-catalog-graph@0.2.36-next.3 + - @backstage/plugin-catalog-import@0.9.14-next.3 + - @backstage/plugin-catalog-react@1.8.4-next.3 + - @backstage/plugin-catalog-unprocessed-entities@0.1.3-next.3 + - @backstage/plugin-circleci@0.3.24-next.3 + - @backstage/plugin-cloudbuild@0.3.24-next.3 + - @backstage/plugin-code-coverage@0.2.17-next.3 + - @backstage/plugin-cost-insights@0.12.13-next.3 + - @backstage/plugin-devtools@0.1.4-next.3 + - @backstage/plugin-dynatrace@7.0.4-next.3 + - @backstage/plugin-entity-feedback@0.2.7-next.3 + - @backstage/plugin-explore@0.4.10-next.3 + - @backstage/plugin-gcalendar@0.3.18-next.3 + - @backstage/plugin-gcp-projects@0.3.41-next.3 + - @backstage/plugin-github-actions@0.6.5-next.3 + - @backstage/plugin-gocd@0.1.30-next.3 + - @backstage/plugin-jenkins@0.8.6-next.3 + - @backstage/plugin-kafka@0.3.24-next.3 + - @backstage/plugin-lighthouse@0.4.9-next.3 + - @backstage/plugin-linguist@0.1.9-next.3 + - @backstage/plugin-linguist-common@0.1.2-next.0 + - @backstage/plugin-microsoft-calendar@0.1.7-next.3 + - @backstage/plugin-newrelic@0.3.40-next.3 + - @backstage/plugin-newrelic-dashboard@0.2.17-next.3 + - @backstage/plugin-nomad@0.1.5-next.3 + - @backstage/plugin-octopus-deploy@0.2.6-next.3 + - @backstage/plugin-org@0.6.14-next.3 + - @backstage/plugin-pagerduty@0.6.5-next.3 + - @backstage/plugin-permission-react@0.4.15-next.3 + - @backstage/plugin-playlist@0.1.16-next.3 + - @backstage/plugin-puppetdb@0.1.7-next.3 + - @backstage/plugin-rollbar@0.4.24-next.3 + - @backstage/plugin-scaffolder@1.15.0-next.3 + - @backstage/plugin-scaffolder-react@1.5.5-next.3 + - @backstage/plugin-search@1.4.0-next.3 + - @backstage/plugin-search-common@1.2.6-next.2 + - @backstage/plugin-search-react@1.7.0-next.3 + - @backstage/plugin-sentry@0.5.9-next.3 + - @backstage/plugin-shortcuts@0.3.14-next.3 + - @backstage/plugin-stack-overflow@0.1.20-next.3 + - @backstage/plugin-stackstorm@0.1.6-next.3 + - @backstage/plugin-tech-insights@0.3.16-next.3 + - @backstage/plugin-tech-radar@0.6.8-next.3 + - @backstage/plugin-techdocs@1.7.0-next.3 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.0-next.3 + - @backstage/plugin-techdocs-react@1.1.10-next.3 + - @backstage/plugin-todo@0.2.26-next.3 + - @backstage/plugin-user-settings@0.7.9-next.3 + - @backstage/theme@0.4.2-next.0 + - @internal/plugin-catalog-customized@0.0.14-next.3 + +## 0.2.87-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-playlist@0.1.16-next.2 + - @backstage/plugin-tech-radar@0.6.8-next.2 + - @backstage/plugin-user-settings@0.7.9-next.2 + - @backstage/plugin-org@0.6.14-next.2 + - @backstage/plugin-techdocs@1.7.0-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.0-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.1.3-next.2 + - @backstage/integration-react@1.1.19-next.2 + - @backstage/plugin-microsoft-calendar@0.1.7-next.2 + - @backstage/core-components@0.13.5-next.2 + - @backstage/core-plugin-api@1.6.0-next.2 + - @backstage/plugin-entity-feedback@0.2.7-next.2 + - @backstage/plugin-apache-airflow@0.2.15-next.2 + - @backstage/plugin-github-actions@0.6.5-next.2 + - @backstage/plugin-octopus-deploy@0.2.6-next.2 + - @backstage/plugin-stack-overflow@0.1.20-next.2 + - @backstage/app-defaults@1.4.3-next.2 + - @backstage/core-app-api@1.10.0-next.2 + - @backstage/plugin-code-coverage@0.2.17-next.2 + - @backstage/plugin-cost-insights@0.12.13-next.2 + - @backstage/plugin-tech-insights@0.3.16-next.2 + - @backstage/plugin-azure-devops@0.3.6-next.2 + - @backstage/plugin-gcp-projects@0.3.41-next.2 + - @backstage/plugin-azure-sites@0.1.13-next.2 + - @backstage/plugin-cloudbuild@0.3.24-next.2 + - @backstage/plugin-kubernetes@0.10.3-next.2 + - @backstage/plugin-lighthouse@0.4.9-next.2 + - @backstage/plugin-scaffolder@1.14.5-next.2 + - @backstage/plugin-stackstorm@0.1.6-next.2 + - @backstage/plugin-dynatrace@7.0.4-next.2 + - @backstage/plugin-gcalendar@0.3.18-next.2 + - @backstage/plugin-pagerduty@0.6.5-next.2 + - @backstage/plugin-shortcuts@0.3.14-next.2 + - @backstage/plugin-airbrake@0.3.24-next.2 + - @backstage/plugin-api-docs@0.9.11-next.2 + - @backstage/plugin-circleci@0.3.24-next.2 + - @backstage/plugin-devtools@0.1.4-next.2 + - @backstage/plugin-graphiql@0.2.54-next.2 + - @backstage/plugin-linguist@0.1.9-next.2 + - @backstage/plugin-newrelic@0.3.40-next.2 + - @backstage/plugin-puppetdb@0.1.7-next.2 + - @backstage/config@1.1.0-next.1 + - @backstage/plugin-explore@0.4.10-next.2 + - @backstage/plugin-jenkins@0.8.6-next.2 + - @backstage/plugin-rollbar@0.4.24-next.2 + - @backstage/plugin-badges@0.2.48-next.2 + - @backstage/plugin-search@1.4.0-next.2 + - @backstage/plugin-sentry@0.5.9-next.2 + - @backstage/plugin-kafka@0.3.24-next.2 + - @backstage/plugin-nomad@0.1.5-next.2 + - @backstage/cli@0.22.13-next.2 + - @backstage/plugin-gocd@0.1.30-next.2 + - @backstage/plugin-home@0.5.8-next.2 + - @backstage/plugin-todo@0.2.26-next.2 + - @backstage/plugin-adr@0.6.7-next.2 + - @backstage/plugin-scaffolder-react@1.5.5-next.2 + - @internal/plugin-catalog-customized@0.0.14-next.2 + - @backstage/plugin-catalog-graph@0.2.36-next.2 + - @backstage/plugin-catalog-import@0.9.14-next.2 + - @backstage/plugin-catalog-react@1.8.4-next.2 + - @backstage/plugin-newrelic-dashboard@0.2.17-next.2 + - @backstage/plugin-search-react@1.7.0-next.2 + - @backstage/plugin-techdocs-react@1.1.10-next.2 + - @backstage/plugin-permission-react@0.4.15-next.2 + - @backstage/catalog-model@1.4.2-next.1 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-common@1.0.16-next.1 + - @backstage/plugin-linguist-common@0.1.1 + - @backstage/plugin-search-common@1.2.6-next.1 + +## 0.2.87-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-playlist@0.1.16-next.1 + - @backstage/plugin-tech-radar@0.6.8-next.1 + - @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-org@0.6.14-next.1 + - @backstage/plugin-home@0.5.8-next.1 + - @backstage/plugin-devtools@0.1.4-next.1 + - @backstage/plugin-user-settings@0.7.9-next.1 + - @backstage/plugin-search-react@1.7.0-next.1 + - @backstage/plugin-search@1.4.0-next.1 + - @backstage/plugin-kubernetes@0.10.3-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.1.0-next.1 + - @backstage/plugin-adr@0.6.7-next.1 + - @backstage/plugin-airbrake@0.3.24-next.1 + - @backstage/plugin-api-docs@0.9.11-next.1 + - @backstage/plugin-azure-devops@0.3.6-next.1 + - @backstage/plugin-azure-sites@0.1.13-next.1 + - @backstage/plugin-badges@0.2.48-next.1 + - @internal/plugin-catalog-customized@0.0.14-next.1 + - @backstage/plugin-catalog-graph@0.2.36-next.1 + - @backstage/plugin-catalog-import@0.9.14-next.1 + - @backstage/plugin-circleci@0.3.24-next.1 + - @backstage/plugin-cloudbuild@0.3.24-next.1 + - @backstage/plugin-code-coverage@0.2.17-next.1 + - @backstage/plugin-cost-insights@0.12.13-next.1 + - @backstage/plugin-dynatrace@7.0.4-next.1 + - @backstage/plugin-entity-feedback@0.2.7-next.1 + - @backstage/plugin-explore@0.4.10-next.1 + - @backstage/plugin-github-actions@0.6.5-next.1 + - @backstage/plugin-gocd@0.1.30-next.1 + - @backstage/plugin-jenkins@0.8.6-next.1 + - @backstage/plugin-kafka@0.3.24-next.1 + - @backstage/plugin-lighthouse@0.4.9-next.1 + - @backstage/plugin-linguist@0.1.9-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.17-next.1 + - @backstage/plugin-nomad@0.1.5-next.1 + - @backstage/plugin-octopus-deploy@0.2.6-next.1 + - @backstage/plugin-pagerduty@0.6.5-next.1 + - @backstage/plugin-puppetdb@0.1.7-next.1 + - @backstage/plugin-rollbar@0.4.24-next.1 + - @backstage/plugin-scaffolder@1.14.5-next.1 + - @backstage/plugin-scaffolder-react@1.5.5-next.1 + - @backstage/plugin-sentry@0.5.9-next.1 + - @backstage/plugin-tech-insights@0.3.16-next.1 + - @backstage/plugin-techdocs@1.6.9-next.1 + - @backstage/plugin-todo@0.2.26-next.1 + - @backstage/app-defaults@1.4.3-next.1 + - @backstage/cli@0.22.13-next.1 + - @backstage/integration-react@1.1.19-next.1 + - @backstage/plugin-apache-airflow@0.2.15-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.3-next.1 + - @backstage/plugin-gcalendar@0.3.18-next.1 + - @backstage/plugin-gcp-projects@0.3.41-next.1 + - @backstage/plugin-graphiql@0.2.54-next.1 + - @backstage/plugin-microsoft-calendar@0.1.7-next.1 + - @backstage/plugin-newrelic@0.3.40-next.1 + - @backstage/plugin-shortcuts@0.3.14-next.1 + - @backstage/plugin-stack-overflow@0.1.20-next.1 + - @backstage/plugin-stackstorm@0.1.6-next.1 + - @backstage/plugin-techdocs-react@1.1.10-next.1 + - @backstage/catalog-model@1.4.2-next.0 + - @backstage/core-app-api@1.10.0-next.1 + - @backstage/core-plugin-api@1.6.0-next.1 + - @backstage/plugin-permission-react@0.4.15-next.1 + - @backstage/plugin-catalog-common@1.0.16-next.0 + - @backstage/theme@0.4.1 + - @backstage/plugin-linguist-common@0.1.1 + - @backstage/plugin-search-common@1.2.6-next.0 + +## 0.2.87-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-unprocessed-entities@0.1.3-next.0 + - @backstage/integration-react@1.1.18-next.0 + - @backstage/plugin-microsoft-calendar@0.1.7-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.16-next.0 + - @backstage/plugin-apache-airflow@0.2.15-next.0 + - @backstage/plugin-github-actions@0.6.4-next.0 + - @backstage/plugin-octopus-deploy@0.2.5-next.0 + - @backstage/plugin-azure-devops@0.3.5-next.0 + - @backstage/plugin-gcp-projects@0.3.41-next.0 + - @backstage/plugin-azure-sites@0.1.12-next.0 + - @backstage/plugin-cloudbuild@0.3.23-next.0 + - @backstage/plugin-lighthouse@0.4.8-next.0 + - @backstage/plugin-tech-radar@0.6.8-next.0 + - @backstage/plugin-dynatrace@7.0.3-next.0 + - @backstage/plugin-gcalendar@0.3.18-next.0 + - @backstage/plugin-shortcuts@0.3.14-next.0 + - @backstage/plugin-airbrake@0.3.23-next.0 + - @backstage/plugin-circleci@0.3.23-next.0 + - @backstage/plugin-graphiql@0.2.54-next.0 + - @backstage/plugin-linguist@0.1.8-next.0 + - @backstage/plugin-newrelic@0.3.40-next.0 + - @backstage/plugin-playlist@0.1.15-next.0 + - @backstage/plugin-puppetdb@0.1.6-next.0 + - @backstage/plugin-jenkins@0.8.5-next.0 + - @backstage/plugin-rollbar@0.4.23-next.0 + - @backstage/plugin-badges@0.2.47-next.0 + - @backstage/plugin-sentry@0.5.8-next.0 + - @backstage/plugin-kafka@0.3.23-next.0 + - @backstage/plugin-nomad@0.1.4-next.0 + - @backstage/plugin-todo@0.2.25-next.0 + - @backstage/plugin-org@0.6.13-next.0 + - @backstage/cli@0.22.12-next.0 + - @backstage/plugin-techdocs@1.6.8-next.0 + - @backstage/plugin-entity-feedback@0.2.6-next.0 + - @backstage/core-app-api@1.10.0-next.0 + - @backstage/plugin-code-coverage@0.2.16-next.0 + - @backstage/core-plugin-api@1.6.0-next.0 + - @backstage/plugin-cost-insights@0.12.12-next.0 + - @backstage/core-components@0.13.5-next.0 + - @backstage/plugin-adr@0.6.6-next.0 + - @backstage/plugin-catalog-import@0.9.13-next.0 + - @backstage/plugin-scaffolder@1.14.4-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.18-next.0 + - @backstage/plugin-home@0.5.7-next.0 + - @backstage/plugin-pagerduty@0.6.4-next.0 + - @backstage/plugin-stack-overflow@0.1.20-next.0 + - @backstage/plugin-api-docs@0.9.10-next.0 + - @internal/plugin-catalog-customized@0.0.14-next.0 + - @backstage/plugin-catalog-graph@0.2.35-next.0 + - @backstage/plugin-explore@0.4.9-next.0 + - @backstage/plugin-scaffolder-react@1.5.4-next.0 + - @backstage/app-defaults@1.4.3-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-catalog-react@1.8.3-next.0 + - @backstage/plugin-devtools@0.1.4-next.0 + - @backstage/plugin-gocd@0.1.29-next.0 + - @backstage/plugin-kubernetes@0.10.2-next.0 + - @backstage/plugin-linguist-common@0.1.1 + - @backstage/plugin-permission-react@0.4.15-next.0 + - @backstage/plugin-search@1.3.6-next.0 + - @backstage/plugin-search-common@1.2.5 + - @backstage/plugin-search-react@1.6.5-next.0 + - @backstage/plugin-stackstorm@0.1.6-next.0 + - @backstage/plugin-tech-insights@0.3.15-next.0 + - @backstage/plugin-techdocs-react@1.1.10-next.0 + - @backstage/plugin-user-settings@0.7.8-next.0 + +## 0.2.86 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.9.1 + - @backstage/plugin-catalog-graph@0.2.33 + - @backstage/plugin-playlist@0.1.13 + - @backstage/plugin-pagerduty@0.6.2 + - @backstage/plugin-scaffolder@1.14.2 + - @backstage/plugin-explore@0.4.7 + - @backstage/plugin-org@0.6.11 + - @backstage/integration-react@1.1.16 + - @backstage/plugin-microsoft-calendar@0.1.6 + - @backstage/plugin-newrelic-dashboard@0.2.14 + - @backstage/plugin-entity-feedback@0.2.4 + - @backstage/plugin-linguist-common@0.1.1 + - @backstage/plugin-apache-airflow@0.2.14 + - @backstage/plugin-octopus-deploy@0.2.3 + - @backstage/plugin-stack-overflow@0.1.19 + - @backstage/plugin-code-coverage@0.2.14 + - @backstage/plugin-tech-insights@0.3.13 + - @backstage/plugin-dynatrace@7.0.1 + - @backstage/plugin-gcalendar@0.3.17 + - @backstage/plugin-shortcuts@0.3.13 + - @backstage/plugin-airbrake@0.3.21 + - @backstage/plugin-kafka@0.3.21 + - @backstage/plugin-nomad@0.1.2 + - @backstage/plugin-adr@0.6.4 + - @backstage/plugin-newrelic@0.3.39 + - @backstage/cli@0.22.10 + - @backstage/plugin-kubernetes@0.10.0 + - @backstage/core-components@0.13.4 + - @backstage/plugin-home@0.5.5 + - @backstage/plugin-catalog-react@1.8.1 + - @backstage/plugin-scaffolder-react@1.5.2 + - @backstage/plugin-devtools@0.1.3 + - @backstage/app-defaults@1.4.2 + - @backstage/core-plugin-api@1.5.3 + - @backstage/plugin-api-docs@0.9.7 + - @backstage/plugin-azure-devops@0.3.3 + - @backstage/plugin-azure-sites@0.1.10 + - @backstage/plugin-badges@0.2.45 + - @backstage/plugin-catalog-import@0.9.11 + - @backstage/plugin-catalog-unprocessed-entities@0.1.2 + - @backstage/plugin-circleci@0.3.21 + - @backstage/plugin-cloudbuild@0.3.21 + - @backstage/plugin-cost-insights@0.12.10 + - @backstage/plugin-gcp-projects@0.3.40 + - @backstage/plugin-github-actions@0.6.2 + - @backstage/plugin-gocd@0.1.27 + - @backstage/plugin-graphiql@0.2.53 + - @backstage/plugin-jenkins@0.8.3 + - @backstage/plugin-lighthouse@0.4.6 + - @backstage/plugin-linguist@0.1.6 + - @backstage/plugin-puppetdb@0.1.4 + - @backstage/plugin-rollbar@0.4.21 + - @backstage/plugin-search@1.3.4 + - @backstage/plugin-search-react@1.6.4 + - @backstage/plugin-sentry@0.5.6 + - @backstage/plugin-stackstorm@0.1.5 + - @backstage/plugin-tech-radar@0.6.7 + - @backstage/plugin-techdocs@1.6.6 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.16 + - @backstage/plugin-todo@0.2.23 + - @backstage/plugin-user-settings@0.7.6 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-permission-react@0.4.14 + - @backstage/plugin-search-common@1.2.5 + - @backstage/plugin-techdocs-react@1.1.9 + - @internal/plugin-catalog-customized@0.0.13 + +## 0.2.86-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-graph@0.2.33-next.2 + - @backstage/plugin-linguist-common@0.1.1-next.1 + - @backstage/plugin-catalog-react@1.8.1-next.1 + - @backstage/plugin-linguist@0.1.6-next.2 + - @backstage/plugin-adr@0.6.4-next.2 + - @backstage/plugin-airbrake@0.3.21-next.2 + - @backstage/plugin-api-docs@0.9.7-next.2 + - @backstage/plugin-azure-devops@0.3.3-next.1 + - @backstage/plugin-azure-sites@0.1.10-next.1 + - @backstage/plugin-badges@0.2.45-next.1 + - @internal/plugin-catalog-customized@0.0.13-next.2 + - @backstage/plugin-catalog-import@0.9.11-next.2 + - @backstage/plugin-circleci@0.3.21-next.1 + - @backstage/plugin-cloudbuild@0.3.21-next.1 + - @backstage/plugin-code-coverage@0.2.14-next.2 + - @backstage/plugin-cost-insights@0.12.10-next.1 + - @backstage/plugin-dynatrace@7.0.1-next.2 + - @backstage/plugin-entity-feedback@0.2.4-next.2 + - @backstage/plugin-explore@0.4.7-next.1 + - @backstage/plugin-github-actions@0.6.2-next.2 + - @backstage/plugin-gocd@0.1.27-next.1 + - @backstage/plugin-home@0.5.5-next.1 + - @backstage/plugin-jenkins@0.8.3-next.2 + - @backstage/plugin-kafka@0.3.21-next.2 + - @backstage/plugin-kubernetes@0.9.4-next.1 + - @backstage/plugin-lighthouse@0.4.6-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.14-next.2 + - @backstage/plugin-nomad@0.1.2-next.2 + - @backstage/plugin-octopus-deploy@0.2.3-next.2 + - @backstage/plugin-org@0.6.11-next.2 + - @backstage/plugin-pagerduty@0.6.2-next.1 + - @backstage/plugin-playlist@0.1.13-next.2 + - @backstage/plugin-puppetdb@0.1.4-next.1 + - @backstage/plugin-rollbar@0.4.21-next.1 + - @backstage/plugin-scaffolder@1.14.2-next.2 + - @backstage/plugin-scaffolder-react@1.5.2-next.1 + - @backstage/plugin-search@1.3.4-next.1 + - @backstage/plugin-sentry@0.5.6-next.1 + - @backstage/plugin-tech-insights@0.3.13-next.2 + - @backstage/plugin-techdocs@1.6.6-next.2 + - @backstage/plugin-todo@0.2.23-next.1 + - @backstage/plugin-user-settings@0.7.6-next.1 + - @backstage/cli@0.22.10-next.1 + - @backstage/integration-react@1.1.16-next.1 + - @backstage/plugin-apache-airflow@0.2.14-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.2-next.0 + - @backstage/plugin-devtools@0.1.3-next.1 + - @backstage/plugin-gcalendar@0.3.17-next.1 + - @backstage/plugin-gcp-projects@0.3.40-next.0 + - @backstage/plugin-graphiql@0.2.53-next.0 + - @backstage/plugin-microsoft-calendar@0.1.6-next.1 + - @backstage/plugin-newrelic@0.3.39-next.0 + - @backstage/plugin-shortcuts@0.3.13-next.1 + - @backstage/plugin-stack-overflow@0.1.19-next.1 + - @backstage/plugin-stackstorm@0.1.5-next.0 + - @backstage/plugin-tech-radar@0.6.7-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.16-next.1 + +## 0.2.86-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-playlist@0.1.13-next.1 + - @backstage/plugin-scaffolder@1.14.2-next.1 + - @backstage/integration-react@1.1.16-next.1 + - @backstage/plugin-microsoft-calendar@0.1.6-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.14-next.1 + - @backstage/plugin-entity-feedback@0.2.4-next.1 + - @backstage/plugin-linguist-common@0.1.1-next.0 + - @backstage/plugin-apache-airflow@0.2.14-next.1 + - @backstage/plugin-octopus-deploy@0.2.3-next.1 + - @backstage/plugin-stack-overflow@0.1.19-next.1 + - @backstage/plugin-catalog-graph@0.2.33-next.1 + - @backstage/plugin-code-coverage@0.2.14-next.1 + - @backstage/plugin-tech-insights@0.3.13-next.1 + - @backstage/plugin-dynatrace@7.0.1-next.1 + - @backstage/plugin-gcalendar@0.3.17-next.1 + - @backstage/plugin-shortcuts@0.3.13-next.1 + - @backstage/plugin-airbrake@0.3.21-next.1 + - @backstage/plugin-kafka@0.3.21-next.1 + - @backstage/plugin-nomad@0.1.2-next.1 + - @backstage/plugin-adr@0.6.4-next.1 + - @backstage/plugin-org@0.6.11-next.1 + - @backstage/plugin-devtools@0.1.3-next.1 + - @backstage/cli@0.22.10-next.1 + - @backstage/plugin-catalog-import@0.9.11-next.1 + - @backstage/plugin-github-actions@0.6.2-next.1 + - @backstage/plugin-techdocs@1.6.6-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.16-next.1 + - @backstage/plugin-linguist@0.1.6-next.1 + - @backstage/plugin-jenkins@0.8.3-next.1 + - @backstage/app-defaults@1.4.2-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/core-app-api@1.9.1-next.0 + - @backstage/core-components@0.13.4-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/theme@0.4.1 + - @backstage/plugin-api-docs@0.9.7-next.1 + - @backstage/plugin-azure-devops@0.3.3-next.0 + - @backstage/plugin-azure-sites@0.1.10-next.0 + - @backstage/plugin-badges@0.2.45-next.0 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.1.2-next.0 + - @backstage/plugin-circleci@0.3.21-next.0 + - @backstage/plugin-cloudbuild@0.3.21-next.0 + - @backstage/plugin-cost-insights@0.12.10-next.0 + - @backstage/plugin-explore@0.4.7-next.0 + - @backstage/plugin-gcp-projects@0.3.40-next.0 + - @backstage/plugin-gocd@0.1.27-next.0 + - @backstage/plugin-graphiql@0.2.53-next.0 + - @backstage/plugin-home@0.5.5-next.0 + - @backstage/plugin-kubernetes@0.9.4-next.0 + - @backstage/plugin-lighthouse@0.4.6-next.0 + - @backstage/plugin-newrelic@0.3.39-next.0 + - @backstage/plugin-pagerduty@0.6.2-next.0 + - @backstage/plugin-permission-react@0.4.14 + - @backstage/plugin-puppetdb@0.1.4-next.0 + - @backstage/plugin-rollbar@0.4.21-next.0 + - @backstage/plugin-scaffolder-react@1.5.2-next.0 + - @backstage/plugin-search@1.3.4-next.0 + - @backstage/plugin-search-common@1.2.5 + - @backstage/plugin-search-react@1.6.4-next.0 + - @backstage/plugin-sentry@0.5.6-next.0 + - @backstage/plugin-stackstorm@0.1.5-next.0 + - @backstage/plugin-tech-radar@0.6.7-next.0 + - @backstage/plugin-techdocs-react@1.1.9-next.0 + - @backstage/plugin-todo@0.2.23-next.0 + - @backstage/plugin-user-settings@0.7.6-next.0 + - @internal/plugin-catalog-customized@0.0.13-next.1 + +## 0.2.86-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.9.1-next.0 + - @backstage/plugin-catalog-graph@0.2.33-next.0 + - @backstage/cli@0.22.10-next.0 + - @backstage/core-components@0.13.4-next.0 + - @backstage/plugin-home@0.5.5-next.0 + - @backstage/plugin-scaffolder-react@1.5.2-next.0 + - @backstage/app-defaults@1.4.2-next.0 + - @backstage/core-plugin-api@1.5.3 + - @backstage/plugin-adr@0.6.4-next.0 + - @backstage/plugin-apache-airflow@0.2.14-next.0 + - @backstage/plugin-api-docs@0.9.7-next.0 + - @backstage/plugin-azure-devops@0.3.3-next.0 + - @backstage/plugin-azure-sites@0.1.10-next.0 + - @backstage/plugin-badges@0.2.45-next.0 + - @backstage/plugin-catalog-import@0.9.11-next.0 + - @backstage/plugin-catalog-react@1.8.1-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.1.2-next.0 + - @backstage/plugin-circleci@0.3.21-next.0 + - @backstage/plugin-cloudbuild@0.3.21-next.0 + - @backstage/plugin-code-coverage@0.2.14-next.0 + - @backstage/plugin-cost-insights@0.12.10-next.0 + - @backstage/plugin-devtools@0.1.3-next.0 + - @backstage/plugin-dynatrace@7.0.1-next.0 + - @backstage/plugin-entity-feedback@0.2.4-next.0 + - @backstage/plugin-explore@0.4.7-next.0 + - @backstage/plugin-gcalendar@0.3.17-next.0 + - @backstage/plugin-gcp-projects@0.3.40-next.0 + - @backstage/plugin-github-actions@0.6.2-next.0 + - @backstage/plugin-gocd@0.1.27-next.0 + - @backstage/plugin-graphiql@0.2.53-next.0 + - @backstage/plugin-jenkins@0.8.3-next.0 + - @backstage/plugin-kafka@0.3.21-next.0 + - @backstage/plugin-kubernetes@0.9.4-next.0 + - @backstage/plugin-lighthouse@0.4.6-next.0 + - @backstage/plugin-linguist@0.1.6-next.0 + - @backstage/plugin-microsoft-calendar@0.1.6-next.0 + - @backstage/plugin-newrelic@0.3.39-next.0 + - @backstage/plugin-nomad@0.1.2-next.0 + - @backstage/plugin-octopus-deploy@0.2.3-next.0 + - @backstage/plugin-org@0.6.11-next.0 + - @backstage/plugin-pagerduty@0.6.2-next.0 + - @backstage/plugin-playlist@0.1.13-next.0 + - @backstage/plugin-puppetdb@0.1.4-next.0 + - @backstage/plugin-rollbar@0.4.21-next.0 + - @backstage/plugin-scaffolder@1.14.2-next.0 + - @backstage/plugin-search@1.3.4-next.0 + - @backstage/plugin-search-react@1.6.4-next.0 + - @backstage/plugin-sentry@0.5.6-next.0 + - @backstage/plugin-shortcuts@0.3.13-next.0 + - @backstage/plugin-stack-overflow@0.1.19-next.0 + - @backstage/plugin-stackstorm@0.1.5-next.0 + - @backstage/plugin-tech-insights@0.3.13-next.0 + - @backstage/plugin-tech-radar@0.6.7-next.0 + - @backstage/plugin-techdocs@1.6.6-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.16-next.0 + - @backstage/plugin-todo@0.2.23-next.0 + - @backstage/plugin-user-settings@0.7.6-next.0 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/integration-react@1.1.16-next.0 + - @backstage/theme@0.4.1 + - @backstage/plugin-airbrake@0.3.21-next.0 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-newrelic-dashboard@0.2.14-next.0 + - @backstage/plugin-permission-react@0.4.14 + - @backstage/plugin-search-common@1.2.5 + - @backstage/plugin-techdocs-react@1.1.9-next.0 + - @internal/plugin-catalog-customized@0.0.13-next.0 + +## 0.2.85 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search@1.3.3 + - @backstage/plugin-devtools@0.1.2 + - @backstage/cli@0.22.9 + - @backstage/theme@0.4.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.1 + - @backstage/plugin-stackstorm@0.1.4 + - @backstage/plugin-scaffolder-react@1.5.1 + - @backstage/plugin-airbrake@0.3.20 + - @backstage/plugin-lighthouse@0.4.5 + - @backstage/plugin-catalog-import@0.9.10 + - @backstage/plugin-dynatrace@7.0.0 + - @backstage/plugin-catalog-react@1.8.0 + - @backstage/plugin-home@0.5.4 + - @backstage/core-components@0.13.3 + - @backstage/plugin-playlist@0.1.12 + - @backstage/plugin-nomad@0.1.1 + - @backstage/plugin-kubernetes@0.9.3 + - @backstage/core-app-api@1.9.0 + - @backstage/plugin-cost-insights@0.12.9 + - @backstage/plugin-user-settings@0.7.5 + - @backstage/core-plugin-api@1.5.3 + - @backstage/plugin-adr@0.6.3 + - @backstage/plugin-puppetdb@0.1.3 + - @backstage/app-defaults@1.4.1 + - @backstage/catalog-model@1.4.1 + - @backstage/config@1.0.8 + - @backstage/integration-react@1.1.15 + - @backstage/plugin-apache-airflow@0.2.13 + - @backstage/plugin-api-docs@0.9.6 + - @backstage/plugin-azure-devops@0.3.2 + - @backstage/plugin-azure-sites@0.1.9 + - @backstage/plugin-badges@0.2.44 + - @backstage/plugin-catalog-common@1.0.15 + - @backstage/plugin-catalog-graph@0.2.32 + - @backstage/plugin-circleci@0.3.20 + - @backstage/plugin-cloudbuild@0.3.20 + - @backstage/plugin-code-coverage@0.2.13 + - @backstage/plugin-entity-feedback@0.2.3 + - @backstage/plugin-explore@0.4.6 + - @backstage/plugin-gcalendar@0.3.16 + - @backstage/plugin-gcp-projects@0.3.39 + - @backstage/plugin-github-actions@0.6.1 + - @backstage/plugin-gocd@0.1.26 + - @backstage/plugin-graphiql@0.2.52 + - @backstage/plugin-jenkins@0.8.2 + - @backstage/plugin-kafka@0.3.20 + - @backstage/plugin-linguist@0.1.5 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-microsoft-calendar@0.1.5 + - @backstage/plugin-newrelic@0.3.38 + - @backstage/plugin-newrelic-dashboard@0.2.13 + - @backstage/plugin-octopus-deploy@0.2.2 + - @backstage/plugin-org@0.6.10 + - @backstage/plugin-pagerduty@0.6.1 + - @backstage/plugin-permission-react@0.4.14 + - @backstage/plugin-rollbar@0.4.20 + - @backstage/plugin-scaffolder@1.14.1 + - @backstage/plugin-search-common@1.2.5 + - @backstage/plugin-search-react@1.6.3 + - @backstage/plugin-sentry@0.5.5 + - @backstage/plugin-shortcuts@0.3.12 + - @backstage/plugin-stack-overflow@0.1.18 + - @backstage/plugin-tech-insights@0.3.12 + - @backstage/plugin-tech-radar@0.6.6 + - @backstage/plugin-techdocs@1.6.5 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.15 + - @backstage/plugin-techdocs-react@1.1.8 + - @backstage/plugin-todo@0.2.22 + - @internal/plugin-catalog-customized@0.0.12 + +## 0.2.85-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search@1.3.3-next.2 + - @backstage/plugin-airbrake@0.3.20-next.2 + - @backstage/cli@0.22.9-next.1 + - @backstage/plugin-catalog-react@1.8.0-next.2 + - @backstage/plugin-home@0.5.4-next.2 + - @backstage/plugin-cost-insights@0.12.9-next.2 + - @backstage/plugin-user-settings@0.7.5-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/core-app-api@1.8.2-next.1 + - @backstage/plugin-kubernetes@0.9.3-next.2 + - @backstage/plugin-adr@0.6.3-next.2 + - @backstage/app-defaults@1.4.1-next.2 + - @backstage/catalog-model@1.4.1-next.0 + - @backstage/config@1.0.8 + - @backstage/integration-react@1.1.15-next.2 + - @backstage/plugin-apache-airflow@0.2.13-next.2 + - @backstage/plugin-api-docs@0.9.6-next.2 + - @backstage/plugin-azure-devops@0.3.2-next.2 + - @backstage/plugin-azure-sites@0.1.9-next.2 + - @backstage/plugin-badges@0.2.44-next.2 + - @backstage/plugin-catalog-common@1.0.15-next.0 + - @backstage/plugin-catalog-graph@0.2.32-next.2 + - @backstage/plugin-catalog-import@0.9.10-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.1.1-next.2 + - @backstage/plugin-circleci@0.3.20-next.2 + - @backstage/plugin-cloudbuild@0.3.20-next.2 + - @backstage/plugin-code-coverage@0.2.13-next.2 + - @backstage/plugin-devtools@0.1.2-next.2 + - @backstage/plugin-dynatrace@7.0.0-next.2 + - @backstage/plugin-entity-feedback@0.2.3-next.2 + - @backstage/plugin-explore@0.4.6-next.2 + - @backstage/plugin-gcalendar@0.3.16-next.2 + - @backstage/plugin-gcp-projects@0.3.39-next.2 + - @backstage/plugin-github-actions@0.6.1-next.2 + - @backstage/plugin-gocd@0.1.26-next.2 + - @backstage/plugin-graphiql@0.2.52-next.2 + - @backstage/plugin-jenkins@0.8.2-next.2 + - @backstage/plugin-kafka@0.3.20-next.2 + - @backstage/plugin-lighthouse@0.4.5-next.2 + - @backstage/plugin-linguist@0.1.5-next.2 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-microsoft-calendar@0.1.5-next.2 + - @backstage/plugin-newrelic@0.3.38-next.2 + - @backstage/plugin-newrelic-dashboard@0.2.13-next.2 + - @backstage/plugin-nomad@0.1.1-next.2 + - @backstage/plugin-octopus-deploy@0.2.2-next.2 + - @backstage/plugin-org@0.6.10-next.2 + - @backstage/plugin-pagerduty@0.6.1-next.2 + - @backstage/plugin-permission-react@0.4.14-next.2 + - @backstage/plugin-playlist@0.1.12-next.2 + - @backstage/plugin-puppetdb@0.1.3-next.2 + - @backstage/plugin-rollbar@0.4.20-next.2 + - @backstage/plugin-scaffolder@1.14.1-next.2 + - @backstage/plugin-scaffolder-react@1.5.1-next.2 + - @backstage/plugin-search-common@1.2.5-next.0 + - @backstage/plugin-search-react@1.6.3-next.2 + - @backstage/plugin-sentry@0.5.5-next.2 + - @backstage/plugin-shortcuts@0.3.12-next.2 + - @backstage/plugin-stack-overflow@0.1.18-next.2 + - @backstage/plugin-stackstorm@0.1.4-next.2 + - @backstage/plugin-tech-insights@0.3.12-next.2 + - @backstage/plugin-tech-radar@0.6.6-next.2 + - @backstage/plugin-techdocs@1.6.5-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.15-next.2 + - @backstage/plugin-techdocs-react@1.1.8-next.2 + - @backstage/plugin-todo@0.2.22-next.2 + - @internal/plugin-catalog-customized@0.0.12-next.2 + +## 0.2.85-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.4.1-next.0 + - @backstage/plugin-scaffolder-react@1.5.1-next.1 + - @backstage/plugin-lighthouse@0.4.5-next.1 + - @backstage/plugin-catalog-import@0.9.10-next.1 + - @backstage/core-components@0.13.3-next.1 + - @backstage/plugin-kubernetes@0.9.3-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.1-next.1 + - @backstage/plugin-home@0.5.4-next.1 + - @backstage/core-plugin-api@1.5.3-next.0 + - @backstage/app-defaults@1.4.1-next.1 + - @backstage/cli@0.22.9-next.0 + - @backstage/integration-react@1.1.15-next.1 + - @backstage/plugin-adr@0.6.3-next.1 + - @backstage/plugin-airbrake@0.3.20-next.1 + - @backstage/plugin-api-docs@0.9.6-next.1 + - @backstage/plugin-azure-devops@0.3.2-next.1 + - @backstage/plugin-azure-sites@0.1.9-next.1 + - @backstage/plugin-badges@0.2.44-next.1 + - @backstage/plugin-catalog-graph@0.2.32-next.1 + - @backstage/plugin-catalog-react@1.7.1-next.1 + - @backstage/plugin-circleci@0.3.20-next.1 + - @backstage/plugin-cloudbuild@0.3.20-next.1 + - @backstage/plugin-code-coverage@0.2.13-next.1 + - @backstage/plugin-cost-insights@0.12.9-next.1 + - @backstage/plugin-devtools@0.1.2-next.1 + - @backstage/plugin-dynatrace@6.0.1-next.1 + - @backstage/plugin-entity-feedback@0.2.3-next.1 + - @backstage/plugin-explore@0.4.6-next.1 + - @backstage/plugin-gcalendar@0.3.16-next.1 + - @backstage/plugin-gcp-projects@0.3.39-next.1 + - @backstage/plugin-github-actions@0.6.1-next.1 + - @backstage/plugin-gocd@0.1.26-next.1 + - @backstage/plugin-graphiql@0.2.52-next.1 + - @backstage/plugin-jenkins@0.8.2-next.1 + - @backstage/plugin-kafka@0.3.20-next.1 + - @backstage/plugin-linguist@0.1.5-next.1 + - @backstage/plugin-microsoft-calendar@0.1.5-next.1 + - @backstage/plugin-newrelic@0.3.38-next.1 + - @backstage/plugin-nomad@0.1.1-next.1 + - @backstage/plugin-octopus-deploy@0.2.2-next.1 + - @backstage/plugin-org@0.6.10-next.1 + - @backstage/plugin-pagerduty@0.6.1-next.1 + - @backstage/plugin-playlist@0.1.12-next.1 + - @backstage/plugin-puppetdb@0.1.3-next.1 + - @backstage/plugin-rollbar@0.4.20-next.1 + - @backstage/plugin-scaffolder@1.14.1-next.1 + - @backstage/plugin-search@1.3.3-next.1 + - @backstage/plugin-search-react@1.6.3-next.1 + - @backstage/plugin-sentry@0.5.5-next.1 + - @backstage/plugin-shortcuts@0.3.12-next.1 + - @backstage/plugin-stack-overflow@0.1.18-next.1 + - @backstage/plugin-stackstorm@0.1.4-next.1 + - @backstage/plugin-tech-insights@0.3.12-next.1 + - @backstage/plugin-tech-radar@0.6.6-next.1 + - @backstage/plugin-techdocs@1.6.5-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.15-next.1 + - @backstage/plugin-techdocs-react@1.1.8-next.1 + - @backstage/plugin-todo@0.2.22-next.1 + - @backstage/plugin-user-settings@0.7.5-next.1 + - @backstage/plugin-apache-airflow@0.2.13-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.13-next.1 + - @internal/plugin-catalog-customized@0.0.12-next.1 + - @backstage/core-app-api@1.8.2-next.0 + - @backstage/plugin-permission-react@0.4.14-next.1 + - @backstage/config@1.0.8 + +## 0.2.85-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-devtools@0.1.2-next.0 + - @backstage/cli@0.22.9-next.0 + - @backstage/plugin-catalog-unprocessed-entities@0.1.1-next.0 + - @backstage/plugin-stackstorm@0.1.4-next.0 + - @backstage/plugin-dynatrace@6.0.1-next.0 + - @backstage/plugin-home@0.5.4-next.0 + - @backstage/core-components@0.13.3-next.0 + - @backstage/plugin-playlist@0.1.12-next.0 + - @backstage/plugin-nomad@0.1.1-next.0 + - @backstage/app-defaults@1.4.1-next.0 + - @backstage/catalog-model@1.4.1-next.0 + - @backstage/config@1.0.8 + - @backstage/core-app-api@1.8.1 + - @backstage/core-plugin-api@1.5.2 + - @backstage/integration-react@1.1.15-next.0 + - @backstage/theme@0.4.0 + - @backstage/plugin-adr@0.6.3-next.0 + - @backstage/plugin-airbrake@0.3.20-next.0 + - @backstage/plugin-apache-airflow@0.2.13-next.0 + - @backstage/plugin-api-docs@0.9.6-next.0 + - @backstage/plugin-azure-devops@0.3.2-next.0 + - @backstage/plugin-azure-sites@0.1.9-next.0 + - @backstage/plugin-badges@0.2.44-next.0 + - @backstage/plugin-catalog-common@1.0.15-next.0 + - @backstage/plugin-catalog-graph@0.2.32-next.0 + - @backstage/plugin-catalog-import@0.9.10-next.0 + - @backstage/plugin-catalog-react@1.7.1-next.0 + - @backstage/plugin-circleci@0.3.20-next.0 + - @backstage/plugin-cloudbuild@0.3.20-next.0 + - @backstage/plugin-code-coverage@0.2.13-next.0 + - @backstage/plugin-cost-insights@0.12.9-next.0 + - @backstage/plugin-entity-feedback@0.2.3-next.0 + - @backstage/plugin-explore@0.4.6-next.0 + - @backstage/plugin-gcalendar@0.3.16-next.0 + - @backstage/plugin-gcp-projects@0.3.39-next.0 + - @backstage/plugin-github-actions@0.6.1-next.0 + - @backstage/plugin-gocd@0.1.26-next.0 + - @backstage/plugin-graphiql@0.2.52-next.0 + - @backstage/plugin-jenkins@0.8.2-next.0 + - @backstage/plugin-kafka@0.3.20-next.0 + - @backstage/plugin-kubernetes@0.9.3-next.0 + - @backstage/plugin-lighthouse@0.4.5-next.0 + - @backstage/plugin-linguist@0.1.5-next.0 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-microsoft-calendar@0.1.5-next.0 + - @backstage/plugin-newrelic@0.3.38-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.13-next.0 + - @backstage/plugin-octopus-deploy@0.2.2-next.0 + - @backstage/plugin-org@0.6.10-next.0 + - @backstage/plugin-pagerduty@0.6.1-next.0 + - @backstage/plugin-permission-react@0.4.14-next.0 + - @backstage/plugin-puppetdb@0.1.3-next.0 + - @backstage/plugin-rollbar@0.4.20-next.0 + - @backstage/plugin-scaffolder@1.14.1-next.0 + - @backstage/plugin-scaffolder-react@1.5.1-next.0 + - @backstage/plugin-search@1.3.3-next.0 + - @backstage/plugin-search-common@1.2.5-next.0 + - @backstage/plugin-search-react@1.6.3-next.0 + - @backstage/plugin-sentry@0.5.5-next.0 + - @backstage/plugin-shortcuts@0.3.12-next.0 + - @backstage/plugin-stack-overflow@0.1.18-next.0 + - @backstage/plugin-tech-insights@0.3.12-next.0 + - @backstage/plugin-tech-radar@0.6.6-next.0 + - @backstage/plugin-techdocs@1.6.5-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.15-next.0 + - @backstage/plugin-techdocs-react@1.1.8-next.0 + - @backstage/plugin-todo@0.2.22-next.0 + - @backstage/plugin-user-settings@0.7.5-next.0 + - @internal/plugin-catalog-customized@0.0.12-next.0 + +## 0.2.84 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-dynatrace@6.0.0 + - @backstage/core-app-api@1.8.1 + - @backstage/core-plugin-api@1.5.2 + - @backstage/plugin-kubernetes@0.9.2 + - @backstage/plugin-user-settings@0.7.4 + - @backstage/plugin-catalog-import@0.9.9 + - @backstage/plugin-scaffolder-react@1.5.0 + - @backstage/plugin-search-react@1.6.2 + - @backstage/plugin-octopus-deploy@0.2.1 + - @backstage/plugin-home@0.5.3 + - @backstage/cli@0.22.8 + - @backstage/core-components@0.13.2 + - @backstage/plugin-scaffolder@1.14.0 + - @backstage/plugin-nomad@0.1.0 + - @backstage/plugin-pagerduty@0.6.0 + - @backstage/plugin-catalog-unprocessed-entities@0.1.0 + - @backstage/plugin-search@1.3.2 + - @backstage/theme@0.4.0 + - @backstage/plugin-catalog-react@1.7.0 + - @backstage/plugin-entity-feedback@0.2.2 + - @backstage/catalog-model@1.4.0 + - @backstage/plugin-adr@0.6.2 + - @backstage/plugin-org@0.6.9 + - @backstage/plugin-techdocs@1.6.4 + - @backstage/plugin-tech-insights@0.3.11 + - @backstage/plugin-devtools@0.1.1 + - @backstage/plugin-api-docs@0.9.5 + - @backstage/plugin-github-actions@0.6.0 + - @backstage/plugin-shortcuts@0.3.11 + - @backstage/plugin-playlist@0.1.11 + - @backstage/plugin-jenkins@0.8.1 + - @backstage/plugin-explore@0.4.5 + - @backstage/plugin-stack-overflow@0.1.17 + - @backstage/app-defaults@1.4.0 + - @backstage/plugin-techdocs-react@1.1.7 + - @backstage/plugin-apache-airflow@0.2.12 + - @backstage/plugin-azure-devops@0.3.1 + - @backstage/plugin-azure-sites@0.1.8 + - @backstage/plugin-badges@0.2.43 + - @backstage/plugin-catalog-graph@0.2.31 + - @backstage/plugin-circleci@0.3.19 + - @backstage/plugin-cloudbuild@0.3.19 + - @backstage/plugin-code-coverage@0.2.12 + - @backstage/plugin-cost-insights@0.12.8 + - @backstage/plugin-gcalendar@0.3.15 + - @backstage/plugin-gcp-projects@0.3.38 + - @backstage/plugin-gocd@0.1.25 + - @backstage/plugin-graphiql@0.2.51 + - @backstage/plugin-kafka@0.3.19 + - @backstage/plugin-lighthouse@0.4.4 + - @backstage/plugin-linguist@0.1.4 + - @backstage/plugin-microsoft-calendar@0.1.4 + - @backstage/plugin-newrelic@0.3.37 + - @backstage/plugin-puppetdb@0.1.2 + - @backstage/plugin-rollbar@0.4.19 + - @backstage/plugin-sentry@0.5.4 + - @backstage/plugin-stackstorm@0.1.3 + - @backstage/plugin-tech-radar@0.6.5 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.14 + - @backstage/plugin-todo@0.2.21 + - @backstage/integration-react@1.1.14 + - @backstage/plugin-airbrake@0.3.19 + - @backstage/plugin-newrelic-dashboard@0.2.12 + - @backstage/plugin-permission-react@0.4.13 + - @internal/plugin-catalog-customized@0.0.11 + - @backstage/config@1.0.8 + - @backstage/plugin-catalog-common@1.0.14 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-search-common@1.2.4 + +## 0.2.84-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search-react@1.6.2-next.3 + - @backstage/plugin-catalog-import@0.9.9-next.3 + - @backstage/cli@0.22.8-next.2 + - @backstage/core-components@0.13.2-next.3 + - @backstage/plugin-scaffolder@1.14.0-next.3 + - @backstage/catalog-model@1.4.0-next.1 + - @backstage/plugin-devtools@0.1.1-next.3 + - @backstage/plugin-api-docs@0.9.5-next.3 + - @backstage/plugin-techdocs@1.6.4-next.3 + - @backstage/plugin-scaffolder-react@1.5.0-next.3 + - @backstage/plugin-explore@0.4.5-next.3 + - @backstage/plugin-adr@0.6.2-next.3 + - @backstage/plugin-playlist@0.1.11-next.3 + - @backstage/plugin-search@1.3.2-next.3 + - @backstage/plugin-stack-overflow@0.1.17-next.3 + - @backstage/app-defaults@1.4.0-next.3 + - @backstage/config@1.0.7 + - @backstage/core-app-api@1.8.1-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/integration-react@1.1.14-next.3 + - @backstage/theme@0.4.0-next.1 + - @backstage/plugin-airbrake@0.3.19-next.3 + - @backstage/plugin-apache-airflow@0.2.12-next.3 + - @backstage/plugin-azure-devops@0.3.1-next.3 + - @backstage/plugin-azure-sites@0.1.8-next.3 + - @backstage/plugin-badges@0.2.43-next.3 + - @backstage/plugin-catalog-common@1.0.14-next.1 + - @backstage/plugin-catalog-graph@0.2.31-next.3 + - @backstage/plugin-catalog-react@1.7.0-next.3 + - @backstage/plugin-catalog-unprocessed-entities@0.1.0-next.2 + - @backstage/plugin-circleci@0.3.19-next.3 + - @backstage/plugin-cloudbuild@0.3.19-next.3 + - @backstage/plugin-code-coverage@0.2.12-next.3 + - @backstage/plugin-cost-insights@0.12.8-next.3 + - @backstage/plugin-dynatrace@6.0.0-next.3 + - @backstage/plugin-entity-feedback@0.2.2-next.3 + - @backstage/plugin-gcalendar@0.3.15-next.3 + - @backstage/plugin-gcp-projects@0.3.38-next.3 + - @backstage/plugin-github-actions@0.6.0-next.3 + - @backstage/plugin-gocd@0.1.25-next.3 + - @backstage/plugin-graphiql@0.2.51-next.3 + - @backstage/plugin-home@0.5.3-next.3 + - @backstage/plugin-jenkins@0.8.1-next.3 + - @backstage/plugin-kafka@0.3.19-next.3 + - @backstage/plugin-kubernetes@0.9.2-next.3 + - @backstage/plugin-lighthouse@0.4.4-next.3 + - @backstage/plugin-linguist@0.1.4-next.3 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-microsoft-calendar@0.1.4-next.3 + - @backstage/plugin-newrelic@0.3.37-next.3 + - @backstage/plugin-newrelic-dashboard@0.2.12-next.3 + - @backstage/plugin-octopus-deploy@0.2.1-next.3 + - @backstage/plugin-org@0.6.9-next.3 + - @backstage/plugin-pagerduty@0.5.12-next.3 + - @backstage/plugin-permission-react@0.4.13-next.0 + - @backstage/plugin-puppetdb@0.1.2-next.3 + - @backstage/plugin-rollbar@0.4.19-next.3 + - @backstage/plugin-search-common@1.2.4-next.0 + - @backstage/plugin-sentry@0.5.4-next.3 + - @backstage/plugin-shortcuts@0.3.11-next.3 + - @backstage/plugin-stackstorm@0.1.3-next.3 + - @backstage/plugin-tech-insights@0.3.11-next.3 + - @backstage/plugin-tech-radar@0.6.5-next.3 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.14-next.3 + - @backstage/plugin-techdocs-react@1.1.7-next.3 + - @backstage/plugin-todo@0.2.21-next.3 + - @backstage/plugin-user-settings@0.7.4-next.3 + - @internal/plugin-catalog-customized@0.0.11-next.3 + +## 0.2.84-next.2 + +### Patch Changes + +- 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-tech-insights@0.3.11-next.2 + - @backstage/plugin-scaffolder-react@1.5.0-next.2 + - @backstage/plugin-scaffolder@1.13.2-next.2 + - @backstage/plugin-home@0.5.3-next.2 + - @backstage/plugin-kubernetes@0.9.2-next.2 + - @backstage/app-defaults@1.4.0-next.2 + - @backstage/cli@0.22.8-next.1 + - @backstage/integration-react@1.1.14-next.2 + - @backstage/plugin-adr@0.6.1-next.2 + - @backstage/plugin-airbrake@0.3.19-next.2 + - @backstage/plugin-api-docs@0.9.4-next.2 + - @backstage/plugin-azure-devops@0.3.1-next.2 + - @backstage/plugin-azure-sites@0.1.8-next.2 + - @backstage/plugin-badges@0.2.43-next.2 + - @backstage/plugin-catalog-graph@0.2.31-next.2 + - @backstage/plugin-catalog-unprocessed-entities@0.1.0-next.1 + - @backstage/plugin-circleci@0.3.19-next.2 + - @backstage/plugin-cloudbuild@0.3.19-next.2 + - @backstage/plugin-code-coverage@0.2.12-next.2 + - @backstage/plugin-cost-insights@0.12.8-next.2 + - @backstage/plugin-devtools@0.1.1-next.2 + - @backstage/plugin-dynatrace@6.0.0-next.2 + - @backstage/plugin-entity-feedback@0.2.2-next.2 + - @backstage/plugin-explore@0.4.4-next.2 + - @backstage/plugin-gcalendar@0.3.15-next.2 + - @backstage/plugin-gcp-projects@0.3.38-next.2 + - @backstage/plugin-github-actions@0.6.0-next.2 + - @backstage/plugin-gocd@0.1.25-next.2 + - @backstage/plugin-graphiql@0.2.51-next.2 + - @backstage/plugin-jenkins@0.8.1-next.2 + - @backstage/plugin-kafka@0.3.19-next.2 + - @backstage/plugin-lighthouse@0.4.4-next.2 + - @backstage/plugin-linguist@0.1.4-next.2 + - @backstage/plugin-microsoft-calendar@0.1.4-next.2 + - @backstage/plugin-newrelic@0.3.37-next.2 + - @backstage/plugin-octopus-deploy@0.2.1-next.2 + - @backstage/plugin-org@0.6.9-next.2 + - @backstage/plugin-pagerduty@0.5.12-next.2 + - @backstage/plugin-playlist@0.1.10-next.2 + - @backstage/plugin-puppetdb@0.1.2-next.2 + - @backstage/plugin-rollbar@0.4.19-next.2 + - @backstage/plugin-search@1.3.1-next.2 + - @backstage/plugin-search-react@1.6.1-next.2 + - @backstage/plugin-sentry@0.5.4-next.2 + - @backstage/plugin-shortcuts@0.3.11-next.2 + - @backstage/plugin-stack-overflow@0.1.16-next.2 + - @backstage/plugin-stackstorm@0.1.3-next.2 + - @backstage/plugin-tech-radar@0.6.5-next.2 + - @backstage/plugin-techdocs@1.6.3-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.14-next.2 + - @backstage/plugin-techdocs-react@1.1.7-next.2 + - @backstage/plugin-todo@0.2.21-next.2 + - @backstage/plugin-user-settings@0.7.4-next.2 + - @internal/plugin-catalog-customized@0.0.11-next.2 + - @backstage/plugin-catalog-import@0.9.9-next.2 + - @backstage/plugin-newrelic-dashboard@0.2.12-next.2 + - @backstage/plugin-apache-airflow@0.2.12-next.2 + - @backstage/config@1.0.7 + - @backstage/core-app-api@1.8.1-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-permission-react@0.4.13-next.0 + +## 0.2.84-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.5.3-next.1 + - @backstage/plugin-user-settings@0.7.4-next.1 + - @backstage/plugin-pagerduty@0.5.12-next.1 + - @backstage/plugin-catalog-unprocessed-entities@0.1.0-next.0 + - @backstage/plugin-scaffolder-react@1.5.0-next.1 + - @backstage/plugin-adr@0.6.1-next.1 + - @backstage/plugin-search-react@1.6.1-next.1 + - @backstage/plugin-search@1.3.1-next.1 + - @backstage/plugin-techdocs@1.6.3-next.1 + - @backstage/core-components@0.13.2-next.1 + - @backstage/plugin-api-docs@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.7.0-next.1 + - @backstage/plugin-devtools@0.1.1-next.1 + - @backstage/catalog-model@1.4.0-next.0 + - @backstage/cli@0.22.8-next.1 + - @backstage/core-app-api@1.8.1-next.0 + - @backstage/core-plugin-api@1.5.2-next.0 + - @backstage/plugin-scaffolder@1.13.2-next.1 + - @internal/plugin-catalog-customized@0.0.11-next.1 + - @backstage/plugin-catalog-graph@0.2.31-next.1 + - @backstage/plugin-explore@0.4.4-next.1 + - @backstage/plugin-org@0.6.9-next.1 + - @backstage/integration-react@1.1.14-next.1 + - @backstage/plugin-catalog-import@0.9.9-next.1 + - @backstage/plugin-github-actions@0.6.0-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.14-next.1 + - @backstage/plugin-azure-devops@0.3.1-next.1 + - @backstage/plugin-badges@0.2.43-next.1 + - @backstage/plugin-code-coverage@0.2.12-next.1 + - @backstage/plugin-entity-feedback@0.2.2-next.1 + - @backstage/plugin-gcalendar@0.3.15-next.1 + - @backstage/plugin-gocd@0.1.25-next.1 + - @backstage/plugin-jenkins@0.8.1-next.1 + - @backstage/plugin-kubernetes@0.9.2-next.1 + - @backstage/plugin-linguist@0.1.4-next.1 + - @backstage/plugin-microsoft-calendar@0.1.4-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.12-next.1 + - @backstage/plugin-playlist@0.1.10-next.1 + - @backstage/plugin-puppetdb@0.1.2-next.1 + - @backstage/plugin-stackstorm@0.1.3-next.1 + - @backstage/plugin-tech-insights@0.3.11-next.1 + - @backstage/plugin-todo@0.2.21-next.1 + - @backstage/plugin-stack-overflow@0.1.16-next.1 + - @backstage/app-defaults@1.4.0-next.1 + - @backstage/plugin-airbrake@0.3.19-next.1 + - @backstage/plugin-apache-airflow@0.2.12-next.1 + - @backstage/plugin-azure-sites@0.1.8-next.1 + - @backstage/plugin-circleci@0.3.19-next.1 + - @backstage/plugin-cloudbuild@0.3.19-next.1 + - @backstage/plugin-cost-insights@0.12.8-next.1 + - @backstage/plugin-dynatrace@6.0.0-next.1 + - @backstage/plugin-gcp-projects@0.3.38-next.1 + - @backstage/plugin-graphiql@0.2.51-next.1 + - @backstage/plugin-kafka@0.3.19-next.1 + - @backstage/plugin-lighthouse@0.4.4-next.1 + - @backstage/plugin-newrelic@0.3.37-next.1 + - @backstage/plugin-octopus-deploy@0.2.1-next.1 + - @backstage/plugin-rollbar@0.4.19-next.1 + - @backstage/plugin-sentry@0.5.4-next.1 + - @backstage/plugin-shortcuts@0.3.11-next.1 + - @backstage/plugin-tech-radar@0.6.5-next.1 + - @backstage/plugin-techdocs-react@1.1.7-next.1 + - @backstage/plugin-catalog-common@1.0.14-next.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.4.0-next.0 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-permission-react@0.4.13-next.0 + - @backstage/plugin-search-common@1.2.4-next.0 + +## 0.2.84-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes@0.9.2-next.0 + - @backstage/plugin-user-settings@0.7.4-next.0 + - @backstage/plugin-catalog-import@0.9.9-next.0 + - @backstage/plugin-scaffolder-react@1.4.1-next.0 + - @backstage/plugin-octopus-deploy@0.2.1-next.0 + - @backstage/plugin-scaffolder@1.13.2-next.0 + - @backstage/plugin-catalog-react@1.7.0-next.0 + - @backstage/plugin-techdocs@1.6.3-next.0 + - @backstage/plugin-github-actions@0.6.0-next.0 + - @backstage/plugin-stack-overflow@0.1.16-next.0 + - @backstage/plugin-home@0.5.3-next.0 + - @backstage/app-defaults@1.4.0-next.0 + - @backstage/theme@0.4.0-next.0 + - @backstage/cli@0.22.8-next.0 + - @backstage/plugin-techdocs-react@1.1.7-next.0 + - @backstage/plugin-dynatrace@6.0.0-next.0 + - @backstage/plugin-pagerduty@0.5.12-next.0 + - @backstage/plugin-catalog-graph@0.2.31-next.0 + - @backstage/plugin-org@0.6.9-next.0 + - @backstage/plugin-airbrake@0.3.19-next.0 + - @backstage/plugin-api-docs@0.9.4-next.0 + - @backstage/plugin-azure-devops@0.3.1-next.0 + - @backstage/plugin-azure-sites@0.1.8-next.0 + - @backstage/plugin-badges@0.2.43-next.0 + - @internal/plugin-catalog-customized@0.0.11-next.0 + - @backstage/plugin-circleci@0.3.19-next.0 + - @backstage/plugin-cloudbuild@0.3.19-next.0 + - @backstage/plugin-code-coverage@0.2.12-next.0 + - @backstage/plugin-cost-insights@0.12.8-next.0 + - @backstage/plugin-entity-feedback@0.2.2-next.0 + - @backstage/plugin-explore@0.4.4-next.0 + - @backstage/plugin-gocd@0.1.25-next.0 + - @backstage/plugin-jenkins@0.8.1-next.0 + - @backstage/plugin-kafka@0.3.19-next.0 + - @backstage/plugin-lighthouse@0.4.4-next.0 + - @backstage/plugin-linguist@0.1.4-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.12-next.0 + - @backstage/plugin-playlist@0.1.10-next.0 + - @backstage/plugin-puppetdb@0.1.2-next.0 + - @backstage/plugin-rollbar@0.4.19-next.0 + - @backstage/plugin-search@1.3.1-next.0 + - @backstage/plugin-sentry@0.5.4-next.0 + - @backstage/plugin-tech-insights@0.3.11-next.0 + - @backstage/plugin-todo@0.2.21-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.14-next.0 + - @backstage/config@1.0.7 + - @backstage/core-app-api@1.8.0 + - @backstage/core-components@0.13.2-next.0 + - @backstage/core-plugin-api@1.5.1 + - @backstage/integration-react@1.1.14-next.0 + - @backstage/plugin-apache-airflow@0.2.12-next.0 + - @backstage/plugin-devtools@0.1.1-next.0 + - @backstage/plugin-gcalendar@0.3.15-next.0 + - @backstage/plugin-gcp-projects@0.3.38-next.0 + - @backstage/plugin-graphiql@0.2.51-next.0 + - @backstage/plugin-microsoft-calendar@0.1.4-next.0 + - @backstage/plugin-newrelic@0.3.37-next.0 + - @backstage/plugin-permission-react@0.4.12 + - @backstage/plugin-search-react@1.6.1-next.0 + - @backstage/plugin-shortcuts@0.3.11-next.0 + - @backstage/plugin-stackstorm@0.1.3-next.0 + - @backstage/plugin-tech-radar@0.6.5-next.0 + - @backstage/catalog-model@1.3.0 + - @backstage/plugin-catalog-common@1.0.13 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-search-common@1.2.3 + +## 0.2.83 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-tech-insights@0.3.10 + - @backstage/plugin-scaffolder@1.13.1 + - @backstage/plugin-devtools@0.1.0 + - @backstage/plugin-kubernetes@0.9.0 + - @backstage/plugin-search@1.3.0 + - @backstage/plugin-home@0.5.2 + - @backstage/plugin-explore@0.4.3 + - @backstage/theme@0.3.0 + - @backstage/plugin-techdocs@1.6.2 + - @backstage/app-defaults@1.3.1 + - @backstage/plugin-badges@0.2.42 + - @backstage/plugin-tech-radar@0.6.4 + - @backstage/cli@0.22.7 + - @backstage/plugin-stack-overflow@0.1.15 + - @backstage/plugin-gcalendar@0.3.14 + - @backstage/plugin-catalog-react@1.6.0 + - @backstage/core-app-api@1.8.0 + - @backstage/plugin-scaffolder-react@1.4.0 + - @backstage/plugin-catalog-graph@0.2.30 + - @backstage/plugin-circleci@0.3.18 + - @backstage/plugin-search-react@1.6.0 + - @backstage/plugin-org@0.6.8 + - @backstage/core-components@0.13.1 + - @backstage/plugin-azure-devops@0.3.0 + - @backstage/plugin-jenkins@0.8.0 + - @backstage/plugin-octopus-deploy@0.2.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.13 + - @backstage/plugin-user-settings@0.7.3 + - @backstage/plugin-shortcuts@0.3.10 + - @backstage/integration-react@1.1.13 + - @backstage/plugin-airbrake@0.3.18 + - @backstage/plugin-api-docs@0.9.3 + - @backstage/plugin-azure-sites@0.1.7 + - @backstage/plugin-cloudbuild@0.3.18 + - @backstage/plugin-code-coverage@0.2.11 + - @backstage/plugin-cost-insights@0.12.7 + - @backstage/plugin-dynatrace@5.0.0 + - @backstage/plugin-entity-feedback@0.2.1 + - @backstage/plugin-gcp-projects@0.3.37 + - @backstage/plugin-github-actions@0.5.18 + - @backstage/plugin-gocd@0.1.24 + - @backstage/plugin-graphiql@0.2.50 + - @backstage/plugin-kafka@0.3.18 + - @backstage/plugin-lighthouse@0.4.3 + - @backstage/plugin-linguist@0.1.3 + - @backstage/plugin-microsoft-calendar@0.1.3 + - @backstage/plugin-newrelic@0.3.36 + - @backstage/plugin-pagerduty@0.5.11 + - @backstage/plugin-playlist@0.1.9 + - @backstage/plugin-puppetdb@0.1.1 + - @backstage/plugin-rollbar@0.4.18 + - @backstage/plugin-sentry@0.5.3 + - @backstage/plugin-stackstorm@0.1.2 + - @backstage/plugin-techdocs-react@1.1.6 + - @backstage/plugin-todo@0.2.20 + - @backstage/catalog-model@1.3.0 + - @backstage/config@1.0.7 + - @backstage/core-plugin-api@1.5.1 + - @backstage/plugin-apache-airflow@0.2.11 + - @backstage/plugin-catalog-common@1.0.13 + - @backstage/plugin-catalog-import@0.9.8 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-newrelic-dashboard@0.2.11 + - @backstage/plugin-permission-react@0.4.12 + - @backstage/plugin-search-common@1.2.3 + - @internal/plugin-catalog-customized@0.0.10 + +## 0.2.83-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-devtools@0.1.0-next.0 + - @backstage/plugin-kubernetes@0.9.0-next.2 + - @backstage/plugin-home@0.5.2-next.2 + - @backstage/theme@0.3.0-next.0 + - @backstage/plugin-badges@0.2.42-next.2 + - @backstage/plugin-tech-radar@0.6.4-next.2 + - @backstage/plugin-scaffolder-react@1.4.0-next.2 + - @backstage/plugin-explore@0.4.3-next.2 + - @backstage/plugin-org@0.6.8-next.2 + - @backstage/core-components@0.13.1-next.1 + - @backstage/plugin-search-react@1.6.0-next.2 + - @backstage/plugin-azure-devops@0.3.0-next.2 + - @backstage/plugin-stack-overflow@0.1.15-next.2 + - @backstage/app-defaults@1.3.1-next.2 + - @backstage/cli@0.22.7-next.0 + - @backstage/integration-react@1.1.13-next.2 + - @backstage/plugin-airbrake@0.3.18-next.2 + - @backstage/plugin-api-docs@0.9.3-next.2 + - @backstage/plugin-azure-sites@0.1.7-next.2 + - @backstage/plugin-catalog-graph@0.2.30-next.2 + - @backstage/plugin-catalog-react@1.6.0-next.2 + - @backstage/plugin-circleci@0.3.18-next.2 + - @backstage/plugin-cloudbuild@0.3.18-next.2 + - @backstage/plugin-code-coverage@0.2.11-next.2 + - @backstage/plugin-cost-insights@0.12.7-next.2 + - @backstage/plugin-dynatrace@5.0.0-next.2 + - @backstage/plugin-entity-feedback@0.2.1-next.2 + - @backstage/plugin-gcalendar@0.3.14-next.1 + - @backstage/plugin-gcp-projects@0.3.37-next.1 + - @backstage/plugin-github-actions@0.5.18-next.2 + - @backstage/plugin-gocd@0.1.24-next.2 + - @backstage/plugin-graphiql@0.2.50-next.1 + - @backstage/plugin-jenkins@0.7.17-next.2 + - @backstage/plugin-kafka@0.3.18-next.2 + - @backstage/plugin-lighthouse@0.4.3-next.2 + - @backstage/plugin-linguist@0.1.3-next.2 + - @backstage/plugin-microsoft-calendar@0.1.3-next.1 + - @backstage/plugin-newrelic@0.3.36-next.1 + - @backstage/plugin-octopus-deploy@0.2.0-next.2 + - @backstage/plugin-pagerduty@0.5.11-next.2 + - @backstage/plugin-playlist@0.1.9-next.2 + - @backstage/plugin-puppetdb@0.1.1-next.2 + - @backstage/plugin-rollbar@0.4.18-next.2 + - @backstage/plugin-scaffolder@1.13.1-next.2 + - @backstage/plugin-search@1.3.0-next.2 + - @backstage/plugin-sentry@0.5.3-next.2 + - @backstage/plugin-shortcuts@0.3.10-next.2 + - @backstage/plugin-stackstorm@0.1.2-next.1 + - @backstage/plugin-tech-insights@0.3.10-next.2 + - @backstage/plugin-techdocs@1.6.2-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.13-next.2 + - @backstage/plugin-techdocs-react@1.1.6-next.1 + - @backstage/plugin-todo@0.2.20-next.2 + - @backstage/plugin-user-settings@0.7.3-next.2 + - @backstage/plugin-apache-airflow@0.2.11-next.1 + - @backstage/plugin-catalog-import@0.9.8-next.2 + - @backstage/plugin-newrelic-dashboard@0.2.11-next.2 + - @backstage/config@1.0.7 + - @backstage/core-app-api@1.8.0-next.1 + - @backstage/core-plugin-api@1.5.1 + - @backstage/plugin-permission-react@0.4.12 + - @internal/plugin-catalog-customized@0.0.10-next.2 + +## 0.2.83-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-tech-insights@0.3.10-next.1 + - @backstage/plugin-scaffolder@1.13.1-next.1 + - @backstage/plugin-search@1.3.0-next.1 + - @backstage/plugin-explore@0.4.3-next.1 + - @backstage/app-defaults@1.3.1-next.1 + - @backstage/plugin-kubernetes@0.9.0-next.1 + - @backstage/core-app-api@1.8.0-next.1 + - @backstage/plugin-catalog-graph@0.2.30-next.1 + - @backstage/plugin-home@0.5.2-next.1 + - @backstage/plugin-octopus-deploy@0.2.0-next.1 + - @backstage/plugin-circleci@0.3.18-next.1 + - @backstage/core-components@0.13.1-next.0 + - @backstage/cli@0.22.7-next.0 + - @backstage/plugin-airbrake@0.3.18-next.1 + - @backstage/core-plugin-api@1.5.1 + - @backstage/plugin-apache-airflow@0.2.11-next.0 + - @backstage/plugin-api-docs@0.9.3-next.1 + - @backstage/plugin-azure-devops@0.2.9-next.1 + - @backstage/plugin-azure-sites@0.1.7-next.1 + - @backstage/plugin-badges@0.2.42-next.1 + - @backstage/plugin-catalog-import@0.9.8-next.1 + - @backstage/plugin-catalog-react@1.6.0-next.1 + - @backstage/plugin-cloudbuild@0.3.18-next.1 + - @backstage/plugin-code-coverage@0.2.11-next.1 + - @backstage/plugin-cost-insights@0.12.7-next.1 + - @backstage/plugin-dynatrace@5.0.0-next.1 + - @backstage/plugin-entity-feedback@0.2.1-next.1 + - @backstage/plugin-gcalendar@0.3.14-next.0 + - @backstage/plugin-gcp-projects@0.3.37-next.0 + - @backstage/plugin-github-actions@0.5.18-next.1 + - @backstage/plugin-gocd@0.1.24-next.1 + - @backstage/plugin-graphiql@0.2.50-next.0 + - @backstage/plugin-jenkins@0.7.17-next.1 + - @backstage/plugin-kafka@0.3.18-next.1 + - @backstage/plugin-lighthouse@0.4.3-next.1 + - @backstage/plugin-linguist@0.1.3-next.1 + - @backstage/plugin-microsoft-calendar@0.1.3-next.0 + - @backstage/plugin-newrelic@0.3.36-next.0 + - @backstage/plugin-org@0.6.8-next.1 + - @backstage/plugin-pagerduty@0.5.11-next.1 + - @backstage/plugin-playlist@0.1.9-next.1 + - @backstage/plugin-puppetdb@0.1.1-next.1 + - @backstage/plugin-rollbar@0.4.18-next.1 + - @backstage/plugin-scaffolder-react@1.3.1-next.1 + - @backstage/plugin-search-react@1.6.0-next.1 + - @backstage/plugin-sentry@0.5.3-next.1 + - @backstage/plugin-shortcuts@0.3.10-next.1 + - @backstage/plugin-stack-overflow@0.1.15-next.1 + - @backstage/plugin-stackstorm@0.1.2-next.0 + - @backstage/plugin-tech-radar@0.6.4-next.1 + - @backstage/plugin-techdocs@1.6.2-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.13-next.1 + - @backstage/plugin-todo@0.2.20-next.1 + - @backstage/plugin-user-settings@0.7.3-next.1 + - @backstage/integration-react@1.1.13-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.11-next.1 + - @backstage/plugin-techdocs-react@1.1.6-next.0 + - @backstage/config@1.0.7 + - @backstage/plugin-permission-react@0.4.12 + - @internal/plugin-catalog-customized@0.0.10-next.1 + +## 0.2.83-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.6.2-next.0 + - @backstage/plugin-stack-overflow@0.1.14-next.0 + - @backstage/plugin-catalog-react@1.6.0-next.0 + - @backstage/plugin-circleci@0.3.18-next.0 + - @backstage/plugin-search-react@1.6.0-next.0 + - @backstage/plugin-search@1.3.0-next.0 + - @backstage/plugin-home@0.5.1-next.0 + - @backstage/core-app-api@1.7.1-next.0 + - @backstage/plugin-scaffolder-react@1.3.1-next.0 + - @backstage/plugin-scaffolder@1.13.1-next.0 + - @backstage/plugin-shortcuts@0.3.10-next.0 + - @backstage/plugin-tech-radar@0.6.4-next.0 + - @backstage/cli@0.22.7-next.0 + - @backstage/plugin-airbrake@0.3.18-next.0 + - @backstage/plugin-api-docs@0.9.3-next.0 + - @backstage/plugin-azure-devops@0.2.9-next.0 + - @backstage/plugin-azure-sites@0.1.7-next.0 + - @backstage/plugin-badges@0.2.42-next.0 + - @internal/plugin-catalog-customized@0.0.10-next.0 + - @backstage/plugin-catalog-graph@0.2.30-next.0 + - @backstage/plugin-catalog-import@0.9.8-next.0 + - @backstage/plugin-cloudbuild@0.3.18-next.0 + - @backstage/plugin-code-coverage@0.2.11-next.0 + - @backstage/plugin-cost-insights@0.12.7-next.0 + - @backstage/plugin-dynatrace@5.0.0-next.0 + - @backstage/plugin-entity-feedback@0.2.1-next.0 + - @backstage/plugin-explore@0.4.3-next.0 + - @backstage/plugin-github-actions@0.5.18-next.0 + - @backstage/plugin-gocd@0.1.24-next.0 + - @backstage/plugin-jenkins@0.7.17-next.0 + - @backstage/plugin-kafka@0.3.18-next.0 + - @backstage/plugin-kubernetes@0.8.1-next.0 + - @backstage/plugin-lighthouse@0.4.3-next.0 + - @backstage/plugin-linguist@0.1.3-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.11-next.0 + - @backstage/plugin-org@0.6.8-next.0 + - @backstage/plugin-pagerduty@0.5.11-next.0 + - @backstage/plugin-playlist@0.1.9-next.0 + - @backstage/plugin-puppetdb@0.1.1-next.0 + - @backstage/plugin-rollbar@0.4.18-next.0 + - @backstage/plugin-sentry@0.5.3-next.0 + - @backstage/plugin-tech-insights@0.3.10-next.0 + - @backstage/plugin-todo@0.2.20-next.0 + - @backstage/plugin-user-settings@0.7.3-next.0 + - @backstage/integration-react@1.1.13-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.13-next.0 + - @backstage/app-defaults@1.3.1-next.0 + - @backstage/core-components@0.13.0 + - @backstage/core-plugin-api@1.5.1 + - @backstage/plugin-apache-airflow@0.2.10 + - @backstage/plugin-gcalendar@0.3.13 + - @backstage/plugin-gcp-projects@0.3.36 + - @backstage/plugin-graphiql@0.2.49 + - @backstage/plugin-microsoft-calendar@0.1.2 + - @backstage/plugin-newrelic@0.3.35 + - @backstage/plugin-stackstorm@0.1.1 + - @backstage/catalog-model@1.3.0 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.19 + - @backstage/plugin-catalog-common@1.0.13 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-permission-react@0.4.12 + - @backstage/plugin-search-common@1.2.3 + - @backstage/plugin-techdocs-react@1.1.5 + +## 0.2.82 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.13.0 + - @backstage/plugin-kubernetes@0.8.0 + - @backstage/cli@0.22.6 + - @backstage/plugin-circleci@0.3.17 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.12 + - @backstage/plugin-scaffolder-react@1.3.0 + - @backstage/plugin-scaffolder@1.13.0 + - @backstage/plugin-api-docs@0.9.2 + - @backstage/plugin-org@0.6.7 + - @backstage/plugin-entity-feedback@0.2.0 + - @backstage/plugin-catalog-react@1.5.0 + - @backstage/plugin-techdocs@1.6.1 + - @backstage/plugin-puppetdb@0.1.0 + - @backstage/plugin-explore@0.4.2 + - @backstage/plugin-tech-insights@0.3.9 + - @backstage/app-defaults@1.3.0 + - @backstage/core-app-api@1.7.0 + - @backstage/plugin-search-react@1.5.2 + - @backstage/plugin-code-coverage@0.2.10 + - @backstage/plugin-cost-insights@0.12.6 + - @backstage/plugin-playlist@0.1.8 + - @backstage/plugin-home@0.5.0 + - @backstage/plugin-dynatrace@4.0.0 + - @backstage/plugin-airbrake@0.3.17 + - @backstage/plugin-techdocs-react@1.1.5 + - @backstage/integration-react@1.1.12 + - @backstage/plugin-stackstorm@0.1.1 + - @backstage/plugin-linguist@0.1.2 + - @backstage/plugin-newrelic-dashboard@0.2.10 + - @backstage/plugin-apache-airflow@0.2.10 + - @backstage/plugin-catalog-import@0.9.7 + - @backstage/plugin-github-actions@0.5.17 + - @backstage/plugin-catalog-graph@0.2.29 + - @backstage/plugin-user-settings@0.7.2 + - @backstage/plugin-azure-devops@0.2.8 + - @backstage/plugin-gcp-projects@0.3.36 + - @backstage/plugin-azure-sites@0.1.6 + - @backstage/plugin-cloudbuild@0.3.17 + - @backstage/plugin-lighthouse@0.4.2 + - @backstage/plugin-tech-radar@0.6.3 + - @backstage/plugin-gcalendar@0.3.13 + - @backstage/plugin-pagerduty@0.5.10 + - @backstage/plugin-shortcuts@0.3.9 + - @backstage/plugin-graphiql@0.2.49 + - @backstage/plugin-newrelic@0.3.35 + - @backstage/plugin-jenkins@0.7.16 + - @backstage/plugin-rollbar@0.4.17 + - @backstage/plugin-badges@0.2.41 + - @backstage/plugin-search@1.2.0 + - @backstage/plugin-sentry@0.5.2 + - @backstage/plugin-kafka@0.3.17 + - @backstage/plugin-gocd@0.1.23 + - @backstage/plugin-todo@0.2.19 + - @backstage/theme@0.2.19 + - @backstage/core-plugin-api@1.5.1 + - @backstage/catalog-model@1.3.0 + - @backstage/plugin-microsoft-calendar@0.1.2 + - @backstage/plugin-permission-react@0.4.12 + - @backstage/plugin-stack-overflow@0.1.13 + - @backstage/config@1.0.7 + - @backstage/plugin-catalog-common@1.0.13 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-search-common@1.2.3 + - @internal/plugin-catalog-customized@0.0.9 + +## 0.2.82-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes@0.8.0-next.3 + - @backstage/plugin-scaffolder@1.13.0-next.3 + - @backstage/cli@0.22.6-next.3 + - @backstage/plugin-explore@0.4.2-next.3 + - @backstage/plugin-catalog-react@1.5.0-next.3 + - @backstage/plugin-scaffolder-react@1.3.0-next.3 + - @backstage/core-app-api@1.7.0-next.3 + - @backstage/catalog-model@1.3.0-next.0 + - @backstage/plugin-techdocs@1.6.1-next.3 + - @backstage/core-components@0.13.0-next.3 + - @backstage/app-defaults@1.3.0-next.3 + - @backstage/config@1.0.7 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/integration-react@1.1.12-next.3 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-airbrake@0.3.17-next.3 + - @backstage/plugin-apache-airflow@0.2.10-next.3 + - @backstage/plugin-api-docs@0.9.2-next.3 + - @backstage/plugin-azure-devops@0.2.8-next.3 + - @backstage/plugin-azure-sites@0.1.6-next.3 + - @backstage/plugin-badges@0.2.41-next.3 + - @backstage/plugin-catalog-common@1.0.13-next.1 + - @backstage/plugin-catalog-graph@0.2.29-next.3 + - @backstage/plugin-catalog-import@0.9.7-next.3 + - @backstage/plugin-circleci@0.3.17-next.3 + - @backstage/plugin-cloudbuild@0.3.17-next.3 + - @backstage/plugin-code-coverage@0.2.10-next.3 + - @backstage/plugin-cost-insights@0.12.6-next.3 + - @backstage/plugin-dynatrace@4.0.0-next.3 + - @backstage/plugin-entity-feedback@0.2.0-next.3 + - @backstage/plugin-gcalendar@0.3.13-next.3 + - @backstage/plugin-gcp-projects@0.3.36-next.3 + - @backstage/plugin-github-actions@0.5.17-next.3 + - @backstage/plugin-gocd@0.1.23-next.3 + - @backstage/plugin-graphiql@0.2.49-next.3 + - @backstage/plugin-home@0.4.33-next.3 + - @backstage/plugin-jenkins@0.7.16-next.3 + - @backstage/plugin-kafka@0.3.17-next.3 + - @backstage/plugin-lighthouse@0.4.2-next.3 + - @backstage/plugin-linguist@0.1.2-next.3 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-microsoft-calendar@0.1.2-next.3 + - @backstage/plugin-newrelic@0.3.35-next.3 + - @backstage/plugin-newrelic-dashboard@0.2.10-next.3 + - @backstage/plugin-org@0.6.7-next.3 + - @backstage/plugin-pagerduty@0.5.10-next.3 + - @backstage/plugin-permission-react@0.4.12-next.1 + - @backstage/plugin-playlist@0.1.8-next.3 + - @backstage/plugin-rollbar@0.4.17-next.3 + - @backstage/plugin-search@1.2.0-next.3 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-search-react@1.5.2-next.3 + - @backstage/plugin-sentry@0.5.2-next.3 + - @backstage/plugin-shortcuts@0.3.9-next.3 + - @backstage/plugin-stack-overflow@0.1.13-next.3 + - @backstage/plugin-stackstorm@0.1.1-next.3 + - @backstage/plugin-tech-insights@0.3.9-next.3 + - @backstage/plugin-tech-radar@0.6.3-next.3 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.12-next.3 + - @backstage/plugin-techdocs-react@1.1.5-next.3 + - @backstage/plugin-todo@0.2.19-next.3 + - @backstage/plugin-user-settings@0.7.2-next.3 + - @internal/plugin-catalog-customized@0.0.9-next.3 + +## 0.2.82-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-circleci@0.3.17-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.12-next.2 + - @backstage/cli@0.22.6-next.2 + - @backstage/core-components@0.12.6-next.2 + - @backstage/plugin-catalog-react@1.4.1-next.2 + - @backstage/plugin-scaffolder-react@1.3.0-next.2 + - @backstage/plugin-scaffolder@1.13.0-next.2 + - @backstage/plugin-code-coverage@0.2.10-next.2 + - @backstage/plugin-cost-insights@0.12.6-next.2 + - @backstage/plugin-playlist@0.1.8-next.2 + - @backstage/plugin-search@1.2.0-next.2 + - @backstage/core-plugin-api@1.5.1-next.1 + - @backstage/plugin-techdocs@1.6.1-next.2 + - @backstage/app-defaults@1.3.0-next.2 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/core-app-api@1.7.0-next.2 + - @backstage/integration-react@1.1.12-next.2 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-airbrake@0.3.17-next.2 + - @backstage/plugin-apache-airflow@0.2.10-next.2 + - @backstage/plugin-api-docs@0.9.2-next.2 + - @backstage/plugin-azure-devops@0.2.8-next.2 + - @backstage/plugin-azure-sites@0.1.6-next.2 + - @backstage/plugin-badges@0.2.41-next.2 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-catalog-graph@0.2.29-next.2 + - @backstage/plugin-catalog-import@0.9.7-next.2 + - @backstage/plugin-cloudbuild@0.3.17-next.2 + - @backstage/plugin-dynatrace@3.0.1-next.2 + - @backstage/plugin-entity-feedback@0.2.0-next.2 + - @backstage/plugin-explore@0.4.2-next.2 + - @backstage/plugin-gcalendar@0.3.13-next.2 + - @backstage/plugin-gcp-projects@0.3.36-next.2 + - @backstage/plugin-github-actions@0.5.17-next.2 + - @backstage/plugin-gocd@0.1.23-next.2 + - @backstage/plugin-graphiql@0.2.49-next.2 + - @backstage/plugin-home@0.4.33-next.2 + - @backstage/plugin-jenkins@0.7.16-next.2 + - @backstage/plugin-kafka@0.3.17-next.2 + - @backstage/plugin-kubernetes@0.7.10-next.2 + - @backstage/plugin-lighthouse@0.4.2-next.2 + - @backstage/plugin-linguist@0.1.2-next.2 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-microsoft-calendar@0.1.2-next.2 + - @backstage/plugin-newrelic@0.3.35-next.2 + - @backstage/plugin-newrelic-dashboard@0.2.10-next.2 + - @backstage/plugin-org@0.6.7-next.2 + - @backstage/plugin-pagerduty@0.5.10-next.2 + - @backstage/plugin-permission-react@0.4.12-next.1 + - @backstage/plugin-rollbar@0.4.17-next.2 + - @backstage/plugin-search-common@1.2.3-next.0 + - @backstage/plugin-search-react@1.5.2-next.2 + - @backstage/plugin-sentry@0.5.2-next.2 + - @backstage/plugin-shortcuts@0.3.9-next.2 + - @backstage/plugin-stack-overflow@0.1.13-next.2 + - @backstage/plugin-stackstorm@0.1.1-next.2 + - @backstage/plugin-tech-insights@0.3.9-next.2 + - @backstage/plugin-tech-radar@0.6.3-next.2 + - @backstage/plugin-techdocs-react@1.1.5-next.2 + - @backstage/plugin-todo@0.2.19-next.2 + - @backstage/plugin-user-settings@0.7.2-next.2 + - @internal/plugin-catalog-customized@0.0.9-next.2 + +## 0.2.82-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.6-next.1 + - @backstage/cli@0.22.6-next.1 + - @backstage/plugin-org@0.6.7-next.1 + - @backstage/plugin-techdocs@1.6.1-next.1 + - @backstage/plugin-scaffolder-react@1.3.0-next.1 + - @backstage/core-app-api@1.7.0-next.1 + - @backstage/plugin-scaffolder@1.13.0-next.1 + - @backstage/plugin-dynatrace@3.0.1-next.1 + - @backstage/plugin-airbrake@0.3.17-next.1 + - @backstage/plugin-circleci@0.3.17-next.1 + - @backstage/integration-react@1.1.12-next.1 + - @backstage/plugin-stackstorm@0.1.1-next.1 + - @backstage/plugin-linguist@0.1.2-next.1 + - @backstage/plugin-playlist@0.1.8-next.1 + - @backstage/plugin-graphiql@0.2.49-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.12-next.1 + - @backstage/plugin-microsoft-calendar@0.1.2-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.10-next.1 + - @backstage/core-plugin-api@1.5.1-next.0 + - @backstage/plugin-permission-react@0.4.12-next.0 + - @backstage/plugin-entity-feedback@0.2.0-next.1 + - @backstage/plugin-apache-airflow@0.2.10-next.1 + - @backstage/plugin-catalog-import@0.9.7-next.1 + - @backstage/plugin-github-actions@0.5.17-next.1 + - @backstage/plugin-stack-overflow@0.1.13-next.1 + - @backstage/plugin-techdocs-react@1.1.5-next.1 + - @backstage/plugin-catalog-graph@0.2.29-next.1 + - @backstage/plugin-catalog-react@1.4.1-next.1 + - @backstage/plugin-code-coverage@0.2.10-next.1 + - @backstage/plugin-cost-insights@0.12.6-next.1 + - @backstage/plugin-tech-insights@0.3.9-next.1 + - @backstage/plugin-user-settings@0.7.2-next.1 + - @backstage/plugin-azure-devops@0.2.8-next.1 + - @backstage/plugin-gcp-projects@0.3.36-next.1 + - @backstage/plugin-search-react@1.5.2-next.1 + - @backstage/plugin-azure-sites@0.1.6-next.1 + - @backstage/plugin-cloudbuild@0.3.17-next.1 + - @backstage/plugin-kubernetes@0.7.10-next.1 + - @backstage/plugin-lighthouse@0.4.2-next.1 + - @backstage/plugin-tech-radar@0.6.3-next.1 + - @backstage/plugin-gcalendar@0.3.13-next.1 + - @backstage/plugin-pagerduty@0.5.10-next.1 + - @backstage/plugin-shortcuts@0.3.9-next.1 + - @backstage/plugin-api-docs@0.9.2-next.1 + - @backstage/plugin-newrelic@0.3.35-next.1 + - @backstage/plugin-explore@0.4.2-next.1 + - @backstage/plugin-jenkins@0.7.16-next.1 + - @backstage/plugin-rollbar@0.4.17-next.1 + - @backstage/theme@0.2.19-next.0 + - @backstage/plugin-badges@0.2.41-next.1 + - @backstage/plugin-search@1.1.2-next.1 + - @backstage/plugin-sentry@0.5.2-next.1 + - @backstage/plugin-kafka@0.3.17-next.1 + - @backstage/plugin-gocd@0.1.23-next.1 + - @backstage/plugin-home@0.4.33-next.1 + - @backstage/plugin-todo@0.2.19-next.1 + - @backstage/app-defaults@1.3.0-next.1 + - @backstage/catalog-model@1.2.1 + - @backstage/config@1.0.7 + - @backstage/plugin-catalog-common@1.0.13-next.0 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-search-common@1.2.3-next.0 + - @internal/plugin-catalog-customized@0.0.9-next.1 + +## 0.2.82-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-api-docs@0.9.2-next.0 + - @backstage/plugin-scaffolder@1.13.0-next.0 + - @backstage/plugin-scaffolder-react@1.3.0-next.0 + - @backstage/plugin-entity-feedback@0.2.0-next.0 + - @backstage/plugin-tech-insights@0.3.9-next.0 + - @backstage/core-components@0.12.6-next.0 + - @backstage/app-defaults@1.3.0-next.0 + - @backstage/core-app-api@1.7.0-next.0 + - @backstage/plugin-search-react@1.5.2-next.0 + - @backstage/plugin-techdocs@1.6.1-next.0 + - @backstage/cli@0.22.6-next.0 + - @backstage/plugin-techdocs-react@1.1.5-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.12-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.10-next.0 + - @backstage/plugin-apache-airflow@0.2.10-next.0 + - @backstage/plugin-catalog-import@0.9.7-next.0 + - @backstage/plugin-github-actions@0.5.17-next.0 + - @backstage/plugin-catalog-graph@0.2.29-next.0 + - @backstage/plugin-catalog-react@1.4.1-next.0 + - @backstage/plugin-code-coverage@0.2.10-next.0 + - @backstage/plugin-cost-insights@0.12.6-next.0 + - @backstage/plugin-user-settings@0.7.2-next.0 + - @backstage/plugin-azure-devops@0.2.8-next.0 + - @backstage/plugin-gcp-projects@0.3.36-next.0 + - @backstage/plugin-azure-sites@0.1.6-next.0 + - @backstage/plugin-cloudbuild@0.3.17-next.0 + - @backstage/plugin-kubernetes@0.7.10-next.0 + - @backstage/plugin-lighthouse@0.4.2-next.0 + - @backstage/plugin-tech-radar@0.6.3-next.0 + - @backstage/plugin-dynatrace@3.0.1-next.0 + - @backstage/plugin-gcalendar@0.3.13-next.0 + - @backstage/plugin-pagerduty@0.5.10-next.0 + - @backstage/plugin-shortcuts@0.3.9-next.0 + - @backstage/plugin-airbrake@0.3.17-next.0 + - @backstage/plugin-circleci@0.3.17-next.0 + - @backstage/plugin-graphiql@0.2.49-next.0 + - @backstage/plugin-newrelic@0.3.35-next.0 + - @backstage/plugin-explore@0.4.2-next.0 + - @backstage/plugin-jenkins@0.7.16-next.0 + - @backstage/plugin-rollbar@0.4.17-next.0 + - @backstage/plugin-badges@0.2.41-next.0 + - @backstage/plugin-search@1.1.2-next.0 + - @backstage/plugin-sentry@0.5.2-next.0 + - @backstage/plugin-kafka@0.3.17-next.0 + - @backstage/plugin-gocd@0.1.23-next.0 + - @backstage/plugin-home@0.4.33-next.0 + - @backstage/plugin-todo@0.2.19-next.0 + - @backstage/plugin-org@0.6.7-next.0 + - @internal/plugin-catalog-customized@0.0.9-next.0 + - @backstage/integration-react@1.1.12-next.0 + - @backstage/plugin-linguist@0.1.2-next.0 + - @backstage/plugin-microsoft-calendar@0.1.2-next.0 + - @backstage/plugin-playlist@0.1.8-next.0 + - @backstage/plugin-stack-overflow@0.1.13-next.0 + - @backstage/plugin-stackstorm@0.1.1-next.0 + - @backstage/core-plugin-api@1.5.0 + - @backstage/config@1.0.7 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/catalog-model@1.2.1 + - @backstage/theme@0.2.18 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-search-common@1.2.2 + +## 0.2.81 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5 + - @backstage/plugin-scaffolder-react@1.2.0 + - @backstage/plugin-techdocs-react@1.1.4 + - @backstage/plugin-catalog-react@1.4.0 + - @backstage/plugin-tech-insights@0.3.8 + - @backstage/plugin-search-react@1.5.1 + - @backstage/plugin-scaffolder@1.12.0 + - @backstage/plugin-techdocs@1.6.0 + - @backstage/plugin-explore@0.4.1 + - @backstage/plugin-search@1.1.1 + - @backstage/cli@0.22.4 + - @backstage/plugin-kubernetes@0.7.9 + - @backstage/plugin-tech-radar@0.6.2 + - @backstage/plugin-microsoft-calendar@0.1.1 + - @backstage/plugin-newrelic-dashboard@0.2.9 + - @backstage/plugin-code-coverage@0.2.9 + - @backstage/plugin-azure-sites@0.1.5 + - @backstage/plugin-gcalendar@0.3.12 + - @backstage/plugin-shortcuts@0.3.8 + - @backstage/plugin-org@0.6.6 + - @backstage/plugin-api-docs@0.9.1 + - @backstage/plugin-stackstorm@0.1.0 + - @backstage/plugin-circleci@0.3.16 + - @backstage/plugin-playlist@0.1.7 + - @backstage/core-plugin-api@1.5.0 + - @backstage/catalog-model@1.2.1 + - @backstage/plugin-catalog-common@1.0.12 + - @backstage/plugin-cost-insights@0.12.5 + - @backstage/plugin-jenkins@0.7.15 + - @backstage/core-app-api@1.6.0 + - @backstage/integration-react@1.1.11 + - @backstage/plugin-airbrake@0.3.16 + - @backstage/plugin-apache-airflow@0.2.9 + - @backstage/plugin-azure-devops@0.2.7 + - @backstage/plugin-badges@0.2.40 + - @backstage/plugin-catalog-import@0.9.6 + - @backstage/plugin-cloudbuild@0.3.16 + - @backstage/plugin-dynatrace@3.0.0 + - @backstage/plugin-entity-feedback@0.1.1 + - @backstage/plugin-gcp-projects@0.3.35 + - @backstage/plugin-github-actions@0.5.16 + - @backstage/plugin-gocd@0.1.22 + - @backstage/plugin-graphiql@0.2.48 + - @backstage/plugin-home@0.4.32 + - @backstage/plugin-kafka@0.3.16 + - @backstage/plugin-lighthouse@0.4.1 + - @backstage/plugin-linguist@0.1.1 + - @backstage/plugin-newrelic@0.3.34 + - @backstage/plugin-pagerduty@0.5.9 + - @backstage/plugin-rollbar@0.4.16 + - @backstage/plugin-sentry@0.5.1 + - @backstage/plugin-stack-overflow@0.1.12 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.11 + - @backstage/plugin-todo@0.2.18 + - @backstage/plugin-user-settings@0.7.1 + - @backstage/config@1.0.7 + - @backstage/theme@0.2.18 + - @internal/plugin-catalog-customized@0.0.8 + - @backstage/plugin-catalog-graph@0.2.28 + - @backstage/app-defaults@1.2.1 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-permission-react@0.4.11 + - @backstage/plugin-search-common@1.2.2 + +## 0.2.81-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.5-next.2 + - @backstage/plugin-scaffolder-react@1.2.0-next.2 + - @backstage/plugin-techdocs-react@1.1.4-next.2 + - @backstage/plugin-catalog-react@1.4.0-next.2 + - @backstage/plugin-tech-insights@0.3.8-next.2 + - @backstage/plugin-search-react@1.5.1-next.2 + - @backstage/plugin-scaffolder@1.12.0-next.2 + - @backstage/plugin-techdocs@1.6.0-next.2 + - @backstage/plugin-explore@0.4.1-next.2 + - @backstage/plugin-search@1.1.1-next.2 + - @backstage/plugin-kubernetes@0.7.9-next.2 + - @backstage/plugin-api-docs@0.9.1-next.2 + - @backstage/core-app-api@1.6.0-next.2 + - @backstage/plugin-org@0.6.6-next.2 + - @backstage/core-plugin-api@1.5.0-next.2 + - @backstage/app-defaults@1.2.1-next.2 + - @backstage/cli@0.22.4-next.1 + - @backstage/integration-react@1.1.11-next.2 + - @backstage/plugin-airbrake@0.3.16-next.2 + - @backstage/plugin-apache-airflow@0.2.9-next.2 + - @backstage/plugin-azure-devops@0.2.7-next.2 + - @backstage/plugin-azure-sites@0.1.5-next.2 + - @backstage/plugin-badges@0.2.40-next.2 + - @backstage/plugin-catalog-graph@0.2.28-next.2 + - @backstage/plugin-catalog-import@0.9.6-next.2 + - @backstage/plugin-circleci@0.3.16-next.2 + - @backstage/plugin-cloudbuild@0.3.16-next.2 + - @backstage/plugin-code-coverage@0.2.9-next.2 + - @backstage/plugin-cost-insights@0.12.5-next.2 + - @backstage/plugin-dynatrace@3.0.0-next.2 + - @backstage/plugin-entity-feedback@0.1.1-next.2 + - @backstage/plugin-gcalendar@0.3.12-next.2 + - @backstage/plugin-gcp-projects@0.3.35-next.2 + - @backstage/plugin-github-actions@0.5.16-next.2 + - @backstage/plugin-gocd@0.1.22-next.2 + - @backstage/plugin-graphiql@0.2.48-next.2 + - @backstage/plugin-home@0.4.32-next.2 + - @backstage/plugin-jenkins@0.7.15-next.2 + - @backstage/plugin-kafka@0.3.16-next.2 + - @backstage/plugin-lighthouse@0.4.1-next.2 + - @backstage/plugin-linguist@0.1.1-next.2 + - @backstage/plugin-microsoft-calendar@0.1.1-next.2 + - @backstage/plugin-newrelic@0.3.34-next.2 + - @backstage/plugin-newrelic-dashboard@0.2.9-next.2 + - @backstage/plugin-pagerduty@0.5.9-next.2 + - @backstage/plugin-playlist@0.1.7-next.2 + - @backstage/plugin-rollbar@0.4.16-next.2 + - @backstage/plugin-sentry@0.5.1-next.2 + - @backstage/plugin-shortcuts@0.3.8-next.2 + - @backstage/plugin-stack-overflow@0.1.12-next.2 + - @backstage/plugin-stackstorm@0.1.0-next.2 + - @backstage/plugin-tech-radar@0.6.2-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.11-next.2 + - @backstage/plugin-todo@0.2.18-next.2 + - @backstage/plugin-user-settings@0.7.1-next.2 + - @internal/plugin-catalog-customized@0.0.8-next.2 + - @backstage/plugin-permission-react@0.4.11-next.2 + - @backstage/config@1.0.7-next.0 + +## 0.2.81-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.4-next.1 + - @backstage/plugin-scaffolder@1.12.0-next.1 + - @backstage/plugin-scaffolder-react@1.2.0-next.1 + - @backstage/plugin-techdocs@1.6.0-next.1 + - @backstage/plugin-tech-radar@0.6.2-next.1 + - @backstage/plugin-microsoft-calendar@0.1.1-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.9-next.1 + - @backstage/core-components@0.12.5-next.1 + - @backstage/plugin-code-coverage@0.2.9-next.1 + - @backstage/plugin-azure-sites@0.1.5-next.1 + - @backstage/plugin-gcalendar@0.3.12-next.1 + - @backstage/plugin-shortcuts@0.3.8-next.1 + - @backstage/plugin-explore@0.4.1-next.1 + - @backstage/plugin-org@0.6.6-next.1 + - @backstage/plugin-kubernetes@0.7.9-next.1 + - @backstage/plugin-circleci@0.3.16-next.1 + - @backstage/plugin-playlist@0.1.7-next.1 + - @backstage/plugin-techdocs-react@1.1.4-next.1 + - @backstage/core-app-api@1.5.1-next.1 + - @backstage/core-plugin-api@1.4.1-next.1 + - @backstage/integration-react@1.1.11-next.1 + - @backstage/plugin-airbrake@0.3.16-next.1 + - @backstage/plugin-apache-airflow@0.2.9-next.1 + - @backstage/plugin-api-docs@0.9.1-next.1 + - @backstage/plugin-azure-devops@0.2.7-next.1 + - @backstage/plugin-badges@0.2.40-next.1 + - @backstage/plugin-catalog-import@0.9.6-next.1 + - @backstage/plugin-cloudbuild@0.3.16-next.1 + - @backstage/plugin-cost-insights@0.12.5-next.1 + - @backstage/plugin-dynatrace@3.0.0-next.1 + - @backstage/plugin-entity-feedback@0.1.1-next.1 + - @backstage/plugin-gcp-projects@0.3.35-next.1 + - @backstage/plugin-github-actions@0.5.16-next.1 + - @backstage/plugin-gocd@0.1.22-next.1 + - @backstage/plugin-graphiql@0.2.48-next.1 + - @backstage/plugin-home@0.4.32-next.1 + - @backstage/plugin-jenkins@0.7.15-next.1 + - @backstage/plugin-kafka@0.3.16-next.1 + - @backstage/plugin-lighthouse@0.4.1-next.1 + - @backstage/plugin-linguist@0.1.1-next.1 + - @backstage/plugin-newrelic@0.3.34-next.1 + - @backstage/plugin-pagerduty@0.5.9-next.1 + - @backstage/plugin-rollbar@0.4.16-next.1 + - @backstage/plugin-search@1.1.1-next.1 + - @backstage/plugin-sentry@0.5.1-next.1 + - @backstage/plugin-stack-overflow@0.1.12-next.1 + - @backstage/plugin-stackstorm@0.1.0-next.1 + - @backstage/plugin-tech-insights@0.3.8-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.11-next.1 + - @backstage/plugin-todo@0.2.18-next.1 + - @backstage/plugin-user-settings@0.7.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/app-defaults@1.2.1-next.1 + - @backstage/catalog-model@1.2.1-next.1 + - @backstage/plugin-catalog-common@1.0.12-next.1 + - @backstage/plugin-catalog-graph@0.2.28-next.1 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-permission-react@0.4.11-next.1 + - @backstage/plugin-search-common@1.2.2-next.0 + - @backstage/plugin-search-react@1.5.1-next.1 + - @internal/plugin-catalog-customized@0.0.8-next.1 + +## 0.2.81-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.1.1-next.0 + - @backstage/cli@0.22.4-next.0 + - @backstage/plugin-catalog-react@1.4.0-next.0 + - @backstage/plugin-techdocs@1.6.0-next.0 + - @backstage/plugin-api-docs@0.9.1-next.0 + - @backstage/plugin-org@0.6.6-next.0 + - @backstage/plugin-stackstorm@0.1.0-next.0 + - @backstage/core-plugin-api@1.4.1-next.0 + - @backstage/catalog-model@1.2.1-next.0 + - @backstage/plugin-catalog-common@1.0.12-next.0 + - @backstage/plugin-techdocs-react@1.1.4-next.0 + - @backstage/plugin-cost-insights@0.12.5-next.0 + - @backstage/plugin-scaffolder@1.11.1-next.0 + - @backstage/plugin-jenkins@0.7.15-next.0 + - @backstage/plugin-playlist@0.1.7-next.0 + - @backstage/plugin-explore@0.4.1-next.0 + - @backstage/plugin-catalog-graph@0.2.28-next.0 + - @backstage/plugin-catalog-import@0.9.6-next.0 + - @backstage/app-defaults@1.2.1-next.0 + - @backstage/config@1.0.6 + - @backstage/core-app-api@1.5.1-next.0 + - @backstage/core-components@0.12.5-next.0 + - @backstage/integration-react@1.1.11-next.0 + - @backstage/theme@0.2.17 + - @backstage/plugin-airbrake@0.3.16-next.0 + - @backstage/plugin-apache-airflow@0.2.9-next.0 + - @backstage/plugin-azure-devops@0.2.7-next.0 + - @backstage/plugin-azure-sites@0.1.5-next.0 + - @backstage/plugin-badges@0.2.40-next.0 + - @backstage/plugin-circleci@0.3.16-next.0 + - @backstage/plugin-cloudbuild@0.3.16-next.0 + - @backstage/plugin-code-coverage@0.2.9-next.0 + - @backstage/plugin-dynatrace@3.0.0-next.0 + - @backstage/plugin-entity-feedback@0.1.1-next.0 + - @backstage/plugin-gcalendar@0.3.12-next.0 + - @backstage/plugin-gcp-projects@0.3.35-next.0 + - @backstage/plugin-github-actions@0.5.16-next.0 + - @backstage/plugin-gocd@0.1.22-next.0 + - @backstage/plugin-graphiql@0.2.48-next.0 + - @backstage/plugin-home@0.4.32-next.0 + - @backstage/plugin-kafka@0.3.16-next.0 + - @backstage/plugin-kubernetes@0.7.9-next.0 + - @backstage/plugin-lighthouse@0.4.1-next.0 + - @backstage/plugin-linguist@0.1.1-next.0 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-microsoft-calendar@0.1.1-next.0 + - @backstage/plugin-newrelic@0.3.34-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.9-next.0 + - @backstage/plugin-pagerduty@0.5.9-next.0 + - @backstage/plugin-permission-react@0.4.11-next.0 + - @backstage/plugin-rollbar@0.4.16-next.0 + - @backstage/plugin-search@1.1.1-next.0 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-search-react@1.5.1-next.0 + - @backstage/plugin-sentry@0.5.1-next.0 + - @backstage/plugin-shortcuts@0.3.8-next.0 + - @backstage/plugin-stack-overflow@0.1.12-next.0 + - @backstage/plugin-tech-insights@0.3.8-next.0 + - @backstage/plugin-tech-radar@0.6.2-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.11-next.0 + - @backstage/plugin-todo@0.2.18-next.0 + - @backstage/plugin-user-settings@0.7.1-next.0 + - @internal/plugin-catalog-customized@0.0.8-next.0 + +## 0.2.80 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.1.0 + - @backstage/plugin-scaffolder@1.11.0 + - @backstage/plugin-azure-devops@0.2.6 + - @backstage/cli@0.22.2 + - @backstage/plugin-techdocs@1.5.0 + - @backstage/core-components@0.12.4 + - @backstage/plugin-microsoft-calendar@0.1.0 + - @backstage/plugin-catalog-graph@0.2.27 + - @backstage/plugin-code-coverage@0.2.8 + - @backstage/plugin-azure-sites@0.1.4 + - @backstage/plugin-lighthouse@0.4.0 + - @backstage/plugin-shortcuts@0.3.7 + - @backstage/plugin-home@0.4.31 + - @backstage/plugin-tech-insights@0.3.7 + - @backstage/plugin-search@1.1.0 + - @backstage/plugin-api-docs@0.9.0 + - @backstage/plugin-entity-feedback@0.1.0 + - @backstage/plugin-tech-radar@0.6.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.10 + - @backstage/plugin-dynatrace@2.0.0 + - @backstage/plugin-playlist@0.1.6 + - @backstage/catalog-model@1.2.0 + - @backstage/theme@0.2.17 + - @backstage/core-app-api@1.5.0 + - @backstage/plugin-kubernetes@0.7.8 + - @backstage/core-plugin-api@1.4.0 + - @backstage/app-defaults@1.2.0 + - @backstage/plugin-user-settings@0.7.0 + - @backstage/plugin-catalog-react@1.3.0 + - @backstage/plugin-pagerduty@0.5.8 + - @backstage/plugin-explore@0.4.0 + - @backstage/plugin-linguist@0.1.0 + - @backstage/plugin-linguist-common@0.1.0 + - @backstage/plugin-search-react@1.5.0 + - @backstage/plugin-apache-airflow@0.2.8 + - @backstage/plugin-circleci@0.3.15 + - @backstage/plugin-sentry@0.5.0 + - @backstage/plugin-org@0.6.5 + - @backstage/plugin-cost-insights@0.12.4 + - @backstage/plugin-airbrake@0.3.15 + - @internal/plugin-catalog-customized@0.0.7 + - @backstage/config@1.0.6 + - @backstage/integration-react@1.1.10 + - @backstage/plugin-badges@0.2.39 + - @backstage/plugin-catalog-common@1.0.11 + - @backstage/plugin-catalog-import@0.9.5 + - @backstage/plugin-cloudbuild@0.3.15 + - @backstage/plugin-gcalendar@0.3.11 + - @backstage/plugin-gcp-projects@0.3.34 + - @backstage/plugin-github-actions@0.5.15 + - @backstage/plugin-gocd@0.1.21 + - @backstage/plugin-graphiql@0.2.47 + - @backstage/plugin-jenkins@0.7.14 + - @backstage/plugin-kafka@0.3.15 + - @backstage/plugin-newrelic@0.3.33 + - @backstage/plugin-newrelic-dashboard@0.2.8 + - @backstage/plugin-permission-react@0.4.10 + - @backstage/plugin-rollbar@0.4.15 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-stack-overflow@0.1.11 + - @backstage/plugin-techdocs-react@1.1.3 + - @backstage/plugin-todo@0.2.17 + +## 0.2.80-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.1.0-next.2 + - @backstage/plugin-scaffolder@1.11.0-next.2 + - @backstage/cli@0.22.2-next.1 + - @backstage/plugin-api-docs@0.9.0-next.2 + - @backstage/plugin-tech-radar@0.6.1-next.1 + - @backstage/catalog-model@1.2.0-next.1 + - @backstage/plugin-techdocs@1.5.0-next.2 + - @backstage/plugin-explore@0.4.0-next.2 + - @backstage/plugin-search-react@1.5.0-next.1 + - @backstage/plugin-sentry@0.5.0-next.2 + - @backstage/plugin-circleci@0.3.15-next.2 + - @backstage/core-components@0.12.4-next.1 + - @backstage/plugin-azure-sites@0.1.4-next.2 + - @backstage/plugin-search@1.1.0-next.2 + - @backstage/plugin-lighthouse@0.4.0-next.2 + - @backstage/app-defaults@1.1.1-next.1 + - @backstage/config@1.0.6 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-airbrake@0.3.15-next.2 + - @backstage/plugin-apache-airflow@0.2.8-next.1 + - @backstage/plugin-azure-devops@0.2.6-next.2 + - @backstage/plugin-badges@0.2.39-next.2 + - @backstage/plugin-catalog-common@1.0.11-next.1 + - @backstage/plugin-catalog-graph@0.2.27-next.2 + - @backstage/plugin-catalog-import@0.9.5-next.2 + - @backstage/plugin-catalog-react@1.3.0-next.2 + - @backstage/plugin-cloudbuild@0.3.15-next.2 + - @backstage/plugin-code-coverage@0.2.8-next.2 + - @backstage/plugin-cost-insights@0.12.4-next.2 + - @backstage/plugin-dynatrace@2.0.0-next.2 + - @backstage/plugin-gcalendar@0.3.11-next.1 + - @backstage/plugin-gcp-projects@0.3.34-next.1 + - @backstage/plugin-github-actions@0.5.15-next.2 + - @backstage/plugin-gocd@0.1.21-next.2 + - @backstage/plugin-graphiql@0.2.47-next.1 + - @backstage/plugin-home@0.4.31-next.2 + - @backstage/plugin-jenkins@0.7.14-next.2 + - @backstage/plugin-kafka@0.3.15-next.2 + - @backstage/plugin-kubernetes@0.7.8-next.2 + - @backstage/plugin-newrelic@0.3.33-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.8-next.2 + - @backstage/plugin-org@0.6.5-next.2 + - @backstage/plugin-pagerduty@0.5.8-next.2 + - @backstage/plugin-permission-react@0.4.9 + - @backstage/plugin-playlist@0.1.6-next.2 + - @backstage/plugin-rollbar@0.4.15-next.2 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-shortcuts@0.3.7-next.1 + - @backstage/plugin-stack-overflow@0.1.11-next.2 + - @backstage/plugin-tech-insights@0.3.7-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.10-next.2 + - @backstage/plugin-techdocs-react@1.1.3-next.2 + - @backstage/plugin-todo@0.2.17-next.2 + - @backstage/plugin-user-settings@0.6.3-next.2 + - @internal/plugin-catalog-customized@0.0.7-next.2 + +## 0.2.80-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.1.0-next.1 + - @backstage/plugin-scaffolder@1.11.0-next.1 + - @backstage/cli@0.22.2-next.0 + - @backstage/plugin-techdocs@1.5.0-next.1 + - @backstage/plugin-tech-insights@0.3.7-next.1 + - @backstage/plugin-search@1.1.0-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.10-next.1 + - @backstage/plugin-dynatrace@2.0.0-next.1 + - @backstage/plugin-playlist@0.1.6-next.1 + - @backstage/plugin-home@0.4.31-next.1 + - @backstage/core-app-api@1.4.1-next.0 + - @backstage/plugin-kubernetes@0.7.8-next.1 + - @backstage/core-components@0.12.4-next.0 + - @backstage/plugin-tech-radar@0.6.1-next.0 + - @backstage/plugin-explore@0.4.0-next.1 + - @backstage/plugin-apache-airflow@0.2.8-next.0 + - @backstage/plugin-circleci@0.3.15-next.1 + - @backstage/plugin-sentry@0.4.8-next.1 + - @backstage/plugin-search-react@1.5.0-next.0 + - @backstage/plugin-airbrake@0.3.15-next.1 + - @backstage/plugin-catalog-react@1.3.0-next.1 + - @backstage/app-defaults@1.1.1-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/config@1.0.6 + - @backstage/core-plugin-api@1.3.0 + - @backstage/integration-react@1.1.10-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-api-docs@0.8.15-next.1 + - @backstage/plugin-azure-devops@0.2.6-next.1 + - @backstage/plugin-azure-sites@0.1.4-next.1 + - @backstage/plugin-badges@0.2.39-next.1 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-catalog-graph@0.2.27-next.1 + - @backstage/plugin-catalog-import@0.9.5-next.1 + - @backstage/plugin-cloudbuild@0.3.15-next.1 + - @backstage/plugin-code-coverage@0.2.8-next.1 + - @backstage/plugin-cost-insights@0.12.4-next.1 + - @backstage/plugin-gcalendar@0.3.11-next.0 + - @backstage/plugin-gcp-projects@0.3.34-next.0 + - @backstage/plugin-github-actions@0.5.15-next.1 + - @backstage/plugin-gocd@0.1.21-next.1 + - @backstage/plugin-graphiql@0.2.47-next.0 + - @backstage/plugin-jenkins@0.7.14-next.1 + - @backstage/plugin-kafka@0.3.15-next.1 + - @backstage/plugin-lighthouse@0.3.15-next.1 + - @backstage/plugin-newrelic@0.3.33-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.8-next.1 + - @backstage/plugin-org@0.6.5-next.1 + - @backstage/plugin-pagerduty@0.5.8-next.1 + - @backstage/plugin-permission-react@0.4.9 + - @backstage/plugin-rollbar@0.4.15-next.1 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-shortcuts@0.3.7-next.0 + - @backstage/plugin-stack-overflow@0.1.11-next.1 + - @backstage/plugin-techdocs-react@1.1.3-next.1 + - @backstage/plugin-todo@0.2.17-next.1 + - @backstage/plugin-user-settings@0.6.3-next.1 + - @internal/plugin-catalog-customized@0.0.7-next.1 + +## 0.2.80-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-azure-devops@0.2.6-next.0 + - @backstage/plugin-scaffolder-react@1.1.0-next.0 + - @backstage/plugin-scaffolder@1.11.0-next.0 + - @backstage/plugin-api-docs@0.8.15-next.0 + - @backstage/plugin-techdocs@1.4.4-next.0 + - @backstage/plugin-catalog-react@1.3.0-next.0 + - @backstage/plugin-user-settings@0.6.3-next.0 + - @backstage/catalog-model@1.1.6-next.0 + - @backstage/plugin-kubernetes@0.7.8-next.0 + - @backstage/plugin-airbrake@0.3.15-next.0 + - @backstage/plugin-azure-sites@0.1.4-next.0 + - @backstage/plugin-badges@0.2.39-next.0 + - @internal/plugin-catalog-customized@0.0.7-next.0 + - @backstage/plugin-catalog-graph@0.2.27-next.0 + - @backstage/plugin-catalog-import@0.9.5-next.0 + - @backstage/plugin-circleci@0.3.15-next.0 + - @backstage/plugin-cloudbuild@0.3.15-next.0 + - @backstage/plugin-code-coverage@0.2.8-next.0 + - @backstage/plugin-cost-insights@0.12.4-next.0 + - @backstage/plugin-dynatrace@2.0.0-next.0 + - @backstage/plugin-explore@0.3.46-next.0 + - @backstage/plugin-github-actions@0.5.15-next.0 + - @backstage/plugin-gocd@0.1.21-next.0 + - @backstage/plugin-home@0.4.31-next.0 + - @backstage/plugin-jenkins@0.7.14-next.0 + - @backstage/plugin-kafka@0.3.15-next.0 + - @backstage/plugin-lighthouse@0.3.15-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.8-next.0 + - @backstage/plugin-org@0.6.5-next.0 + - @backstage/plugin-pagerduty@0.5.8-next.0 + - @backstage/plugin-playlist@0.1.6-next.0 + - @backstage/plugin-rollbar@0.4.15-next.0 + - @backstage/plugin-search@1.0.8-next.0 + - @backstage/plugin-sentry@0.4.8-next.0 + - @backstage/plugin-tech-insights@0.3.7-next.0 + - @backstage/plugin-todo@0.2.17-next.0 + - @backstage/plugin-catalog-common@1.0.11-next.0 + - @backstage/plugin-techdocs-react@1.1.3-next.0 + - @backstage/cli@0.22.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.10-next.0 + - @backstage/integration-react@1.1.9 + - @backstage/plugin-apache-airflow@0.2.7 + - @backstage/plugin-gcalendar@0.3.10 + - @backstage/plugin-gcp-projects@0.3.33 + - @backstage/plugin-graphiql@0.2.46 + - @backstage/plugin-newrelic@0.3.32 + - @backstage/plugin-shortcuts@0.3.6 + - @backstage/plugin-stack-overflow@0.1.11-next.0 + - @backstage/plugin-tech-radar@0.6.0 + +## 0.2.79 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.1 + - @backstage/plugin-search@1.0.7 + - @backstage/plugin-scaffolder@1.10.0 + - @backstage/plugin-catalog-graph@0.2.26 + - @backstage/catalog-model@1.1.5 + - @backstage/plugin-catalog-react@1.2.4 + - @backstage/core-components@0.12.3 + - @backstage/plugin-scaffolder-react@1.0.0 + - @backstage/plugin-user-settings@0.6.2 + - @backstage/plugin-explore@0.3.45 + - @backstage/plugin-techdocs@1.4.3 + - @backstage/plugin-github-actions@0.5.14 + - @backstage/plugin-home@0.4.30 + - @backstage/plugin-jenkins@0.7.13 + - @backstage/plugin-kubernetes@0.7.7 + - @backstage/plugin-stack-overflow@0.1.10 + - @backstage/plugin-tech-radar@0.6.0 + - @backstage/plugin-search-react@1.4.0 + - @backstage/app-defaults@1.1.0 + - @backstage/core-plugin-api@1.3.0 + - @backstage/core-app-api@1.4.0 + - @backstage/plugin-lighthouse@0.3.14 + - @backstage/plugin-cost-insights@0.12.3 + - @backstage/plugin-cloudbuild@0.3.14 + - @backstage/plugin-api-docs@0.8.14 + - @backstage/plugin-azure-devops@0.2.5 + - @backstage/plugin-azure-sites@0.1.3 + - @backstage/plugin-gcp-projects@0.3.33 + - @backstage/plugin-techdocs-react@1.1.2 + - @backstage/plugin-permission-react@0.4.9 + - @backstage/plugin-playlist@0.1.5 + - @backstage/config@1.0.6 + - @backstage/integration-react@1.1.9 + - @backstage/theme@0.2.16 + - @backstage/plugin-airbrake@0.3.14 + - @backstage/plugin-apache-airflow@0.2.7 + - @backstage/plugin-badges@0.2.38 + - @backstage/plugin-catalog-common@1.0.10 + - @backstage/plugin-catalog-import@0.9.4 + - @backstage/plugin-circleci@0.3.14 + - @backstage/plugin-code-coverage@0.2.7 + - @backstage/plugin-dynatrace@1.0.4 + - @backstage/plugin-gcalendar@0.3.10 + - @backstage/plugin-gocd@0.1.20 + - @backstage/plugin-graphiql@0.2.46 + - @backstage/plugin-kafka@0.3.14 + - @backstage/plugin-newrelic@0.3.32 + - @backstage/plugin-newrelic-dashboard@0.2.7 + - @backstage/plugin-org@0.6.4 + - @backstage/plugin-pagerduty@0.5.7 + - @backstage/plugin-rollbar@0.4.14 + - @backstage/plugin-search-common@1.2.1 + - @backstage/plugin-sentry@0.4.7 + - @backstage/plugin-shortcuts@0.3.6 + - @backstage/plugin-tech-insights@0.3.6 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.9 + - @backstage/plugin-todo@0.2.16 + - @internal/plugin-catalog-customized@0.0.6 + +## 0.2.79-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder@1.10.0-next.2 + - @backstage/cli@0.22.1-next.2 + - @backstage/plugin-scaffolder-react@1.0.0-next.0 + - @backstage/plugin-user-settings@0.6.2-next.2 + - @backstage/plugin-search-react@1.4.0-next.2 + - @backstage/plugin-tech-radar@0.6.0-next.2 + - @backstage/app-defaults@1.1.0-next.2 + - @backstage/core-plugin-api@1.3.0-next.1 + - @backstage/core-app-api@1.4.0-next.1 + - @backstage/plugin-lighthouse@0.3.14-next.2 + - @backstage/plugin-catalog-react@1.2.4-next.2 + - @backstage/plugin-permission-react@0.4.9-next.1 + - @backstage/plugin-playlist@0.1.5-next.2 + - @backstage/plugin-techdocs-react@1.1.2-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/integration-react@1.1.9-next.2 + - @backstage/theme@0.2.16 + - @backstage/plugin-airbrake@0.3.14-next.2 + - @backstage/plugin-apache-airflow@0.2.7-next.2 + - @backstage/plugin-api-docs@0.8.14-next.2 + - @backstage/plugin-azure-devops@0.2.5-next.2 + - @backstage/plugin-azure-sites@0.1.3-next.2 + - @backstage/plugin-badges@0.2.38-next.2 + - @backstage/plugin-catalog-common@1.0.10-next.1 + - @backstage/plugin-catalog-graph@0.2.26-next.2 + - @backstage/plugin-catalog-import@0.9.4-next.2 + - @backstage/plugin-circleci@0.3.14-next.2 + - @backstage/plugin-cloudbuild@0.3.14-next.2 + - @backstage/plugin-code-coverage@0.2.7-next.2 + - @backstage/plugin-cost-insights@0.12.3-next.2 + - @backstage/plugin-dynatrace@1.0.4-next.2 + - @backstage/plugin-explore@0.3.45-next.2 + - @backstage/plugin-gcalendar@0.3.10-next.2 + - @backstage/plugin-gcp-projects@0.3.33-next.2 + - @backstage/plugin-github-actions@0.5.14-next.2 + - @backstage/plugin-gocd@0.1.20-next.2 + - @backstage/plugin-graphiql@0.2.46-next.2 + - @backstage/plugin-home@0.4.30-next.2 + - @backstage/plugin-jenkins@0.7.13-next.2 + - @backstage/plugin-kafka@0.3.14-next.2 + - @backstage/plugin-kubernetes@0.7.7-next.2 + - @backstage/plugin-newrelic@0.3.32-next.2 + - @backstage/plugin-newrelic-dashboard@0.2.7-next.2 + - @backstage/plugin-org@0.6.4-next.2 + - @backstage/plugin-pagerduty@0.5.7-next.2 + - @backstage/plugin-rollbar@0.4.14-next.2 + - @backstage/plugin-search@1.0.7-next.2 + - @backstage/plugin-search-common@1.2.1-next.0 + - @backstage/plugin-sentry@0.4.7-next.2 + - @backstage/plugin-shortcuts@0.3.6-next.2 + - @backstage/plugin-stack-overflow@0.1.10-next.2 + - @backstage/plugin-tech-insights@0.3.6-next.2 + - @backstage/plugin-techdocs@1.4.3-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.9-next.2 + - @backstage/plugin-todo@0.2.16-next.2 + - @internal/plugin-catalog-customized@0.0.6-next.2 + +## 0.2.79-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.1-next.1 + - @backstage/plugin-catalog-graph@0.2.26-next.1 + - @backstage/plugin-explore@0.3.45-next.1 + - @backstage/plugin-techdocs@1.4.3-next.1 + - @backstage/plugin-cost-insights@0.12.3-next.1 + - @backstage/config@1.0.6-next.0 + - @backstage/app-defaults@1.0.11-next.1 + - @backstage/catalog-model@1.1.5-next.1 + - @backstage/core-app-api@1.3.1-next.0 + - @backstage/core-components@0.12.3-next.1 + - @backstage/core-plugin-api@1.2.1-next.0 + - @backstage/integration-react@1.1.9-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-airbrake@0.3.14-next.1 + - @backstage/plugin-apache-airflow@0.2.7-next.1 + - @backstage/plugin-api-docs@0.8.14-next.1 + - @backstage/plugin-azure-devops@0.2.5-next.1 + - @backstage/plugin-azure-sites@0.1.3-next.1 + - @backstage/plugin-badges@0.2.38-next.1 + - @backstage/plugin-catalog-common@1.0.10-next.1 + - @backstage/plugin-catalog-import@0.9.4-next.1 + - @backstage/plugin-catalog-react@1.2.4-next.1 + - @backstage/plugin-circleci@0.3.14-next.1 + - @backstage/plugin-cloudbuild@0.3.14-next.1 + - @backstage/plugin-code-coverage@0.2.7-next.1 + - @backstage/plugin-dynatrace@1.0.4-next.1 + - @backstage/plugin-gcalendar@0.3.10-next.1 + - @backstage/plugin-gcp-projects@0.3.33-next.1 + - @backstage/plugin-github-actions@0.5.14-next.1 + - @backstage/plugin-gocd@0.1.20-next.1 + - @backstage/plugin-graphiql@0.2.46-next.1 + - @backstage/plugin-home@0.4.30-next.1 + - @backstage/plugin-jenkins@0.7.13-next.1 + - @backstage/plugin-kafka@0.3.14-next.1 + - @backstage/plugin-kubernetes@0.7.7-next.1 + - @backstage/plugin-lighthouse@0.3.14-next.1 + - @backstage/plugin-newrelic@0.3.32-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.7-next.1 + - @backstage/plugin-org@0.6.4-next.1 + - @backstage/plugin-pagerduty@0.5.7-next.1 + - @backstage/plugin-permission-react@0.4.9-next.0 + - @backstage/plugin-playlist@0.1.5-next.1 + - @backstage/plugin-rollbar@0.4.14-next.1 + - @backstage/plugin-scaffolder@1.10.0-next.1 + - @backstage/plugin-search@1.0.7-next.1 + - @backstage/plugin-search-common@1.2.1-next.0 + - @backstage/plugin-search-react@1.3.2-next.1 + - @backstage/plugin-sentry@0.4.7-next.1 + - @backstage/plugin-shortcuts@0.3.6-next.1 + - @backstage/plugin-stack-overflow@0.1.10-next.1 + - @backstage/plugin-tech-insights@0.3.6-next.1 + - @backstage/plugin-tech-radar@0.5.21-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.9-next.1 + - @backstage/plugin-techdocs-react@1.1.2-next.1 + - @backstage/plugin-todo@0.2.16-next.1 + - @backstage/plugin-user-settings@0.6.2-next.1 + - @internal/plugin-catalog-customized@0.0.6-next.1 + +## 0.2.79-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.22.1-next.0 + - @backstage/plugin-scaffolder@1.10.0-next.0 + - @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/plugin-techdocs-react@1.1.2-next.0 + - @backstage/plugin-techdocs@1.4.3-next.0 + - @backstage/plugin-explore@0.3.45-next.0 + - @backstage/app-defaults@1.0.11-next.0 + - @backstage/config@1.0.5 + - @backstage/core-app-api@1.3.0 + - @backstage/core-plugin-api@1.2.0 + - @backstage/integration-react@1.1.9-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-airbrake@0.3.14-next.0 + - @backstage/plugin-apache-airflow@0.2.7-next.0 + - @backstage/plugin-api-docs@0.8.14-next.0 + - @backstage/plugin-azure-devops@0.2.5-next.0 + - @backstage/plugin-azure-sites@0.1.3-next.0 + - @backstage/plugin-badges@0.2.38-next.0 + - @backstage/plugin-catalog-common@1.0.10-next.0 + - @backstage/plugin-catalog-graph@0.2.26-next.0 + - @backstage/plugin-catalog-import@0.9.4-next.0 + - @backstage/plugin-circleci@0.3.14-next.0 + - @backstage/plugin-cloudbuild@0.3.14-next.0 + - @backstage/plugin-code-coverage@0.2.7-next.0 + - @backstage/plugin-cost-insights@0.12.3-next.0 + - @backstage/plugin-dynatrace@1.0.4-next.0 + - @backstage/plugin-gcalendar@0.3.10-next.0 + - @backstage/plugin-gcp-projects@0.3.33-next.0 + - @backstage/plugin-github-actions@0.5.14-next.0 + - @backstage/plugin-gocd@0.1.20-next.0 + - @backstage/plugin-graphiql@0.2.46-next.0 + - @backstage/plugin-home@0.4.30-next.0 + - @backstage/plugin-jenkins@0.7.13-next.0 + - @backstage/plugin-kafka@0.3.14-next.0 + - @backstage/plugin-kubernetes@0.7.7-next.0 + - @backstage/plugin-lighthouse@0.3.14-next.0 + - @backstage/plugin-newrelic@0.3.32-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.7-next.0 + - @backstage/plugin-org@0.6.4-next.0 + - @backstage/plugin-pagerduty@0.5.7-next.0 + - @backstage/plugin-permission-react@0.4.8 + - @backstage/plugin-playlist@0.1.5-next.0 + - @backstage/plugin-rollbar@0.4.14-next.0 + - @backstage/plugin-search@1.0.7-next.0 + - @backstage/plugin-search-common@1.2.0 + - @backstage/plugin-search-react@1.3.2-next.0 + - @backstage/plugin-sentry@0.4.7-next.0 + - @backstage/plugin-shortcuts@0.3.6-next.0 + - @backstage/plugin-stack-overflow@0.1.10-next.0 + - @backstage/plugin-tech-insights@0.3.6-next.0 + - @backstage/plugin-tech-radar@0.5.21-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.9-next.0 + - @backstage/plugin-todo@0.2.16-next.0 + - @backstage/plugin-user-settings@0.6.2-next.0 + - @internal/plugin-catalog-customized@0.0.6-next.0 + +## 0.2.79 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.12.2 + - @backstage/app-defaults@1.0.10 + - @backstage/cli@0.22.0 + - @backstage/integration-react@1.1.8 + - @backstage/plugin-airbrake@0.3.13 + - @backstage/plugin-apache-airflow@0.2.6 + - @backstage/plugin-api-docs@0.8.13 + - @backstage/plugin-azure-devops@0.2.4 + - @backstage/plugin-azure-sites@0.1.2 + - @backstage/plugin-badges@0.2.37 + - @backstage/plugin-catalog-graph@0.2.25 + - @backstage/plugin-catalog-import@0.9.3 + - @backstage/plugin-catalog-react@1.2.3 + - @backstage/plugin-circleci@0.3.13 + - @backstage/plugin-cloudbuild@0.3.13 + - @backstage/plugin-code-coverage@0.2.6 + - @backstage/plugin-cost-insights@0.12.2 + - @backstage/plugin-dynatrace@1.0.3 + - @backstage/plugin-explore@0.3.44 + - @backstage/plugin-gcalendar@0.3.9 + - @backstage/plugin-gcp-projects@0.3.32 + - @backstage/plugin-github-actions@0.5.13 + - @backstage/plugin-gocd@0.1.19 + - @backstage/plugin-graphiql@0.2.45 + - @backstage/plugin-home@0.4.29 + - @backstage/plugin-jenkins@0.7.12 + - @backstage/plugin-kafka@0.3.13 + - @backstage/plugin-kubernetes@0.7.6 + - @backstage/plugin-lighthouse@0.3.13 + - @backstage/plugin-newrelic@0.3.31 + - @backstage/plugin-newrelic-dashboard@0.2.6 + - @backstage/plugin-org@0.6.3 + - @backstage/plugin-pagerduty@0.5.6 + - @backstage/plugin-playlist@0.1.4 + - @backstage/plugin-rollbar@0.4.13 + - @backstage/plugin-scaffolder@1.9.1 + - @backstage/plugin-search@1.0.6 + - @backstage/plugin-search-react@1.3.1 + - @backstage/plugin-sentry@0.4.6 + - @backstage/plugin-shortcuts@0.3.5 + - @backstage/plugin-stack-overflow@0.1.9 + - @backstage/plugin-tech-insights@0.3.5 + - @backstage/plugin-tech-radar@0.5.20 + - @backstage/plugin-techdocs@1.4.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.8 + - @backstage/plugin-techdocs-react@1.1.1 + - @backstage/plugin-todo@0.2.15 + - @backstage/plugin-user-settings@0.6.1 + - @internal/plugin-catalog-customized@0.0.6 + +## 0.2.78 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-graph@0.2.24 + - @backstage/plugin-pagerduty@0.5.5 + - @backstage/plugin-techdocs-react@1.1.0 + - @backstage/plugin-scaffolder@1.9.0 + - @backstage/plugin-cost-insights@0.12.1 + - @backstage/plugin-kubernetes@0.7.5 + - @backstage/core-plugin-api@1.2.0 + - @backstage/plugin-search-react@1.3.0 + - @backstage/core-components@0.12.1 + - @backstage/plugin-explore@0.3.43 + - @backstage/cli@0.22.0 + - @backstage/core-app-api@1.3.0 + - @backstage/plugin-cloudbuild@0.3.12 + - @backstage/plugin-gcp-projects@0.3.31 + - @backstage/plugin-github-actions@0.5.12 + - @backstage/plugin-graphiql@0.2.44 + - @backstage/plugin-techdocs@1.4.1 + - @backstage/plugin-org@0.6.2 + - @backstage/plugin-user-settings@0.6.0 + - @backstage/app-defaults@1.0.9 + - @backstage/plugin-airbrake@0.3.12 + - @backstage/plugin-api-docs@0.8.12 + - @backstage/plugin-azure-devops@0.2.3 + - @backstage/plugin-badges@0.2.36 + - @backstage/plugin-catalog-import@0.9.2 + - @backstage/plugin-catalog-react@1.2.2 + - @backstage/plugin-circleci@0.3.12 + - @backstage/plugin-code-coverage@0.2.5 + - @backstage/plugin-home@0.4.28 + - @backstage/plugin-jenkins@0.7.11 + - @backstage/plugin-kafka@0.3.12 + - @backstage/plugin-permission-react@0.4.8 + - @backstage/plugin-playlist@0.1.3 + - @backstage/plugin-rollbar@0.4.12 + - @backstage/plugin-search@1.0.5 + - @backstage/plugin-sentry@0.4.5 + - @backstage/plugin-shortcuts@0.3.4 + - @backstage/plugin-todo@0.2.14 + - @backstage/plugin-lighthouse@0.3.12 + - @backstage/plugin-stack-overflow@0.1.8 + - @backstage/integration-react@1.1.7 + - @backstage/plugin-apache-airflow@0.2.5 + - @backstage/plugin-azure-sites@0.1.1 + - @backstage/plugin-dynatrace@1.0.2 + - @backstage/plugin-gcalendar@0.3.8 + - @backstage/plugin-gocd@0.1.18 + - @backstage/plugin-newrelic@0.3.30 + - @backstage/plugin-tech-insights@0.3.4 + - @backstage/plugin-tech-radar@0.5.19 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.7 + - @backstage/plugin-search-common@1.2.0 + - @internal/plugin-catalog-customized@0.0.5 + - @backstage/plugin-newrelic-dashboard@0.2.5 + - @backstage/catalog-model@1.1.4 + - @backstage/config@1.0.5 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.9 + +## 0.2.78-next.4 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-cost-insights@0.12.1-next.4 + - @backstage/plugin-kubernetes@0.7.5-next.4 + - @backstage/cli@0.22.0-next.4 + - @backstage/core-app-api@1.3.0-next.4 + - @backstage/core-components@0.12.1-next.4 + - @backstage/plugin-scaffolder@1.9.0-next.4 + - @backstage/app-defaults@1.0.9-next.4 + - @backstage/plugin-airbrake@0.3.12-next.4 + - @backstage/plugin-api-docs@0.8.12-next.4 + - @backstage/plugin-azure-devops@0.2.3-next.4 + - @backstage/plugin-badges@0.2.36-next.4 + - @backstage/plugin-catalog-graph@0.2.24-next.4 + - @backstage/plugin-catalog-import@0.9.2-next.4 + - @backstage/plugin-catalog-react@1.2.2-next.4 + - @backstage/plugin-circleci@0.3.12-next.4 + - @backstage/plugin-cloudbuild@0.3.12-next.4 + - @backstage/plugin-code-coverage@0.2.5-next.4 + - @backstage/plugin-explore@0.3.43-next.4 + - @backstage/plugin-github-actions@0.5.12-next.4 + - @backstage/plugin-home@0.4.28-next.4 + - @backstage/plugin-jenkins@0.7.11-next.4 + - @backstage/plugin-kafka@0.3.12-next.4 + - @backstage/plugin-org@0.6.2-next.4 + - @backstage/plugin-permission-react@0.4.8-next.3 + - @backstage/plugin-playlist@0.1.3-next.4 + - @backstage/plugin-rollbar@0.4.12-next.4 + - @backstage/plugin-search@1.0.5-next.4 + - @backstage/plugin-search-react@1.3.0-next.4 + - @backstage/plugin-sentry@0.4.5-next.4 + - @backstage/plugin-shortcuts@0.3.4-next.4 + - @backstage/plugin-techdocs@1.4.1-next.4 + - @backstage/plugin-todo@0.2.14-next.4 + - @backstage/plugin-user-settings@0.6.0-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/integration-react@1.1.7-next.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-apache-airflow@0.2.5-next.4 + - @backstage/plugin-azure-sites@0.1.1-next.4 + - @backstage/plugin-catalog-common@1.0.9-next.3 + - @backstage/plugin-dynatrace@1.0.2-next.4 + - @backstage/plugin-gcalendar@0.3.8-next.4 + - @backstage/plugin-gcp-projects@0.3.31-next.4 + - @backstage/plugin-gocd@0.1.18-next.4 + - @backstage/plugin-graphiql@0.2.44-next.4 + - @backstage/plugin-lighthouse@0.3.12-next.4 + - @backstage/plugin-newrelic@0.3.30-next.4 + - @backstage/plugin-newrelic-dashboard@0.2.5-next.4 + - @backstage/plugin-pagerduty@0.5.5-next.4 + - @backstage/plugin-search-common@1.2.0-next.3 + - @backstage/plugin-tech-insights@0.3.4-next.4 + - @backstage/plugin-tech-radar@0.5.19-next.4 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.7-next.4 + - @backstage/plugin-techdocs-react@1.0.7-next.4 + - @internal/plugin-catalog-customized@0.0.5-next.4 + +## 0.2.78-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.21.2-next.3 + - @backstage/core-app-api@1.2.1-next.3 + - @backstage/plugin-airbrake@0.3.12-next.3 + - @backstage/core-components@0.12.1-next.3 + - @backstage/app-defaults@1.0.9-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/integration-react@1.1.7-next.3 + - @backstage/theme@0.2.16 + - @backstage/plugin-apache-airflow@0.2.5-next.3 + - @backstage/plugin-api-docs@0.8.12-next.3 + - @backstage/plugin-azure-devops@0.2.3-next.3 + - @backstage/plugin-azure-sites@0.1.1-next.3 + - @backstage/plugin-badges@0.2.36-next.3 + - @backstage/plugin-catalog-common@1.0.9-next.2 + - @backstage/plugin-catalog-graph@0.2.24-next.3 + - @backstage/plugin-catalog-import@0.9.2-next.3 + - @backstage/plugin-catalog-react@1.2.2-next.3 + - @backstage/plugin-circleci@0.3.12-next.3 + - @backstage/plugin-cloudbuild@0.3.12-next.3 + - @backstage/plugin-code-coverage@0.2.5-next.3 + - @backstage/plugin-cost-insights@0.12.1-next.3 + - @backstage/plugin-dynatrace@1.0.2-next.3 + - @backstage/plugin-explore@0.3.43-next.3 + - @backstage/plugin-gcalendar@0.3.8-next.3 + - @backstage/plugin-gcp-projects@0.3.31-next.3 + - @backstage/plugin-github-actions@0.5.12-next.3 + - @backstage/plugin-gocd@0.1.18-next.3 + - @backstage/plugin-graphiql@0.2.44-next.3 + - @backstage/plugin-home@0.4.28-next.3 + - @backstage/plugin-jenkins@0.7.11-next.3 + - @backstage/plugin-kafka@0.3.12-next.3 + - @backstage/plugin-kubernetes@0.7.5-next.3 + - @backstage/plugin-lighthouse@0.3.12-next.3 + - @backstage/plugin-newrelic@0.3.30-next.3 + - @backstage/plugin-newrelic-dashboard@0.2.5-next.3 + - @backstage/plugin-org@0.6.2-next.3 + - @backstage/plugin-pagerduty@0.5.5-next.3 + - @backstage/plugin-permission-react@0.4.8-next.2 + - @backstage/plugin-playlist@0.1.3-next.3 + - @backstage/plugin-rollbar@0.4.12-next.3 + - @backstage/plugin-scaffolder@1.9.0-next.3 + - @backstage/plugin-search@1.0.5-next.3 + - @backstage/plugin-search-common@1.2.0-next.2 + - @backstage/plugin-search-react@1.3.0-next.3 + - @backstage/plugin-sentry@0.4.5-next.3 + - @backstage/plugin-shortcuts@0.3.4-next.3 + - @backstage/plugin-stack-overflow@0.1.8-next.3 + - @backstage/plugin-tech-insights@0.3.4-next.3 + - @backstage/plugin-tech-radar@0.5.19-next.3 + - @backstage/plugin-techdocs@1.4.1-next.3 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.7-next.3 + - @backstage/plugin-techdocs-react@1.0.7-next.3 + - @backstage/plugin-todo@0.2.14-next.3 + - @backstage/plugin-user-settings@0.6.0-next.3 + - @internal/plugin-catalog-customized@0.0.5-next.3 + +## 0.2.78-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.2.0-next.2 + - @backstage/plugin-search-react@1.3.0-next.2 + - @backstage/plugin-explore@0.3.43-next.2 + - @backstage/cli@0.21.2-next.2 + - @backstage/core-app-api@1.2.1-next.2 + - @backstage/core-components@0.12.1-next.2 + - @backstage/plugin-catalog-react@1.2.2-next.2 + - @backstage/plugin-cost-insights@0.12.1-next.2 + - @backstage/plugin-gcp-projects@0.3.31-next.2 + - @backstage/plugin-scaffolder@1.9.0-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.7-next.2 + - @backstage/plugin-catalog-graph@0.2.24-next.2 + - @backstage/plugin-search-common@1.2.0-next.2 + - @backstage/plugin-api-docs@0.8.12-next.2 + - @internal/plugin-catalog-customized@0.0.5-next.2 + - @backstage/app-defaults@1.0.9-next.2 + - @backstage/integration-react@1.1.7-next.2 + - @backstage/plugin-airbrake@0.3.12-next.2 + - @backstage/plugin-apache-airflow@0.2.5-next.2 + - @backstage/plugin-azure-devops@0.2.3-next.2 + - @backstage/plugin-azure-sites@0.1.1-next.2 + - @backstage/plugin-badges@0.2.36-next.2 + - @backstage/plugin-catalog-import@0.9.2-next.2 + - @backstage/plugin-circleci@0.3.12-next.2 + - @backstage/plugin-cloudbuild@0.3.12-next.2 + - @backstage/plugin-code-coverage@0.2.5-next.2 + - @backstage/plugin-dynatrace@1.0.2-next.2 + - @backstage/plugin-gcalendar@0.3.8-next.2 + - @backstage/plugin-github-actions@0.5.12-next.2 + - @backstage/plugin-gocd@0.1.18-next.2 + - @backstage/plugin-graphiql@0.2.44-next.2 + - @backstage/plugin-home@0.4.28-next.2 + - @backstage/plugin-jenkins@0.7.11-next.2 + - @backstage/plugin-kafka@0.3.12-next.2 + - @backstage/plugin-kubernetes@0.7.5-next.2 + - @backstage/plugin-lighthouse@0.3.12-next.2 + - @backstage/plugin-newrelic@0.3.30-next.2 + - @backstage/plugin-newrelic-dashboard@0.2.5-next.2 + - @backstage/plugin-org@0.6.2-next.2 + - @backstage/plugin-pagerduty@0.5.5-next.2 + - @backstage/plugin-permission-react@0.4.8-next.2 + - @backstage/plugin-playlist@0.1.3-next.2 + - @backstage/plugin-rollbar@0.4.12-next.2 + - @backstage/plugin-search@1.0.5-next.2 + - @backstage/plugin-sentry@0.4.5-next.2 + - @backstage/plugin-shortcuts@0.3.4-next.2 + - @backstage/plugin-stack-overflow@0.1.8-next.2 + - @backstage/plugin-tech-insights@0.3.4-next.2 + - @backstage/plugin-tech-radar@0.5.19-next.2 + - @backstage/plugin-techdocs@1.4.1-next.2 + - @backstage/plugin-techdocs-react@1.0.7-next.2 + - @backstage/plugin-todo@0.2.14-next.2 + - @backstage/plugin-user-settings@0.6.0-next.2 + - @backstage/catalog-model@1.1.4-next.1 + - @backstage/config@1.0.5-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.9-next.2 + +## 0.2.78-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@1.2.1-next.1 + - @backstage/core-components@0.12.1-next.1 + - @backstage/plugin-cloudbuild@0.3.12-next.1 + - @backstage/plugin-gcp-projects@0.3.31-next.1 + - @backstage/plugin-github-actions@0.5.12-next.1 + - @backstage/plugin-graphiql@0.2.44-next.1 + - @backstage/plugin-techdocs@1.4.1-next.1 + - @backstage/plugin-cost-insights@0.12.1-next.1 + - @backstage/plugin-search-react@1.2.2-next.1 + - @backstage/plugin-stack-overflow@0.1.8-next.1 + - @backstage/cli@0.21.2-next.1 + - @backstage/plugin-org@0.6.2-next.1 + - @backstage/core-plugin-api@1.1.1-next.1 + - @backstage/plugin-catalog-react@1.2.2-next.1 + - @backstage/plugin-scaffolder@1.9.0-next.1 + - @backstage/plugin-shortcuts@0.3.4-next.1 + - @backstage/plugin-user-settings@0.6.0-next.1 + - @backstage/plugin-explore@0.3.43-next.1 + - @backstage/app-defaults@1.0.9-next.1 + - @backstage/plugin-apache-airflow@0.2.5-next.1 + - @backstage/plugin-api-docs@0.8.12-next.1 + - @backstage/plugin-azure-devops@0.2.3-next.1 + - @backstage/plugin-azure-sites@0.1.1-next.1 + - @backstage/plugin-badges@0.2.36-next.1 + - @backstage/plugin-catalog-graph@0.2.24-next.1 + - @backstage/plugin-catalog-import@0.9.2-next.1 + - @backstage/plugin-circleci@0.3.12-next.1 + - @backstage/plugin-code-coverage@0.2.5-next.1 + - @backstage/plugin-dynatrace@1.0.2-next.1 + - @backstage/plugin-gcalendar@0.3.8-next.1 + - @backstage/plugin-gocd@0.1.18-next.1 + - @backstage/plugin-home@0.4.28-next.1 + - @backstage/plugin-jenkins@0.7.11-next.1 + - @backstage/plugin-kafka@0.3.12-next.1 + - @backstage/plugin-kubernetes@0.7.5-next.1 + - @backstage/plugin-lighthouse@0.3.12-next.1 + - @backstage/plugin-newrelic@0.3.30-next.1 + - @backstage/plugin-pagerduty@0.5.5-next.1 + - @backstage/plugin-playlist@0.1.3-next.1 + - @backstage/plugin-rollbar@0.4.12-next.1 + - @backstage/plugin-search@1.0.5-next.1 + - @backstage/plugin-sentry@0.4.5-next.1 + - @backstage/plugin-tech-insights@0.3.4-next.1 + - @backstage/plugin-tech-radar@0.5.19-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.7-next.1 + - @backstage/plugin-todo@0.2.14-next.1 + - @backstage/integration-react@1.1.7-next.1 + - @backstage/plugin-airbrake@0.3.12-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.5-next.1 + - @backstage/plugin-techdocs-react@1.0.7-next.1 + - @internal/plugin-catalog-customized@0.0.5-next.1 + - @backstage/config@1.0.5-next.1 + - @backstage/plugin-permission-react@0.4.8-next.1 + - @backstage/catalog-model@1.1.4-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.9-next.1 + - @backstage/plugin-search-common@1.1.2-next.1 + +## 0.2.78-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-graph@0.2.24-next.0 + - @backstage/plugin-pagerduty@0.5.5-next.0 + - @backstage/plugin-techdocs-react@1.0.7-next.0 + - @backstage/plugin-scaffolder@1.9.0-next.0 + - @backstage/cli@0.21.2-next.0 + - @backstage/plugin-cost-insights@0.12.1-next.0 + - @backstage/core-components@0.12.1-next.0 + - @backstage/plugin-user-settings@0.6.0-next.0 + - @backstage/plugin-explore@0.3.43-next.0 + - @backstage/core-app-api@1.2.1-next.0 + - @backstage/core-plugin-api@1.1.1-next.0 + - @backstage/integration-react@1.1.7-next.0 + - @backstage/plugin-airbrake@0.3.12-next.0 + - @backstage/plugin-apache-airflow@0.2.5-next.0 + - @backstage/plugin-api-docs@0.8.12-next.0 + - @backstage/plugin-azure-devops@0.2.3-next.0 + - @backstage/plugin-azure-sites@0.1.1-next.0 + - @backstage/plugin-badges@0.2.36-next.0 + - @backstage/plugin-catalog-import@0.9.2-next.0 + - @backstage/plugin-circleci@0.3.12-next.0 + - @backstage/plugin-cloudbuild@0.3.12-next.0 + - @backstage/plugin-code-coverage@0.2.5-next.0 + - @backstage/plugin-dynatrace@1.0.2-next.0 + - @backstage/plugin-gcalendar@0.3.8-next.0 + - @backstage/plugin-gcp-projects@0.3.31-next.0 + - @backstage/plugin-github-actions@0.5.12-next.0 + - @backstage/plugin-gocd@0.1.18-next.0 + - @backstage/plugin-graphiql@0.2.44-next.0 + - @backstage/plugin-home@0.4.28-next.0 + - @backstage/plugin-jenkins@0.7.11-next.0 + - @backstage/plugin-kafka@0.3.12-next.0 + - @backstage/plugin-kubernetes@0.7.5-next.0 + - @backstage/plugin-lighthouse@0.3.12-next.0 + - @backstage/plugin-newrelic@0.3.30-next.0 + - @backstage/plugin-org@0.6.1-next.0 + - @backstage/plugin-playlist@0.1.3-next.0 + - @backstage/plugin-rollbar@0.4.12-next.0 + - @backstage/plugin-search@1.0.5-next.0 + - @backstage/plugin-sentry@0.4.5-next.0 + - @backstage/plugin-shortcuts@0.3.4-next.0 + - @backstage/plugin-stack-overflow@0.1.8-next.0 + - @backstage/plugin-tech-insights@0.3.4-next.0 + - @backstage/plugin-tech-radar@0.5.19-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.7-next.0 + - @backstage/plugin-techdocs@1.4.1-next.0 + - @backstage/plugin-todo@0.2.14-next.0 + - @backstage/plugin-catalog-react@1.2.2-next.0 + - @backstage/app-defaults@1.0.9-next.0 + - @backstage/catalog-model@1.1.4-next.0 + - @backstage/config@1.0.5-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.9-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.5-next.0 + - @backstage/plugin-permission-react@0.4.8-next.0 + - @backstage/plugin-search-common@1.1.2-next.0 + - @backstage/plugin-search-react@1.2.2-next.0 + - @internal/plugin-catalog-customized@0.0.5-next.0 + +## 0.2.77 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder@1.8.0 + - @backstage/plugin-catalog-react@1.2.1 + - @backstage/plugin-techdocs@1.4.0 + - @backstage/core-components@0.12.0 + - @backstage/plugin-cost-insights@0.12.0 + - @backstage/plugin-apache-airflow@0.2.4 + - @backstage/core-app-api@1.2.0 + - @backstage/plugin-explore@0.3.42 + - @backstage/plugin-tech-insights@0.3.3 + - @backstage/plugin-github-actions@0.5.11 + - @backstage/cli@0.21.0 + - @backstage/core-plugin-api@1.1.0 + - @backstage/plugin-dynatrace@1.0.1 + - @backstage/plugin-catalog-import@0.9.1 + - @backstage/plugin-catalog-graph@0.2.23 + - @backstage/plugin-tech-radar@0.5.18 + - @backstage/plugin-playlist@0.1.2 + - @backstage/plugin-stack-overflow@0.1.7 + - @backstage/catalog-model@1.1.3 + - @backstage/plugin-gcalendar@0.3.7 + - @backstage/plugin-code-coverage@0.2.4 + - @backstage/plugin-org@0.6.0 + - @backstage/plugin-api-docs@0.8.11 + - @backstage/plugin-kubernetes@0.7.4 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.6 + - @backstage/plugin-circleci@0.3.11 + - @backstage/plugin-azure-sites@0.1.0 + - @backstage/plugin-techdocs-react@1.0.6 + - @backstage/plugin-cloudbuild@0.3.11 + - @backstage/plugin-jenkins@0.7.10 + - @backstage/plugin-kafka@0.3.11 + - @backstage/plugin-pagerduty@0.5.4 + - @backstage/plugin-rollbar@0.4.11 + - @backstage/plugin-airbrake@0.3.11 + - @backstage/plugin-azure-devops@0.2.2 + - @backstage/plugin-badges@0.2.35 + - @internal/plugin-catalog-customized@0.0.4 + - @backstage/plugin-gocd@0.1.17 + - @backstage/plugin-home@0.4.27 + - @backstage/plugin-lighthouse@0.3.11 + - @backstage/plugin-newrelic-dashboard@0.2.4 + - @backstage/plugin-search@1.0.4 + - @backstage/plugin-sentry@0.4.4 + - @backstage/plugin-todo@0.2.13 + - @backstage/app-defaults@1.0.8 + - @backstage/integration-react@1.1.6 + - @backstage/plugin-gcp-projects@0.3.30 + - @backstage/plugin-graphiql@0.2.43 + - @backstage/plugin-newrelic@0.3.29 + - @backstage/plugin-search-react@1.2.1 + - @backstage/plugin-shortcuts@0.3.3 + - @backstage/plugin-user-settings@0.5.1 + - @backstage/config@1.0.4 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.8 + - @backstage/plugin-permission-react@0.4.7 + - @backstage/plugin-search-common@1.1.1 + +## 0.2.77-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder@1.8.0-next.1 + - @backstage/plugin-cost-insights@0.12.0-next.1 + - @backstage/plugin-techdocs@1.4.0-next.2 + - @backstage/plugin-explore@0.3.42-next.1 + - @backstage/plugin-github-actions@0.5.11-next.1 + - @backstage/cli@0.21.0-next.1 + - @backstage/plugin-catalog-graph@0.2.23-next.1 + - @backstage/core-components@0.12.0-next.1 + - @backstage/plugin-code-coverage@0.2.4-next.1 + - @backstage/plugin-org@0.6.0-next.1 + - @backstage/plugin-kubernetes@0.7.4-next.1 + - @backstage/app-defaults@1.0.8-next.1 + - @backstage/catalog-model@1.1.3-next.0 + - @backstage/config@1.0.4-next.0 + - @backstage/core-app-api@1.2.0-next.0 + - @backstage/core-plugin-api@1.1.0-next.0 + - @backstage/integration-react@1.1.6-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-airbrake@0.3.11-next.1 + - @backstage/plugin-apache-airflow@0.2.4-next.1 + - @backstage/plugin-api-docs@0.8.11-next.1 + - @backstage/plugin-azure-devops@0.2.2-next.1 + - @backstage/plugin-azure-sites@0.1.0-next.1 + - @backstage/plugin-badges@0.2.35-next.1 + - @backstage/plugin-catalog-common@1.0.8-next.0 + - @backstage/plugin-catalog-import@0.9.1-next.1 + - @backstage/plugin-catalog-react@1.2.1-next.1 + - @backstage/plugin-circleci@0.3.11-next.1 + - @backstage/plugin-cloudbuild@0.3.11-next.1 + - @backstage/plugin-dynatrace@1.0.1-next.1 + - @backstage/plugin-gcalendar@0.3.7-next.1 + - @backstage/plugin-gcp-projects@0.3.30-next.1 + - @backstage/plugin-gocd@0.1.17-next.1 + - @backstage/plugin-graphiql@0.2.43-next.1 + - @backstage/plugin-home@0.4.27-next.1 + - @backstage/plugin-jenkins@0.7.10-next.1 + - @backstage/plugin-kafka@0.3.11-next.1 + - @backstage/plugin-lighthouse@0.3.11-next.1 + - @backstage/plugin-newrelic@0.3.29-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.4-next.1 + - @backstage/plugin-pagerduty@0.5.4-next.1 + - @backstage/plugin-permission-react@0.4.7-next.0 + - @backstage/plugin-playlist@0.1.2-next.2 + - @backstage/plugin-rollbar@0.4.11-next.1 + - @backstage/plugin-search@1.0.4-next.1 + - @backstage/plugin-search-common@1.1.1-next.0 + - @backstage/plugin-search-react@1.2.1-next.1 + - @backstage/plugin-sentry@0.4.4-next.1 + - @backstage/plugin-shortcuts@0.3.3-next.1 + - @backstage/plugin-stack-overflow@0.1.7-next.1 + - @backstage/plugin-tech-insights@0.3.3-next.1 + - @backstage/plugin-tech-radar@0.5.18-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.6-next.1 + - @backstage/plugin-techdocs-react@1.0.6-next.1 + - @backstage/plugin-todo@0.2.13-next.1 + - @backstage/plugin-user-settings@0.5.1-next.1 + - @internal/plugin-catalog-customized@0.0.4-next.1 + +## 0.2.77-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-techdocs@1.4.0-next.1 + - @backstage/plugin-playlist@0.1.2-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.6-next.0 + +## 0.2.77-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder@1.8.0-next.0 + - @backstage/plugin-catalog-react@1.2.1-next.0 + - @backstage/core-components@0.12.0-next.0 + - @backstage/core-app-api@1.2.0-next.0 + - @backstage/plugin-tech-insights@0.3.2-next.0 + - @backstage/plugin-techdocs@1.4.0-next.0 + - @backstage/core-plugin-api@1.1.0-next.0 + - @backstage/plugin-cost-insights@0.12.0-next.0 + - @backstage/plugin-dynatrace@1.0.1-next.0 + - @backstage/cli@0.21.0-next.0 + - @backstage/plugin-catalog-import@0.9.1-next.0 + - @backstage/plugin-tech-radar@0.5.18-next.0 + - @backstage/catalog-model@1.1.3-next.0 + - @backstage/plugin-gcalendar@0.3.7-next.0 + - @backstage/plugin-code-coverage@0.2.4-next.0 + - @backstage/plugin-github-actions@0.5.11-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.6-next.0 + - @backstage/plugin-circleci@0.3.11-next.0 + - @backstage/plugin-azure-sites@0.1.0-next.0 + - @backstage/plugin-cloudbuild@0.3.11-next.0 + - @backstage/plugin-jenkins@0.7.10-next.0 + - @backstage/plugin-kafka@0.3.11-next.0 + - @backstage/plugin-pagerduty@0.5.4-next.0 + - @backstage/plugin-rollbar@0.4.11-next.0 + - @backstage/plugin-airbrake@0.3.11-next.0 + - @backstage/plugin-api-docs@0.8.11-next.0 + - @backstage/plugin-azure-devops@0.2.2-next.0 + - @backstage/plugin-badges@0.2.35-next.0 + - @internal/plugin-catalog-customized@0.0.4-next.0 + - @backstage/plugin-catalog-graph@0.2.23-next.0 + - @backstage/plugin-explore@0.3.42-next.0 + - @backstage/plugin-gocd@0.1.17-next.0 + - @backstage/plugin-home@0.4.27-next.0 + - @backstage/plugin-kubernetes@0.7.4-next.0 + - @backstage/plugin-lighthouse@0.3.11-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.4-next.0 + - @backstage/plugin-org@0.5.11-next.0 + - @backstage/plugin-playlist@0.1.2-next.0 + - @backstage/plugin-search@1.0.4-next.0 + - @backstage/plugin-sentry@0.4.4-next.0 + - @backstage/plugin-todo@0.2.13-next.0 + - @backstage/app-defaults@1.0.8-next.0 + - @backstage/integration-react@1.1.6-next.0 + - @backstage/plugin-apache-airflow@0.2.4-next.0 + - @backstage/plugin-gcp-projects@0.3.30-next.0 + - @backstage/plugin-graphiql@0.2.43-next.0 + - @backstage/plugin-newrelic@0.3.29-next.0 + - @backstage/plugin-search-react@1.2.1-next.0 + - @backstage/plugin-shortcuts@0.3.3-next.0 + - @backstage/plugin-stack-overflow@0.1.7-next.0 + - @backstage/plugin-techdocs-react@1.0.6-next.0 + - @backstage/plugin-user-settings@0.5.1-next.0 + - @backstage/plugin-permission-react@0.4.7-next.0 + - @backstage/config@1.0.4-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.8-next.0 + - @backstage/plugin-search-common@1.1.1-next.0 + +## 0.2.76 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-user-settings@0.5.0 + - @backstage/plugin-scaffolder@1.7.0 + - @backstage/plugin-org@0.5.10 + - @backstage/catalog-model@1.1.2 + - @backstage/plugin-catalog-react@1.2.0 + - @backstage/core-components@0.11.2 + - @backstage/plugin-catalog-graph@0.2.22 + - @backstage/core-app-api@1.1.1 + - @backstage/cli@0.20.0 + - @backstage/plugin-catalog-common@1.0.7 + - @backstage/plugin-catalog-import@0.9.0 + - @backstage/plugin-tech-insights@0.3.1 + - @backstage/plugin-kubernetes@0.7.3 + - @backstage/plugin-gcalendar@0.3.6 + - @backstage/plugin-api-docs@0.8.10 + - @backstage/plugin-search-react@1.2.0 + - @backstage/plugin-search-common@1.1.0 + - @backstage/plugin-cost-insights@0.11.32 + - @backstage/plugin-airbrake@0.3.10 + - @backstage/plugin-azure-devops@0.2.1 + - @backstage/plugin-badges@0.2.34 + - @backstage/plugin-circleci@0.3.10 + - @backstage/plugin-cloudbuild@0.3.10 + - @backstage/plugin-code-coverage@0.2.3 + - @backstage/plugin-dynatrace@1.0.0 + - @backstage/plugin-explore@0.3.41 + - @backstage/plugin-github-actions@0.5.10 + - @backstage/plugin-gocd@0.1.16 + - @backstage/plugin-home@0.4.26 + - @backstage/plugin-jenkins@0.7.9 + - @backstage/plugin-kafka@0.3.10 + - @backstage/plugin-lighthouse@0.3.10 + - @backstage/plugin-newrelic-dashboard@0.2.3 + - @backstage/plugin-pagerduty@0.5.3 + - @backstage/plugin-playlist@0.1.1 + - @backstage/plugin-rollbar@0.4.10 + - @backstage/plugin-search@1.0.3 + - @backstage/plugin-sentry@0.4.3 + - @backstage/plugin-techdocs@1.3.3 + - @backstage/plugin-techdocs-react@1.0.5 + - @backstage/plugin-todo@0.2.12 + - @internal/plugin-catalog-customized@0.0.3 + - @backstage/app-defaults@1.0.7 + - @backstage/integration-react@1.1.5 + - @backstage/plugin-apache-airflow@0.2.3 + - @backstage/plugin-gcp-projects@0.3.29 + - @backstage/plugin-graphiql@0.2.42 + - @backstage/plugin-newrelic@0.3.28 + - @backstage/plugin-shortcuts@0.3.2 + - @backstage/plugin-stack-overflow@0.1.6 + - @backstage/plugin-tech-radar@0.5.17 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.5 + - @backstage/core-plugin-api@1.0.7 + - @backstage/config@1.0.3 + - @backstage/theme@0.2.16 + - @backstage/plugin-permission-react@0.4.6 + +## 0.2.76-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder@1.7.0-next.2 + - @backstage/plugin-catalog-common@1.0.7-next.2 + - @backstage/plugin-catalog-import@0.9.0-next.2 + - @backstage/cli@0.20.0-next.2 + - @backstage/plugin-catalog-react@1.2.0-next.2 + - @backstage/plugin-playlist@0.1.1-next.2 + - @backstage/plugin-permission-react@0.4.6-next.2 + - @backstage/plugin-search-common@1.1.0-next.2 + - @backstage/app-defaults@1.0.7-next.2 + - @backstage/catalog-model@1.1.2-next.2 + - @backstage/config@1.0.3-next.2 + - @backstage/core-app-api@1.1.1-next.2 + - @backstage/core-components@0.11.2-next.2 + - @backstage/core-plugin-api@1.0.7-next.2 + - @backstage/integration-react@1.1.5-next.2 + - @backstage/theme@0.2.16 + - @backstage/plugin-airbrake@0.3.10-next.2 + - @backstage/plugin-apache-airflow@0.2.3-next.2 + - @backstage/plugin-api-docs@0.8.10-next.2 + - @backstage/plugin-azure-devops@0.2.1-next.2 + - @backstage/plugin-badges@0.2.34-next.2 + - @backstage/plugin-catalog-graph@0.2.22-next.2 + - @backstage/plugin-circleci@0.3.10-next.2 + - @backstage/plugin-cloudbuild@0.3.10-next.2 + - @backstage/plugin-code-coverage@0.2.3-next.2 + - @backstage/plugin-cost-insights@0.11.32-next.2 + - @backstage/plugin-dynatrace@1.0.0-next.2 + - @backstage/plugin-explore@0.3.41-next.2 + - @backstage/plugin-gcalendar@0.3.6-next.2 + - @backstage/plugin-gcp-projects@0.3.29-next.2 + - @backstage/plugin-github-actions@0.5.10-next.2 + - @backstage/plugin-gocd@0.1.16-next.2 + - @backstage/plugin-graphiql@0.2.42-next.2 + - @backstage/plugin-home@0.4.26-next.2 + - @backstage/plugin-jenkins@0.7.9-next.2 + - @backstage/plugin-kafka@0.3.10-next.2 + - @backstage/plugin-kubernetes@0.7.3-next.2 + - @backstage/plugin-lighthouse@0.3.10-next.2 + - @backstage/plugin-newrelic@0.3.28-next.2 + - @backstage/plugin-newrelic-dashboard@0.2.3-next.2 + - @backstage/plugin-org@0.5.10-next.2 + - @backstage/plugin-pagerduty@0.5.3-next.2 + - @backstage/plugin-rollbar@0.4.10-next.2 + - @backstage/plugin-search@1.0.3-next.2 + - @backstage/plugin-search-react@1.2.0-next.2 + - @backstage/plugin-sentry@0.4.3-next.2 + - @backstage/plugin-shortcuts@0.3.2-next.2 + - @backstage/plugin-stack-overflow@0.1.6-next.2 + - @backstage/plugin-tech-insights@0.3.1-next.2 + - @backstage/plugin-tech-radar@0.5.17-next.2 + - @backstage/plugin-techdocs@1.3.3-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.5-next.2 + - @backstage/plugin-techdocs-react@1.0.5-next.2 + - @backstage/plugin-todo@0.2.12-next.2 + - @backstage/plugin-user-settings@0.5.0-next.2 + - @internal/plugin-catalog-customized@0.0.3-next.2 + +## 0.2.76-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-user-settings@0.5.0-next.1 + - @backstage/plugin-scaffolder@1.7.0-next.1 + - @backstage/plugin-catalog-react@1.2.0-next.1 + - @backstage/core-app-api@1.1.1-next.1 + - @backstage/cli@0.20.0-next.1 + - @backstage/plugin-tech-insights@0.3.1-next.1 + - @backstage/plugin-gcalendar@0.3.6-next.1 + - @backstage/plugin-api-docs@0.8.10-next.1 + - @backstage/plugin-search-react@1.2.0-next.1 + - @backstage/plugin-search-common@1.1.0-next.1 + - @backstage/plugin-airbrake@0.3.10-next.1 + - @backstage/plugin-azure-devops@0.2.1-next.1 + - @backstage/plugin-badges@0.2.34-next.1 + - @internal/plugin-catalog-customized@0.0.3-next.1 + - @backstage/plugin-catalog-graph@0.2.22-next.1 + - @backstage/plugin-catalog-import@0.8.13-next.1 + - @backstage/plugin-circleci@0.3.10-next.1 + - @backstage/plugin-cloudbuild@0.3.10-next.1 + - @backstage/plugin-code-coverage@0.2.3-next.1 + - @backstage/plugin-dynatrace@1.0.0-next.1 + - @backstage/plugin-explore@0.3.41-next.1 + - @backstage/plugin-github-actions@0.5.10-next.1 + - @backstage/plugin-gocd@0.1.16-next.1 + - @backstage/plugin-home@0.4.26-next.1 + - @backstage/plugin-jenkins@0.7.9-next.1 + - @backstage/plugin-kafka@0.3.10-next.1 + - @backstage/plugin-kubernetes@0.7.3-next.1 + - @backstage/plugin-lighthouse@0.3.10-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.3-next.1 + - @backstage/plugin-org@0.5.10-next.1 + - @backstage/plugin-pagerduty@0.5.3-next.1 + - @backstage/plugin-playlist@0.1.1-next.1 + - @backstage/plugin-rollbar@0.4.10-next.1 + - @backstage/plugin-search@1.0.3-next.1 + - @backstage/plugin-sentry@0.4.3-next.1 + - @backstage/plugin-techdocs@1.3.3-next.1 + - @backstage/plugin-todo@0.2.12-next.1 + - @backstage/app-defaults@1.0.7-next.1 + - @backstage/core-components@0.11.2-next.1 + - @backstage/core-plugin-api@1.0.7-next.1 + - @backstage/plugin-apache-airflow@0.2.3-next.1 + - @backstage/plugin-cost-insights@0.11.32-next.1 + - @backstage/plugin-gcp-projects@0.3.29-next.1 + - @backstage/plugin-graphiql@0.2.42-next.1 + - @backstage/plugin-newrelic@0.3.28-next.1 + - @backstage/plugin-shortcuts@0.3.2-next.1 + - @backstage/plugin-stack-overflow@0.1.6-next.1 + - @backstage/plugin-tech-radar@0.5.17-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.5-next.1 + - @backstage/catalog-model@1.1.2-next.1 + - @backstage/config@1.0.3-next.1 + - @backstage/integration-react@1.1.5-next.1 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.7-next.1 + - @backstage/plugin-permission-react@0.4.6-next.1 + - @backstage/plugin-techdocs-react@1.0.5-next.1 + +## 0.2.76-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-org@0.5.10-next.0 + - @backstage/catalog-model@1.1.2-next.0 + - @backstage/core-components@0.11.2-next.0 + - @backstage/cli@0.20.0-next.0 + - @backstage/plugin-kubernetes@0.7.3-next.0 + - @backstage/plugin-scaffolder@1.7.0-next.0 + - @backstage/plugin-api-docs@0.8.10-next.0 + - @backstage/plugin-user-settings@0.5.0-next.0 + - @backstage/plugin-cost-insights@0.11.32-next.0 + - @backstage/plugin-airbrake@0.3.10-next.0 + - @backstage/plugin-azure-devops@0.2.1-next.0 + - @backstage/plugin-badges@0.2.34-next.0 + - @backstage/plugin-catalog-graph@0.2.22-next.0 + - @backstage/plugin-catalog-import@0.8.13-next.0 + - @backstage/plugin-catalog-react@1.1.5-next.0 + - @backstage/plugin-circleci@0.3.10-next.0 + - @backstage/plugin-cloudbuild@0.3.10-next.0 + - @backstage/plugin-code-coverage@0.2.3-next.0 + - @backstage/plugin-dynatrace@0.2.1-next.0 + - @backstage/plugin-explore@0.3.41-next.0 + - @backstage/plugin-github-actions@0.5.10-next.0 + - @backstage/plugin-gocd@0.1.16-next.0 + - @backstage/plugin-home@0.4.26-next.0 + - @backstage/plugin-jenkins@0.7.9-next.0 + - @backstage/plugin-kafka@0.3.10-next.0 + - @backstage/plugin-lighthouse@0.3.10-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.3-next.0 + - @backstage/plugin-pagerduty@0.5.3-next.0 + - @backstage/plugin-playlist@0.1.1-next.0 + - @backstage/plugin-rollbar@0.4.10-next.0 + - @backstage/plugin-search@1.0.3-next.0 + - @backstage/plugin-sentry@0.4.3-next.0 + - @backstage/plugin-tech-insights@0.3.1-next.0 + - @backstage/plugin-techdocs@1.3.3-next.0 + - @backstage/plugin-techdocs-react@1.0.5-next.0 + - @backstage/plugin-todo@0.2.12-next.0 + - @backstage/app-defaults@1.0.7-next.0 + - @backstage/integration-react@1.1.5-next.0 + - @backstage/plugin-apache-airflow@0.2.3-next.0 + - @backstage/plugin-gcalendar@0.3.6-next.0 + - @backstage/plugin-gcp-projects@0.3.29-next.0 + - @backstage/plugin-graphiql@0.2.42-next.0 + - @backstage/plugin-newrelic@0.3.28-next.0 + - @backstage/plugin-search-react@1.1.1-next.0 + - @backstage/plugin-shortcuts@0.3.2-next.0 + - @backstage/plugin-stack-overflow@0.1.6-next.0 + - @backstage/plugin-tech-radar@0.5.17-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.5-next.0 + - @backstage/config@1.0.3-next.0 + - @backstage/core-app-api@1.1.1-next.0 + - @backstage/core-plugin-api@1.0.7-next.0 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.7-next.0 + - @backstage/plugin-permission-react@0.4.6-next.0 + - @backstage/plugin-search-common@1.0.2-next.0 + - @internal/plugin-catalog-customized@0.0.3-next.0 + +## 0.2.75 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.19.0 + - @backstage/app-defaults@1.0.6 + - @backstage/core-app-api@1.1.0 + - @backstage/core-components@0.11.1 + - @backstage/core-plugin-api@1.0.6 + - @backstage/plugin-airbrake@0.3.9 + - @backstage/plugin-api-docs@0.8.9 + - @backstage/plugin-azure-devops@0.2.0 + - @backstage/plugin-badges@0.2.33 + - @backstage/plugin-catalog-graph@0.2.21 + - @backstage/plugin-catalog-import@0.8.12 + - @backstage/plugin-catalog-react@1.1.4 + - @backstage/plugin-circleci@0.3.9 + - @backstage/plugin-cloudbuild@0.3.9 + - @backstage/plugin-code-coverage@0.2.2 + - @backstage/plugin-cost-insights@0.11.31 + - @backstage/plugin-explore@0.3.40 + - @backstage/plugin-gcp-projects@0.3.28 + - @backstage/plugin-github-actions@0.5.9 + - @backstage/plugin-graphiql@0.2.41 + - @backstage/plugin-home@0.4.25 + - @backstage/plugin-jenkins@0.7.8 + - @backstage/plugin-kafka@0.3.9 + - @backstage/plugin-kubernetes@0.7.2 + - @backstage/plugin-lighthouse@0.3.9 + - @backstage/plugin-org@0.5.9 + - @backstage/plugin-pagerduty@0.5.2 + - @backstage/plugin-permission-react@0.4.5 + - @backstage/plugin-rollbar@0.4.9 + - @backstage/plugin-scaffolder@1.6.0 + - @backstage/plugin-search-react@1.1.0 + - @backstage/plugin-search@1.0.2 + - @backstage/plugin-sentry@0.4.2 + - @backstage/plugin-shortcuts@0.3.1 + - @backstage/plugin-tech-insights@0.3.0 + - @backstage/plugin-techdocs-react@1.0.4 + - @backstage/plugin-techdocs@1.3.2 + - @backstage/plugin-todo@0.2.11 + - @backstage/plugin-user-settings@0.4.8 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.4 + - @backstage/plugin-newrelic-dashboard@0.2.2 + - @backstage/plugin-dynatrace@0.2.0 + - @backstage/catalog-model@1.1.1 + - @backstage/config@1.0.2 + - @backstage/integration-react@1.1.4 + - @backstage/plugin-apache-airflow@0.2.2 + - @backstage/plugin-gcalendar@0.3.5 + - @backstage/plugin-gocd@0.1.15 + - @backstage/plugin-newrelic@0.3.27 + - @backstage/plugin-stack-overflow@0.1.5 + - @backstage/plugin-tech-radar@0.5.16 + - @backstage/plugin-playlist@0.1.0 + - @backstage/plugin-catalog-common@1.0.6 + - @internal/plugin-catalog-customized@0.0.2 + - @backstage/plugin-search-common@1.0.1 + +## 0.2.75-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.1.4-next.2 + - @backstage/app-defaults@1.0.6-next.2 + - @backstage/catalog-model@1.1.1-next.0 + - @backstage/config@1.0.2-next.0 + - @backstage/core-app-api@1.1.0-next.3 + - @backstage/core-components@0.11.1-next.3 + - @backstage/core-plugin-api@1.0.6-next.3 + - @backstage/integration-react@1.1.4-next.2 + - @backstage/plugin-airbrake@0.3.9-next.3 + - @backstage/plugin-apache-airflow@0.2.2-next.3 + - @backstage/plugin-api-docs@0.8.9-next.3 + - @backstage/plugin-azure-devops@0.2.0-next.3 + - @backstage/plugin-badges@0.2.33-next.3 + - @backstage/plugin-catalog-graph@0.2.21-next.2 + - @backstage/plugin-catalog-import@0.8.12-next.3 + - @backstage/plugin-circleci@0.3.9-next.3 + - @backstage/plugin-cloudbuild@0.3.9-next.3 + - @backstage/plugin-code-coverage@0.2.2-next.3 + - @backstage/plugin-cost-insights@0.11.31-next.3 + - @backstage/plugin-dynatrace@0.2.0-next.3 + - @backstage/plugin-explore@0.3.40-next.3 + - @backstage/plugin-gcalendar@0.3.5-next.3 + - @backstage/plugin-gcp-projects@0.3.28-next.3 + - @backstage/plugin-github-actions@0.5.9-next.3 + - @backstage/plugin-gocd@0.1.15-next.2 + - @backstage/plugin-graphiql@0.2.41-next.3 + - @backstage/plugin-home@0.4.25-next.3 + - @backstage/plugin-jenkins@0.7.8-next.3 + - @backstage/plugin-kafka@0.3.9-next.3 + - @backstage/plugin-kubernetes@0.7.2-next.3 + - @backstage/plugin-lighthouse@0.3.9-next.3 + - @backstage/plugin-newrelic@0.3.27-next.3 + - @backstage/plugin-org@0.5.9-next.3 + - @backstage/plugin-pagerduty@0.5.2-next.3 + - @backstage/plugin-permission-react@0.4.5-next.2 + - @backstage/plugin-rollbar@0.4.9-next.3 + - @backstage/plugin-scaffolder@1.6.0-next.3 + - @backstage/plugin-search@1.0.2-next.3 + - @backstage/plugin-sentry@0.4.2-next.3 + - @backstage/plugin-shortcuts@0.3.1-next.3 + - @backstage/plugin-stack-overflow@0.1.5-next.3 + - @backstage/plugin-tech-insights@0.3.0-next.3 + - @backstage/plugin-tech-radar@0.5.16-next.3 + - @backstage/plugin-techdocs@1.3.2-next.3 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.4-next.2 + - @backstage/plugin-todo@0.2.11-next.3 + - @backstage/plugin-user-settings@0.4.8-next.3 + - @backstage/cli@0.19.0-next.3 + - @backstage/plugin-newrelic-dashboard@0.2.2-next.2 + - @backstage/plugin-techdocs-react@1.0.4-next.2 + +## 0.2.75-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.19.0-next.2 + - @backstage/core-app-api@1.1.0-next.2 + - @backstage/plugin-catalog-import@0.8.12-next.2 + - @backstage/plugin-scaffolder@1.6.0-next.2 + - @backstage/plugin-techdocs@1.3.2-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.4-next.1 + - @backstage/plugin-apache-airflow@0.2.2-next.2 + - @backstage/core-components@0.11.1-next.2 + - @backstage/core-plugin-api@1.0.6-next.2 + - @backstage/integration-react@1.1.4-next.1 + - @backstage/plugin-airbrake@0.3.9-next.2 + - @backstage/plugin-api-docs@0.8.9-next.2 + - @backstage/plugin-azure-devops@0.2.0-next.2 + - @backstage/plugin-badges@0.2.33-next.2 + - @backstage/plugin-circleci@0.3.9-next.2 + - @backstage/plugin-cloudbuild@0.3.9-next.2 + - @backstage/plugin-code-coverage@0.2.2-next.2 + - @backstage/plugin-cost-insights@0.11.31-next.2 + - @backstage/plugin-dynatrace@0.2.0-next.2 + - @backstage/plugin-explore@0.3.40-next.2 + - @backstage/plugin-gcalendar@0.3.5-next.2 + - @backstage/plugin-gcp-projects@0.3.28-next.2 + - @backstage/plugin-github-actions@0.5.9-next.2 + - @backstage/plugin-gocd@0.1.15-next.1 + - @backstage/plugin-graphiql@0.2.41-next.2 + - @backstage/plugin-home@0.4.25-next.2 + - @backstage/plugin-jenkins@0.7.8-next.2 + - @backstage/plugin-kafka@0.3.9-next.2 + - @backstage/plugin-kubernetes@0.7.2-next.2 + - @backstage/plugin-lighthouse@0.3.9-next.2 + - @backstage/plugin-newrelic@0.3.27-next.2 + - @backstage/plugin-org@0.5.9-next.2 + - @backstage/plugin-pagerduty@0.5.2-next.2 + - @backstage/plugin-rollbar@0.4.9-next.2 + - @backstage/plugin-search@1.0.2-next.2 + - @backstage/plugin-sentry@0.4.2-next.2 + - @backstage/plugin-shortcuts@0.3.1-next.2 + - @backstage/plugin-stack-overflow@0.1.5-next.2 + - @backstage/plugin-tech-insights@0.3.0-next.2 + - @backstage/plugin-tech-radar@0.5.16-next.2 + - @backstage/plugin-todo@0.2.11-next.2 + - @backstage/plugin-user-settings@0.4.8-next.2 + - @backstage/plugin-search-react@1.1.0-next.2 + +## 0.2.75-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/app-defaults@1.0.6-next.1 + - @backstage/core-app-api@1.1.0-next.1 + - @backstage/core-components@0.11.1-next.1 + - @backstage/core-plugin-api@1.0.6-next.1 + - @backstage/plugin-airbrake@0.3.9-next.1 + - @backstage/plugin-api-docs@0.8.9-next.1 + - @backstage/plugin-azure-devops@0.2.0-next.1 + - @backstage/plugin-badges@0.2.33-next.1 + - @backstage/plugin-catalog-graph@0.2.21-next.1 + - @backstage/plugin-catalog-import@0.8.12-next.1 + - @backstage/plugin-catalog-react@1.1.4-next.1 + - @backstage/plugin-circleci@0.3.9-next.1 + - @backstage/plugin-cloudbuild@0.3.9-next.1 + - @backstage/plugin-code-coverage@0.2.2-next.1 + - @backstage/plugin-cost-insights@0.11.31-next.1 + - @backstage/plugin-explore@0.3.40-next.1 + - @backstage/plugin-gcp-projects@0.3.28-next.1 + - @backstage/plugin-github-actions@0.5.9-next.1 + - @backstage/plugin-graphiql@0.2.41-next.1 + - @backstage/plugin-home@0.4.25-next.1 + - @backstage/plugin-jenkins@0.7.8-next.1 + - @backstage/plugin-kafka@0.3.9-next.1 + - @backstage/plugin-kubernetes@0.7.2-next.1 + - @backstage/plugin-lighthouse@0.3.9-next.1 + - @backstage/plugin-org@0.5.9-next.1 + - @backstage/plugin-pagerduty@0.5.2-next.1 + - @backstage/plugin-permission-react@0.4.5-next.1 + - @backstage/plugin-rollbar@0.4.9-next.1 + - @backstage/plugin-scaffolder@1.6.0-next.1 + - @backstage/plugin-search-react@1.0.2-next.1 + - @backstage/plugin-search@1.0.2-next.1 + - @backstage/plugin-sentry@0.4.2-next.1 + - @backstage/plugin-shortcuts@0.3.1-next.1 + - @backstage/plugin-tech-insights@0.3.0-next.1 + - @backstage/plugin-techdocs-react@1.0.4-next.1 + - @backstage/plugin-techdocs@1.3.2-next.1 + - @backstage/plugin-todo@0.2.11-next.1 + - @backstage/plugin-user-settings@0.4.8-next.1 + - @backstage/cli@0.19.0-next.1 + - @backstage/plugin-dynatrace@0.2.0-next.1 + - @backstage/plugin-apache-airflow@0.2.2-next.1 + - @backstage/plugin-gcalendar@0.3.5-next.1 + - @backstage/plugin-newrelic@0.3.27-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.2-next.1 + - @backstage/plugin-tech-radar@0.5.16-next.1 + - @backstage/plugin-stack-overflow@0.1.5-next.1 + +## 0.2.75-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kafka@0.3.9-next.0 + - @backstage/plugin-lighthouse@0.3.9-next.0 + - @backstage/plugin-scaffolder@1.6.0-next.0 + - @backstage/plugin-azure-devops@0.2.0-next.0 + - @backstage/plugin-cloudbuild@0.3.9-next.0 + - @backstage/plugin-explore@0.3.40-next.0 + - @backstage/plugin-github-actions@0.5.9-next.0 + - @backstage/plugin-jenkins@0.7.8-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.2-next.0 + - @backstage/plugin-pagerduty@0.5.2-next.0 + - @backstage/plugin-sentry@0.4.2-next.0 + - @backstage/plugin-tech-insights@0.2.5-next.0 + - @backstage/plugin-techdocs@1.3.2-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.4-next.0 + - @backstage/plugin-user-settings@0.4.8-next.0 + - @backstage/plugin-dynatrace@0.2.0-next.0 + - @backstage/plugin-cost-insights@0.11.31-next.0 + - @backstage/core-app-api@1.0.6-next.0 + - @backstage/core-plugin-api@1.0.6-next.0 + - @backstage/core-components@0.11.1-next.0 + - @backstage/plugin-org@0.5.9-next.0 + - @backstage/cli@0.18.2-next.0 + - @backstage/integration-react@1.1.4-next.0 + - @backstage/plugin-airbrake@0.3.9-next.0 + - @backstage/plugin-apache-airflow@0.2.2-next.0 + - @backstage/plugin-api-docs@0.8.9-next.0 + - @backstage/plugin-badges@0.2.33-next.0 + - @backstage/plugin-catalog-import@0.8.12-next.0 + - @backstage/plugin-circleci@0.3.9-next.0 + - @backstage/plugin-code-coverage@0.2.2-next.0 + - @backstage/plugin-gcalendar@0.3.5-next.0 + - @backstage/plugin-gcp-projects@0.3.28-next.0 + - @backstage/plugin-gocd@0.1.15-next.0 + - @backstage/plugin-graphiql@0.2.41-next.0 + - @backstage/plugin-home@0.4.25-next.0 + - @backstage/plugin-kubernetes@0.7.2-next.0 + - @backstage/plugin-newrelic@0.3.27-next.0 + - @backstage/plugin-rollbar@0.4.9-next.0 + - @backstage/plugin-search@1.0.2-next.0 + - @backstage/plugin-shortcuts@0.3.1-next.0 + - @backstage/plugin-stack-overflow@0.1.5-next.0 + - @backstage/plugin-tech-radar@0.5.16-next.0 + - @backstage/plugin-todo@0.2.11-next.0 + - @backstage/plugin-catalog-react@1.1.4-next.0 + - @backstage/app-defaults@1.0.6-next.0 + - @backstage/plugin-catalog-graph@0.2.21-next.0 + - @backstage/plugin-search-react@1.0.2-next.0 + - @backstage/plugin-permission-react@0.4.5-next.0 + - @backstage/plugin-techdocs-react@1.0.4-next.0 + - @backstage/plugin-catalog-common@1.0.6-next.0 + - @backstage/plugin-search-common@1.0.1-next.0 + - @internal/plugin-catalog-customized@0.0.2-next.0 + +## 0.2.74 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes@0.7.1 + - @backstage/cli@0.18.1 + - @backstage/plugin-techdocs@1.3.1 + - @backstage/plugin-home@0.4.24 + - @backstage/core-components@0.11.0 + - @backstage/plugin-scaffolder@1.5.0 + - @backstage/core-plugin-api@1.0.5 + - @backstage/plugin-catalog-react@1.1.3 + - @backstage/plugin-cost-insights@0.11.30 + - @backstage/plugin-graphiql@0.2.40 + - @backstage/plugin-catalog-common@1.0.5 + - @backstage/plugin-kafka@0.3.8 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.3 + - @backstage/plugin-gocd@0.1.14 + - @backstage/plugin-sentry@0.4.1 + - @backstage/plugin-api-docs@0.8.8 + - @backstage/plugin-techdocs-react@1.0.3 + - @backstage/plugin-shortcuts@0.3.0 + - @backstage/plugin-tech-radar@0.5.15 + - @backstage/app-defaults@1.0.5 + - @backstage/core-app-api@1.0.5 + - @backstage/integration-react@1.1.3 + - @backstage/plugin-airbrake@0.3.8 + - @backstage/plugin-apache-airflow@0.2.1 + - @backstage/plugin-azure-devops@0.1.24 + - @backstage/plugin-badges@0.2.32 + - @internal/plugin-catalog-customized@0.0.1 + - @backstage/plugin-catalog-graph@0.2.20 + - @backstage/plugin-catalog-import@0.8.11 + - @backstage/plugin-circleci@0.3.8 + - @backstage/plugin-cloudbuild@0.3.8 + - @backstage/plugin-code-coverage@0.2.1 + - @backstage/plugin-dynatrace@0.1.2 + - @backstage/plugin-explore@0.3.39 + - @backstage/plugin-gcalendar@0.3.4 + - @backstage/plugin-gcp-projects@0.3.27 + - @backstage/plugin-github-actions@0.5.8 + - @backstage/plugin-jenkins@0.7.7 + - @backstage/plugin-lighthouse@0.3.8 + - @backstage/plugin-newrelic@0.3.26 + - @backstage/plugin-newrelic-dashboard@0.2.1 + - @backstage/plugin-org@0.5.8 + - @backstage/plugin-pagerduty@0.5.1 + - @backstage/plugin-permission-react@0.4.4 + - @backstage/plugin-rollbar@0.4.8 + - @backstage/plugin-search@1.0.1 + - @backstage/plugin-search-react@1.0.1 + - @backstage/plugin-stack-overflow@0.1.4 + - @backstage/plugin-tech-insights@0.2.4 + - @backstage/plugin-todo@0.2.10 + - @backstage/plugin-user-settings@0.4.7 + +## 0.2.74-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes@0.7.1-next.2 + - @backstage/plugin-catalog-react@1.1.3-next.2 + - @backstage/plugin-cost-insights@0.11.30-next.1 + - @backstage/cli@0.18.1-next.1 + - @backstage/plugin-techdocs@1.3.1-next.2 + - @backstage/core-components@0.11.0-next.2 + - @backstage/app-defaults@1.0.5-next.1 + - @backstage/integration-react@1.1.3-next.1 + - @backstage/plugin-airbrake@0.3.8-next.1 + - @backstage/plugin-apache-airflow@0.2.1-next.1 + - @backstage/plugin-api-docs@0.8.8-next.2 + - @backstage/plugin-azure-devops@0.1.24-next.1 + - @backstage/plugin-badges@0.2.32-next.1 + - @backstage/plugin-catalog-graph@0.2.20-next.1 + - @backstage/plugin-catalog-import@0.8.11-next.1 + - @backstage/plugin-circleci@0.3.8-next.1 + - @backstage/plugin-cloudbuild@0.3.8-next.1 + - @backstage/plugin-code-coverage@0.2.1-next.1 + - @backstage/plugin-dynatrace@0.1.2-next.1 + - @backstage/plugin-explore@0.3.39-next.1 + - @backstage/plugin-gcalendar@0.3.4-next.1 + - @backstage/plugin-gcp-projects@0.3.27-next.1 + - @backstage/plugin-github-actions@0.5.8-next.1 + - @backstage/plugin-gocd@0.1.14-next.1 + - @backstage/plugin-graphiql@0.2.40-next.1 + - @backstage/plugin-home@0.4.24-next.2 + - @backstage/plugin-jenkins@0.7.7-next.2 + - @backstage/plugin-kafka@0.3.8-next.1 + - @backstage/plugin-lighthouse@0.3.8-next.1 + - @backstage/plugin-newrelic@0.3.26-next.1 + - @backstage/plugin-newrelic-dashboard@0.2.1-next.1 + - @backstage/plugin-org@0.5.8-next.1 + - @backstage/plugin-pagerduty@0.5.1-next.1 + - @backstage/plugin-rollbar@0.4.8-next.1 + - @backstage/plugin-scaffolder@1.5.0-next.2 + - @backstage/plugin-search@1.0.1-next.1 + - @backstage/plugin-search-react@1.0.1-next.1 + - @backstage/plugin-sentry@0.4.1-next.1 + - @backstage/plugin-shortcuts@0.3.0-next.1 + - @backstage/plugin-stack-overflow@0.1.4-next.1 + - @backstage/plugin-tech-insights@0.2.4-next.1 + - @backstage/plugin-tech-radar@0.5.15-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.3-next.2 + - @backstage/plugin-techdocs-react@1.0.3-next.2 + - @backstage/plugin-todo@0.2.10-next.1 + - @backstage/plugin-user-settings@0.4.7-next.1 + +## 0.2.74-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes@0.7.1-next.1 + - @backstage/plugin-home@0.4.24-next.1 + - @backstage/core-components@0.10.1-next.1 + - @backstage/plugin-scaffolder@1.5.0-next.1 + - @backstage/plugin-techdocs@1.3.1-next.1 + - @backstage/plugin-catalog-common@1.0.5-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.3-next.1 + - @backstage/plugin-api-docs@0.8.8-next.1 + - @backstage/plugin-techdocs-react@1.0.3-next.1 + - @backstage/plugin-catalog-react@1.1.3-next.1 + - @backstage/plugin-jenkins@0.7.7-next.1 + +## 0.2.74-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.0.5-next.0 + - @backstage/plugin-techdocs@1.3.1-next.0 + - @backstage/cli@0.18.1-next.0 + - @backstage/plugin-kafka@0.3.8-next.0 + - @backstage/plugin-gocd@0.1.14-next.0 + - @backstage/plugin-sentry@0.4.1-next.0 + - @backstage/plugin-shortcuts@0.3.0-next.0 + - @backstage/integration-react@1.1.3-next.0 + - @backstage/plugin-catalog-import@0.8.11-next.0 + - @backstage/plugin-catalog-react@1.1.3-next.0 + - @backstage/plugin-github-actions@0.5.8-next.0 + - @backstage/plugin-scaffolder@1.4.1-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.3-next.0 + - @backstage/app-defaults@1.0.5-next.0 + - @backstage/core-app-api@1.0.5-next.0 + - @backstage/core-components@0.10.1-next.0 + - @backstage/plugin-airbrake@0.3.8-next.0 + - @backstage/plugin-apache-airflow@0.2.1-next.0 + - @backstage/plugin-api-docs@0.8.8-next.0 + - @backstage/plugin-azure-devops@0.1.24-next.0 + - @backstage/plugin-badges@0.2.32-next.0 + - @backstage/plugin-catalog-graph@0.2.20-next.0 + - @backstage/plugin-circleci@0.3.8-next.0 + - @backstage/plugin-cloudbuild@0.3.8-next.0 + - @backstage/plugin-code-coverage@0.2.1-next.0 + - @backstage/plugin-cost-insights@0.11.30-next.0 + - @backstage/plugin-dynatrace@0.1.2-next.0 + - @backstage/plugin-explore@0.3.39-next.0 + - @backstage/plugin-gcalendar@0.3.4-next.0 + - @backstage/plugin-gcp-projects@0.3.27-next.0 + - @backstage/plugin-graphiql@0.2.40-next.0 + - @backstage/plugin-home@0.4.24-next.0 + - @backstage/plugin-jenkins@0.7.7-next.0 + - @backstage/plugin-kubernetes@0.7.1-next.0 + - @backstage/plugin-lighthouse@0.3.8-next.0 + - @backstage/plugin-newrelic@0.3.26-next.0 + - @backstage/plugin-newrelic-dashboard@0.2.1-next.0 + - @backstage/plugin-org@0.5.8-next.0 + - @backstage/plugin-pagerduty@0.5.1-next.0 + - @backstage/plugin-permission-react@0.4.4-next.0 + - @backstage/plugin-rollbar@0.4.8-next.0 + - @backstage/plugin-search@1.0.1-next.0 + - @backstage/plugin-search-react@1.0.1-next.0 + - @backstage/plugin-stack-overflow@0.1.4-next.0 + - @backstage/plugin-tech-insights@0.2.4-next.0 + - @backstage/plugin-tech-radar@0.5.15-next.0 + - @backstage/plugin-techdocs-react@1.0.3-next.0 + - @backstage/plugin-todo@0.2.10-next.0 + - @backstage/plugin-user-settings@0.4.7-next.0 + - @internal/plugin-catalog-customized@0.0.1-next.0 + +## 0.2.73 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-cost-insights@0.11.29 + - @backstage/plugin-code-coverage@0.2.0 + - @backstage/plugin-scaffolder@1.4.0 + - @backstage/core-components@0.10.0 + - @backstage/catalog-model@1.1.0 + - @backstage/plugin-techdocs-react@1.0.2 + - @backstage/plugin-search@1.0.0 + - @backstage/plugin-search-react@1.0.0 + - @backstage/plugin-search-common@1.0.0 + - @backstage/plugin-kubernetes@0.7.0 + - @backstage/plugin-tech-radar@0.5.14 + - @backstage/plugin-catalog@1.4.0 + - @backstage/plugin-newrelic-dashboard@0.2.0 + - @backstage/cli@0.18.0 + - @backstage/plugin-apache-airflow@0.2.0 + - @backstage/app-defaults@1.0.4 + - @backstage/core-app-api@1.0.4 + - @backstage/core-plugin-api@1.0.4 + - @backstage/plugin-jenkins@0.7.6 + - @backstage/plugin-stack-overflow@0.1.3 + - @backstage/plugin-catalog-import@0.8.10 + - @backstage/plugin-github-actions@0.5.7 + - @backstage/plugin-sentry@0.4.0 + - @backstage/integration-react@1.1.2 + - @backstage/plugin-airbrake@0.3.7 + - @backstage/plugin-api-docs@0.8.7 + - @backstage/plugin-azure-devops@0.1.23 + - @backstage/plugin-badges@0.2.31 + - @backstage/plugin-circleci@0.3.7 + - @backstage/plugin-cloudbuild@0.3.7 + - @backstage/plugin-dynatrace@0.1.1 + - @backstage/plugin-explore@0.3.38 + - @backstage/plugin-gcalendar@0.3.3 + - @backstage/plugin-gcp-projects@0.3.26 + - @backstage/plugin-gocd@0.1.13 + - @backstage/plugin-graphiql@0.2.39 + - @backstage/plugin-home@0.4.23 + - @backstage/plugin-kafka@0.3.7 + - @backstage/plugin-lighthouse@0.3.7 + - @backstage/plugin-newrelic@0.3.25 + - @backstage/plugin-org@0.5.7 + - @backstage/plugin-pagerduty@0.5.0 + - @backstage/plugin-rollbar@0.4.7 + - @backstage/plugin-shortcuts@0.2.8 + - @backstage/plugin-tech-insights@0.2.3 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.2 + - @backstage/plugin-techdocs@1.3.0 + - @backstage/plugin-todo@0.2.9 + - @backstage/plugin-user-settings@0.4.6 + - @backstage/plugin-catalog-react@1.1.2 + - @backstage/theme@0.2.16 + - @backstage/plugin-catalog-common@1.0.4 + - @backstage/plugin-catalog-graph@0.2.19 + - @backstage/plugin-permission-react@0.4.3 + +## 0.2.73-next.3 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-code-coverage@0.2.0-next.3 + - @backstage/plugin-scaffolder@1.4.0-next.3 + - @backstage/plugin-kubernetes@0.7.0-next.3 + - @backstage/plugin-tech-radar@0.5.14-next.3 + - @backstage/plugin-newrelic-dashboard@0.2.0-next.3 + - @backstage/app-defaults@1.0.4-next.3 + - @backstage/core-app-api@1.0.4-next.1 + - @backstage/core-plugin-api@1.0.4-next.0 + - @backstage/core-components@0.10.0-next.3 + - @backstage/plugin-sentry@0.4.0-next.3 + - @backstage/cli@0.18.0-next.3 + - @backstage/integration-react@1.1.2-next.3 + - @backstage/plugin-airbrake@0.3.7-next.3 + - @backstage/plugin-apache-airflow@0.2.0-next.3 + - @backstage/plugin-api-docs@0.8.7-next.3 + - @backstage/plugin-azure-devops@0.1.23-next.3 + - @backstage/plugin-badges@0.2.31-next.3 + - @backstage/plugin-catalog-import@0.8.10-next.3 + - @backstage/plugin-circleci@0.3.7-next.3 + - @backstage/plugin-cloudbuild@0.3.7-next.3 + - @backstage/plugin-cost-insights@0.11.29-next.3 + - @backstage/plugin-dynatrace@0.1.1-next.3 + - @backstage/plugin-explore@0.3.38-next.3 + - @backstage/plugin-gcalendar@0.3.3-next.3 + - @backstage/plugin-gcp-projects@0.3.26-next.3 + - @backstage/plugin-github-actions@0.5.7-next.3 + - @backstage/plugin-gocd@0.1.13-next.3 + - @backstage/plugin-graphiql@0.2.39-next.3 + - @backstage/plugin-home@0.4.23-next.3 + - @backstage/plugin-jenkins@0.7.6-next.3 + - @backstage/plugin-kafka@0.3.7-next.3 + - @backstage/plugin-lighthouse@0.3.7-next.3 + - @backstage/plugin-newrelic@0.3.25-next.3 + - @backstage/plugin-org@0.5.7-next.3 + - @backstage/plugin-pagerduty@0.5.0-next.3 + - @backstage/plugin-rollbar@0.4.7-next.3 + - @backstage/plugin-search@0.9.1-next.3 + - @backstage/plugin-shortcuts@0.2.8-next.3 + - @backstage/plugin-stack-overflow@0.1.3-next.3 + - @backstage/plugin-tech-insights@0.2.3-next.3 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.2-next.3 + - @backstage/plugin-techdocs@1.2.1-next.3 + - @backstage/plugin-todo@0.2.9-next.3 + - @backstage/plugin-user-settings@0.4.6-next.3 + - @backstage/catalog-model@1.1.0-next.3 + - @backstage/plugin-catalog-react@1.1.2-next.3 + - @backstage/plugin-catalog@1.4.0-next.3 + - @backstage/plugin-catalog-graph@0.2.19-next.3 + - @backstage/plugin-permission-react@0.4.3-next.1 + - @backstage/plugin-search-react@0.2.2-next.3 + - @backstage/plugin-techdocs-react@1.0.2-next.2 + +## 0.2.73-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-cost-insights@0.11.29-next.2 + - @backstage/core-components@0.10.0-next.2 + - @backstage/plugin-scaffolder@1.4.0-next.2 + - @backstage/plugin-jenkins@0.7.6-next.2 + - @backstage/catalog-model@1.1.0-next.2 + - @backstage/plugin-search-react@0.2.2-next.2 + - @backstage/theme@0.2.16-next.1 + - @backstage/plugin-catalog-import@0.8.10-next.2 + - @backstage/plugin-techdocs@1.2.1-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.2-next.2 + - @backstage/plugin-api-docs@0.8.7-next.2 + - @backstage/plugin-catalog@1.4.0-next.2 + - @backstage/cli@0.18.0-next.2 + - @backstage/plugin-catalog-react@1.1.2-next.2 + - @backstage/app-defaults@1.0.4-next.2 + - @backstage/integration-react@1.1.2-next.2 + - @backstage/plugin-airbrake@0.3.7-next.2 + - @backstage/plugin-apache-airflow@0.2.0-next.2 + - @backstage/plugin-azure-devops@0.1.23-next.2 + - @backstage/plugin-badges@0.2.31-next.2 + - @backstage/plugin-catalog-graph@0.2.19-next.2 + - @backstage/plugin-circleci@0.3.7-next.2 + - @backstage/plugin-cloudbuild@0.3.7-next.2 + - @backstage/plugin-code-coverage@0.1.34-next.2 + - @backstage/plugin-dynatrace@0.1.1-next.2 + - @backstage/plugin-explore@0.3.38-next.2 + - @backstage/plugin-gcalendar@0.3.3-next.2 + - @backstage/plugin-gcp-projects@0.3.26-next.2 + - @backstage/plugin-github-actions@0.5.7-next.2 + - @backstage/plugin-gocd@0.1.13-next.2 + - @backstage/plugin-graphiql@0.2.39-next.2 + - @backstage/plugin-home@0.4.23-next.2 + - @backstage/plugin-kafka@0.3.7-next.2 + - @backstage/plugin-kubernetes@0.6.7-next.2 + - @backstage/plugin-lighthouse@0.3.7-next.2 + - @backstage/plugin-newrelic@0.3.25-next.2 + - @backstage/plugin-newrelic-dashboard@0.1.15-next.2 + - @backstage/plugin-org@0.5.7-next.2 + - @backstage/plugin-pagerduty@0.5.0-next.2 + - @backstage/plugin-rollbar@0.4.7-next.2 + - @backstage/plugin-search@0.9.1-next.2 + - @backstage/plugin-sentry@0.3.45-next.2 + - @backstage/plugin-shortcuts@0.2.8-next.2 + - @backstage/plugin-stack-overflow@0.1.3-next.2 + - @backstage/plugin-tech-insights@0.2.3-next.2 + - @backstage/plugin-tech-radar@0.5.14-next.2 + - @backstage/plugin-techdocs-react@1.0.2-next.1 + - @backstage/plugin-todo@0.2.9-next.2 + - @backstage/plugin-user-settings@0.4.6-next.2 + +## 0.2.73-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.6-next.1 + - @backstage/cli@0.18.0-next.1 + - @backstage/plugin-apache-airflow@0.2.0-next.1 + - @backstage/catalog-model@1.1.0-next.1 + - @backstage/plugin-search@0.9.1-next.1 + - @backstage/plugin-org@0.5.7-next.1 + - @backstage/plugin-catalog@1.3.1-next.1 + - @backstage/plugin-home@0.4.23-next.1 + - @backstage/plugin-stack-overflow@0.1.3-next.1 + - @backstage/theme@0.2.16-next.0 + - @backstage/plugin-techdocs@1.2.1-next.1 + - @backstage/app-defaults@1.0.4-next.1 + - @backstage/integration-react@1.1.2-next.1 + - @backstage/plugin-airbrake@0.3.7-next.1 + - @backstage/plugin-api-docs@0.8.7-next.1 + - @backstage/plugin-azure-devops@0.1.23-next.1 + - @backstage/plugin-badges@0.2.31-next.1 + - @backstage/plugin-catalog-common@1.0.4-next.0 + - @backstage/plugin-catalog-graph@0.2.19-next.1 + - @backstage/plugin-catalog-import@0.8.10-next.1 + - @backstage/plugin-catalog-react@1.1.2-next.1 + - @backstage/plugin-circleci@0.3.7-next.1 + - @backstage/plugin-cloudbuild@0.3.7-next.1 + - @backstage/plugin-code-coverage@0.1.34-next.1 + - @backstage/plugin-cost-insights@0.11.29-next.1 + - @backstage/plugin-dynatrace@0.1.1-next.1 + - @backstage/plugin-explore@0.3.38-next.1 + - @backstage/plugin-gcalendar@0.3.3-next.1 + - @backstage/plugin-gcp-projects@0.3.26-next.1 + - @backstage/plugin-github-actions@0.5.7-next.1 + - @backstage/plugin-gocd@0.1.13-next.1 + - @backstage/plugin-graphiql@0.2.39-next.1 + - @backstage/plugin-jenkins@0.7.6-next.1 + - @backstage/plugin-kafka@0.3.7-next.1 + - @backstage/plugin-kubernetes@0.6.7-next.1 + - @backstage/plugin-lighthouse@0.3.7-next.1 + - @backstage/plugin-newrelic@0.3.25-next.1 + - @backstage/plugin-newrelic-dashboard@0.1.15-next.1 + - @backstage/plugin-pagerduty@0.5.0-next.1 + - @backstage/plugin-permission-react@0.4.3-next.0 + - @backstage/plugin-rollbar@0.4.7-next.1 + - @backstage/plugin-scaffolder@1.4.0-next.1 + - @backstage/plugin-search-common@0.3.6-next.0 + - @backstage/plugin-sentry@0.3.45-next.1 + - @backstage/plugin-shortcuts@0.2.8-next.1 + - @backstage/plugin-tech-insights@0.2.3-next.1 + - @backstage/plugin-tech-radar@0.5.14-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.2-next.1 + - @backstage/plugin-todo@0.2.9-next.1 + - @backstage/plugin-user-settings@0.4.6-next.1 + - @backstage/plugin-search-react@0.2.2-next.1 + +## 0.2.73-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder@1.4.0-next.0 + - @backstage/catalog-model@1.1.0-next.0 + - @backstage/core-components@0.9.6-next.0 + - @backstage/plugin-techdocs-react@1.0.2-next.0 + - @backstage/plugin-catalog@1.3.1-next.0 + - @backstage/plugin-stack-overflow@0.1.3-next.0 + - @backstage/core-app-api@1.0.4-next.0 + - @backstage/cli@0.17.3-next.0 + - @backstage/plugin-azure-devops@0.1.23-next.0 + - @backstage/plugin-techdocs@1.2.1-next.0 + - @backstage/plugin-catalog-import@0.8.10-next.0 + - @backstage/plugin-pagerduty@0.5.0-next.0 + - @backstage/plugin-github-actions@0.5.7-next.0 + - @backstage/plugin-airbrake@0.3.7-next.0 + - @backstage/plugin-api-docs@0.8.7-next.0 + - @backstage/plugin-badges@0.2.31-next.0 + - @backstage/plugin-catalog-graph@0.2.19-next.0 + - @backstage/plugin-catalog-react@1.1.2-next.0 + - @backstage/plugin-circleci@0.3.7-next.0 + - @backstage/plugin-cloudbuild@0.3.7-next.0 + - @backstage/plugin-code-coverage@0.1.34-next.0 + - @backstage/plugin-cost-insights@0.11.29-next.0 + - @backstage/plugin-dynatrace@0.1.1-next.0 + - @backstage/plugin-explore@0.3.38-next.0 + - @backstage/plugin-gocd@0.1.13-next.0 + - @backstage/plugin-home@0.4.23-next.0 + - @backstage/plugin-jenkins@0.7.6-next.0 + - @backstage/plugin-kafka@0.3.7-next.0 + - @backstage/plugin-kubernetes@0.6.7-next.0 + - @backstage/plugin-lighthouse@0.3.7-next.0 + - @backstage/plugin-newrelic-dashboard@0.1.15-next.0 + - @backstage/plugin-org@0.5.7-next.0 + - @backstage/plugin-rollbar@0.4.7-next.0 + - @backstage/plugin-search@0.9.1-next.0 + - @backstage/plugin-sentry@0.3.45-next.0 + - @backstage/plugin-tech-insights@0.2.3-next.0 + - @backstage/plugin-todo@0.2.9-next.0 + - @backstage/app-defaults@1.0.4-next.0 + - @backstage/integration-react@1.1.2-next.0 + - @backstage/plugin-apache-airflow@0.1.15-next.0 + - @backstage/plugin-gcalendar@0.3.3-next.0 + - @backstage/plugin-gcp-projects@0.3.26-next.0 + - @backstage/plugin-graphiql@0.2.39-next.0 + - @backstage/plugin-newrelic@0.3.25-next.0 + - @backstage/plugin-search-react@0.2.2-next.0 + - @backstage/plugin-shortcuts@0.2.8-next.0 + - @backstage/plugin-tech-radar@0.5.14-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.2-next.0 + - @backstage/plugin-user-settings@0.4.6-next.0 + +## 0.2.72 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes@0.6.6 + - @backstage/plugin-cost-insights@0.11.28 + - @backstage/plugin-scaffolder@1.3.0 + - @backstage/plugin-catalog@1.3.0 + - @backstage/plugin-techdocs@1.2.0 + - @backstage/plugin-catalog-react@1.1.1 + - @backstage/cli@0.17.2 + - @backstage/plugin-user-settings@0.4.5 + - @backstage/plugin-pagerduty@0.4.0 + - @backstage/plugin-search-common@0.3.5 + - @backstage/plugin-search@0.9.0 + - @backstage/plugin-search-react@0.2.1 + - @backstage/plugin-sentry@0.3.44 + - @backstage/plugin-tech-insights@0.2.2 + - @backstage/plugin-catalog-common@1.0.3 + - @backstage/core-components@0.9.5 + - @backstage/plugin-dynatrace@0.1.0 + - @backstage/plugin-tech-radar@0.5.13 + - @backstage/core-app-api@1.0.3 + - @backstage/core-plugin-api@1.0.3 + - @backstage/integration-react@1.1.1 + - @backstage/plugin-airbrake@0.3.6 + - @backstage/plugin-apache-airflow@0.1.14 + - @backstage/plugin-api-docs@0.8.6 + - @backstage/plugin-azure-devops@0.1.22 + - @backstage/plugin-badges@0.2.30 + - @backstage/plugin-catalog-import@0.8.9 + - @backstage/plugin-circleci@0.3.6 + - @backstage/plugin-cloudbuild@0.3.6 + - @backstage/plugin-code-coverage@0.1.33 + - @backstage/plugin-explore@0.3.37 + - @backstage/plugin-gcalendar@0.3.2 + - @backstage/plugin-gcp-projects@0.3.25 + - @backstage/plugin-github-actions@0.5.6 + - @backstage/plugin-gocd@0.1.12 + - @backstage/plugin-graphiql@0.2.38 + - @backstage/plugin-home@0.4.22 + - @backstage/plugin-jenkins@0.7.5 + - @backstage/plugin-kafka@0.3.6 + - @backstage/plugin-lighthouse@0.3.6 + - @backstage/plugin-newrelic@0.3.24 + - @backstage/plugin-org@0.5.6 + - @backstage/plugin-rollbar@0.4.6 + - @backstage/plugin-shortcuts@0.2.7 + - @backstage/plugin-stack-overflow@0.1.2 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.1 + - @backstage/plugin-todo@0.2.8 + - @backstage/catalog-model@1.0.3 + - @backstage/plugin-techdocs-react@1.0.1 + - @backstage/app-defaults@1.0.3 + - @backstage/plugin-catalog-graph@0.2.18 + - @backstage/plugin-newrelic-dashboard@0.1.14 + - @backstage/plugin-permission-react@0.4.2 + +## 0.2.72-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder@1.3.0-next.2 + - @backstage/cli@0.17.2-next.2 + - @backstage/plugin-pagerduty@0.4.0-next.2 + - @backstage/plugin-search-common@0.3.5-next.1 + - @backstage/plugin-cost-insights@0.11.28-next.2 + - @backstage/plugin-catalog-common@1.0.3-next.1 + - @backstage/plugin-kubernetes@0.6.6-next.2 + - @backstage/core-components@0.9.5-next.2 + - @backstage/plugin-search@0.8.2-next.2 + - @backstage/plugin-org@0.5.6-next.2 + +## 0.2.72-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-sentry@0.3.44-next.1 + - @backstage/plugin-kubernetes@0.6.6-next.1 + - @backstage/plugin-tech-insights@0.2.2-next.1 + - @backstage/plugin-cost-insights@0.11.28-next.1 + - @backstage/core-components@0.9.5-next.1 + - @backstage/cli@0.17.2-next.1 + - @backstage/core-app-api@1.0.3-next.0 + - @backstage/core-plugin-api@1.0.3-next.0 + - @backstage/integration-react@1.1.1-next.1 + - @backstage/plugin-airbrake@0.3.6-next.1 + - @backstage/plugin-apache-airflow@0.1.14-next.1 + - @backstage/plugin-api-docs@0.8.6-next.1 + - @backstage/plugin-azure-devops@0.1.22-next.1 + - @backstage/plugin-badges@0.2.30-next.1 + - @backstage/plugin-catalog-import@0.8.9-next.1 + - @backstage/plugin-circleci@0.3.6-next.1 + - @backstage/plugin-cloudbuild@0.3.6-next.1 + - @backstage/plugin-code-coverage@0.1.33-next.1 + - @backstage/plugin-explore@0.3.37-next.1 + - @backstage/plugin-gcalendar@0.3.2-next.1 + - @backstage/plugin-gcp-projects@0.3.25-next.1 + - @backstage/plugin-github-actions@0.5.6-next.1 + - @backstage/plugin-gocd@0.1.12-next.1 + - @backstage/plugin-graphiql@0.2.38-next.1 + - @backstage/plugin-home@0.4.22-next.1 + - @backstage/plugin-jenkins@0.7.5-next.1 + - @backstage/plugin-kafka@0.3.6-next.1 + - @backstage/plugin-lighthouse@0.3.6-next.1 + - @backstage/plugin-newrelic@0.3.24-next.1 + - @backstage/plugin-org@0.5.6-next.1 + - @backstage/plugin-pagerduty@0.3.33-next.1 + - @backstage/plugin-rollbar@0.4.6-next.1 + - @backstage/plugin-scaffolder@1.3.0-next.1 + - @backstage/plugin-search@0.8.2-next.1 + - @backstage/plugin-shortcuts@0.2.7-next.1 + - @backstage/plugin-stack-overflow@0.1.2-next.1 + - @backstage/plugin-tech-radar@0.5.13-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.1-next.1 + - @backstage/plugin-techdocs@1.1.2-next.1 + - @backstage/plugin-todo@0.2.8-next.1 + - @backstage/plugin-user-settings@0.4.5-next.1 + - @backstage/catalog-model@1.0.3-next.0 + - @backstage/plugin-catalog@1.2.1-next.1 + - @backstage/plugin-catalog-graph@0.2.18-next.1 + - @backstage/plugin-catalog-react@1.1.1-next.1 + - @backstage/app-defaults@1.0.3-next.1 + - @backstage/plugin-search-react@0.2.1-next.0 + - @backstage/plugin-newrelic-dashboard@0.1.14-next.1 + - @backstage/plugin-permission-react@0.4.2-next.0 + - @backstage/plugin-techdocs-react@1.0.1-next.1 + - @backstage/plugin-catalog-common@1.0.3-next.0 + - @backstage/plugin-search-common@0.3.5-next.0 + +## 0.2.72-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes@0.6.6-next.0 + - @backstage/plugin-cost-insights@0.11.28-next.0 + - @backstage/plugin-catalog-react@1.1.1-next.0 + - @backstage/plugin-catalog@1.2.1-next.0 + - @backstage/cli@0.17.2-next.0 + - @backstage/plugin-pagerduty@0.3.33-next.0 + - @backstage/core-components@0.9.5-next.0 + - @backstage/plugin-gcp-projects@0.3.25-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.1-next.0 + - @backstage/plugin-scaffolder@1.3.0-next.0 + - @backstage/plugin-techdocs@1.1.2-next.0 + - @backstage/plugin-techdocs-react@1.0.1-next.0 + - @backstage/plugin-airbrake@0.3.6-next.0 + - @backstage/plugin-api-docs@0.8.6-next.0 + - @backstage/plugin-azure-devops@0.1.22-next.0 + - @backstage/plugin-badges@0.2.30-next.0 + - @backstage/plugin-catalog-graph@0.2.18-next.0 + - @backstage/plugin-catalog-import@0.8.9-next.0 + - @backstage/plugin-circleci@0.3.6-next.0 + - @backstage/plugin-cloudbuild@0.3.6-next.0 + - @backstage/plugin-code-coverage@0.1.33-next.0 + - @backstage/plugin-explore@0.3.37-next.0 + - @backstage/plugin-github-actions@0.5.6-next.0 + - @backstage/plugin-gocd@0.1.12-next.0 + - @backstage/plugin-home@0.4.22-next.0 + - @backstage/plugin-jenkins@0.7.5-next.0 + - @backstage/plugin-kafka@0.3.6-next.0 + - @backstage/plugin-lighthouse@0.3.6-next.0 + - @backstage/plugin-newrelic-dashboard@0.1.14-next.0 + - @backstage/plugin-org@0.5.6-next.0 + - @backstage/plugin-rollbar@0.4.6-next.0 + - @backstage/plugin-search@0.8.2-next.0 + - @backstage/plugin-sentry@0.3.44-next.0 + - @backstage/plugin-tech-insights@0.2.2-next.0 + - @backstage/plugin-todo@0.2.8-next.0 + - @backstage/app-defaults@1.0.3-next.0 + - @backstage/integration-react@1.1.1-next.0 + - @backstage/plugin-apache-airflow@0.1.14-next.0 + - @backstage/plugin-gcalendar@0.3.2-next.0 + - @backstage/plugin-graphiql@0.2.38-next.0 + - @backstage/plugin-newrelic@0.3.24-next.0 + - @backstage/plugin-shortcuts@0.2.7-next.0 + - @backstage/plugin-stack-overflow@0.1.2-next.0 + - @backstage/plugin-tech-radar@0.5.13-next.0 + - @backstage/plugin-user-settings@0.4.5-next.0 + +## 0.2.71 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4 + - @backstage/plugin-kubernetes@0.6.5 + - @backstage/plugin-scaffolder@1.2.0 + - @backstage/plugin-api-docs@0.8.5 + - @backstage/plugin-tech-insights@0.2.1 + - @backstage/plugin-tech-radar@0.5.12 + - @backstage/plugin-org@0.5.5 + - @backstage/plugin-techdocs@1.1.1 + - @backstage/cli@0.17.1 + - @backstage/core-plugin-api@1.0.2 + - @backstage/plugin-user-settings@0.4.4 + - @backstage/plugin-techdocs-module-addons-contrib@1.0.0 + - @backstage/plugin-home@0.4.21 + - @backstage/plugin-catalog@1.2.0 + - @backstage/plugin-catalog-react@1.1.0 + - @backstage/integration-react@1.1.0 + - @backstage/plugin-techdocs-react@1.0.0 + - @backstage/plugin-newrelic-dashboard@0.1.13 + - @backstage/plugin-graphiql@0.2.37 + - @backstage/config@1.0.1 + - @backstage/plugin-search@0.8.1 + - @backstage/plugin-search-react@0.2.0 + - @backstage/plugin-catalog-graph@0.2.17 + - @backstage/core-app-api@1.0.2 + - @backstage/plugin-gcalendar@0.3.1 + - @backstage/plugin-search-common@0.3.4 + - @backstage/plugin-azure-devops@0.1.21 + - @backstage/app-defaults@1.0.2 + - @backstage/catalog-model@1.0.2 + - @backstage/plugin-airbrake@0.3.5 + - @backstage/plugin-apache-airflow@0.1.13 + - @backstage/plugin-badges@0.2.29 + - @backstage/plugin-catalog-common@1.0.2 + - @backstage/plugin-catalog-import@0.8.8 + - @backstage/plugin-circleci@0.3.5 + - @backstage/plugin-cloudbuild@0.3.5 + - @backstage/plugin-code-coverage@0.1.32 + - @backstage/plugin-cost-insights@0.11.27 + - @backstage/plugin-explore@0.3.36 + - @backstage/plugin-gcp-projects@0.3.24 + - @backstage/plugin-github-actions@0.5.5 + - @backstage/plugin-gocd@0.1.11 + - @backstage/plugin-jenkins@0.7.4 + - @backstage/plugin-kafka@0.3.5 + - @backstage/plugin-lighthouse@0.3.5 + - @backstage/plugin-newrelic@0.3.23 + - @backstage/plugin-pagerduty@0.3.32 + - @backstage/plugin-permission-react@0.4.1 + - @backstage/plugin-rollbar@0.4.5 + - @backstage/plugin-sentry@0.3.43 + - @backstage/plugin-shortcuts@0.2.6 + - @backstage/plugin-stack-overflow@0.1.1 + - @backstage/plugin-todo@0.2.7 + +## 0.2.71-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.1 + - @backstage/plugin-kubernetes@0.6.5-next.2 + - @backstage/plugin-org@0.5.5-next.2 + - @backstage/plugin-techdocs@1.1.1-next.2 + - @backstage/plugin-techdocs-react@0.1.1-next.2 + - @backstage/plugin-scaffolder@1.2.0-next.2 + - @backstage/plugin-graphiql@0.2.37-next.1 + - @backstage/config@1.0.1-next.0 + - @backstage/plugin-catalog@1.2.0-next.2 + - @backstage/plugin-techdocs-module-addons-contrib@0.1.0-next.2 + - @backstage/cli@0.17.1-next.2 + - @backstage/plugin-search@0.8.1-next.2 + - @backstage/plugin-search-react@0.2.0-next.2 + - @backstage/plugin-search-common@0.3.4-next.0 + - @backstage/plugin-azure-devops@0.1.21-next.2 + - @backstage/plugin-catalog-react@1.1.0-next.2 + - @backstage/catalog-model@1.0.2-next.0 + - @backstage/core-app-api@1.0.2-next.1 + - @backstage/core-plugin-api@1.0.2-next.1 + - @backstage/integration-react@1.1.0-next.2 + - @backstage/plugin-catalog-import@0.8.8-next.2 + - @backstage/plugin-code-coverage@0.1.32-next.2 + - @backstage/plugin-cost-insights@0.11.27-next.1 + - @backstage/plugin-home@0.4.21-next.2 + - @backstage/plugin-lighthouse@0.3.5-next.2 + - @backstage/plugin-permission-react@0.4.1-next.1 + - @backstage/plugin-stack-overflow@0.1.1-next.2 + - @backstage/plugin-airbrake@0.3.5-next.2 + - @backstage/plugin-api-docs@0.8.5-next.2 + - @backstage/plugin-badges@0.2.29-next.2 + - @backstage/plugin-catalog-graph@0.2.17-next.2 + - @backstage/plugin-circleci@0.3.5-next.2 + - @backstage/plugin-cloudbuild@0.3.5-next.2 + - @backstage/plugin-explore@0.3.36-next.2 + - @backstage/plugin-github-actions@0.5.5-next.2 + - @backstage/plugin-gocd@0.1.11-next.2 + - @backstage/plugin-jenkins@0.7.4-next.2 + - @backstage/plugin-kafka@0.3.5-next.2 + - @backstage/plugin-newrelic-dashboard@0.1.13-next.2 + - @backstage/plugin-pagerduty@0.3.32-next.2 + - @backstage/plugin-rollbar@0.4.5-next.2 + - @backstage/plugin-sentry@0.3.43-next.2 + - @backstage/plugin-tech-insights@0.2.1-next.2 + - @backstage/plugin-todo@0.2.7-next.2 + - @backstage/plugin-catalog-common@1.0.2-next.0 + +## 0.2.71-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.9.4-next.0 + - @backstage/plugin-api-docs@0.8.5-next.1 + - @backstage/plugin-tech-insights@0.2.1-next.1 + - @backstage/plugin-tech-radar@0.5.12-next.0 + - @backstage/cli@0.17.1-next.1 + - @backstage/core-plugin-api@1.0.2-next.0 + - @backstage/plugin-user-settings@0.4.4-next.0 + - @backstage/plugin-scaffolder@1.2.0-next.1 + - @backstage/plugin-catalog@1.2.0-next.1 + - @backstage/plugin-catalog-react@1.1.0-next.1 + - @backstage/plugin-org@0.5.5-next.1 + - @backstage/plugin-graphiql@0.2.37-next.0 + - @backstage/plugin-search-react@0.2.0-next.1 + - @backstage/plugin-techdocs-react@0.1.1-next.1 + - @backstage/plugin-techdocs@1.1.1-next.1 + - @backstage/app-defaults@1.0.2-next.0 + - @backstage/integration-react@1.1.0-next.1 + - @backstage/plugin-airbrake@0.3.5-next.1 + - @backstage/plugin-apache-airflow@0.1.13-next.0 + - @backstage/plugin-azure-devops@0.1.21-next.1 + - @backstage/plugin-badges@0.2.29-next.1 + - @backstage/plugin-catalog-graph@0.2.17-next.1 + - @backstage/plugin-catalog-import@0.8.8-next.1 + - @backstage/plugin-circleci@0.3.5-next.1 + - @backstage/plugin-cloudbuild@0.3.5-next.1 + - @backstage/plugin-code-coverage@0.1.32-next.1 + - @backstage/plugin-cost-insights@0.11.27-next.0 + - @backstage/plugin-explore@0.3.36-next.1 + - @backstage/plugin-gcalendar@0.3.1-next.1 + - @backstage/plugin-gcp-projects@0.3.24-next.0 + - @backstage/plugin-github-actions@0.5.5-next.1 + - @backstage/plugin-gocd@0.1.11-next.1 + - @backstage/plugin-home@0.4.21-next.1 + - @backstage/plugin-jenkins@0.7.4-next.1 + - @backstage/plugin-kafka@0.3.5-next.1 + - @backstage/plugin-kubernetes@0.6.5-next.1 + - @backstage/plugin-lighthouse@0.3.5-next.1 + - @backstage/plugin-newrelic@0.3.23-next.0 + - @backstage/plugin-newrelic-dashboard@0.1.13-next.1 + - @backstage/plugin-pagerduty@0.3.32-next.1 + - @backstage/plugin-rollbar@0.4.5-next.1 + - @backstage/plugin-search@0.8.1-next.1 + - @backstage/plugin-sentry@0.3.43-next.1 + - @backstage/plugin-shortcuts@0.2.6-next.0 + - @backstage/plugin-stack-overflow@0.1.1-next.1 + - @backstage/plugin-techdocs-module-addons-contrib@0.1.0-next.1 + - @backstage/plugin-todo@0.2.7-next.1 + - @backstage/core-app-api@1.0.2-next.0 + - @backstage/plugin-permission-react@0.4.1-next.0 + +## 0.2.71-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder@1.2.0-next.0 + - @backstage/cli@0.17.1-next.0 + - @backstage/plugin-home@0.4.21-next.0 + - @backstage/plugin-api-docs@0.8.5-next.0 + - @backstage/plugin-catalog@1.2.0-next.0 + - @backstage/plugin-catalog-react@1.1.0-next.0 + - @backstage/integration-react@1.1.0-next.0 + - @backstage/plugin-newrelic-dashboard@0.1.13-next.0 + - @backstage/plugin-search@0.8.1-next.0 + - @backstage/plugin-search-react@0.1.1-next.0 + - @backstage/plugin-techdocs@1.1.1-next.0 + - @backstage/plugin-techdocs-module-addons-contrib@0.1.0-next.0 + - @backstage/plugin-techdocs-react@0.1.1-next.0 + - @backstage/plugin-gcalendar@0.3.1-next.0 + - @backstage/plugin-org@0.5.5-next.0 + - @backstage/plugin-catalog-import@0.8.8-next.0 + - @backstage/plugin-github-actions@0.5.5-next.0 + - @backstage/plugin-airbrake@0.3.5-next.0 + - @backstage/plugin-azure-devops@0.1.21-next.0 + - @backstage/plugin-badges@0.2.29-next.0 + - @backstage/plugin-catalog-graph@0.2.17-next.0 + - @backstage/plugin-circleci@0.3.5-next.0 + - @backstage/plugin-cloudbuild@0.3.5-next.0 + - @backstage/plugin-code-coverage@0.1.32-next.0 + - @backstage/plugin-explore@0.3.36-next.0 + - @backstage/plugin-gocd@0.1.11-next.0 + - @backstage/plugin-jenkins@0.7.4-next.0 + - @backstage/plugin-kafka@0.3.5-next.0 + - @backstage/plugin-kubernetes@0.6.5-next.0 + - @backstage/plugin-lighthouse@0.3.5-next.0 + - @backstage/plugin-pagerduty@0.3.32-next.0 + - @backstage/plugin-rollbar@0.4.5-next.0 + - @backstage/plugin-sentry@0.3.43-next.0 + - @backstage/plugin-stack-overflow@0.1.1-next.0 + - @backstage/plugin-tech-insights@0.2.1-next.0 + - @backstage/plugin-todo@0.2.7-next.0 + +## 0.2.70 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-react@0.4.0 + - @backstage/plugin-home@0.4.20 + - @backstage/plugin-techdocs@1.1.0 + - @backstage/plugin-catalog-react@1.0.1 + - @backstage/cli@0.17.0 + - @backstage/plugin-scaffolder@1.1.0 + - @backstage/catalog-model@1.0.1 + - @backstage/plugin-kubernetes@0.6.4 + - @backstage/core-app-api@1.0.1 + - @backstage/core-components@0.9.3 + - @backstage/core-plugin-api@1.0.1 + - @backstage/plugin-catalog-graph@0.2.16 + - @backstage/plugin-catalog-import@0.8.7 + - @backstage/plugin-kafka@0.3.4 + - @backstage/plugin-lighthouse@0.3.4 + - @backstage/plugin-rollbar@0.4.4 + - @backstage/plugin-search-react@0.1.0 + - @backstage/plugin-search@0.8.0 + - @backstage/integration-react@1.0.1 + - @backstage/plugin-airbrake@0.3.4 + - @backstage/plugin-apache-airflow@0.1.12 + - @backstage/plugin-api-docs@0.8.4 + - @backstage/plugin-azure-devops@0.1.20 + - @backstage/plugin-badges@0.2.28 + - @backstage/plugin-catalog@1.1.0 + - @backstage/plugin-circleci@0.3.4 + - @backstage/plugin-cloudbuild@0.3.4 + - @backstage/plugin-code-coverage@0.1.31 + - @backstage/plugin-cost-insights@0.11.26 + - @backstage/plugin-explore@0.3.35 + - @backstage/plugin-gcalendar@0.3.0 + - @backstage/plugin-gcp-projects@0.3.23 + - @backstage/plugin-github-actions@0.5.4 + - @backstage/plugin-gocd@0.1.10 + - @backstage/plugin-graphiql@0.2.36 + - @backstage/plugin-jenkins@0.7.3 + - @backstage/plugin-newrelic@0.3.22 + - @backstage/plugin-org@0.5.4 + - @backstage/plugin-pagerduty@0.3.31 + - @backstage/plugin-sentry@0.3.42 + - @backstage/plugin-shortcuts@0.2.5 + - @backstage/plugin-stack-overflow@0.1.0 + - @backstage/plugin-tech-insights@0.2.0 + - @backstage/plugin-tech-radar@0.5.11 + - @backstage/plugin-todo@0.2.6 + - @backstage/plugin-user-settings@0.4.3 + - @backstage/plugin-search-common@0.3.3 + - @backstage/plugin-catalog-common@1.0.1 + - @backstage/app-defaults@1.0.1 + - @backstage/plugin-newrelic-dashboard@0.1.12 + +## 0.2.70-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-home@0.4.20-next.3 + - @backstage/plugin-techdocs@1.1.0-next.3 + - @backstage/cli@0.17.0-next.3 + - @backstage/plugin-scaffolder@1.1.0-next.3 + - @backstage/plugin-kubernetes@0.6.4-next.2 + - @backstage/core-app-api@1.0.1-next.1 + - @backstage/core-components@0.9.3-next.2 + - @backstage/core-plugin-api@1.0.1-next.0 + - @backstage/integration-react@1.0.1-next.2 + - @backstage/plugin-airbrake@0.3.4-next.1 + - @backstage/plugin-apache-airflow@0.1.12-next.1 + - @backstage/plugin-api-docs@0.8.4-next.3 + - @backstage/plugin-azure-devops@0.1.20-next.1 + - @backstage/plugin-badges@0.2.28-next.1 + - @backstage/plugin-catalog-graph@0.2.16-next.3 + - @backstage/plugin-catalog-import@0.8.7-next.2 + - @backstage/plugin-catalog-react@1.0.1-next.3 + - @backstage/plugin-catalog@1.1.0-next.3 + - @backstage/plugin-circleci@0.3.4-next.1 + - @backstage/plugin-cloudbuild@0.3.4-next.1 + - @backstage/plugin-code-coverage@0.1.31-next.1 + - @backstage/plugin-cost-insights@0.11.26-next.1 + - @backstage/plugin-explore@0.3.35-next.1 + - @backstage/plugin-gcalendar@0.3.0-next.2 + - @backstage/plugin-gcp-projects@0.3.23-next.1 + - @backstage/plugin-github-actions@0.5.4-next.2 + - @backstage/plugin-gocd@0.1.10-next.2 + - @backstage/plugin-graphiql@0.2.36-next.2 + - @backstage/plugin-jenkins@0.7.3-next.1 + - @backstage/plugin-kafka@0.3.4-next.1 + - @backstage/plugin-lighthouse@0.3.4-next.1 + - @backstage/plugin-newrelic@0.3.22-next.1 + - @backstage/plugin-org@0.5.4-next.3 + - @backstage/plugin-pagerduty@0.3.31-next.1 + - @backstage/plugin-rollbar@0.4.4-next.1 + - @backstage/plugin-search@0.7.5-next.1 + - @backstage/plugin-sentry@0.3.42-next.2 + - @backstage/plugin-shortcuts@0.2.5-next.1 + - @backstage/plugin-stack-overflow@0.1.0-next.1 + - @backstage/plugin-tech-insights@0.2.0-next.1 + - @backstage/plugin-tech-radar@0.5.11-next.2 + - @backstage/plugin-todo@0.2.6-next.1 + - @backstage/plugin-user-settings@0.4.3-next.1 + - @backstage/app-defaults@1.0.1-next.2 + - @backstage/plugin-search-react@0.1.0-next.0 + - @backstage/plugin-permission-react@0.4.0-next.1 + - @backstage/plugin-newrelic-dashboard@0.1.12-next.1 + +## 0.2.70-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-permission-react@0.4.0-next.0 + - @backstage/plugin-catalog-react@1.0.1-next.1 + - @backstage/cli@0.17.0-next.1 + - @backstage/plugin-home@0.4.20-next.1 + - @backstage/plugin-kubernetes@0.6.4-next.1 + - @backstage/plugin-catalog-common@1.0.1-next.1 + - @backstage/plugin-org@0.5.4-next.1 + - @backstage/plugin-catalog-graph@0.2.16-next.1 + - @backstage/plugin-tech-radar@0.5.11-next.1 + - @backstage/plugin-catalog@1.1.0-next.1 + - @backstage/plugin-gcalendar@0.3.0-next.1 + - @backstage/plugin-techdocs@1.0.1-next.1 + - @backstage/plugin-scaffolder@1.0.1-next.1 + - @backstage/integration-react@1.0.1-next.1 + - @backstage/plugin-catalog-import@0.8.7-next.1 + - @backstage/plugin-github-actions@0.5.4-next.1 + - @backstage/app-defaults@1.0.1-next.1 + - @backstage/plugin-search-common@0.3.3-next.1 + - @backstage/plugin-api-docs@0.8.4-next.1 + +## 0.2.70-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@1.0.1-next.0 + - @backstage/plugin-catalog@1.0.1-next.0 + - @backstage/plugin-user-settings@0.4.3-next.0 + - @backstage/cli@0.16.1-next.0 + - @backstage/plugin-search-common@0.3.3-next.0 + - @backstage/core-app-api@1.0.1-next.0 + - @backstage/plugin-search@0.7.5-next.0 + - @backstage/plugin-catalog-react@1.0.1-next.0 + - @backstage/plugin-scaffolder@1.0.1-next.0 + - @backstage/core-components@0.9.3-next.0 + - @backstage/plugin-techdocs@1.0.1-next.0 + - @backstage/plugin-tech-insights@0.1.14-next.0 + - @backstage/plugin-kubernetes@0.6.4-next.0 + - @backstage/plugin-airbrake@0.3.4-next.0 + - @backstage/plugin-api-docs@0.8.4-next.0 + - @backstage/plugin-azure-devops@0.1.20-next.0 + - @backstage/plugin-badges@0.2.28-next.0 + - @backstage/plugin-catalog-graph@0.2.16-next.0 + - @backstage/plugin-catalog-import@0.8.7-next.0 + - @backstage/plugin-circleci@0.3.4-next.0 + - @backstage/plugin-cloudbuild@0.3.4-next.0 + - @backstage/plugin-code-coverage@0.1.31-next.0 + - @backstage/plugin-cost-insights@0.11.26-next.0 + - @backstage/plugin-explore@0.3.35-next.0 + - @backstage/plugin-github-actions@0.5.4-next.0 + - @backstage/plugin-gocd@0.1.10-next.0 + - @backstage/plugin-home@0.4.20-next.0 + - @backstage/plugin-jenkins@0.7.3-next.0 + - @backstage/plugin-kafka@0.3.4-next.0 + - @backstage/plugin-lighthouse@0.3.4-next.0 + - @backstage/plugin-newrelic-dashboard@0.1.12-next.0 + - @backstage/plugin-org@0.5.4-next.0 + - @backstage/plugin-pagerduty@0.3.31-next.0 + - @backstage/plugin-rollbar@0.4.4-next.0 + - @backstage/plugin-sentry@0.3.42-next.0 + - @backstage/plugin-todo@0.2.6-next.0 + - @backstage/app-defaults@1.0.1-next.0 + - @backstage/integration-react@1.0.1-next.0 + - @backstage/plugin-apache-airflow@0.1.12-next.0 + - @backstage/plugin-catalog-common@1.0.1-next.0 + - @backstage/plugin-gcalendar@0.2.1-next.0 + - @backstage/plugin-gcp-projects@0.3.23-next.0 + - @backstage/plugin-graphiql@0.2.36-next.0 + - @backstage/plugin-newrelic@0.3.22-next.0 + - @backstage/plugin-shortcuts@0.2.5-next.0 + - @backstage/plugin-tech-radar@0.5.11-next.0 + +## 0.2.69 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.16.0 + - @backstage/plugin-gcalendar@0.2.0 + - @backstage/plugin-scaffolder@1.0.0 + - @backstage/plugin-airbrake@0.3.3 + - @backstage/plugin-kafka@0.3.3 + - @backstage/plugin-todo@0.2.5 + - @backstage/app-defaults@1.0.0 + - @backstage/core-app-api@1.0.0 + - @backstage/core-components@0.9.2 + - @backstage/core-plugin-api@1.0.0 + - @backstage/integration-react@1.0.0 + - @backstage/plugin-apache-airflow@0.1.11 + - @backstage/plugin-api-docs@0.8.3 + - @backstage/plugin-azure-devops@0.1.19 + - @backstage/plugin-badges@0.2.27 + - @backstage/plugin-catalog-graph@0.2.15 + - @backstage/plugin-catalog-import@0.8.6 + - @backstage/plugin-catalog-react@1.0.0 + - @backstage/plugin-catalog@1.0.0 + - @backstage/plugin-circleci@0.3.3 + - @backstage/plugin-cloudbuild@0.3.3 + - @backstage/plugin-code-coverage@0.1.30 + - @backstage/plugin-cost-insights@0.11.25 + - @backstage/plugin-explore@0.3.34 + - @backstage/plugin-gcp-projects@0.3.22 + - @backstage/plugin-github-actions@0.5.3 + - @backstage/plugin-gocd@0.1.9 + - @backstage/plugin-graphiql@0.2.35 + - @backstage/plugin-home@0.4.19 + - @backstage/plugin-jenkins@0.7.2 + - @backstage/plugin-kubernetes@0.6.3 + - @backstage/plugin-lighthouse@0.3.3 + - @backstage/plugin-newrelic@0.3.21 + - @backstage/plugin-org@0.5.3 + - @backstage/plugin-pagerduty@0.3.30 + - @backstage/plugin-permission-react@0.3.4 + - @backstage/plugin-rollbar@0.4.3 + - @backstage/plugin-search@0.7.4 + - @backstage/plugin-sentry@0.3.41 + - @backstage/plugin-shortcuts@0.2.4 + - @backstage/plugin-tech-insights@0.1.13 + - @backstage/plugin-tech-radar@0.5.10 + - @backstage/plugin-techdocs@1.0.0 + - @backstage/plugin-user-settings@0.4.2 + - @backstage/catalog-model@1.0.0 + - @backstage/plugin-catalog-common@1.0.0 + - @backstage/plugin-newrelic-dashboard@0.1.11 + - @backstage/plugin-search-common@0.3.2 + +## 0.2.68 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.15.2 + - @backstage/plugin-catalog@0.10.0 + - @backstage/plugin-catalog-react@0.9.0 + - @backstage/core-components@0.9.1 + - @backstage/plugin-gcp-projects@0.3.21 + - @backstage/plugin-scaffolder@0.15.0 + - @backstage/catalog-model@0.13.0 + - @backstage/plugin-airbrake@0.3.2 + - @backstage/plugin-rollbar@0.4.2 + - @backstage/plugin-catalog-graph@0.2.14 + - @backstage/plugin-catalog-import@0.8.5 + - @backstage/plugin-explore@0.3.33 + - @backstage/plugin-catalog-common@0.2.2 + - @backstage/plugin-search-common@0.3.1 + - @backstage/plugin-search@0.7.3 + - @backstage/plugin-tech-radar@0.5.9 + - @backstage/plugin-org@0.5.2 + - @backstage/plugin-techdocs@0.15.1 + - @backstage/app-defaults@0.2.1 + - @backstage/integration-react@0.1.25 + - @backstage/plugin-apache-airflow@0.1.10 + - @backstage/plugin-api-docs@0.8.2 + - @backstage/plugin-azure-devops@0.1.18 + - @backstage/plugin-badges@0.2.26 + - @backstage/plugin-circleci@0.3.2 + - @backstage/plugin-cloudbuild@0.3.2 + - @backstage/plugin-code-coverage@0.1.29 + - @backstage/plugin-cost-insights@0.11.24 + - @backstage/plugin-github-actions@0.5.2 + - @backstage/plugin-gocd@0.1.8 + - @backstage/plugin-graphiql@0.2.34 + - @backstage/plugin-home@0.4.18 + - @backstage/plugin-jenkins@0.7.1 + - @backstage/plugin-kafka@0.3.2 + - @backstage/plugin-kubernetes@0.6.2 + - @backstage/plugin-lighthouse@0.3.2 + - @backstage/plugin-newrelic@0.3.20 + - @backstage/plugin-newrelic-dashboard@0.1.10 + - @backstage/plugin-pagerduty@0.3.29 + - @backstage/plugin-sentry@0.3.40 + - @backstage/plugin-shortcuts@0.2.3 + - @backstage/plugin-tech-insights@0.1.12 + - @backstage/plugin-todo@0.2.4 + - @backstage/plugin-user-settings@0.4.1 + +## 0.2.68-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.15.2-next.0 + - @backstage/plugin-catalog@0.10.0-next.0 + - @backstage/plugin-catalog-react@0.9.0-next.0 + - @backstage/core-components@0.9.1-next.0 + - @backstage/plugin-gcp-projects@0.3.21-next.0 + - @backstage/plugin-scaffolder@0.15.0-next.0 + - @backstage/catalog-model@0.13.0-next.0 + - @backstage/plugin-rollbar@0.4.2-next.0 + - @backstage/plugin-catalog-graph@0.2.14-next.0 + - @backstage/plugin-catalog-import@0.8.5-next.0 + - @backstage/plugin-explore@0.3.33-next.0 + - @backstage/plugin-catalog-common@0.2.2-next.0 + - @backstage/plugin-search-common@0.3.1-next.0 + - @backstage/plugin-search@0.7.3-next.0 + - @backstage/plugin-tech-radar@0.5.9-next.0 + - @backstage/plugin-org@0.5.2-next.0 + - @backstage/plugin-techdocs@0.15.1-next.0 + - @backstage/app-defaults@0.2.1-next.0 + - @backstage/integration-react@0.1.25-next.0 + - @backstage/plugin-airbrake@0.3.2-next.0 + - @backstage/plugin-apache-airflow@0.1.10-next.0 + - @backstage/plugin-api-docs@0.8.2-next.0 + - @backstage/plugin-azure-devops@0.1.18-next.0 + - @backstage/plugin-badges@0.2.26-next.0 + - @backstage/plugin-circleci@0.3.2-next.0 + - @backstage/plugin-cloudbuild@0.3.2-next.0 + - @backstage/plugin-code-coverage@0.1.29-next.0 + - @backstage/plugin-cost-insights@0.11.24-next.0 + - @backstage/plugin-github-actions@0.5.2-next.0 + - @backstage/plugin-gocd@0.1.8-next.0 + - @backstage/plugin-graphiql@0.2.34-next.0 + - @backstage/plugin-home@0.4.18-next.0 + - @backstage/plugin-jenkins@0.7.1-next.0 + - @backstage/plugin-kafka@0.3.2-next.0 + - @backstage/plugin-kubernetes@0.6.2-next.0 + - @backstage/plugin-lighthouse@0.3.2-next.0 + - @backstage/plugin-newrelic@0.3.20-next.0 + - @backstage/plugin-newrelic-dashboard@0.1.10-next.0 + - @backstage/plugin-pagerduty@0.3.29-next.0 + - @backstage/plugin-sentry@0.3.40-next.0 + - @backstage/plugin-shortcuts@0.2.3-next.0 + - @backstage/plugin-tech-insights@0.1.12-next.0 + - @backstage/plugin-todo@0.2.4-next.0 + - @backstage/plugin-user-settings@0.4.1-next.0 + +## 0.2.67 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-model@0.12.0 + - @backstage/core-components@0.9.0 + - @backstage/plugin-search@0.7.2 + - @backstage/plugin-techdocs@0.15.0 + - @backstage/plugin-api-docs@0.8.1 + - @backstage/plugin-catalog@0.9.1 + - @backstage/plugin-catalog-graph@0.2.13 + - @backstage/plugin-catalog-import@0.8.4 + - @backstage/plugin-catalog-react@0.8.0 + - @backstage/plugin-explore@0.3.32 + - @backstage/plugin-rollbar@0.4.1 + - @backstage/plugin-catalog-common@0.2.0 + - @backstage/plugin-org@0.5.1 + - @backstage/plugin-scaffolder@0.14.0 + - @backstage/core-app-api@0.6.0 + - @backstage/core-plugin-api@0.8.0 + - @backstage/cli@0.15.0 + - @backstage/app-defaults@0.2.0 + - @backstage/plugin-user-settings@0.4.0 + - @backstage/plugin-airbrake@0.3.1 + - @backstage/search-common@0.3.0 + - @backstage/plugin-jenkins@0.7.0 + - @backstage/plugin-code-coverage@0.1.28 + - @backstage/plugin-tech-insights@0.1.11 + - @backstage/plugin-azure-devops@0.1.17 + - @backstage/plugin-badges@0.2.25 + - @backstage/plugin-circleci@0.3.1 + - @backstage/plugin-cloudbuild@0.3.1 + - @backstage/plugin-cost-insights@0.11.23 + - @backstage/plugin-github-actions@0.5.1 + - @backstage/plugin-gocd@0.1.7 + - @backstage/plugin-home@0.4.17 + - @backstage/plugin-kafka@0.3.1 + - @backstage/plugin-kubernetes@0.6.1 + - @backstage/plugin-lighthouse@0.3.1 + - @backstage/plugin-newrelic-dashboard@0.1.9 + - @backstage/plugin-pagerduty@0.3.28 + - @backstage/plugin-sentry@0.3.39 + - @backstage/plugin-todo@0.2.3 + - @backstage/integration-react@0.1.24 + - @backstage/plugin-apache-airflow@0.1.9 + - @backstage/plugin-gcp-projects@0.3.20 + - @backstage/plugin-graphiql@0.2.33 + - @backstage/plugin-newrelic@0.3.19 + - @backstage/plugin-shortcuts@0.2.2 + - @backstage/plugin-tech-radar@0.5.8 + - @backstage/plugin-permission-react@0.3.3 + +## 0.2.66 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@0.9.0 + - @backstage/cli@0.14.1 + - @backstage/core-components@0.8.10 + - @backstage/plugin-api-docs@0.8.0 + - @backstage/plugin-catalog-react@0.7.0 + - @backstage/plugin-catalog-graph@0.2.12 + - @backstage/plugin-jenkins@0.6.0 + - @backstage/plugin-scaffolder@0.13.0 + - @backstage/plugin-techdocs@0.14.0 + - @backstage/plugin-airbrake@0.3.0 + - @backstage/catalog-model@0.11.0 + - @backstage/plugin-catalog-import@0.8.3 + - @backstage/plugin-explore@0.3.31 + - @backstage/core-plugin-api@0.7.0 + - @backstage/plugin-circleci@0.3.0 + - @backstage/plugin-cloudbuild@0.3.0 + - @backstage/plugin-github-actions@0.5.0 + - @backstage/plugin-kafka@0.3.0 + - @backstage/plugin-kubernetes@0.6.0 + - @backstage/plugin-lighthouse@0.3.0 + - @backstage/plugin-org@0.5.0 + - @backstage/plugin-rollbar@0.4.0 + - @backstage/plugin-gocd@0.1.6 + - @backstage/plugin-azure-devops@0.1.16 + - @backstage/plugin-badges@0.2.24 + - @backstage/plugin-code-coverage@0.1.27 + - @backstage/plugin-home@0.4.16 + - @backstage/plugin-newrelic-dashboard@0.1.8 + - @backstage/plugin-pagerduty@0.3.27 + - @backstage/plugin-search@0.7.1 + - @backstage/plugin-sentry@0.3.38 + - @backstage/plugin-tech-insights@0.1.10 + - @backstage/plugin-todo@0.2.2 + - @backstage/plugin-cost-insights@0.11.22 + - @backstage/app-defaults@0.1.9 + - @backstage/core-app-api@0.5.4 + - @backstage/integration-react@0.1.23 + - @backstage/plugin-apache-airflow@0.1.8 + - @backstage/plugin-gcp-projects@0.3.19 + - @backstage/plugin-graphiql@0.2.32 + - @backstage/plugin-newrelic@0.3.18 + - @backstage/plugin-permission-react@0.3.2 + - @backstage/plugin-shortcuts@0.2.1 + - @backstage/plugin-tech-radar@0.5.7 + - @backstage/plugin-user-settings@0.3.21 + +## 0.2.65 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.14.0 + - @backstage/core-app-api@0.5.3 + - @backstage/core-components@0.8.9 + - @backstage/core-plugin-api@0.6.1 + - @backstage/integration-react@0.1.22 + - @backstage/plugin-airbrake@0.2.0 + - @backstage/plugin-apache-airflow@0.1.7 + - @backstage/plugin-api-docs@0.7.3 + - @backstage/plugin-azure-devops@0.1.15 + - @backstage/plugin-badges@0.2.23 + - @backstage/plugin-catalog@0.8.0 + - @backstage/plugin-catalog-import@0.8.2 + - @backstage/plugin-catalog-react@0.6.15 + - @backstage/plugin-circleci@0.2.38 + - @backstage/plugin-cloudbuild@0.2.36 + - @backstage/plugin-code-coverage@0.1.26 + - @backstage/plugin-cost-insights@0.11.21 + - @backstage/plugin-explore@0.3.30 + - @backstage/plugin-gcp-projects@0.3.18 + - @backstage/plugin-github-actions@0.4.36 + - @backstage/plugin-gocd@0.1.5 + - @backstage/plugin-graphiql@0.2.31 + - @backstage/plugin-home@0.4.15 + - @backstage/plugin-jenkins@0.5.21 + - @backstage/plugin-kafka@0.2.29 + - @backstage/plugin-kubernetes@0.5.8 + - @backstage/plugin-lighthouse@0.2.38 + - @backstage/plugin-newrelic@0.3.17 + - @backstage/plugin-newrelic-dashboard@0.1.7 + - @backstage/plugin-org@0.4.3 + - @backstage/plugin-pagerduty@0.3.26 + - @backstage/plugin-permission-react@0.3.1 + - @backstage/plugin-rollbar@0.3.27 + - @backstage/plugin-scaffolder@0.12.3 + - @backstage/plugin-search@0.7.0 + - @backstage/plugin-sentry@0.3.37 + - @backstage/plugin-shortcuts@0.2.0 + - @backstage/plugin-tech-insights@0.1.9 + - @backstage/plugin-tech-radar@0.5.6 + - @backstage/plugin-techdocs@0.13.4 + - @backstage/plugin-todo@0.2.1 + - @backstage/plugin-user-settings@0.3.20 + - @backstage/app-defaults@0.1.8 + - @backstage/catalog-model@0.10.0 + - @backstage/search-common@0.2.3 + - @backstage/theme@0.2.15 + - @backstage/plugin-catalog-common@0.1.3 + - @backstage/plugin-catalog-graph@0.2.11 + +## 0.2.64 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.13.2 + - @backstage/plugin-todo@0.2.0 + - @backstage/plugin-newrelic-dashboard@0.1.6 + - @backstage/core-components@0.8.8 + - @backstage/plugin-scaffolder@0.12.2 + - @backstage/plugin-search@0.6.2 + - @backstage/plugin-catalog-react@0.6.14 + - @backstage/plugin-catalog@0.7.12 + - @backstage/plugin-catalog-graph@0.2.10 + - @backstage/plugin-catalog-import@0.8.1 + - @backstage/plugin-home@0.4.14 + - @backstage/app-defaults@0.1.7 + - @backstage/integration-react@0.1.21 + - @backstage/plugin-airbrake@0.1.3 + - @backstage/plugin-apache-airflow@0.1.6 + - @backstage/plugin-api-docs@0.7.2 + - @backstage/plugin-azure-devops@0.1.14 + - @backstage/plugin-badges@0.2.22 + - @backstage/plugin-circleci@0.2.37 + - @backstage/plugin-cloudbuild@0.2.35 + - @backstage/plugin-code-coverage@0.1.25 + - @backstage/plugin-cost-insights@0.11.20 + - @backstage/plugin-explore@0.3.29 + - @backstage/plugin-gcp-projects@0.3.17 + - @backstage/plugin-github-actions@0.4.35 + - @backstage/plugin-gocd@0.1.4 + - @backstage/plugin-graphiql@0.2.30 + - @backstage/plugin-jenkins@0.5.20 + - @backstage/plugin-kafka@0.2.28 + - @backstage/plugin-kubernetes@0.5.7 + - @backstage/plugin-lighthouse@0.2.37 + - @backstage/plugin-newrelic@0.3.16 + - @backstage/plugin-pagerduty@0.3.25 + - @backstage/plugin-rollbar@0.3.26 + - @backstage/plugin-sentry@0.3.36 + - @backstage/plugin-shortcuts@0.1.22 + - @backstage/plugin-tech-insights@0.1.8 + - @backstage/plugin-tech-radar@0.5.5 + - @backstage/plugin-techdocs@0.13.3 + - @backstage/plugin-user-settings@0.3.19 + +## 0.2.64-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.13.2-next.0 + - @backstage/plugin-todo@0.2.0-next.0 + - @backstage/plugin-newrelic-dashboard@0.1.6-next.0 + - @backstage/core-components@0.8.8-next.0 + - @backstage/plugin-scaffolder@0.12.2-next.0 + - @backstage/plugin-search@0.6.2-next.0 + - @backstage/plugin-catalog-react@0.6.14-next.0 + - @backstage/plugin-catalog-graph@0.2.10-next.0 + - @backstage/plugin-catalog-import@0.8.1-next.0 + - @backstage/plugin-home@0.4.14-next.0 + - @backstage/app-defaults@0.1.7-next.0 + - @backstage/integration-react@0.1.21-next.0 + - @backstage/plugin-airbrake@0.1.3-next.0 + - @backstage/plugin-apache-airflow@0.1.6-next.0 + - @backstage/plugin-api-docs@0.7.2-next.0 + - @backstage/plugin-azure-devops@0.1.14-next.0 + - @backstage/plugin-badges@0.2.22-next.0 + - @backstage/plugin-catalog@0.7.12-next.0 + - @backstage/plugin-circleci@0.2.37-next.0 + - @backstage/plugin-cloudbuild@0.2.35-next.0 + - @backstage/plugin-code-coverage@0.1.25-next.0 + - @backstage/plugin-cost-insights@0.11.20-next.0 + - @backstage/plugin-explore@0.3.29-next.0 + - @backstage/plugin-gcp-projects@0.3.17-next.0 + - @backstage/plugin-github-actions@0.4.35-next.0 + - @backstage/plugin-gocd@0.1.4-next.0 + - @backstage/plugin-graphiql@0.2.30-next.0 + - @backstage/plugin-jenkins@0.5.20-next.0 + - @backstage/plugin-kafka@0.2.28-next.0 + - @backstage/plugin-kubernetes@0.5.7-next.0 + - @backstage/plugin-lighthouse@0.2.37-next.0 + - @backstage/plugin-newrelic@0.3.16-next.0 + - @backstage/plugin-org@0.4.2-next.0 + - @backstage/plugin-pagerduty@0.3.25-next.0 + - @backstage/plugin-rollbar@0.3.26-next.0 + - @backstage/plugin-sentry@0.3.36-next.0 + - @backstage/plugin-shortcuts@0.1.22-next.0 + - @backstage/plugin-tech-insights@0.1.8-next.0 + - @backstage/plugin-tech-radar@0.5.5-next.0 + - @backstage/plugin-techdocs@0.13.3-next.0 + - @backstage/plugin-user-settings@0.3.19-next.0 + +## 0.2.63 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.8.7 + - @backstage/plugin-catalog-react@0.6.13 + - @backstage/plugin-code-coverage@0.1.24 + - @backstage/plugin-catalog-common@0.1.2 + - @backstage/cli@0.13.1 + - @backstage/plugin-scaffolder@0.12.1 + - @backstage/integration-react@0.1.20 + - @backstage/plugin-org@0.4.1 + - @backstage/plugin-pagerduty@0.3.24 + - @backstage/plugin-catalog-import@0.8.0 + - @backstage/core-app-api@0.5.2 + - @backstage/plugin-techdocs@0.13.2 + - @backstage/app-defaults@0.1.6 + - @backstage/plugin-airbrake@0.1.2 + - @backstage/plugin-apache-airflow@0.1.5 + - @backstage/plugin-api-docs@0.7.1 + - @backstage/plugin-azure-devops@0.1.13 + - @backstage/plugin-badges@0.2.21 + - @backstage/plugin-catalog@0.7.11 + - @backstage/plugin-catalog-graph@0.2.9 + - @backstage/plugin-circleci@0.2.36 + - @backstage/plugin-cloudbuild@0.2.34 + - @backstage/plugin-cost-insights@0.11.19 + - @backstage/plugin-explore@0.3.28 + - @backstage/plugin-gcp-projects@0.3.16 + - @backstage/plugin-github-actions@0.4.34 + - @backstage/plugin-gocd@0.1.3 + - @backstage/plugin-graphiql@0.2.29 + - @backstage/plugin-home@0.4.13 + - @backstage/plugin-jenkins@0.5.19 + - @backstage/plugin-kafka@0.2.27 + - @backstage/plugin-kubernetes@0.5.6 + - @backstage/plugin-lighthouse@0.2.36 + - @backstage/plugin-newrelic@0.3.15 + - @backstage/plugin-newrelic-dashboard@0.1.5 + - @backstage/plugin-rollbar@0.3.25 + - @backstage/plugin-search@0.6.1 + - @backstage/plugin-sentry@0.3.35 + - @backstage/plugin-shortcuts@0.1.21 + - @backstage/plugin-tech-insights@0.1.7 + - @backstage/plugin-tech-radar@0.5.4 + - @backstage/plugin-todo@0.1.21 + - @backstage/plugin-user-settings@0.3.18 + +## 0.2.63-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.8.7-next.1 + - @backstage/plugin-catalog-react@0.6.13-next.1 + - @backstage/plugin-code-coverage@0.1.24-next.1 + - @backstage/plugin-catalog-common@0.1.2-next.0 + - @backstage/cli@0.13.1-next.1 + - @backstage/plugin-scaffolder@0.12.1-next.1 + - @backstage/core-app-api@0.5.2-next.0 + - @backstage/plugin-techdocs@0.13.2-next.1 + - @backstage/plugin-catalog@0.7.11-next.1 + - @backstage/app-defaults@0.1.6-next.1 + +## 0.2.63-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.8.7-next.0 + - @backstage/plugin-org@0.4.1-next.0 + - @backstage/plugin-pagerduty@0.3.24-next.0 + - @backstage/plugin-catalog-import@0.8.0-next.0 + - @backstage/plugin-techdocs@0.13.2-next.0 + - @backstage/plugin-scaffolder@0.12.1-next.0 + - @backstage/cli@0.13.1-next.0 + - @backstage/app-defaults@0.1.6-next.0 + - @backstage/integration-react@0.1.20-next.0 + - @backstage/plugin-airbrake@0.1.2-next.0 + - @backstage/plugin-apache-airflow@0.1.5-next.0 + - @backstage/plugin-api-docs@0.7.1-next.0 + - @backstage/plugin-azure-devops@0.1.13-next.0 + - @backstage/plugin-badges@0.2.21-next.0 + - @backstage/plugin-catalog@0.7.11-next.0 + - @backstage/plugin-catalog-graph@0.2.9-next.0 + - @backstage/plugin-catalog-react@0.6.13-next.0 + - @backstage/plugin-circleci@0.2.36-next.0 + - @backstage/plugin-cloudbuild@0.2.34-next.0 + - @backstage/plugin-code-coverage@0.1.24-next.0 + - @backstage/plugin-cost-insights@0.11.19-next.0 + - @backstage/plugin-explore@0.3.28-next.0 + - @backstage/plugin-gcp-projects@0.3.16-next.0 + - @backstage/plugin-github-actions@0.4.34-next.0 + - @backstage/plugin-gocd@0.1.3-next.0 + - @backstage/plugin-graphiql@0.2.29-next.0 + - @backstage/plugin-home@0.4.13-next.0 + - @backstage/plugin-jenkins@0.5.19-next.0 + - @backstage/plugin-kafka@0.2.27-next.0 + - @backstage/plugin-kubernetes@0.5.6-next.0 + - @backstage/plugin-lighthouse@0.2.36-next.0 + - @backstage/plugin-newrelic@0.3.15-next.0 + - @backstage/plugin-newrelic-dashboard@0.1.5-next.0 + - @backstage/plugin-rollbar@0.3.25-next.0 + - @backstage/plugin-search@0.6.1-next.0 + - @backstage/plugin-sentry@0.3.35-next.0 + - @backstage/plugin-shortcuts@0.1.21-next.0 + - @backstage/plugin-tech-insights@0.1.7-next.0 + - @backstage/plugin-tech-radar@0.5.4-next.0 + - @backstage/plugin-todo@0.1.21-next.0 + - @backstage/plugin-user-settings@0.3.18-next.0 + +## 0.2.62 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.8.6 + - @backstage/plugin-catalog-graph@0.2.8 + - @backstage/cli@0.13.0 + - @backstage/plugin-techdocs@0.13.1 + - @backstage/plugin-search@0.6.0 + - @backstage/plugin-explore@0.3.27 + - @backstage/search-common@0.2.2 + - @backstage/plugin-azure-devops@0.1.12 + - @backstage/plugin-catalog@0.7.10 + - @backstage/plugin-github-actions@0.4.33 + - @backstage/plugin-gcp-projects@0.3.15 + - @backstage/core-app-api@0.5.1 + - @backstage/plugin-home@0.4.12 + +## 0.2.61 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-tech-radar@0.5.3 + - @backstage/core-components@0.8.5 + - @backstage/plugin-api-docs@0.7.0 + - @backstage/plugin-kubernetes@0.5.5 + - @backstage/cli@0.12.0 + - @backstage/plugin-search@0.5.6 + - @backstage/core-plugin-api@0.6.0 + - @backstage/plugin-org@0.4.0 + - @backstage/plugin-catalog@0.7.9 + - @backstage/plugin-cost-insights@0.11.18 + - @backstage/plugin-shortcuts@0.1.20 + - @backstage/plugin-user-settings@0.3.17 + - @backstage/core-app-api@0.5.0 + - @backstage/plugin-catalog-react@0.6.12 + - @backstage/plugin-scaffolder@0.12.0 + - @backstage/plugin-azure-devops@0.1.11 + - @backstage/plugin-badges@0.2.20 + - @backstage/plugin-catalog-import@0.7.10 + - @backstage/plugin-kafka@0.2.26 + - @backstage/plugin-pagerduty@0.3.23 + - @backstage/plugin-rollbar@0.3.24 + - @backstage/plugin-sentry@0.3.34 + - @backstage/plugin-tech-insights@0.1.6 + - @backstage/plugin-techdocs@0.13.0 + - @backstage/plugin-todo@0.1.20 + - @backstage/plugin-newrelic-dashboard@0.1.4 + - @backstage/catalog-model@0.9.10 + - @backstage/app-defaults@0.1.5 + - @backstage/integration-react@0.1.19 + - @backstage/plugin-airbrake@0.1.1 + - @backstage/plugin-apache-airflow@0.1.4 + - @backstage/plugin-catalog-graph@0.2.7 + - @backstage/plugin-circleci@0.2.35 + - @backstage/plugin-cloudbuild@0.2.33 + - @backstage/plugin-code-coverage@0.1.23 + - @backstage/plugin-explore@0.3.26 + - @backstage/plugin-gcp-projects@0.3.14 + - @backstage/plugin-github-actions@0.4.32 + - @backstage/plugin-gocd@0.1.2 + - @backstage/plugin-graphiql@0.2.28 + - @backstage/plugin-home@0.4.11 + - @backstage/plugin-jenkins@0.5.18 + - @backstage/plugin-lighthouse@0.2.35 + - @backstage/plugin-newrelic@0.3.14 + +## 0.2.61-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-tech-radar@0.5.3-next.0 + - @backstage/core-components@0.8.5-next.0 + - @backstage/plugin-api-docs@0.6.23-next.0 + - @backstage/cli@0.12.0-next.0 + - @backstage/core-plugin-api@0.6.0-next.0 + - @backstage/plugin-org@0.3.35-next.0 + - @backstage/plugin-catalog@0.7.9-next.0 + - @backstage/plugin-cost-insights@0.11.18-next.0 + - @backstage/plugin-shortcuts@0.1.20-next.0 + - @backstage/plugin-user-settings@0.3.17-next.0 + - @backstage/core-app-api@0.5.0-next.0 + - @backstage/plugin-catalog-react@0.6.12-next.0 + - @backstage/plugin-azure-devops@0.1.11-next.0 + - @backstage/plugin-badges@0.2.20-next.0 + - @backstage/plugin-catalog-import@0.7.10-next.0 + - @backstage/plugin-kafka@0.2.26-next.0 + - @backstage/plugin-kubernetes@0.5.5-next.0 + - @backstage/plugin-pagerduty@0.3.23-next.0 + - @backstage/plugin-rollbar@0.3.24-next.0 + - @backstage/plugin-scaffolder@0.11.19-next.0 + - @backstage/plugin-search@0.5.6-next.0 + - @backstage/plugin-sentry@0.3.34-next.0 + - @backstage/plugin-tech-insights@0.1.6-next.0 + - @backstage/plugin-techdocs@0.12.15-next.0 + - @backstage/plugin-todo@0.1.19-next.0 + - @backstage/catalog-model@0.9.10-next.0 + - @backstage/app-defaults@0.1.5-next.0 + - @backstage/integration-react@0.1.19-next.0 + - @backstage/plugin-airbrake@0.1.1-next.0 + - @backstage/plugin-apache-airflow@0.1.4-next.0 + - @backstage/plugin-catalog-graph@0.2.7-next.0 + - @backstage/plugin-circleci@0.2.35-next.0 + - @backstage/plugin-cloudbuild@0.2.33-next.0 + - @backstage/plugin-code-coverage@0.1.23-next.0 + - @backstage/plugin-explore@0.3.26-next.0 + - @backstage/plugin-gcp-projects@0.3.14-next.0 + - @backstage/plugin-github-actions@0.4.32-next.0 + - @backstage/plugin-gocd@0.1.2-next.0 + - @backstage/plugin-graphiql@0.2.28-next.0 + - @backstage/plugin-home@0.4.11-next.0 + - @backstage/plugin-jenkins@0.5.18-next.0 + - @backstage/plugin-lighthouse@0.2.35-next.0 + - @backstage/plugin-newrelic@0.3.14-next.0 + - @backstage/plugin-newrelic-dashboard@0.1.4-next.0 + +## 0.2.60 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.8.4 + - @backstage/cli@0.11.0 + - @backstage/plugin-tech-insights@0.1.5 + - @backstage/plugin-gocd@0.1.1 + - @backstage/core-plugin-api@0.5.0 + - @backstage/plugin-org@0.3.34 + - @backstage/plugin-home@0.4.10 + - @backstage/plugin-azure-devops@0.1.10 + - @backstage/plugin-apache-airflow@0.1.3 + - @backstage/plugin-catalog-import@0.7.9 + - @backstage/plugin-catalog-react@0.6.11 + - @backstage/plugin-code-coverage@0.1.22 + - @backstage/plugin-cost-insights@0.11.17 + - @backstage/plugin-jenkins@0.5.17 + - @backstage/plugin-scaffolder@0.11.18 + - @backstage/plugin-techdocs@0.12.14 + - @backstage/plugin-kubernetes@0.5.4 + - @backstage/plugin-pagerduty@0.3.22 + - @backstage/plugin-api-docs@0.6.22 + - @backstage/core-app-api@0.4.0 + - @backstage/plugin-airbrake@0.1.0 + - @backstage/app-defaults@0.1.4 + - @backstage/catalog-model@0.9.9 + - @backstage/integration-react@0.1.18 + - @backstage/plugin-badges@0.2.19 + - @backstage/plugin-catalog@0.7.8 + - @backstage/plugin-catalog-graph@0.2.6 + - @backstage/plugin-circleci@0.2.34 + - @backstage/plugin-cloudbuild@0.2.32 + - @backstage/plugin-explore@0.3.25 + - @backstage/plugin-gcp-projects@0.3.13 + - @backstage/plugin-github-actions@0.4.31 + - @backstage/plugin-graphiql@0.2.27 + - @backstage/plugin-kafka@0.2.25 + - @backstage/plugin-lighthouse@0.2.34 + - @backstage/plugin-newrelic@0.3.13 + - @backstage/plugin-newrelic-dashboard@0.1.3 + - @backstage/plugin-rollbar@0.3.23 + - @backstage/plugin-search@0.5.5 + - @backstage/plugin-sentry@0.3.33 + - @backstage/plugin-shortcuts@0.1.19 + - @backstage/plugin-tech-radar@0.5.2 + - @backstage/plugin-todo@0.1.18 + - @backstage/plugin-user-settings@0.3.16 + +## 0.2.59 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.10.5 + - @backstage/plugin-search@0.5.4 + - @backstage/plugin-techdocs@0.12.13 + - @backstage/core-plugin-api@0.4.1 + - @backstage/plugin-catalog-react@0.6.10 + - @backstage/plugin-kubernetes@0.5.3 + - @backstage/core-app-api@0.3.1 + - @backstage/core-components@0.8.3 + - @backstage/plugin-apache-airflow@0.1.2 + - @backstage/plugin-azure-devops@0.1.9 + - @backstage/plugin-badges@0.2.18 + - @backstage/plugin-catalog@0.7.7 + - @backstage/plugin-catalog-graph@0.2.5 + - @backstage/plugin-catalog-import@0.7.8 + - @backstage/plugin-circleci@0.2.33 + - @backstage/plugin-cloudbuild@0.2.31 + - @backstage/plugin-code-coverage@0.1.21 + - @backstage/plugin-cost-insights@0.11.16 + - @backstage/plugin-explore@0.3.24 + - @backstage/plugin-gcp-projects@0.3.12 + - @backstage/plugin-github-actions@0.4.30 + - @backstage/plugin-graphiql@0.2.26 + - @backstage/plugin-home@0.4.9 + - @backstage/plugin-jenkins@0.5.16 + - @backstage/plugin-kafka@0.2.24 + - @backstage/plugin-lighthouse@0.2.33 + - @backstage/plugin-newrelic@0.3.12 + - @backstage/plugin-newrelic-dashboard@0.1.2 + - @backstage/plugin-org@0.3.33 + - @backstage/plugin-pagerduty@0.3.21 + - @backstage/plugin-rollbar@0.3.22 + - @backstage/plugin-scaffolder@0.11.17 + - @backstage/plugin-sentry@0.3.32 + - @backstage/plugin-shortcuts@0.1.18 + - @backstage/plugin-tech-insights@0.1.4 + - @backstage/plugin-tech-radar@0.5.1 + - @backstage/plugin-user-settings@0.3.15 + - @backstage/plugin-api-docs@0.6.21 + +## 0.2.58 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-search@0.5.2 + - @backstage/app-defaults@0.1.3 + - @backstage/core-app-api@0.3.0 + - @backstage/core-plugin-api@0.4.0 + - @backstage/plugin-user-settings@0.3.14 + - @backstage/plugin-scaffolder@0.11.15 + - @backstage/plugin-catalog-react@0.6.8 + - @backstage/plugin-kubernetes@0.5.2 + - @backstage/core-components@0.8.2 + - @backstage/cli@0.10.3 + - @backstage/plugin-tech-radar@0.5.0 + - @backstage/plugin-tech-insights@0.1.2 + - @backstage/plugin-org@0.3.32 + - @backstage/plugin-catalog@0.7.5 + - @backstage/plugin-newrelic-dashboard@0.1.1 + - @backstage/plugin-home@0.4.8 + - @backstage/plugin-circleci@0.2.32 + - @backstage/plugin-cloudbuild@0.2.30 + - @backstage/plugin-github-actions@0.4.28 + - @backstage/plugin-jenkins@0.5.15 + - @backstage/plugin-lighthouse@0.2.32 + - @backstage/plugin-sentry@0.3.31 + - @backstage/plugin-apache-airflow@0.1.1 + - @backstage/plugin-api-docs@0.6.19 + - @backstage/plugin-azure-devops@0.1.8 + - @backstage/plugin-badges@0.2.17 + - @backstage/plugin-catalog-graph@0.2.4 + - @backstage/plugin-catalog-import@0.7.6 + - @backstage/plugin-code-coverage@0.1.20 + - @backstage/plugin-cost-insights@0.11.14 + - @backstage/plugin-explore@0.3.23 + - @backstage/plugin-gcp-projects@0.3.11 + - @backstage/plugin-graphiql@0.2.25 + - @backstage/plugin-kafka@0.2.23 + - @backstage/plugin-newrelic@0.3.11 + - @backstage/plugin-pagerduty@0.3.20 + - @backstage/plugin-rollbar@0.3.21 + - @backstage/plugin-shortcuts@0.1.16 + - @backstage/plugin-techdocs@0.12.11 + - @backstage/plugin-todo@0.1.17 + - @backstage/integration-react@0.1.16 + +## 0.2.57 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-github-actions@0.4.27 + - @backstage/core-app-api@0.2.1 + - @backstage/plugin-kubernetes@0.5.1 + - @backstage/core-plugin-api@0.3.1 + - @backstage/core-components@0.8.1 + - @backstage/plugin-org@0.3.31 + - @backstage/plugin-azure-devops@0.1.7 + - @backstage/cli@0.10.2 + - @backstage/catalog-model@0.9.8 + - @backstage/plugin-techdocs@0.12.10 + - @backstage/plugin-catalog-react@0.6.7 + - @backstage/plugin-apache-airflow@0.1.0 + +## 0.2.56 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.8.0 + - @backstage/core-plugin-api@0.3.0 + - @backstage/plugin-cloudbuild@0.2.29 + - @backstage/plugin-catalog@0.7.4 + - @backstage/core-app-api@0.2.0 + - @backstage/plugin-scaffolder@0.11.14 + - @backstage/plugin-kubernetes@0.5.0 + - @backstage/app-defaults@0.1.2 + - @backstage/integration-react@0.1.15 + - @backstage/plugin-api-docs@0.6.18 + - @backstage/plugin-azure-devops@0.1.6 + - @backstage/plugin-badges@0.2.16 + - @backstage/plugin-catalog-graph@0.2.3 + - @backstage/plugin-catalog-import@0.7.5 + - @backstage/plugin-catalog-react@0.6.5 + - @backstage/plugin-circleci@0.2.31 + - @backstage/plugin-code-coverage@0.1.19 + - @backstage/plugin-cost-insights@0.11.13 + - @backstage/plugin-explore@0.3.22 + - @backstage/plugin-gcp-projects@0.3.10 + - @backstage/plugin-github-actions@0.4.26 + - @backstage/plugin-graphiql@0.2.24 + - @backstage/plugin-home@0.4.7 + - @backstage/plugin-jenkins@0.5.14 + - @backstage/plugin-kafka@0.2.22 + - @backstage/plugin-lighthouse@0.2.31 + - @backstage/plugin-newrelic@0.3.10 + - @backstage/plugin-org@0.3.30 + - @backstage/plugin-pagerduty@0.3.19 + - @backstage/plugin-rollbar@0.3.20 + - @backstage/plugin-search@0.5.1 + - @backstage/plugin-sentry@0.3.30 + - @backstage/plugin-shortcuts@0.1.15 + - @backstage/plugin-tech-insights@0.1.1 + - @backstage/plugin-tech-radar@0.4.13 + - @backstage/plugin-techdocs@0.12.9 + - @backstage/plugin-todo@0.1.16 + - @backstage/plugin-user-settings@0.3.13 + - @backstage/cli@0.10.1 + +## 0.2.55 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-azure-devops@0.1.5 + - @backstage/core-components@0.7.6 + - @backstage/theme@0.2.14 + - @backstage/plugin-user-settings@0.3.12 + - @backstage/plugin-api-docs@0.6.16 + - @backstage/cli@0.10.0 + - @backstage/plugin-circleci@0.2.30 + - @backstage/core-plugin-api@0.2.2 + - @backstage/plugin-search@0.5.0 + - @backstage/plugin-tech-insights@0.1.0 + - @backstage/core-app-api@0.1.24 + - @backstage/plugin-kubernetes@0.4.22 + - @backstage/plugin-scaffolder@0.11.13 + - @backstage/plugin-techdocs@0.12.8 + +## 0.2.53 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@0.7.3 + - @backstage/plugin-cost-insights@0.11.11 + - @backstage/cli@0.9.0 + - @backstage/plugin-gcp-projects@0.3.9 + - @backstage/catalog-model@0.9.7 + - @backstage/plugin-scaffolder@0.11.11 + - @backstage/plugin-api-docs@0.6.14 + - @backstage/plugin-azure-devops@0.1.4 + - @backstage/plugin-badges@0.2.14 + - @backstage/plugin-catalog-graph@0.2.2 + - @backstage/plugin-catalog-import@0.7.4 + - @backstage/plugin-catalog-react@0.6.4 + - @backstage/plugin-circleci@0.2.29 + - @backstage/plugin-cloudbuild@0.2.28 + - @backstage/plugin-code-coverage@0.1.18 + - @backstage/plugin-explore@0.3.21 + - @backstage/plugin-github-actions@0.4.24 + - @backstage/plugin-home@0.4.6 + - @backstage/plugin-jenkins@0.5.12 + - @backstage/plugin-kafka@0.2.21 + - @backstage/plugin-kubernetes@0.4.20 + - @backstage/plugin-lighthouse@0.2.30 + - @backstage/plugin-newrelic@0.3.9 + - @backstage/plugin-pagerduty@0.3.18 + - @backstage/plugin-rollbar@0.3.19 + - @backstage/plugin-search@0.4.18 + - @backstage/plugin-sentry@0.3.29 + - @backstage/plugin-tech-radar@0.4.12 + - @backstage/plugin-techdocs@0.12.6 + - @backstage/plugin-todo@0.1.15 + - @backstage/plugin-user-settings@0.3.11 + - @backstage/core-components@0.7.4 + - @backstage/core-plugin-api@0.2.0 + - @backstage/core-app-api@0.1.21 + - @backstage/plugin-shortcuts@0.1.14 + - @backstage/app-defaults@0.1.1 + - @backstage/integration-react@0.1.14 + - @backstage/plugin-graphiql@0.2.21 + - @backstage/plugin-org@0.3.28 + +## 0.2.51 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.7.1 + - @backstage/plugin-techdocs@0.12.3 + - @backstage/plugin-sentry@0.3.26 + - @backstage/plugin-user-settings@0.3.10 + - @backstage/plugin-catalog-graph@0.2.1 + - @backstage/plugin-jenkins@0.5.11 + - @backstage/core-app-api@0.1.18 + - @backstage/core-plugin-api@0.1.11 + - @backstage/cli@0.8.0 + - @backstage/plugin-catalog@0.7.2 + - @backstage/plugin-catalog-import@0.7.3 + - @backstage/plugin-catalog-react@0.6.1 + - @backstage/catalog-model@0.9.5 + +## 0.2.50 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@0.6.0 + - @backstage/plugin-catalog@0.7.1 + - @backstage/plugin-api-docs@0.6.12 + - @backstage/plugin-scaffolder@0.11.8 + - @backstage/core-app-api@0.1.17 + - @backstage/core-components@0.7.0 + - @backstage/theme@0.2.11 + - @backstage/plugin-graphiql@0.2.20 + - @backstage/cli@0.7.16 + - @backstage/plugin-home@0.4.4 + - @backstage/plugin-catalog-graph@0.2.0 + - @backstage/plugin-search@0.4.15 + - @backstage/plugin-techdocs@0.12.2 + - @backstage/plugin-kubernetes@0.4.17 + - @backstage/plugin-azure-devops@0.1.1 + - @backstage/plugin-badges@0.2.13 + - @backstage/plugin-catalog-import@0.7.2 + - @backstage/plugin-circleci@0.2.27 + - @backstage/plugin-cloudbuild@0.2.27 + - @backstage/plugin-code-coverage@0.1.15 + - @backstage/plugin-explore@0.3.20 + - @backstage/plugin-github-actions@0.4.22 + - @backstage/plugin-jenkins@0.5.10 + - @backstage/plugin-kafka@0.2.19 + - @backstage/plugin-lighthouse@0.2.29 + - @backstage/plugin-org@0.3.27 + - @backstage/plugin-pagerduty@0.3.17 + - @backstage/plugin-rollbar@0.3.18 + - @backstage/plugin-sentry@0.3.25 + - @backstage/plugin-todo@0.1.14 + - @backstage/integration-react@0.1.12 + - @backstage/plugin-cost-insights@0.11.10 + - @backstage/plugin-gcp-projects@0.3.8 + - @backstage/plugin-newrelic@0.3.8 + - @backstage/plugin-shortcuts@0.1.12 + - @backstage/plugin-tech-radar@0.4.11 + - @backstage/plugin-user-settings@0.3.9 + +## 0.2.49 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.7.15 + - @backstage/core-components@0.6.1 + - @backstage/core-plugin-api@0.1.10 + - @backstage/core-app-api@0.1.16 + - @backstage/plugin-org@0.3.26 + - @backstage/plugin-catalog@0.7.0 + - @backstage/plugin-catalog-react@0.5.2 + - @backstage/catalog-model@0.9.4 + - @backstage/plugin-cost-insights@0.11.9 + - @backstage/plugin-user-settings@0.3.8 + - @backstage/plugin-kubernetes@0.4.16 + - @backstage/plugin-catalog-import@0.7.1 + - @backstage/plugin-badges@0.2.12 + - @backstage/plugin-home@0.4.3 + - @backstage/plugin-search@0.4.14 + - @backstage/plugin-shortcuts@0.1.11 + - @backstage/plugin-api-docs@0.6.11 + - @backstage/plugin-catalog-graph@0.1.3 + - @backstage/plugin-circleci@0.2.26 + - @backstage/plugin-cloudbuild@0.2.26 + - @backstage/plugin-code-coverage@0.1.14 + - @backstage/plugin-explore@0.3.19 + - @backstage/plugin-gcp-projects@0.3.7 + - @backstage/plugin-github-actions@0.4.21 + - @backstage/plugin-graphiql@0.2.19 + - @backstage/plugin-jenkins@0.5.9 + - @backstage/plugin-kafka@0.2.18 + - @backstage/plugin-lighthouse@0.2.28 + - @backstage/plugin-newrelic@0.3.7 + - @backstage/plugin-pagerduty@0.3.16 + - @backstage/plugin-rollbar@0.3.17 + - @backstage/plugin-scaffolder@0.11.7 + - @backstage/plugin-sentry@0.3.24 + - @backstage/plugin-tech-radar@0.4.10 + - @backstage/plugin-techdocs@0.12.1 + - @backstage/plugin-todo@0.1.13 + +## 0.2.48 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.7.14 + - @backstage/plugin-techdocs@0.12.0 + - @backstage/plugin-user-settings@0.3.7 + - @backstage/core-app-api@0.1.15 + - @backstage/plugin-catalog-import@0.7.0 + - @backstage/plugin-badges@0.2.11 + - @backstage/plugin-cost-insights@0.11.8 + - @backstage/plugin-tech-radar@0.4.9 + - @backstage/core-plugin-api@0.1.9 + - @backstage/plugin-kubernetes@0.4.15 + - @backstage/core-components@0.6.0 + - @backstage/integration-react@0.1.11 + - @backstage/plugin-catalog@0.6.17 + - @backstage/plugin-api-docs@0.6.10 + - @backstage/plugin-catalog-graph@0.1.2 + - @backstage/plugin-catalog-react@0.5.1 + - @backstage/plugin-circleci@0.2.25 + - @backstage/plugin-cloudbuild@0.2.25 + - @backstage/plugin-code-coverage@0.1.13 + - @backstage/plugin-explore@0.3.18 + - @backstage/plugin-gcp-projects@0.3.6 + - @backstage/plugin-github-actions@0.4.20 + - @backstage/plugin-graphiql@0.2.18 + - @backstage/plugin-home@0.4.2 + - @backstage/plugin-jenkins@0.5.8 + - @backstage/plugin-kafka@0.2.17 + - @backstage/plugin-lighthouse@0.2.27 + - @backstage/plugin-newrelic@0.3.6 + - @backstage/plugin-org@0.3.25 + - @backstage/plugin-pagerduty@0.3.15 + - @backstage/plugin-rollbar@0.3.16 + - @backstage/plugin-scaffolder@0.11.6 + - @backstage/plugin-search@0.4.13 + - @backstage/plugin-sentry@0.3.23 + - @backstage/plugin-shortcuts@0.1.10 + - @backstage/plugin-todo@0.1.12 + +## 0.2.47 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-explore@0.3.17 + - @backstage/core-components@0.5.0 + - @backstage/plugin-catalog-import@0.6.0 + - @backstage/plugin-catalog-graph@0.1.1 + - @backstage/cli@0.7.13 + - @backstage/plugin-catalog@0.6.16 + - @backstage/plugin-user-settings@0.3.6 + - @backstage/plugin-circleci@0.2.24 + - @backstage/plugin-catalog-react@0.5.0 + - @backstage/plugin-api-docs@0.6.9 + - @backstage/catalog-model@0.9.3 + - @backstage/plugin-rollbar@0.3.15 + - @backstage/plugin-techdocs@0.11.3 + - @backstage/plugin-kubernetes@0.4.14 + - @backstage/core-app-api@0.1.14 + - @backstage/integration-react@0.1.10 + - @backstage/plugin-badges@0.2.10 + - @backstage/plugin-cloudbuild@0.2.24 + - @backstage/plugin-code-coverage@0.1.12 + - @backstage/plugin-cost-insights@0.11.7 + - @backstage/plugin-gcp-projects@0.3.5 + - @backstage/plugin-github-actions@0.4.19 + - @backstage/plugin-graphiql@0.2.17 + - @backstage/plugin-home@0.4.1 + - @backstage/plugin-jenkins@0.5.7 + - @backstage/plugin-kafka@0.2.16 + - @backstage/plugin-lighthouse@0.2.26 + - @backstage/plugin-newrelic@0.3.5 + - @backstage/plugin-org@0.3.24 + - @backstage/plugin-pagerduty@0.3.14 + - @backstage/plugin-scaffolder@0.11.5 + - @backstage/plugin-search@0.4.12 + - @backstage/plugin-sentry@0.3.22 + - @backstage/plugin-shortcuts@0.1.9 + - @backstage/plugin-tech-radar@0.4.8 + - @backstage/plugin-todo@0.1.11 + +## 0.2.46 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.4.2 + - @backstage/cli@0.7.12 + - @backstage/plugin-techdocs@0.11.2 + - @backstage/plugin-user-settings@0.3.5 + - @backstage/plugin-newrelic@0.3.4 + - @backstage/plugin-home@0.4.0 + - @backstage/integration-react@0.1.9 + - @backstage/plugin-api-docs@0.6.8 + - @backstage/plugin-badges@0.2.9 + - @backstage/plugin-catalog@0.6.15 + - @backstage/plugin-catalog-import@0.5.21 + - @backstage/plugin-catalog-react@0.4.6 + - @backstage/plugin-circleci@0.2.23 + - @backstage/plugin-cloudbuild@0.2.23 + - @backstage/plugin-code-coverage@0.1.11 + - @backstage/plugin-cost-insights@0.11.6 + - @backstage/plugin-explore@0.3.16 + - @backstage/plugin-gcp-projects@0.3.4 + - @backstage/plugin-github-actions@0.4.18 + - @backstage/plugin-graphiql@0.2.16 + - @backstage/plugin-jenkins@0.5.6 + - @backstage/plugin-kafka@0.2.15 + - @backstage/plugin-kubernetes@0.4.13 + - @backstage/plugin-lighthouse@0.2.25 + - @backstage/plugin-org@0.3.23 + - @backstage/plugin-pagerduty@0.3.13 + - @backstage/plugin-rollbar@0.3.14 + - @backstage/plugin-scaffolder@0.11.4 + - @backstage/plugin-search@0.4.11 + - @backstage/plugin-sentry@0.3.21 + - @backstage/plugin-shortcuts@0.1.8 + - @backstage/plugin-tech-radar@0.4.7 + - @backstage/plugin-todo@0.1.10 + - @backstage/core-app-api@0.1.13 + - @backstage/core-plugin-api@0.1.8 + +## 0.2.45 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-todo@0.1.9 + - @backstage/core-components@0.4.1 + - @backstage/catalog-model@0.9.2 + - @backstage/plugin-home@0.3.0 + - @backstage/plugin-scaffolder@0.11.3 + - @backstage/plugin-org@0.3.22 + - @backstage/core-app-api@0.1.12 + - @backstage/plugin-search@0.4.10 + - @backstage/core-plugin-api@0.1.7 + - @backstage/cli@0.7.11 + +## 0.2.44 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder@0.11.2 + - @backstage/cli@0.7.10 + - @backstage/plugin-catalog-react@0.4.5 + - @backstage/plugin-techdocs@0.11.1 + - @backstage/core-components@0.4.0 + - @backstage/plugin-catalog-import@0.5.20 + - @backstage/plugin-shortcuts@0.1.7 + - @backstage/plugin-org@0.3.21 + - @backstage/plugin-catalog@0.6.14 + - @backstage/search-common@0.2.0 + - @backstage/plugin-search@0.4.9 + - @backstage/catalog-model@0.9.1 + - @backstage/core-app-api@0.1.11 + - @backstage/integration-react@0.1.8 + - @backstage/plugin-api-docs@0.6.7 + - @backstage/plugin-badges@0.2.8 + - @backstage/plugin-circleci@0.2.22 + - @backstage/plugin-cloudbuild@0.2.22 + - @backstage/plugin-code-coverage@0.1.10 + - @backstage/plugin-cost-insights@0.11.5 + - @backstage/plugin-explore@0.3.15 + - @backstage/plugin-gcp-projects@0.3.3 + - @backstage/plugin-github-actions@0.4.17 + - @backstage/plugin-graphiql@0.2.15 + - @backstage/plugin-home@0.2.1 + - @backstage/plugin-jenkins@0.5.5 + - @backstage/plugin-kafka@0.2.14 + - @backstage/plugin-kubernetes@0.4.12 + - @backstage/plugin-lighthouse@0.2.24 + - @backstage/plugin-newrelic@0.3.3 + - @backstage/plugin-pagerduty@0.3.12 + - @backstage/plugin-rollbar@0.3.13 + - @backstage/plugin-sentry@0.3.20 + - @backstage/plugin-tech-radar@0.4.6 + - @backstage/plugin-todo@0.1.8 + - @backstage/plugin-user-settings@0.3.4 + +## 0.2.43 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-explore@0.3.14 + - @backstage/core-app-api@0.1.10 + - @backstage/plugin-catalog-import@0.5.19 + - @backstage/plugin-catalog@0.6.13 + - @backstage/plugin-org@0.3.20 + - @backstage/plugin-catalog-react@0.4.4 + - @backstage/core-components@0.3.3 + - @backstage/plugin-techdocs@0.11.0 + - @backstage/plugin-search@0.4.8 + +## 0.2.42 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder@0.11.1 + - @backstage/plugin-home@0.2.0 + - @backstage/cli@0.7.9 + - @backstage/core-app-api@0.1.9 + - @backstage/plugin-catalog-import@0.5.18 + - @backstage/plugin-catalog@0.6.12 + - @backstage/plugin-catalog-react@0.4.3 + - @backstage/plugin-sentry@0.3.19 + - @backstage/plugin-jenkins@0.5.4 + - @backstage/core-components@0.3.2 + - @backstage/theme@0.2.10 + +## 0.2.41 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-cost-insights@0.11.4 + - @backstage/plugin-github-actions@0.4.16 + - @backstage/plugin-jenkins@0.5.3 + - @backstage/plugin-kubernetes@0.4.11 + - @backstage/plugin-pagerduty@0.3.11 + - @backstage/plugin-scaffolder@0.11.0 + - @backstage/plugin-sentry@0.3.18 + - @backstage/plugin-techdocs@0.10.4 + - @backstage/core-app-api@0.1.8 + - @backstage/core-components@0.3.1 + - @backstage/core-plugin-api@0.1.6 + - @backstage/plugin-api-docs@0.6.6 + - @backstage/plugin-catalog@0.6.11 + - @backstage/plugin-catalog-import@0.5.17 + - @backstage/plugin-catalog-react@0.4.2 + - @backstage/plugin-explore@0.3.13 + - @backstage/plugin-lighthouse@0.2.23 + - @backstage/plugin-rollbar@0.3.12 + - @backstage/plugin-search@0.4.7 + - @backstage/plugin-tech-radar@0.4.5 + - @backstage/cli@0.7.8 + - @backstage/integration-react@0.1.7 + +## 0.2.40 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.7.7 + - @backstage/plugin-catalog@0.6.10 + - @backstage/core-components@0.3.0 + - @backstage/core-plugin-api@0.1.5 + - @backstage/plugin-api-docs@0.6.5 + - @backstage/plugin-scaffolder@0.10.3 + - @backstage/plugin-search@0.4.6 + - @backstage/plugin-cost-insights@0.11.3 + - @backstage/plugin-kubernetes@0.4.10 + - @backstage/plugin-lighthouse@0.2.22 + - @backstage/plugin-pagerduty@0.3.10 + - @backstage/plugin-techdocs@0.10.3 + - @backstage/search-common@0.1.3 + - @backstage/core-app-api@0.1.7 + - @backstage/integration-react@0.1.6 + - @backstage/plugin-badges@0.2.7 + - @backstage/plugin-catalog-import@0.5.16 + - @backstage/plugin-catalog-react@0.4.1 + - @backstage/plugin-circleci@0.2.21 + - @backstage/plugin-cloudbuild@0.2.21 + - @backstage/plugin-code-coverage@0.1.9 + - @backstage/plugin-explore@0.3.12 + - @backstage/plugin-gcp-projects@0.3.2 + - @backstage/plugin-github-actions@0.4.15 + - @backstage/plugin-graphiql@0.2.14 + - @backstage/plugin-jenkins@0.5.2 + - @backstage/plugin-kafka@0.2.13 + - @backstage/plugin-newrelic@0.3.2 + - @backstage/plugin-org@0.3.19 + - @backstage/plugin-rollbar@0.3.11 + - @backstage/plugin-sentry@0.3.17 + - @backstage/plugin-shortcuts@0.1.6 + - @backstage/plugin-tech-radar@0.4.4 + - @backstage/plugin-todo@0.1.7 + - @backstage/plugin-user-settings@0.3.3 + +## 0.2.39 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder@0.10.2 + - @backstage/core-components@0.2.0 + - @backstage/plugin-catalog@0.6.9 + - @backstage/plugin-catalog-react@0.4.0 + - @backstage/cli@0.7.6 + - @backstage/core-app-api@0.1.6 + - @backstage/core-plugin-api@0.1.4 + - @backstage/integration-react@0.1.5 + - @backstage/theme@0.2.9 + - @backstage/plugin-api-docs@0.6.4 + - @backstage/plugin-badges@0.2.6 + - @backstage/plugin-catalog-import@0.5.15 + - @backstage/plugin-circleci@0.2.20 + - @backstage/plugin-cloudbuild@0.2.20 + - @backstage/plugin-code-coverage@0.1.8 + - @backstage/plugin-cost-insights@0.11.2 + - @backstage/plugin-explore@0.3.11 + - @backstage/plugin-gcp-projects@0.3.1 + - @backstage/plugin-github-actions@0.4.14 + - @backstage/plugin-graphiql@0.2.13 + - @backstage/plugin-jenkins@0.5.1 + - @backstage/plugin-kafka@0.2.12 + - @backstage/plugin-kubernetes@0.4.9 + - @backstage/plugin-lighthouse@0.2.21 + - @backstage/plugin-newrelic@0.3.1 + - @backstage/plugin-org@0.3.18 + - @backstage/plugin-pagerduty@0.3.9 + - @backstage/plugin-rollbar@0.3.10 + - @backstage/plugin-search@0.4.5 + - @backstage/plugin-sentry@0.3.16 + - @backstage/plugin-shortcuts@0.1.5 + - @backstage/plugin-tech-radar@0.4.3 + - @backstage/plugin-techdocs@0.10.2 + - @backstage/plugin-todo@0.1.6 + - @backstage/plugin-user-settings@0.3.2 + +## 0.2.37 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@0.6.7 + - @backstage/plugin-catalog-react@0.3.0 + - @backstage/plugin-scaffolder@0.10.1 + - @backstage/plugin-techdocs@0.10.0 + - @backstage/plugin-jenkins@0.5.0 + - @backstage/plugin-user-settings@0.3.0 + - @backstage/plugin-search@0.4.3 + - @backstage/cli@0.7.4 + - @backstage/plugin-api-docs@0.6.2 + - @backstage/plugin-badges@0.2.5 + - @backstage/plugin-catalog-import@0.5.13 + - @backstage/plugin-circleci@0.2.19 + - @backstage/plugin-cloudbuild@0.2.19 + - @backstage/plugin-code-coverage@0.1.7 + - @backstage/plugin-explore@0.3.10 + - @backstage/plugin-github-actions@0.4.13 + - @backstage/plugin-kafka@0.2.11 + - @backstage/plugin-kubernetes@0.4.8 + - @backstage/plugin-lighthouse@0.2.20 + - @backstage/plugin-org@0.3.17 + - @backstage/plugin-pagerduty@0.3.8 + - @backstage/plugin-rollbar@0.3.9 + - @backstage/plugin-sentry@0.3.15 + - @backstage/plugin-todo@0.1.5 + +## 0.2.36 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.1.5 + - @backstage/plugin-pagerduty@0.3.7 + - @backstage/plugin-catalog-import@0.5.12 + - @backstage/plugin-explore@0.3.9 + - @backstage/catalog-model@0.9.0 + - @backstage/plugin-scaffolder@0.10.0 + - @backstage/plugin-catalog@0.6.6 + - @backstage/plugin-org@0.3.16 + - @backstage/plugin-techdocs@0.9.9 + - @backstage/plugin-api-docs@0.6.1 + - @backstage/plugin-badges@0.2.4 + - @backstage/plugin-catalog-react@0.2.6 + - @backstage/plugin-circleci@0.2.18 + - @backstage/plugin-cloudbuild@0.2.18 + - @backstage/plugin-code-coverage@0.1.6 + - @backstage/plugin-github-actions@0.4.12 + - @backstage/plugin-jenkins@0.4.7 + - @backstage/plugin-kafka@0.2.10 + - @backstage/plugin-kubernetes@0.4.7 + - @backstage/plugin-lighthouse@0.2.19 + - @backstage/plugin-rollbar@0.3.8 + - @backstage/plugin-search@0.4.2 + - @backstage/plugin-sentry@0.3.14 + - @backstage/plugin-todo@0.1.4 + +## 0.2.34 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@0.6.4 + - @backstage/plugin-search@0.4.1 + - @backstage/plugin-explore@0.3.7 + - @backstage/core-app-api@0.1.3 + - @backstage/core-plugin-api@0.1.3 + - @backstage/plugin-scaffolder@0.9.9 + - @backstage/cli@0.7.2 + - @backstage/plugin-api-docs@0.6.0 + - @backstage/plugin-cost-insights@0.11.0 + - @backstage/plugin-gcp-projects@0.3.0 + - @backstage/plugin-newrelic@0.3.0 + - @backstage/plugin-techdocs@0.9.7 + - @backstage/catalog-model@0.8.4 + - @backstage/integration-react@0.1.4 + - @backstage/plugin-badges@0.2.3 + - @backstage/plugin-catalog-import@0.5.11 + - @backstage/plugin-catalog-react@0.2.4 + - @backstage/plugin-circleci@0.2.17 + - @backstage/plugin-cloudbuild@0.2.17 + - @backstage/plugin-code-coverage@0.1.5 + - @backstage/plugin-github-actions@0.4.10 + - @backstage/plugin-graphiql@0.2.12 + - @backstage/plugin-jenkins@0.4.6 + - @backstage/plugin-kafka@0.2.9 + - @backstage/plugin-kubernetes@0.4.6 + - @backstage/plugin-lighthouse@0.2.18 + - @backstage/plugin-org@0.3.15 + - @backstage/plugin-pagerduty@0.3.6 + - @backstage/plugin-rollbar@0.3.7 + - @backstage/plugin-sentry@0.3.13 + - @backstage/plugin-shortcuts@0.1.4 + - @backstage/plugin-tech-radar@0.4.1 + - @backstage/plugin-todo@0.1.3 + - @backstage/plugin-user-settings@0.2.12 + +## 0.2.33 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@0.2.3 + - @backstage/plugin-catalog@0.6.3 + - @backstage/cli@0.7.1 + - @backstage/plugin-api-docs@0.5.0 + - @backstage/plugin-jenkins@0.4.5 + - @backstage/plugin-techdocs@0.9.6 + - @backstage/plugin-circleci@0.2.16 + - @backstage/plugin-catalog-import@0.5.10 + - @backstage/plugin-sentry@0.3.12 + - @backstage/plugin-user-settings@0.2.11 + - @backstage/catalog-model@0.8.3 + - @backstage/core@0.7.13 + +## 0.2.32 + +### Patch Changes + +- Updated dependencies [9cd3c533c] +- Updated dependencies [db1c8f93b] +- Updated dependencies [9d906c7a1] +- Updated dependencies [9bdd2cca8] +- Updated dependencies [27a9b503a] +- Updated dependencies [f4e3ac5ce] +- Updated dependencies [9b4010965] +- Updated dependencies [7f7443308] +- Updated dependencies [7028ee1ca] +- Updated dependencies [70bc30c5b] +- Updated dependencies [db1c8f93b] +- Updated dependencies [5aff84759] +- Updated dependencies [21e8ebef5] +- Updated dependencies [4fbb00707] +- Updated dependencies [d5ad47bbb] + - @backstage/cli@0.7.0 + - @backstage/plugin-catalog@0.6.2 + - @backstage/plugin-cost-insights@0.10.2 + - @backstage/plugin-github-actions@0.4.9 + - @backstage/catalog-model@0.8.2 + - @backstage/plugin-scaffolder@0.9.8 + - @backstage/integration-react@0.1.3 + - @backstage/plugin-catalog-react@0.2.2 + - @backstage/plugin-catalog-import@0.5.9 + - @backstage/plugin-search@0.4.0 + +## 0.2.31 + +### Patch Changes + +- Updated dependencies [497f4ce18] +- Updated dependencies [ee4eb5b40] +- Updated dependencies [84160313e] +- Updated dependencies [3772de8ba] +- Updated dependencies [7e7c71417] +- Updated dependencies [f430b6c6f] +- Updated dependencies [2a942cc9e] +- Updated dependencies [e7c5e4b30] +- Updated dependencies [ebe802bc4] +- Updated dependencies [1cf1d351f] +- Updated dependencies [90a505a77] +- Updated dependencies [76f99a1a0] +- Updated dependencies [deaba2e13] +- Updated dependencies [1157fa307] +- Updated dependencies [8e919a6f8] +- Updated dependencies [2305ab8fc] +- Updated dependencies [054bcd029] +- Updated dependencies [aad98c544] +- Updated dependencies [f46a9e82d] + - @backstage/plugin-scaffolder@0.9.7 + - @backstage/cli@0.6.14 + - @backstage/plugin-catalog@0.6.1 + - @backstage/theme@0.2.8 + - @backstage/catalog-model@0.8.1 + - @backstage/core@0.7.12 + - @backstage/plugin-tech-radar@0.4.0 + - @backstage/plugin-catalog-react@0.2.1 + - @backstage/plugin-techdocs@0.9.5 + +## 0.2.30 + +### Patch Changes + +- Updated dependencies [41c3ec421] +- Updated dependencies [add62a455] +- Updated dependencies [cc592248b] +- Updated dependencies [17c497b81] +- Updated dependencies [1cd0cacd9] +- Updated dependencies [4ea9df9d3] +- Updated dependencies [7a7da5146] +- Updated dependencies [5baf2ff0f] +- Updated dependencies [bf805b467] +- Updated dependencies [203ce6f6f] +- Updated dependencies [7ab5bfe68] +- Updated dependencies [704875e26] +- Updated dependencies [3a181cff1] + - @backstage/plugin-cost-insights@0.10.1 + - @backstage/catalog-model@0.8.0 + - @backstage/core@0.7.11 + - @backstage/plugin-catalog@0.6.0 + - @backstage/plugin-catalog-react@0.2.0 + - @backstage/cli@0.6.13 + - @backstage/plugin-techdocs@0.9.4 + - @backstage/plugin-jenkins@0.4.4 + - @backstage/plugin-api-docs@0.4.15 + - @backstage/plugin-badges@0.2.2 + - @backstage/plugin-catalog-import@0.5.8 + - @backstage/plugin-circleci@0.2.15 + - @backstage/plugin-cloudbuild@0.2.16 + - @backstage/plugin-code-coverage@0.1.4 + - @backstage/plugin-explore@0.3.6 + - @backstage/plugin-github-actions@0.4.8 + - @backstage/plugin-kafka@0.2.8 + - @backstage/plugin-kubernetes@0.4.5 + - @backstage/plugin-lighthouse@0.2.17 + - @backstage/plugin-org@0.3.14 + - @backstage/plugin-pagerduty@0.3.5 + - @backstage/plugin-rollbar@0.3.6 + - @backstage/plugin-scaffolder@0.9.6 + - @backstage/plugin-search@0.3.7 + - @backstage/plugin-sentry@0.3.11 + - @backstage/plugin-todo@0.1.2 + +## 0.2.29 + +### Patch Changes + +- Updated dependencies [7cbfcae48] +- Updated dependencies [2bfec55a6] +- Updated dependencies [f7f7783a3] +- Updated dependencies [65e6c4541] +- Updated dependencies [68fdbf014] +- Updated dependencies [5da6a561d] +- Updated dependencies [ca6e0ab69] +- Updated dependencies [5914a76d5] +- Updated dependencies [81d7b9c6f] +- Updated dependencies [a62cfe068] +- Updated dependencies [35e091604] +- Updated dependencies [a53f3d603] +- Updated dependencies [b203699e9] + - @backstage/plugin-cost-insights@0.10.0 + - @backstage/cli@0.6.12 + - @backstage/catalog-model@0.7.10 + - @backstage/plugin-scaffolder@0.9.5 + - @backstage/core@0.7.10 + - @backstage/plugin-api-docs@0.4.14 + - @backstage/plugin-cloudbuild@0.2.15 + - @backstage/plugin-github-actions@0.4.7 + - @backstage/plugin-techdocs@0.9.3 + - @backstage/plugin-catalog-import@0.5.7 + - @backstage/plugin-catalog@0.5.8 + +## 0.2.28 + +### Patch Changes + +- Updated dependencies [062bbf90f] +- Updated dependencies [2cd70e164] +- Updated dependencies [0b033d07b] +- Updated dependencies [3be844496] +- Updated dependencies [5542de095] +- Updated dependencies [10c008a3a] +- Updated dependencies [81ef1d57b] +- Updated dependencies [ea21d46f0] +- Updated dependencies [e3fc89df6] +- Updated dependencies [f59a945b7] +- Updated dependencies [889d89b6e] +- Updated dependencies [16be1d093] +- Updated dependencies [3f988cb63] +- Updated dependencies [675a569a9] + - @backstage/core@0.7.9 + - @backstage/integration-react@0.1.2 + - @backstage/plugin-api-docs@0.4.13 + - @backstage/plugin-badges@0.2.1 + - @backstage/plugin-catalog@0.5.7 + - @backstage/plugin-catalog-import@0.5.6 + - @backstage/plugin-catalog-react@0.1.6 + - @backstage/plugin-circleci@0.2.14 + - @backstage/plugin-cloudbuild@0.2.14 + - @backstage/plugin-code-coverage@0.1.3 + - @backstage/plugin-cost-insights@0.9.1 + - @backstage/plugin-explore@0.3.5 + - @backstage/plugin-gcp-projects@0.2.6 + - @backstage/plugin-github-actions@0.4.6 + - @backstage/plugin-graphiql@0.2.11 + - @backstage/plugin-jenkins@0.4.3 + - @backstage/plugin-kafka@0.2.7 + - @backstage/plugin-kubernetes@0.4.4 + - @backstage/plugin-lighthouse@0.2.16 + - @backstage/plugin-newrelic@0.2.7 + - @backstage/plugin-org@0.3.13 + - @backstage/plugin-pagerduty@0.3.4 + - @backstage/plugin-rollbar@0.3.5 + - @backstage/plugin-scaffolder@0.9.4 + - @backstage/plugin-search@0.3.6 + - @backstage/plugin-sentry@0.3.10 + - @backstage/plugin-shortcuts@0.1.2 + - @backstage/plugin-tech-radar@0.3.11 + - @backstage/plugin-techdocs@0.9.2 + - @backstage/plugin-todo@0.1.1 + - @backstage/plugin-user-settings@0.2.10 + - @backstage/cli@0.6.11 + - @backstage/catalog-model@0.7.9 + +## 0.2.27 + +### Patch Changes + +- Updated dependencies [6f1b82b14] +- Updated dependencies [38ca05168] +- Updated dependencies [f65adcde7] +- Updated dependencies [81c54d1f2] +- Updated dependencies [80888659b] +- Updated dependencies [7b8272fb7] +- Updated dependencies [8aedbb4af] +- Updated dependencies [fc79a6dd3] +- Updated dependencies [f53fba29f] +- Updated dependencies [b2e2ec753] +- Updated dependencies [9314a8592] +- Updated dependencies [2e05277e0] +- Updated dependencies [4075c6367] +- Updated dependencies [d8b81fd28] + - @backstage/plugin-cost-insights@0.9.0 + - @backstage/plugin-catalog-import@0.5.5 + - @backstage/plugin-github-actions@0.4.5 + - @backstage/cli@0.6.10 + - @backstage/core@0.7.8 + - @backstage/plugin-catalog-react@0.1.5 + - @backstage/theme@0.2.7 + - @backstage/plugin-kubernetes@0.4.3 + - @backstage/plugin-tech-radar@0.3.10 + - @backstage/plugin-scaffolder@0.9.3 + - @backstage/plugin-techdocs@0.9.1 + - @backstage/catalog-model@0.7.8 + +## 0.2.26 + +### Patch Changes + +- Updated dependencies [1ce80ff02] +- Updated dependencies [b98de52ae] +- Updated dependencies [4c42ecca2] +- Updated dependencies [c614ede9a] +- Updated dependencies [9afcac5af] +- Updated dependencies [07a7806c3] +- Updated dependencies [f6efa71ee] +- Updated dependencies [19a4dd710] +- Updated dependencies [dcd54c7cd] +- Updated dependencies [da546ce00] +- Updated dependencies [e0c9ed759] +- Updated dependencies [6fbd7beca] +- Updated dependencies [15cbe6815] +- Updated dependencies [39bdaa004] +- Updated dependencies [cb8c848a3] +- Updated dependencies [21fddf452] +- Updated dependencies [17915e29b] +- Updated dependencies [6eaecbd81] +- Updated dependencies [23769512a] +- Updated dependencies [1a142ae8a] + - @backstage/plugin-api-docs@0.4.12 + - @backstage/plugin-cost-insights@0.8.5 + - @backstage/plugin-github-actions@0.4.4 + - @backstage/plugin-catalog-import@0.5.4 + - @backstage/plugin-circleci@0.2.13 + - @backstage/plugin-explore@0.3.4 + - @backstage/plugin-graphiql@0.2.10 + - @backstage/plugin-jenkins@0.4.2 + - @backstage/plugin-lighthouse@0.2.15 + - @backstage/plugin-pagerduty@0.3.3 + - @backstage/plugin-rollbar@0.3.4 + - @backstage/plugin-sentry@0.3.9 + - @backstage/core@0.7.7 + - @backstage/plugin-scaffolder@0.9.2 + - @backstage/plugin-catalog@0.5.6 + - @backstage/plugin-search@0.3.5 + - @backstage/plugin-techdocs@0.9.0 + +## 0.2.25 + +### Patch Changes + +- Updated dependencies [94da20976] +- Updated dependencies [d8cc7e67a] +- Updated dependencies [4e5c94249] +- Updated dependencies [99fbef232] +- Updated dependencies [cb0206b2b] +- Updated dependencies [1373f4f12] +- Updated dependencies [29a7e4be8] +- Updated dependencies [ab07d77f6] +- Updated dependencies [96728a2af] +- Updated dependencies [931b21a12] +- Updated dependencies [937ed39ce] +- Updated dependencies [87c4f59de] +- Updated dependencies [55b2fc0c0] +- Updated dependencies [9a9e7a42f] +- Updated dependencies [50ce875a0] +- Updated dependencies [ac6025f63] +- Updated dependencies [e292e393f] +- Updated dependencies [479b29124] + - @backstage/core@0.7.6 + - @backstage/cli@0.6.9 + - @backstage/plugin-scaffolder@0.9.1 + - @backstage/plugin-catalog-import@0.5.3 + - @backstage/plugin-catalog@0.5.5 + - @backstage/theme@0.2.6 + - @backstage/plugin-code-coverage@0.1.2 + - @backstage/plugin-techdocs@0.8.0 + +## 0.2.24 + +### Patch Changes + +- Updated dependencies [a360f9478] +- Updated dependencies [bb5055aee] +- Updated dependencies [d0d1c2f7b] +- Updated dependencies [5d0740563] +- Updated dependencies [12390778e] +- Updated dependencies [fef852ecd] +- Updated dependencies [18f7345a6] +- Updated dependencies [5cafcf452] +- Updated dependencies [86a95ba67] +- Updated dependencies [e27cb6c45] +- Updated dependencies [184b02bef] +- Updated dependencies [60ce64aa2] + - @backstage/plugin-scaffolder@0.9.0 + - @backstage/catalog-model@0.7.7 + - @backstage/core@0.7.5 + - @backstage/plugin-catalog@0.5.4 + - @backstage/plugin-api-docs@0.4.11 + - @backstage/plugin-techdocs@0.7.2 + - @backstage/plugin-tech-radar@0.3.9 + - @backstage/cli@0.6.8 + +## 0.2.23 + +### Patch Changes + +- Updated dependencies [d0b4ebf22] +- Updated dependencies [1279a3325] +- Updated dependencies [4a4681b1b] +- Updated dependencies [97b60de98] +- Updated dependencies [3f96a9d5a] +- Updated dependencies [b051e770c] +- Updated dependencies [f9c75f7a9] +- Updated dependencies [98dd5da71] +- Updated dependencies [97d53f686] +- Updated dependencies [64d2ce700] + - @backstage/plugin-badges@0.2.0 + - @backstage/core@0.7.4 + - @backstage/catalog-model@0.7.6 + - @backstage/plugin-scaffolder@0.8.2 + - @backstage/plugin-catalog-import@0.5.2 + - @backstage/plugin-catalog@0.5.3 + - @backstage/plugin-org@0.3.12 + - @backstage/plugin-github-deployments@0.1.2 + - @backstage/cli@0.6.7 + +## 0.2.21 + +### Patch Changes + +- Updated dependencies [a2a3c7803] +- Updated dependencies [687f066e1] +- Updated dependencies [d10ea17c9] +- Updated dependencies [01ccef4c7] +- Updated dependencies [4d248725e] +- Updated dependencies [4d248725e] +- Updated dependencies [aaeb7ecf3] +- Updated dependencies [ea9d977e7] +- Updated dependencies [fcc3ada24] +- Updated dependencies [687f066e1] +- Updated dependencies [2aab54319] +- Updated dependencies [4618774ff] +- Updated dependencies [3139f83af] +- Updated dependencies [598f5bcfb] +- Updated dependencies [4d248725e] +- Updated dependencies [df59930b3] + - @backstage/plugin-kubernetes@0.4.2 + - @backstage/plugin-badges@0.1.2 + - @backstage/plugin-cost-insights@0.8.4 + - @backstage/plugin-catalog-react@0.1.3 + - @backstage/plugin-github-actions@0.4.2 + - @backstage/plugin-jenkins@0.4.1 + - @backstage/plugin-catalog@0.5.1 + - @backstage/plugin-techdocs@0.7.0 + - @backstage/core@0.7.3 + - @backstage/theme@0.2.5 + - @backstage/cli@0.6.6 + +## 0.2.20 + +### Patch Changes + +- Updated dependencies [633a31fec] +- Updated dependencies [34e6bb409] +- Updated dependencies [b56815b40] +- Updated dependencies [09eb54e01] +- Updated dependencies [147b4c5b1] +- Updated dependencies [83bfc98a3] +- Updated dependencies [7d8c4c97c] +- Updated dependencies [e7baa0d2e] +- Updated dependencies [1df417bd3] +- Updated dependencies [84972540b] +- Updated dependencies [3385b374b] +- Updated dependencies [a0dacc184] +- Updated dependencies [8686eb38c] +- Updated dependencies [9ca0e4009] +- Updated dependencies [34ff49b0f] +- Updated dependencies [8686eb38c] +- Updated dependencies [c8b54c370] +- Updated dependencies [1f98a6ff8] +- Updated dependencies [e8b2ed9cc] + - @backstage/plugin-catalog@0.5.0 + - @backstage/plugin-tech-radar@0.3.8 + - @backstage/plugin-graphiql@0.2.9 + - @backstage/plugin-user-settings@0.2.8 + - @backstage/plugin-techdocs@0.6.2 + - @backstage/plugin-catalog-import@0.5.0 + - @backstage/plugin-kubernetes@0.4.1 + - @backstage/cli@0.6.5 + - @backstage/plugin-scaffolder@0.8.0 + - @backstage/core@0.7.2 + - @backstage/plugin-api-docs@0.4.9 + - @backstage/plugin-catalog-react@0.1.2 + - @backstage/plugin-circleci@0.2.12 + - @backstage/plugin-cloudbuild@0.2.13 + - @backstage/plugin-explore@0.3.2 + - @backstage/plugin-github-actions@0.4.1 + - @backstage/plugin-jenkins@0.4.0 + - @backstage/plugin-lighthouse@0.2.14 + - @backstage/plugin-org@0.3.10 + - @backstage/plugin-search@0.3.4 + +## 0.2.19 + +### Patch Changes + +- Updated dependencies [13fb84244] +- Updated dependencies [4f3d0dce0] +- Updated dependencies [8f72318fe] +- Updated dependencies [0b42fff22] +- Updated dependencies [0b42fff22] +- Updated dependencies [ff4d666ab] +- Updated dependencies [aa095e469] +- Updated dependencies [f98f212e4] +- Updated dependencies [9f7dc10fb] +- Updated dependencies [eabe89d38] +- Updated dependencies [9581ff0b4] +- Updated dependencies [93c62c755] +- Updated dependencies [2089de76b] +- Updated dependencies [c9b5c1eca] +- Updated dependencies [dc1fc92c8] +- Updated dependencies [2089de76b] +- Updated dependencies [868e4cdf2] +- Updated dependencies [ca4a904f6] +- Updated dependencies [763926bc1] +- Updated dependencies [5ab5864f6] +- Updated dependencies [4202807bb] +- Updated dependencies [e2c1b3fb6] + - @backstage/plugin-github-actions@0.4.0 + - @backstage/plugin-catalog@0.4.2 + - @backstage/plugin-kafka@0.2.6 + - @backstage/catalog-model@0.7.4 + - @backstage/core@0.7.1 + - @backstage/plugin-techdocs@0.6.1 + - @backstage/plugin-scaffolder@0.7.1 + - @backstage/plugin-kubernetes@0.4.0 + - @backstage/theme@0.2.4 + - @backstage/plugin-explore@0.3.1 + - @backstage/cli@0.6.4 + +## 0.2.18 + +### Patch Changes + +- Updated dependencies [ba21797ca] +- Updated dependencies [b2a5320a4] +- Updated dependencies [12d8f27a6] +- Updated dependencies [507513fed] +- Updated dependencies [32a003973] +- Updated dependencies [40c0fdbaa] +- Updated dependencies [12d8f27a6] +- Updated dependencies [cfc83cac1] +- Updated dependencies [bc327dc42] +- Updated dependencies [2386de1d3] +- Updated dependencies [42c8ebb79] +- Updated dependencies [10362e9eb] +- Updated dependencies [e37d2de99] +- Updated dependencies [813c6a4f2] +- Updated dependencies [11c6208fe] +- Updated dependencies [8106c9528] +- Updated dependencies [05183f202] +- Updated dependencies [40c0fdbaa] +- Updated dependencies [f71589800] +- Updated dependencies [2a271d89e] +- Updated dependencies [bece09057] +- Updated dependencies [d4f0a1406] +- Updated dependencies [169f48deb] +- Updated dependencies [8a1566719] +- Updated dependencies [9d455f69a] +- Updated dependencies [4c049a1a1] +- Updated dependencies [d21058c34] +- Updated dependencies [b33e553b2] +- Updated dependencies [04667f571] +- Updated dependencies [b93538acc] +- Updated dependencies [0452ba238] +- Updated dependencies [8871e7523] +- Updated dependencies [02816ecd7] +- Updated dependencies [dbea11072] + - @backstage/plugin-kubernetes@0.3.12 + - @backstage/plugin-circleci@0.2.11 + - @backstage/plugin-cloudbuild@0.2.12 + - @backstage/plugin-github-actions@0.3.5 + - @backstage/plugin-scaffolder@0.7.0 + - @backstage/cli@0.6.3 + - @backstage/plugin-api-docs@0.4.8 + - @backstage/plugin-catalog@0.4.1 + - @backstage/catalog-model@0.7.3 + - @backstage/plugin-explore@0.3.0 + - @backstage/plugin-techdocs@0.6.0 + - @backstage/plugin-catalog-import@0.4.3 + - @backstage/core@0.7.0 + - @backstage/plugin-catalog-react@0.1.1 + - @backstage/plugin-pagerduty@0.3.2 + - @backstage/plugin-jenkins@0.3.12 + - @backstage/plugin-lighthouse@0.2.13 + - @backstage/plugin-cost-insights@0.8.3 + - @backstage/plugin-gcp-projects@0.2.5 + - @backstage/plugin-gitops-profiles@0.2.6 + - @backstage/plugin-graphiql@0.2.8 + - @backstage/plugin-kafka@0.2.5 + - @backstage/plugin-newrelic@0.2.6 + - @backstage/plugin-org@0.3.9 + - @backstage/plugin-register-component@0.2.12 + - @backstage/plugin-rollbar@0.3.3 + - @backstage/plugin-search@0.3.3 + - @backstage/plugin-sentry@0.3.8 + - @backstage/plugin-tech-radar@0.3.7 + - @backstage/plugin-user-settings@0.2.7 + +## 0.2.17 + +### Patch Changes + +- Updated dependencies [3a58084b6] +- Updated dependencies [a5f42cf66] +- Updated dependencies [38205492a] +- Updated dependencies [e488f0502] +- Updated dependencies [e799e74d4] +- Updated dependencies [e3bc5aad7] +- Updated dependencies [a5f42cf66] +- Updated dependencies [a8953a9c9] +- Updated dependencies [f37992797] +- Updated dependencies [347137ccf] +- Updated dependencies [d0760ecdf] +- Updated dependencies [1407b34c6] +- Updated dependencies [88f1f1b60] +- Updated dependencies [d6593abe6] +- Updated dependencies [bad21a085] +- Updated dependencies [e8e35fb5f] +- Updated dependencies [9615e68fb] +- Updated dependencies [e780e119c] +- Updated dependencies [437bac549] +- Updated dependencies [9f2b3a26e] +- Updated dependencies [49f9b7346] +- Updated dependencies [5c2e2863f] +- Updated dependencies [968b588f7] +- Updated dependencies [3a58084b6] +- Updated dependencies [2499f6cde] +- Updated dependencies [5469a9761] +- Updated dependencies [60d1bc3e7] +- Updated dependencies [2c1f2a7c2] +- Updated dependencies [6266ddd11] + - @backstage/core@0.6.3 + - @backstage/plugin-scaffolder@0.6.0 + - @backstage/plugin-cost-insights@0.8.2 + - @backstage/plugin-org@0.3.8 + - @backstage/plugin-catalog@0.4.0 + - @backstage/plugin-catalog-import@0.4.2 + - @backstage/plugin-techdocs@0.5.8 + - @backstage/plugin-explore@0.2.7 + - @backstage/plugin-catalog-react@0.1.0 + - @backstage/plugin-api-docs@0.4.7 + - @backstage/catalog-model@0.7.2 + - @backstage/cli@0.6.2 + - @backstage/plugin-tech-radar@0.3.6 + - @backstage/plugin-circleci@0.2.10 + - @backstage/plugin-cloudbuild@0.2.11 + - @backstage/plugin-github-actions@0.3.4 + - @backstage/plugin-jenkins@0.3.11 + - @backstage/plugin-kafka@0.2.4 + - @backstage/plugin-kubernetes@0.3.11 + - @backstage/plugin-lighthouse@0.2.12 + - @backstage/plugin-pagerduty@0.3.1 + - @backstage/plugin-register-component@0.2.11 + - @backstage/plugin-rollbar@0.3.2 + - @backstage/plugin-search@0.3.2 + - @backstage/plugin-sentry@0.3.7 + +## 0.2.16 + +### Patch Changes + +- Updated dependencies [6c4a76c59] +- Updated dependencies [32a950409] +- Updated dependencies [f10950bd2] +- Updated dependencies [914c89b13] +- Updated dependencies [fd3f2a8c0] +- Updated dependencies [257a753ff] +- Updated dependencies [d872f662d] +- Updated dependencies [9337f509d] +- Updated dependencies [d34d26125] +- Updated dependencies [0af242b6d] +- Updated dependencies [f4c2bcf54] +- Updated dependencies [e8692df4a] +- Updated dependencies [53b69236d] +- Updated dependencies [549a859ac] +- Updated dependencies [10a0124e0] +- Updated dependencies [07e226872] +- Updated dependencies [f62e7abe5] +- Updated dependencies [96f378d10] +- Updated dependencies [532bc0ec0] +- Updated dependencies [688b73110] + - @backstage/plugin-scaffolder@0.5.1 + - @backstage/plugin-catalog@0.3.2 + - @backstage/core@0.6.2 + - @backstage/cli@0.6.1 + - @backstage/plugin-user-settings@0.2.6 + - @backstage/plugin-catalog-react@0.0.4 + - @backstage/plugin-api-docs@0.4.6 + - @backstage/plugin-catalog-import@0.4.1 + - @backstage/plugin-github-actions@0.3.3 + - @backstage/plugin-jenkins@0.3.10 + - @backstage/plugin-lighthouse@0.2.11 + - @backstage/plugin-org@0.3.7 + - @backstage/plugin-sentry@0.3.6 + - @backstage/plugin-pagerduty@0.3.0 + - @backstage/plugin-circleci@0.2.9 + - @backstage/plugin-cloudbuild@0.2.10 + - @backstage/plugin-explore@0.2.6 + - @backstage/plugin-kafka@0.2.3 + - @backstage/plugin-kubernetes@0.3.10 + - @backstage/plugin-register-component@0.2.10 + - @backstage/plugin-rollbar@0.3.1 + - @backstage/plugin-search@0.3.1 + - @backstage/plugin-techdocs@0.5.7 + +## 0.2.15 + +### Patch Changes + +- 07bafa248: Add configurable `scope` for oauth2 auth provider. + + Some OAuth2 providers require certain scopes to facilitate a user sign-in using the Authorization Code flow. + This change adds the optional `scope` key to auth.providers.oauth2. An example is: + + ```yaml + auth: + providers: + oauth2: + development: + clientId: + $env: DEV_OAUTH2_CLIENT_ID + clientSecret: + $env: DEV_OAUTH2_CLIENT_SECRET + authorizationUrl: + $env: DEV_OAUTH2_AUTH_URL + tokenUrl: + $env: DEV_OAUTH2_TOKEN_URL + scope: saml-login-selector openid profile email + ``` + + This tells the OAuth 2.0 AS to perform a SAML login and return OIDC information include the `profile` + and `email` claims as part of the ID Token. + +- Updated dependencies [753bb4c40] +- Updated dependencies [6ed2b47d6] +- Updated dependencies [b33fa4cf4] +- Updated dependencies [d36660721] +- Updated dependencies [6b26c9f41] +- Updated dependencies [b3f0c3811] +- Updated dependencies [302795d10] +- Updated dependencies [9ec66c345] +- Updated dependencies [53d3e2d62] +- Updated dependencies [ca559171b] +- Updated dependencies [53348f0af] +- Updated dependencies [f5e564cd6] +- Updated dependencies [68dd79d83] +- Updated dependencies [29a138636] +- Updated dependencies [14aef4b94] +- Updated dependencies [41af18227] +- Updated dependencies [1df75733e] +- Updated dependencies [02d6803e8] +- Updated dependencies [b288a291e] +- Updated dependencies [025c0c7bf] +- Updated dependencies [e5da858d7] +- Updated dependencies [9230d07e7] +- Updated dependencies [f5f45744e] +- Updated dependencies [0fe8ff5be] +- Updated dependencies [c5ab91ce3] +- Updated dependencies [64b9efac2] +- Updated dependencies [19d354c78] +- Updated dependencies [7716d1d70] +- Updated dependencies [8f3443427] +- Updated dependencies [b51ee6ece] +- Updated dependencies [accdfeb30] +- Updated dependencies [804502a5c] + - @backstage/plugin-catalog-import@0.4.0 + - @backstage/plugin-catalog@0.3.1 + - @backstage/plugin-kubernetes@0.3.9 + - @backstage/plugin-rollbar@0.3.0 + - @backstage/plugin-scaffolder@0.5.0 + - @backstage/plugin-cost-insights@0.8.1 + - @backstage/plugin-circleci@0.2.8 + - @backstage/plugin-search@0.3.0 + - @backstage/plugin-cloudbuild@0.2.9 + - @backstage/plugin-register-component@0.2.9 + - @backstage/plugin-sentry@0.3.5 + - @backstage/plugin-jenkins@0.3.9 + - @backstage/plugin-api-docs@0.4.5 + - @backstage/plugin-lighthouse@0.2.10 + - @backstage/plugin-techdocs@0.5.6 + - @backstage/plugin-pagerduty@0.2.8 + - @backstage/plugin-org@0.3.6 + - @backstage/plugin-github-actions@0.3.2 + - @backstage/plugin-explore@0.2.5 + - @backstage/plugin-newrelic@0.2.5 + - @backstage/plugin-catalog-react@0.0.3 + - @backstage/plugin-kafka@0.2.2 + - @backstage/core@0.6.1 + - @backstage/plugin-gitops-profiles@0.2.5 + - @backstage/plugin-tech-radar@0.3.5 + +## 0.2.14 + +### Patch Changes + +- 9d6ef14bc: Migrated to new composability API, exporting the plugin instance as `rollbarPlugin`, the entity page content as `EntityRollbarContent`, and entity conditional as `isRollbarAvailable`. Updated the `EntityPage` for the `example-app` to include a composite `ErrorsSwitcher` component that works with both `Sentry` & `Rollbar`. Also removed the unused and undocumented `RollbarHome` related components. +- Updated dependencies [ceef4dd89] +- Updated dependencies [720149854] +- Updated dependencies [19172f5a9] +- Updated dependencies [4c6a6dddd] +- Updated dependencies [398e1f83e] +- Updated dependencies [87b189d00] +- Updated dependencies [12ece98cd] +- Updated dependencies [d82246867] +- Updated dependencies [7fc89bae2] +- Updated dependencies [c810082ae] +- Updated dependencies [b712841d6] +- Updated dependencies [a5628df40] +- Updated dependencies [5fa3bdb55] +- Updated dependencies [bc5082a00] +- Updated dependencies [6e612ce25] +- Updated dependencies [e44925723] +- Updated dependencies [b37501a3d] +- Updated dependencies [9d6ef14bc] +- Updated dependencies [025e122c3] +- Updated dependencies [e9aab60c7] +- Updated dependencies [21e624ba9] +- Updated dependencies [0269f4fd9] +- Updated dependencies [19fe61c27] +- Updated dependencies [da9f53c60] +- Updated dependencies [a08c4b0b0] +- Updated dependencies [bc5082a00] +- Updated dependencies [bc5082a00] +- Updated dependencies [b37501a3d] +- Updated dependencies [90c8f20b9] +- Updated dependencies [32c95605f] +- Updated dependencies [7881f2117] +- Updated dependencies [8dfdec613] +- Updated dependencies [54c7d02f7] +- Updated dependencies [de98c32ed] +- Updated dependencies [806929fe2] +- Updated dependencies [019fe39a0] +- Updated dependencies [019fe39a0] +- Updated dependencies [11cb5ef94] + - @backstage/plugin-catalog-import@0.3.7 + - @backstage/plugin-scaffolder@0.4.2 + - @backstage/plugin-cost-insights@0.8.0 + - @backstage/cli@0.6.0 + - @backstage/plugin-graphiql@0.2.7 + - @backstage/core@0.6.0 + - @backstage/plugin-api-docs@0.4.4 + - @backstage/plugin-catalog@0.3.0 + - @backstage/plugin-catalog-react@0.0.2 + - @backstage/plugin-org@0.3.5 + - @backstage/theme@0.2.3 + - @backstage/plugin-lighthouse@0.2.9 + - @backstage/plugin-techdocs@0.5.5 + - @backstage/plugin-user-settings@0.2.5 + - @backstage/catalog-model@0.7.1 + - @backstage/plugin-rollbar@0.2.9 + - @backstage/plugin-gcp-projects@0.2.4 + - @backstage/plugin-tech-radar@0.3.4 + - @backstage/plugin-welcome@0.2.5 + - @backstage/plugin-explore@0.2.4 + - @backstage/plugin-circleci@0.2.7 + - @backstage/plugin-cloudbuild@0.2.8 + - @backstage/plugin-github-actions@0.3.1 + - @backstage/plugin-jenkins@0.3.8 + - @backstage/plugin-kafka@0.2.1 + - @backstage/plugin-register-component@0.2.8 + - @backstage/plugin-search@0.2.7 + - @backstage/plugin-sentry@0.3.4 + - @backstage/plugin-gitops-profiles@0.2.4 + - @backstage/plugin-kubernetes@0.3.8 + - @backstage/plugin-newrelic@0.2.4 + - @backstage/plugin-pagerduty@0.2.7 + +## 0.2.13 + +### Patch Changes + +- Updated dependencies [681111228] +- Updated dependencies [12a56cdfe] +- Updated dependencies [8b7ef9f8b] +- Updated dependencies [fac91bcc5] +- Updated dependencies [9dd057662] +- Updated dependencies [234e7d985] +- Updated dependencies [ef7957be4] +- Updated dependencies [0b1182346] +- Updated dependencies [a6e3b9596] + - @backstage/plugin-kubernetes@0.3.7 + - @backstage/cli@0.5.0 + - @backstage/plugin-cost-insights@0.6.0 + - @backstage/plugin-catalog@0.2.14 + - @backstage/plugin-catalog-import@0.3.6 + - @backstage/plugin-scaffolder@0.4.1 + - @backstage/plugin-kafka@0.2.0 + +## 0.2.12 + +### Patch Changes + +- Updated dependencies [def2307f3] +- Updated dependencies [46bba09ea] +- Updated dependencies [efd6ef753] +- Updated dependencies [593632f07] +- Updated dependencies [8c2437c15] +- Updated dependencies [2b514d532] +- Updated dependencies [33846acfc] +- Updated dependencies [b604a9d41] +- Updated dependencies [d014185db] +- Updated dependencies [a187b8ad0] +- Updated dependencies [8855f61f6] +- Updated dependencies [ed6baab66] +- Updated dependencies [f04db53d7] +- Updated dependencies [a5e27d5c1] +- Updated dependencies [debf359b5] +- Updated dependencies [a93f42213] + - @backstage/catalog-model@0.7.0 + - @backstage/plugin-github-actions@0.3.0 + - @backstage/core@0.5.0 + - @backstage/plugin-catalog@0.2.12 + - @backstage/plugin-cost-insights@0.5.7 + - @backstage/plugin-catalog-import@0.3.5 + - @backstage/cli@0.4.7 + - @backstage/plugin-kubernetes@0.3.6 + - @backstage/plugin-api-docs@0.4.3 + - @backstage/plugin-scaffolder@0.4.0 + - @backstage/plugin-techdocs@0.5.4 + - @backstage/plugin-lighthouse@0.2.8 + - @backstage/plugin-circleci@0.2.6 + - @backstage/plugin-cloudbuild@0.2.7 + - @backstage/plugin-jenkins@0.3.6 + - @backstage/plugin-kafka@0.1.1 + - @backstage/plugin-org@0.3.4 + - @backstage/plugin-pagerduty@0.2.6 + - @backstage/plugin-register-component@0.2.7 + - @backstage/plugin-rollbar@0.2.8 + - @backstage/plugin-search@0.2.6 + - @backstage/plugin-sentry@0.3.3 + - @backstage/plugin-explore@0.2.3 + - @backstage/plugin-gcp-projects@0.2.3 + - @backstage/plugin-gitops-profiles@0.2.3 + - @backstage/plugin-graphiql@0.2.6 + - @backstage/plugin-newrelic@0.2.3 + - @backstage/plugin-tech-radar@0.3.3 + - @backstage/plugin-user-settings@0.2.4 + - @backstage/plugin-welcome@0.2.4 + +## 0.2.9 + +### Patch Changes + +- Updated dependencies [ab0892358] +- Updated dependencies [37a7d26c4] +- Updated dependencies [8e083f41f] +- Updated dependencies [88da267cc] +- Updated dependencies [9c09a364f] +- Updated dependencies [01707438b] +- Updated dependencies [edb7d0775] +- Updated dependencies [818d45e94] +- Updated dependencies [0588be01f] +- Updated dependencies [b8abdda57] +- Updated dependencies [b7a124883] +- Updated dependencies [bc909178d] +- Updated dependencies [947d3c269] + - @backstage/plugin-cost-insights@0.5.5 + - @backstage/plugin-tech-radar@0.3.2 + - @backstage/cli@0.4.5 + - @backstage/plugin-scaffolder@0.3.6 + - @backstage/plugin-sentry@0.3.2 + - @backstage/plugin-catalog@0.2.10 + - @backstage/plugin-search@0.2.5 + - @backstage/plugin-catalog-import@0.3.3 + - @backstage/plugin-pagerduty@0.2.5 + +## 0.2.8 + +### Patch Changes + +- Updated dependencies [19554f6d6] +- Updated dependencies [1dc445e89] +- Updated dependencies [342270e4d] +- Updated dependencies [7d72f9b09] + - @backstage/cli@0.4.3 + - @backstage/plugin-github-actions@0.2.6 + - @backstage/plugin-scaffolder@0.3.5 + - @backstage/core@0.4.2 + - @backstage/test-utils@0.1.6 + - @backstage/plugin-graphiql@0.2.3 + - @backstage/plugin-catalog@0.2.8 + - @backstage/plugin-pagerduty@0.2.4 + - @backstage/plugin-techdocs@0.5.1 + +## 0.2.7 + +### Patch Changes + +- Updated dependencies [c0fac6163] +- Updated dependencies [48c305e69] +- Updated dependencies [c911061b7] +- Updated dependencies [ab805860a] +- Updated dependencies [dae4f3983] +- Updated dependencies [8ef71ed32] +- Updated dependencies [0e6298f7e] +- Updated dependencies [f3e75508d] +- Updated dependencies [3b50f833d] +- Updated dependencies [c36a01b4c] +- Updated dependencies [c5297baeb] +- Updated dependencies [ac3560b42] +- Updated dependencies [962d1ad66] + - @backstage/plugin-org@0.3.2 + - @backstage/plugin-cost-insights@0.5.2 + - @backstage/catalog-model@0.6.0 + - @backstage/plugin-techdocs@0.5.0 + - @backstage/core@0.4.1 + - @backstage/plugin-catalog-import@0.3.2 + - @backstage/plugin-pagerduty@0.2.3 + - @backstage/cli@0.4.2 + - @backstage/plugin-sentry@0.3.1 + - @backstage/plugin-api-docs@0.4.1 + - @backstage/plugin-catalog@0.2.7 + - @backstage/plugin-circleci@0.2.5 + - @backstage/plugin-cloudbuild@0.2.5 + - @backstage/plugin-github-actions@0.2.5 + - @backstage/plugin-jenkins@0.3.4 + - @backstage/plugin-kubernetes@0.3.3 + - @backstage/plugin-lighthouse@0.2.6 + - @backstage/plugin-register-component@0.2.5 + - @backstage/plugin-rollbar@0.2.7 + - @backstage/plugin-scaffolder@0.3.4 + - @backstage/plugin-search@0.2.4 + +## 0.2.6 + +### Patch Changes + +- Updated dependencies [b2a07d2dc] +- Updated dependencies [075d3dc5a] +- Updated dependencies [e3071a0d4] +- Updated dependencies [d6e8099ed] +- Updated dependencies [88ef11b45] +- Updated dependencies [06dbe707b] +- Updated dependencies [2527628e1] +- Updated dependencies [011708102] +- Updated dependencies [04efbbdd2] +- Updated dependencies [90458fed6] +- Updated dependencies [6011b7d3e] +- Updated dependencies [79418ddb6] +- Updated dependencies [d2938af4c] +- Updated dependencies [61897fb2c] +- Updated dependencies [e1f4e24ef] +- Updated dependencies [6a0d7a9fb] +- Updated dependencies [0f8877168] +- Updated dependencies [1c69d4716] +- Updated dependencies [246799c7f] +- Updated dependencies [83b6e0c1f] +- Updated dependencies [87a33d2fe] +- Updated dependencies [1665ae8bb] +- Updated dependencies [04f26f88d] +- Updated dependencies [ff243ce96] +- Updated dependencies [2b71db211] + - @backstage/plugin-jenkins@0.3.3 + - @backstage/plugin-sentry@0.3.0 + - @backstage/plugin-cost-insights@0.5.0 + - @backstage/cli@0.4.1 + - @backstage/core@0.4.0 + - @backstage/plugin-circleci@0.2.4 + - @backstage/plugin-catalog@0.2.6 + - @backstage/plugin-pagerduty@0.2.2 + - @backstage/plugin-catalog-import@0.3.1 + - @backstage/test-utils@0.1.5 + - @backstage/plugin-search@0.2.3 + - @backstage/plugin-api-docs@0.4.0 + - @backstage/catalog-model@0.5.0 + - @backstage/plugin-techdocs@0.4.0 + - @backstage/theme@0.2.2 + - @backstage/plugin-org@0.3.1 + - @backstage/plugin-cloudbuild@0.2.4 + - @backstage/plugin-explore@0.2.2 + - @backstage/plugin-gcp-projects@0.2.2 + - @backstage/plugin-github-actions@0.2.4 + - @backstage/plugin-gitops-profiles@0.2.2 + - @backstage/plugin-graphiql@0.2.2 + - @backstage/plugin-kubernetes@0.3.2 + - @backstage/plugin-lighthouse@0.2.5 + - @backstage/plugin-newrelic@0.2.2 + - @backstage/plugin-register-component@0.2.4 + - @backstage/plugin-rollbar@0.2.6 + - @backstage/plugin-scaffolder@0.3.3 + - @backstage/plugin-tech-radar@0.3.1 + - @backstage/plugin-user-settings@0.2.3 + - @backstage/plugin-welcome@0.2.3 + +## 0.2.5 + +### Patch Changes + +- Updated dependencies [7eb8bfe4a] +- Updated dependencies [fe7257ff0] +- Updated dependencies [a2cfa311a] +- Updated dependencies [69f38457f] +- Updated dependencies [bec334b33] +- Updated dependencies [303c5ea17] +- Updated dependencies [b4488ddb0] +- Updated dependencies [4a655c89d] +- Updated dependencies [08835a61d] +- Updated dependencies [a9fd599f7] +- Updated dependencies [8a16e8af8] +- Updated dependencies [bcc211a08] +- Updated dependencies [00670a96e] +- Updated dependencies [da2ad65cb] +- Updated dependencies [ebf37bbae] + - @backstage/plugin-api-docs@0.3.1 + - @backstage/plugin-cost-insights@0.4.2 + - @backstage/plugin-sentry@0.2.4 + - @backstage/plugin-welcome@0.2.2 + - @backstage/cli@0.4.0 + - @backstage/catalog-model@0.4.0 + - @backstage/plugin-catalog-import@0.3.0 + - @backstage/plugin-scaffolder@0.3.2 + - @backstage/plugin-kubernetes@0.3.1 + - @backstage/plugin-techdocs@0.3.1 + - @backstage/plugin-catalog@0.2.5 + - @backstage/test-utils@0.1.4 + - @backstage/plugin-circleci@0.2.3 + - @backstage/plugin-cloudbuild@0.2.3 + - @backstage/plugin-github-actions@0.2.3 + - @backstage/plugin-jenkins@0.3.2 + - @backstage/plugin-lighthouse@0.2.4 + - @backstage/plugin-register-component@0.2.3 + - @backstage/plugin-rollbar@0.2.5 + - @backstage/plugin-search@0.2.2 + +## 0.2.4 + +### Patch Changes + +- Updated dependencies [294295453] +- Updated dependencies [f3bb55ee3] +- Updated dependencies [4b53294a6] +- Updated dependencies [6f70ed7a9] +- Updated dependencies [ab94c9542] +- Updated dependencies [3a201c5d5] +- Updated dependencies [f538e2c56] +- Updated dependencies [2daf18e80] +- Updated dependencies [069cda35f] +- Updated dependencies [8697dea5b] +- Updated dependencies [b623cc275] + - @backstage/cli@0.3.2 + - @backstage/plugin-api-docs@0.3.0 + - @backstage/plugin-techdocs@0.3.0 + - @backstage/plugin-catalog@0.2.4 + - @backstage/catalog-model@0.3.1 + - @backstage/plugin-rollbar@0.2.4 + +## 0.2.3 + +### Patch Changes + +- 475fc0aaa: Using the search field in the sidebar now navigates to the search result page. +- Updated dependencies [475fc0aaa] +- Updated dependencies [1166fcc36] +- Updated dependencies [29a0ccab2] +- Updated dependencies [8e6728e25] +- Updated dependencies [c93a14b49] +- Updated dependencies [ef2831dde] +- Updated dependencies [2a71f4bab] +- Updated dependencies [1185919f3] +- Updated dependencies [a8de7f554] +- Updated dependencies [faf311c26] +- Updated dependencies [31d8b6979] +- Updated dependencies [991345969] +- Updated dependencies [475fc0aaa] + - @backstage/core@0.3.2 + - @backstage/catalog-model@0.3.0 + - @backstage/plugin-kubernetes@0.3.0 + - @backstage/cli@0.3.1 + - @backstage/plugin-cost-insights@0.4.1 + - @backstage/plugin-scaffolder@0.3.1 + - @backstage/plugin-register-component@0.2.2 + - @backstage/plugin-circleci@0.2.2 + - @backstage/plugin-search@0.2.1 + - @backstage/plugin-api-docs@0.2.2 + - @backstage/plugin-catalog@0.2.3 + - @backstage/plugin-cloudbuild@0.2.2 + - @backstage/plugin-github-actions@0.2.2 + - @backstage/plugin-jenkins@0.3.1 + - @backstage/plugin-lighthouse@0.2.3 + - @backstage/plugin-rollbar@0.2.3 + - @backstage/plugin-sentry@0.2.3 + - @backstage/plugin-techdocs@0.2.3 + +## 0.2.2 + +### Patch Changes + +- 3efd03c0e: Removed obsolete CircleCI proxy config from example-app +- Updated dependencies [1722cb53c] +- Updated dependencies [1722cb53c] +- Updated dependencies [17a9f48f6] +- Updated dependencies [4040d4fcb] +- Updated dependencies [f360395d0] +- Updated dependencies [259d848ee] +- Updated dependencies [8b7737d0b] +- Updated dependencies [902340451] + - @backstage/cli@0.3.0 + - @backstage/core@0.3.1 + - @backstage/plugin-cost-insights@0.4.0 + - @backstage/plugin-lighthouse@0.2.2 + - @backstage/plugin-rollbar@0.2.2 + - @backstage/plugin-sentry@0.2.2 + - @backstage/plugin-techdocs@0.2.2 + - @backstage/plugin-user-settings@0.2.2 + - @backstage/plugin-catalog@0.2.2 + - @backstage/test-utils@0.1.3 + +## 0.2.1 + +### Patch Changes + +- Updated dependencies [7b37d65fd] +- Updated dependencies [4aca74e08] +- Updated dependencies [a41730c6e] +- Updated dependencies [9a294574c] +- Updated dependencies [0703edee0] +- Updated dependencies [e8f69ba93] +- Updated dependencies [0c0798f08] +- Updated dependencies [5a2705de2] +- Updated dependencies [0c0798f08] +- Updated dependencies [84b654d5d] +- Updated dependencies [0c0798f08] +- Updated dependencies [199237d2f] +- Updated dependencies [6627b626f] +- Updated dependencies [3f05616bf] +- Updated dependencies [803527bd3] +- Updated dependencies [4577e377b] +- Updated dependencies [2d0bd1be7] +- Updated dependencies [59166e5ec] +- Updated dependencies [a906f20e7] + - @backstage/core@0.3.0 + - @backstage/plugin-jenkins@0.3.0 + - @backstage/plugin-cost-insights@0.3.0 + - @backstage/plugin-user-settings@0.2.1 + - @backstage/plugin-api-docs@0.2.1 + - @backstage/plugin-tech-radar@0.3.0 + - @backstage/theme@0.2.1 + - @backstage/plugin-catalog@0.2.1 + - @backstage/plugin-scaffolder@0.3.0 + - @backstage/plugin-circleci@0.2.1 + - @backstage/plugin-cloudbuild@0.2.1 + - @backstage/plugin-explore@0.2.1 + - @backstage/plugin-gcp-projects@0.2.1 + - @backstage/plugin-github-actions@0.2.1 + - @backstage/plugin-gitops-profiles@0.2.1 + - @backstage/plugin-graphiql@0.2.1 + - @backstage/plugin-kubernetes@0.2.1 + - @backstage/plugin-lighthouse@0.2.1 + - @backstage/plugin-newrelic@0.2.1 + - @backstage/plugin-register-component@0.2.1 + - @backstage/plugin-rollbar@0.2.1 + - @backstage/plugin-sentry@0.2.1 + - @backstage/plugin-techdocs@0.2.1 + - @backstage/plugin-welcome@0.2.1 + +## 0.2.0 + +### Minor Changes + +- 6d97d2d6f: The InfoCard variant `'height100'` is deprecated. Use variant `'gridItem'` instead. + + When the InfoCard is displayed as a grid item within a grid, you may want items to have the same height for all items. + Set to the `'gridItem'` variant to display the InfoCard with full height suitable for Grid: + `...` + + Changed the InfoCards in '@backstage/plugin-github-actions', '@backstage/plugin-jenkins', '@backstage/plugin-lighthouse' + to pass an optional variant to the corresponding card of the plugin. + + As a result the overview content of the EntityPage shows cards with full height suitable for Grid. + +### Patch Changes + +- 65d722455: Add Pull Request tab to components view. +- 26e69ab1a: Remove cost insights example client from demo app and export from plugin + Create cost insights dev plugin using example client + Make PluginConfig and dependent types public +- e7f5471fd: cleaning up because external plugins have already implemented new api for creating +- Updated dependencies [28edd7d29] +- Updated dependencies [819a70229] +- Updated dependencies [2846ef95c] +- Updated dependencies [3a4236570] +- Updated dependencies [ae5983387] +- Updated dependencies [0d4459c08] +- Updated dependencies [d67c529ab] +- Updated dependencies [482b6313d] +- Updated dependencies [e0be86b6f] +- Updated dependencies [f70a52868] +- Updated dependencies [12b5fe940] +- Updated dependencies [8351ad79b] +- Updated dependencies [30dd11122] +- Updated dependencies [1297dcb3a] +- Updated dependencies [368fd8243] +- Updated dependencies [fb74f1db6] +- Updated dependencies [3472c8be7] +- Updated dependencies [cab473771] +- Updated dependencies [1d0aec70f] +- Updated dependencies [1c60f716e] +- Updated dependencies [a73979d45] +- Updated dependencies [144c66d50] +- Updated dependencies [a768a07fb] +- Updated dependencies [a3840bed2] +- Updated dependencies [339668995] +- Updated dependencies [b79017fd3] +- Updated dependencies [6d97d2d6f] +- Updated dependencies [5adfc005e] +- Updated dependencies [f0aa01bcc] +- Updated dependencies [8d1360aa9] +- Updated dependencies [72f6cda35] +- Updated dependencies [0ee9e9f66] +- Updated dependencies [5c70f3d35] +- Updated dependencies [bb48b9833] +- Updated dependencies [fd8384d7e] +- Updated dependencies [8c2b76e45] +- Updated dependencies [0aecfded0] +- Updated dependencies [93a3fa3ae] +- Updated dependencies [782f3b354] +- Updated dependencies [c5ef12926] +- Updated dependencies [8b9c8196f] +- Updated dependencies [2713f28f4] +- Updated dependencies [6a84cb072] +- Updated dependencies [406015b0d] +- Updated dependencies [82759d3e4] +- Updated dependencies [60d40892c] +- Updated dependencies [cba4e4d97] +- Updated dependencies [ac8d5d5c7] +- Updated dependencies [2ebcfac8d] +- Updated dependencies [4fc1d440e] +- Updated dependencies [fa56f4615] +- Updated dependencies [8afce088a] +- Updated dependencies [4512b9967] +- Updated dependencies [ebca83d48] +- Updated dependencies [aca79334f] +- Updated dependencies [c0d5242a0] +- Updated dependencies [b3d57961c] +- Updated dependencies [9a3b3dbf1] +- Updated dependencies [e7d4ac7ce] +- Updated dependencies [0b956f21b] +- Updated dependencies [1c8c43756] +- Updated dependencies [0e67c6b40] +- Updated dependencies [26e69ab1a] +- Updated dependencies [97c2cb19b] +- Updated dependencies [02c60b5f8] +- Updated dependencies [3beb5c9fc] +- Updated dependencies [754e31db5] +- Updated dependencies [57b54c8ed] +- Updated dependencies [1611c6dbc] +- Updated dependencies [7bbeb049f] + - @backstage/cli@0.2.0 + - @backstage/plugin-api-docs@0.2.0 + - @backstage/plugin-catalog@0.2.0 + - @backstage/plugin-circleci@0.2.0 + - @backstage/plugin-explore@0.2.0 + - @backstage/plugin-gcp-projects@0.2.0 + - @backstage/plugin-github-actions@0.2.0 + - @backstage/plugin-gitops-profiles@0.2.0 + - @backstage/plugin-graphiql@0.2.0 + - @backstage/plugin-jenkins@0.2.0 + - @backstage/plugin-kubernetes@0.2.0 + - @backstage/plugin-lighthouse@0.2.0 + - @backstage/plugin-newrelic@0.2.0 + - @backstage/plugin-register-component@0.2.0 + - @backstage/plugin-rollbar@0.2.0 + - @backstage/plugin-scaffolder@0.2.0 + - @backstage/plugin-sentry@0.2.0 + - @backstage/plugin-tech-radar@0.2.0 + - @backstage/plugin-techdocs@0.2.0 + - @backstage/plugin-welcome@0.2.0 + - @backstage/core@0.2.0 + - @backstage/plugin-cloudbuild@0.2.0 + - @backstage/catalog-model@0.2.0 + - @backstage/theme@0.2.0 + - @backstage/plugin-cost-insights@0.2.0 + - @backstage/plugin-user-settings@0.2.0 + - @backstage/test-utils@0.1.2 diff --git a/packages/app-legacy/README.md b/packages/app-legacy/README.md new file mode 100644 index 0000000000..1035c192df --- /dev/null +++ b/packages/app-legacy/README.md @@ -0,0 +1,5 @@ +# example-app-legacy + +This package is an example of a Backstage application using the old (legacy) frontend system. + +**NOTE:** This is the legacy frontend system. For new projects, use `packages/app` which uses the new frontend system. diff --git a/packages/app-next/catalog-info.yaml b/packages/app-legacy/catalog-info.yaml similarity index 73% rename from packages/app-next/catalog-info.yaml rename to packages/app-legacy/catalog-info.yaml index 14e51ecd04..bf729b380c 100644 --- a/packages/app-next/catalog-info.yaml +++ b/packages/app-legacy/catalog-info.yaml @@ -1,8 +1,8 @@ apiVersion: backstage.io/v1alpha1 kind: Component metadata: - name: example-app-next - title: example-app-next + name: example-app-legacy + title: example-app-legacy spec: lifecycle: experimental type: backstage-frontend diff --git a/packages/app-legacy/knip-report.md b/packages/app-legacy/knip-report.md new file mode 100644 index 0000000000..d9c3463946 --- /dev/null +++ b/packages/app-legacy/knip-report.md @@ -0,0 +1,28 @@ +# Knip report + +## Unused dependencies (8) + +| Name | Location | Severity | +| :------------------------------ | :----------- | :------- | +| @backstage/plugin-search-common | packages/app-legacy/package.json | error | +| @backstage/plugin-auth-react | packages/app-legacy/package.json | error | +| @backstage/frontend-app-api | packages/app-legacy/package.json | error | +| @material-ui/lab | packages/app-legacy/package.json | error | +| zen-observable | packages/app-legacy/package.json | error | +| @octokit/rest | packages/app-legacy/package.json | error | +| react-router | packages/app-legacy/package.json | error | +| history | packages/app-legacy/package.json | error | + +## Unused devDependencies (3) + +| Name | Location | Severity | +| :-------------------------- | :----------- | :------- | +| @testing-library/user-event | packages/app-legacy/package.json | error | +| @types/zen-observable | packages/app-legacy/package.json | error | +| @types/jquery | packages/app-legacy/package.json | error | + +## Unlisted dependencies (1) + +| Name | Location | Severity | +| :---------- | :------------------------------------------------------- | :------- | +| @rjsf/utils | packages/app/src/components/scaffolder/customScaffolderExtensions.tsx | error | diff --git a/packages/app-next/package.json b/packages/app-legacy/package.json similarity index 84% rename from packages/app-next/package.json rename to packages/app-legacy/package.json index 1bb03fb1c5..ef8f1a2afb 100644 --- a/packages/app-next/package.json +++ b/packages/app-legacy/package.json @@ -1,14 +1,15 @@ { - "name": "example-app-next", - "version": "0.0.30", + "name": "example-app-legacy", + "version": "0.2.118-next.2", "backstage": { "role": "frontend" }, "private": true, + "homepage": "https://backstage.io", "repository": { "type": "git", "url": "https://github.com/backstage/backstage", - "directory": "packages/app-next" + "directory": "packages/app-legacy" }, "license": "Apache-2.0", "files": [ @@ -18,7 +19,7 @@ "build": "backstage-cli package build", "clean": "backstage-cli package clean", "lint": "backstage-cli package lint", - "start": "backstage-cli package start --config ../../app-config.yaml --config app-config.yaml", + "start": "cross-env EXPERIMENTAL_LAZY_COMPILATION=1 backstage-cli package start", "test": "backstage-cli package test" }, "browserslist": { @@ -39,17 +40,11 @@ "@backstage/cli": "workspace:^", "@backstage/config": "workspace:^", "@backstage/core-app-api": "workspace:^", - "@backstage/core-compat-api": "workspace:^", "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", "@backstage/frontend-app-api": "workspace:^", - "@backstage/frontend-defaults": "workspace:^", - "@backstage/frontend-plugin-api": "workspace:^", "@backstage/integration-react": "workspace:^", "@backstage/plugin-api-docs": "workspace:^", - "@backstage/plugin-app": "workspace:^", - "@backstage/plugin-app-visualizer": "workspace:^", - "@backstage/plugin-auth": "workspace:^", "@backstage/plugin-auth-react": "workspace:^", "@backstage/plugin-catalog": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", @@ -57,9 +52,12 @@ "@backstage/plugin-catalog-import": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", "@backstage/plugin-catalog-unprocessed-entities": "workspace:^", + "@backstage/plugin-devtools": "workspace:^", "@backstage/plugin-home": "workspace:^", + "@backstage/plugin-home-react": "workspace:^", "@backstage/plugin-kubernetes": "workspace:^", "@backstage/plugin-kubernetes-cluster": "workspace:^", + "@backstage/plugin-mui-to-bui": "workspace:^", "@backstage/plugin-notifications": "workspace:^", "@backstage/plugin-org": "workspace:^", "@backstage/plugin-permission-react": "workspace:^", @@ -82,13 +80,14 @@ "history": "^5.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router": "^6.3.0", - "react-router-dom": "^6.3.0", + "react-router": "^6.30.2", + "react-router-dom": "^6.30.2", "react-use": "^17.2.4", "zen-observable": "^0.10.0" }, "devDependencies": { "@backstage/test-utils": "workspace:^", + "@playwright/test": "^1.32.3", "@testing-library/dom": "^10.0.0", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", @@ -97,7 +96,9 @@ "@types/react": "*", "@types/react-dom": "*", "@types/zen-observable": "^0.8.0", - "cross-env": "^7.0.0" + "axios": "^1.13.0", + "cross-env": "^10.0.0", + "msw": "^1.0.0" }, "bundled": true } diff --git a/packages/app-next/public/android-chrome-192x192.png b/packages/app-legacy/public/android-chrome-192x192.png similarity index 100% rename from packages/app-next/public/android-chrome-192x192.png rename to packages/app-legacy/public/android-chrome-192x192.png diff --git a/packages/app-next/public/android-chrome-512x512.png b/packages/app-legacy/public/android-chrome-512x512.png similarity index 100% rename from packages/app-next/public/android-chrome-512x512.png rename to packages/app-legacy/public/android-chrome-512x512.png diff --git a/packages/app-next/public/apple-touch-icon.png b/packages/app-legacy/public/apple-touch-icon.png similarity index 100% rename from packages/app-next/public/apple-touch-icon.png rename to packages/app-legacy/public/apple-touch-icon.png diff --git a/packages/app-next/public/favicon-16x16.png b/packages/app-legacy/public/favicon-16x16.png similarity index 100% rename from packages/app-next/public/favicon-16x16.png rename to packages/app-legacy/public/favicon-16x16.png diff --git a/packages/app-next/public/favicon-32x32.png b/packages/app-legacy/public/favicon-32x32.png similarity index 100% rename from packages/app-next/public/favicon-32x32.png rename to packages/app-legacy/public/favicon-32x32.png diff --git a/packages/app-next/public/favicon.ico b/packages/app-legacy/public/favicon.ico similarity index 100% rename from packages/app-next/public/favicon.ico rename to packages/app-legacy/public/favicon.ico diff --git a/packages/app-next/public/favicon.svg b/packages/app-legacy/public/favicon.svg similarity index 100% rename from packages/app-next/public/favicon.svg rename to packages/app-legacy/public/favicon.svg diff --git a/packages/app-next/public/index.html b/packages/app-legacy/public/index.html similarity index 97% rename from packages/app-next/public/index.html rename to packages/app-legacy/public/index.html index 74387edea3..9b67673b2e 100644 --- a/packages/app-next/public/index.html +++ b/packages/app-legacy/public/index.html @@ -42,7 +42,7 @@ href="<%= publicPath %>/safari-pinned-tab.svg" color="#5bbad5" /> - <%= config.getString('app.title') %> + <%= config.getOptionalString('app.title') ?? 'Backstage' %> <% if (config.has('app.datadogRum')) { %>

    Safe Content

    ' + dialect="gfm" + />, + ); + + expect(screen.getByText('Safe Content')).toBeInTheDocument(); + expect(container.querySelector('script')).toBeNull(); + expect(container.querySelector('style')).toBeNull(); + }); }); diff --git a/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx b/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx index 5ad23cce09..6d978ebb6f 100644 --- a/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx +++ b/packages/core-components/src/components/MarkdownContent/MarkdownContent.tsx @@ -20,6 +20,9 @@ import gfm from 'remark-gfm'; import { Children, createElement } from 'react'; import { CodeSnippet } from '../CodeSnippet'; import { HeadingProps } from 'react-markdown/lib/ast-to-react'; +import rehypeRaw from 'rehype-raw'; +import rehypeSanitize, { defaultSchema } from 'rehype-sanitize'; +import type { PluggableList } from 'react-markdown/lib/react-markdown'; export type MarkdownContentClassKey = 'markdown'; @@ -108,6 +111,30 @@ const components: Options['components'] = { h6: headingRenderer, }; +const gfmRehypePlugins: PluggableList = [ + [ + rehypeRaw, + { + tagFiter: true, + }, + ], + [ + rehypeSanitize, + { + ...defaultSchema, + attributes: { + ...defaultSchema.attributes, + code: [ + ...(defaultSchema.attributes?.code ?? []), + // for syntax highlighting classes in code blocks + // breaks the codesnippet component override above if omitted + ['className'], + ], + }, + }, + ], +]; + /** * Renders markdown with the default dialect {@link https://github.github.com/gfm/ | gfm - GitHub flavored Markdown} to backstage theme styled HTML. * @@ -127,6 +154,7 @@ export function MarkdownContent(props: Props) { return ( ; diff --git a/packages/core-components/src/components/ProgressBars/Gauge.stories.tsx b/packages/core-components/src/components/ProgressBars/Gauge.stories.tsx index 4dcb788289..9578a35864 100644 --- a/packages/core-components/src/components/ProgressBars/Gauge.stories.tsx +++ b/packages/core-components/src/components/ProgressBars/Gauge.stories.tsx @@ -21,6 +21,7 @@ const containerStyle = { width: 300 }; export default { title: 'Data Display/Gauge', component: Gauge, + tags: ['!manifest'], }; export const Default = () => ( diff --git a/packages/core-components/src/components/ProgressBars/GaugeCard.stories.tsx b/packages/core-components/src/components/ProgressBars/GaugeCard.stories.tsx index 0377c37ef0..6b673a65d5 100644 --- a/packages/core-components/src/components/ProgressBars/GaugeCard.stories.tsx +++ b/packages/core-components/src/components/ProgressBars/GaugeCard.stories.tsx @@ -34,6 +34,7 @@ const Wrapper = ({ children }: PropsWithChildren<{}>) => ( export default { title: 'Data Display/Progress Card', component: GaugeCard, + tags: ['!manifest'], }; export const Default = () => ( diff --git a/packages/core-components/src/components/ProgressBars/LinearGauge.stories.tsx b/packages/core-components/src/components/ProgressBars/LinearGauge.stories.tsx index 295856bd51..eebfb7356c 100644 --- a/packages/core-components/src/components/ProgressBars/LinearGauge.stories.tsx +++ b/packages/core-components/src/components/ProgressBars/LinearGauge.stories.tsx @@ -21,6 +21,7 @@ const containerStyle = { width: 300 }; export default { title: 'Data Display/LinearGauge', component: LinearGauge, + tags: ['!manifest'], }; export const Default = () => ( diff --git a/packages/core-components/src/components/ResponseErrorPanel/ResponseErrorPanel.stories.tsx b/packages/core-components/src/components/ResponseErrorPanel/ResponseErrorPanel.stories.tsx index 7eab08f55f..050ae2ce29 100644 --- a/packages/core-components/src/components/ResponseErrorPanel/ResponseErrorPanel.stories.tsx +++ b/packages/core-components/src/components/ResponseErrorPanel/ResponseErrorPanel.stories.tsx @@ -20,6 +20,7 @@ import { ErrorPanelProps } from '../ErrorPanel'; export default { title: 'Data Display/ResponseErrorPanel', component: ResponseErrorPanel, + tags: ['!manifest'], }; export const Default = (args: ErrorPanelProps) => ( diff --git a/packages/core-components/src/components/Select/Select.stories.tsx b/packages/core-components/src/components/Select/Select.stories.tsx index f3eaea1021..d6a11244a4 100644 --- a/packages/core-components/src/components/Select/Select.stories.tsx +++ b/packages/core-components/src/components/Select/Select.stories.tsx @@ -19,6 +19,7 @@ import { SelectComponent as Select, SelectProps } from './Select'; export default { title: 'Inputs/Select', component: Select, + tags: ['!manifest'], }; const SELECT_ITEMS = [ diff --git a/packages/core-components/src/components/SimpleStepper/SimpleStepper.stories.tsx b/packages/core-components/src/components/SimpleStepper/SimpleStepper.stories.tsx index a50183b179..d99e1b0a39 100644 --- a/packages/core-components/src/components/SimpleStepper/SimpleStepper.stories.tsx +++ b/packages/core-components/src/components/SimpleStepper/SimpleStepper.stories.tsx @@ -22,6 +22,7 @@ import { SimpleStepperStep } from './SimpleStepperStep'; export default { title: 'Navigation/SimpleStepper', component: SimpleStepper, + tags: ['!manifest'], }; const defaultArgs = { diff --git a/packages/core-components/src/components/Status/Status.stories.tsx b/packages/core-components/src/components/Status/Status.stories.tsx index 1237a02432..1404ae4373 100644 --- a/packages/core-components/src/components/Status/Status.stories.tsx +++ b/packages/core-components/src/components/Status/Status.stories.tsx @@ -28,6 +28,7 @@ import { InfoCard } from '../../layout/InfoCard'; export default { title: 'Data Display/Status', component: StatusOK, + tags: ['!manifest'], }; const data = [ diff --git a/packages/core-components/src/components/StructuredMetadataTable/StructuredMetadataTable.stories.tsx b/packages/core-components/src/components/StructuredMetadataTable/StructuredMetadataTable.stories.tsx index 8a30300685..2ee11fd23d 100644 --- a/packages/core-components/src/components/StructuredMetadataTable/StructuredMetadataTable.stories.tsx +++ b/packages/core-components/src/components/StructuredMetadataTable/StructuredMetadataTable.stories.tsx @@ -41,6 +41,7 @@ const metadata = { export default { title: 'Data Display/Structured Metadata Table', component: StructuredMetadataTable, + tags: ['!manifest'], }; const Wrapper = ({ children }: PropsWithChildren<{}>) => ( diff --git a/packages/core-components/src/components/TabbedLayout/TabbedLayout.stories.tsx b/packages/core-components/src/components/TabbedLayout/TabbedLayout.stories.tsx index a4060d9d43..b0a6754fd2 100644 --- a/packages/core-components/src/components/TabbedLayout/TabbedLayout.stories.tsx +++ b/packages/core-components/src/components/TabbedLayout/TabbedLayout.stories.tsx @@ -20,6 +20,7 @@ import { TabbedLayout } from './TabbedLayout'; export default { title: 'Navigation/TabbedLayout', component: TabbedLayout, + tags: ['!manifest'], }; const Wrapper = ({ children }: PropsWithChildren<{}>) => ( diff --git a/packages/core-components/src/components/Table/Table.stories.tsx b/packages/core-components/src/components/Table/Table.stories.tsx index ac8303cde7..c17726d5fd 100644 --- a/packages/core-components/src/components/Table/Table.stories.tsx +++ b/packages/core-components/src/components/Table/Table.stories.tsx @@ -23,6 +23,7 @@ import { Table, TableColumn, TableFilter } from './Table'; export default { title: 'Data Display/Table', component: Table, + tags: ['!manifest'], }; const useStyles = makeStyles(theme => ({ diff --git a/packages/core-components/src/components/Table/Table.tsx b/packages/core-components/src/components/Table/Table.tsx index 0287cfdf40..59220abbaf 100644 --- a/packages/core-components/src/components/Table/Table.tsx +++ b/packages/core-components/src/components/Table/Table.tsx @@ -186,6 +186,7 @@ const useFilterStyles = makeStyles( display: 'flex', alignItems: 'center', justifyContent: 'space-between', + flexWrap: 'wrap', }, title: { fontWeight: theme.typography.fontWeightBold, diff --git a/packages/core-components/src/components/TrendLine/TrendLine.stories.tsx b/packages/core-components/src/components/TrendLine/TrendLine.stories.tsx index 2f1e9bc4f1..710c0448f4 100644 --- a/packages/core-components/src/components/TrendLine/TrendLine.stories.tsx +++ b/packages/core-components/src/components/TrendLine/TrendLine.stories.tsx @@ -21,6 +21,7 @@ import { InfoCard } from '../../layout/InfoCard'; export default { title: 'Data Display/TrendLine', component: TrendLine, + tags: ['!manifest'], }; const containerStyle = { width: 700 }; diff --git a/packages/core-components/src/components/WarningPanel/WarningPanel.stories.tsx b/packages/core-components/src/components/WarningPanel/WarningPanel.stories.tsx index 7e45f3c398..9fa950dc0c 100644 --- a/packages/core-components/src/components/WarningPanel/WarningPanel.stories.tsx +++ b/packages/core-components/src/components/WarningPanel/WarningPanel.stories.tsx @@ -22,6 +22,7 @@ import { Link } from '../Link'; export default { title: 'Feedback/Warning Panel', component: WarningPanel, + tags: ['!manifest'], }; export const Default = () => ( diff --git a/packages/core-components/src/layout/BottomLink/BottomLink.stories.tsx b/packages/core-components/src/layout/BottomLink/BottomLink.stories.tsx index 93607c35f5..345030b80c 100644 --- a/packages/core-components/src/layout/BottomLink/BottomLink.stories.tsx +++ b/packages/core-components/src/layout/BottomLink/BottomLink.stories.tsx @@ -19,6 +19,7 @@ import { BottomLink } from '../BottomLink'; export default { title: 'Layout/BottomLink', component: BottomLink, + tags: ['!manifest'], }; export const Default = (args: { link: string; title: string }) => ( diff --git a/packages/core-components/src/layout/Breadcrumbs/Breadcrumbs.stories.tsx b/packages/core-components/src/layout/Breadcrumbs/Breadcrumbs.stories.tsx index f962e4673e..cec62304ee 100644 --- a/packages/core-components/src/layout/Breadcrumbs/Breadcrumbs.stories.tsx +++ b/packages/core-components/src/layout/Breadcrumbs/Breadcrumbs.stories.tsx @@ -31,6 +31,7 @@ import { Breadcrumbs } from './Breadcrumbs'; export default { title: 'Layout/Breadcrumbs', component: Breadcrumbs, + tags: ['!manifest'], }; export const InHeader = () => ( diff --git a/packages/core-components/src/layout/Content/Content.stories.tsx b/packages/core-components/src/layout/Content/Content.stories.tsx index 8879c3c51d..eb6947b3f7 100644 --- a/packages/core-components/src/layout/Content/Content.stories.tsx +++ b/packages/core-components/src/layout/Content/Content.stories.tsx @@ -18,6 +18,7 @@ import { Content } from './Content'; export default { title: 'Layout/Content', component: Content, + tags: ['!manifest'], }; type Props = { diff --git a/packages/core-components/src/layout/ContentHeader/ContentHeader.stories.tsx b/packages/core-components/src/layout/ContentHeader/ContentHeader.stories.tsx index 6b4ced0edd..989fba81ce 100644 --- a/packages/core-components/src/layout/ContentHeader/ContentHeader.stories.tsx +++ b/packages/core-components/src/layout/ContentHeader/ContentHeader.stories.tsx @@ -20,6 +20,7 @@ import { ContentHeader } from '../ContentHeader'; export default { title: 'Layout/ContentHeader', component: ContentHeader, + tags: ['!manifest'], }; type ContentHeaderProps = { diff --git a/packages/core-components/src/layout/Header/Header.stories.tsx b/packages/core-components/src/layout/Header/Header.stories.tsx index 3b9c67fce5..a87c89544a 100644 --- a/packages/core-components/src/layout/Header/Header.stories.tsx +++ b/packages/core-components/src/layout/Header/Header.stories.tsx @@ -36,6 +36,7 @@ export default { control: { type: 'select' }, }, }, + tags: ['!manifest'], }; const labels = ( diff --git a/packages/core-components/src/layout/HeaderActionMenu/HeaderActionMenu.stories.tsx b/packages/core-components/src/layout/HeaderActionMenu/HeaderActionMenu.stories.tsx index 0fc4139dfb..b087c08d06 100644 --- a/packages/core-components/src/layout/HeaderActionMenu/HeaderActionMenu.stories.tsx +++ b/packages/core-components/src/layout/HeaderActionMenu/HeaderActionMenu.stories.tsx @@ -18,6 +18,7 @@ import { HeaderActionMenu, HeaderActionMenuProps } from './HeaderActionMenu'; export default { title: 'Layout/HeaderActionMenu', component: HeaderActionMenu, + tags: ['!manifest'], }; export const Default = (args: HeaderActionMenuProps) => ( diff --git a/packages/core-components/src/layout/HeaderLabel/HeaderLabel.stories.tsx b/packages/core-components/src/layout/HeaderLabel/HeaderLabel.stories.tsx index dd93b0768c..60028eb89c 100644 --- a/packages/core-components/src/layout/HeaderLabel/HeaderLabel.stories.tsx +++ b/packages/core-components/src/layout/HeaderLabel/HeaderLabel.stories.tsx @@ -18,6 +18,7 @@ import { HeaderLabel } from './HeaderLabel'; export default { title: 'Layout/HeaderLabel', component: HeaderLabel, + tags: ['!manifest'], }; type HeaderLabelProps = { diff --git a/packages/core-components/src/layout/HeaderTabs/HeaderTabs.stories.tsx b/packages/core-components/src/layout/HeaderTabs/HeaderTabs.stories.tsx index 08ea2a0648..b551bb1d04 100644 --- a/packages/core-components/src/layout/HeaderTabs/HeaderTabs.stories.tsx +++ b/packages/core-components/src/layout/HeaderTabs/HeaderTabs.stories.tsx @@ -18,6 +18,7 @@ import { HeaderTabs } from './HeaderTabs'; export default { title: 'Layout/HeaderTabs', component: HeaderTabs, + tags: ['!manifest'], }; export const SingleTab = (args: any) => ; diff --git a/packages/core-components/src/layout/InfoCard/InfoCard.stories.tsx b/packages/core-components/src/layout/InfoCard/InfoCard.stories.tsx index 72bc79b674..10400412c6 100644 --- a/packages/core-components/src/layout/InfoCard/InfoCard.stories.tsx +++ b/packages/core-components/src/layout/InfoCard/InfoCard.stories.tsx @@ -23,6 +23,7 @@ import { InfoCard, Props } from './InfoCard'; export default { title: 'Layout/Information Card', component: InfoCard, + tags: ['!manifest'], }; const text = ( diff --git a/packages/core-components/src/layout/ItemCard/ItemCard.stories.tsx b/packages/core-components/src/layout/ItemCard/ItemCard.stories.tsx index def451d418..4ab03c305f 100644 --- a/packages/core-components/src/layout/ItemCard/ItemCard.stories.tsx +++ b/packages/core-components/src/layout/ItemCard/ItemCard.stories.tsx @@ -27,6 +27,7 @@ import { ItemCardHeader } from './ItemCardHeader'; export default { title: 'Layout/Item Cards', + tags: ['!manifest'], }; const text = diff --git a/packages/core-components/src/layout/ItemCard/ItemCardHeader.tsx b/packages/core-components/src/layout/ItemCard/ItemCardHeader.tsx index 115c9e89e1..cb1010b2c7 100644 --- a/packages/core-components/src/layout/ItemCard/ItemCardHeader.tsx +++ b/packages/core-components/src/layout/ItemCard/ItemCardHeader.tsx @@ -30,7 +30,7 @@ export type ItemCardHeaderClassKey = 'root'; const styles = (theme: Theme) => createStyles({ root: { - color: theme.palette.text.primary, + color: theme.getPageTheme({ themeId: 'card' }).fontColor, padding: theme.spacing(2, 2, 3), backgroundImage: theme.getPageTheme({ themeId: 'card' }).backgroundImage, backgroundPosition: 0, diff --git a/packages/core-components/src/layout/Page/Page.stories.tsx b/packages/core-components/src/layout/Page/Page.stories.tsx index aa0aedbe5d..2ec3afebb7 100644 --- a/packages/core-components/src/layout/Page/Page.stories.tsx +++ b/packages/core-components/src/layout/Page/Page.stories.tsx @@ -40,6 +40,7 @@ import { Page } from '../Page'; export default { title: 'Plugins/Examples', component: Page, + tags: ['!manifest'], }; interface TableData { diff --git a/packages/core-components/src/layout/Sidebar/Sidebar.stories.tsx b/packages/core-components/src/layout/Sidebar/Sidebar.stories.tsx index f02fad5095..d5720d00a7 100644 --- a/packages/core-components/src/layout/Sidebar/Sidebar.stories.tsx +++ b/packages/core-components/src/layout/Sidebar/Sidebar.stories.tsx @@ -48,6 +48,7 @@ export default { (Story: ComponentType>) => wrapInTestApp(, { mountedRoutes: { '/': routeRef } }), ], + tags: ['!manifest'], }; const handleSearch = (input: string) => { diff --git a/packages/core-components/src/layout/TabbedCard/TabbedCard.stories.tsx b/packages/core-components/src/layout/TabbedCard/TabbedCard.stories.tsx index 7c83dad083..c9019107ec 100644 --- a/packages/core-components/src/layout/TabbedCard/TabbedCard.stories.tsx +++ b/packages/core-components/src/layout/TabbedCard/TabbedCard.stories.tsx @@ -36,6 +36,7 @@ export default { ), ], + tags: ['!manifest'], }; export const Default = () => { diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md index 8c6c617bcb..cde546e760 100644 --- a/packages/core-plugin-api/CHANGELOG.md +++ b/packages/core-plugin-api/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/core-plugin-api +## 1.12.3-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/frontend-plugin-api@0.14.0-next.2 + - @backstage/version-bridge@1.0.12-next.0 + +## 1.12.2-next.0 + +### Patch Changes + +- 53b6549: Plugins in the new frontend system now have a `pluginId` field rather than `id` to better align with naming conventions used throughout the frontend and backend systems. The old field is still present but marked as deprecated. All internal code has been updated to prefer `pluginId` while maintaining backward compatibility by falling back to `id` when needed. +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + ## 1.12.1 ### Patch Changes diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index ef4982e07e..8c3c496ebd 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.1", + "version": "1.12.3-next.1", "description": "Core API used by Backstage plugins", "backstage": { "role": "web-library" @@ -55,7 +55,7 @@ "@backstage/types": "workspace:^", "@backstage/version-bridge": "workspace:^", "history": "^5.0.0", - "zod": "^3.22.4" + "zod": "^3.25.76" }, "devDependencies": { "@backstage/cli": "workspace:^", @@ -68,13 +68,13 @@ "@types/react": "^18.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/core-plugin-api/src/app/useApp.tsx b/packages/core-plugin-api/src/app/useApp.tsx index fde807c317..5d789689cd 100644 --- a/packages/core-plugin-api/src/app/useApp.tsx +++ b/packages/core-plugin-api/src/app/useApp.tsx @@ -53,7 +53,7 @@ function toLegacyPlugin(plugin: FrontendPlugin): BackstagePlugin { legacy = { getId(): string { - return plugin.id; + return plugin.pluginId ?? plugin.id; }, get routes() { return {}; diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index 92fff85f58..65da38edda 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,63 @@ # @backstage/create-app +## 0.7.9-next.2 + +### Patch Changes + +- Bumped create-app version. + +## 0.7.9-next.1 + +### Patch Changes + +- Bumped create-app version. + +## 0.7.9-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- c38b74d: Switched `next-app` template to use blueprint from `@backstage/plugin-app-react`. +- Updated dependencies + - @backstage/cli-common@0.1.18-next.0 + +## 0.7.8 + +### Patch Changes + +- fea3e39: Bumped create-app version. +- 9f1ee3e: Bumped create-app version. +- 880310b: Bumped create-app version. +- f1fe6fe: Updated Dockerfile to use Node 24 and Debian Trixie +- Updated dependencies + - @backstage/cli-common@0.1.17 + +## 0.7.8-next.3 + +### Patch Changes + +- Bumped create-app version. + +## 0.7.8-next.2 + +### Patch Changes + +- f1fe6fe: Updated Dockerfile to use Node 24 and Debian Trixie + +## 0.7.8-next.1 + +### Patch Changes + +- Bumped create-app version. + +## 0.7.8-next.0 + +### Patch Changes + +- Bumped create-app version. +- Updated dependencies + - @backstage/cli-common@0.1.16 + ## 0.7.7 ### Patch Changes diff --git a/packages/create-app/bin/backstage-create-app b/packages/create-app/bin/backstage-create-app index bacee3e835..fe8fc68188 100755 --- a/packages/create-app/bin/backstage-create-app +++ b/packages/create-app/bin/backstage-create-app @@ -16,10 +16,12 @@ */ /* eslint-disable no-restricted-syntax */ -const path = require('path'); +const path = require('node:path'); // Figure out whether we're running inside the backstage repo or as an installed dependency -const isLocal = require('fs').existsSync(path.resolve(__dirname, '../src')); +const isLocal = require('node:fs').existsSync( + path.resolve(__dirname, '../src'), +); if (!isLocal || process.env.BACKSTAGE_E2E_CLI_TEST) { require('..'); diff --git a/packages/create-app/package.json b/packages/create-app/package.json index aaf686f58d..a1271c47ee 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/create-app", - "version": "0.7.7", + "version": "0.7.9-next.2", "description": "A CLI that helps you create your own Backstage app", "backstage": { "role": "cli" diff --git a/packages/create-app/scripts/add-lock-seed.js b/packages/create-app/scripts/add-lock-seed.js index faa01fca9b..cddf59d8d1 100644 --- a/packages/create-app/scripts/add-lock-seed.js +++ b/packages/create-app/scripts/add-lock-seed.js @@ -16,7 +16,7 @@ */ const fs = require('fs-extra'); -const path = require('path'); +const path = require('node:path'); const YARN_REGISTRY = 'https://registry.yarnpkg.com'; const NPM_REGISTRY = 'https://registry.npmjs.org'; diff --git a/packages/create-app/scripts/postpack.js b/packages/create-app/scripts/postpack.js index f13db11e76..ffed449a22 100644 --- a/packages/create-app/scripts/postpack.js +++ b/packages/create-app/scripts/postpack.js @@ -18,7 +18,7 @@ /* eslint-disable no-restricted-syntax */ const fs = require('fs-extra'); -const path = require('path'); +const path = require('node:path'); async function main() { const pkgPath = path.resolve(__dirname, '../package.json'); diff --git a/packages/create-app/scripts/prepack.js b/packages/create-app/scripts/prepack.js index 2caf865280..c87fac8450 100644 --- a/packages/create-app/scripts/prepack.js +++ b/packages/create-app/scripts/prepack.js @@ -18,7 +18,7 @@ /* eslint-disable no-restricted-syntax */ const fs = require('fs-extra'); -const path = require('path'); +const path = require('node:path'); async function main() { const pkgPath = path.resolve(__dirname, '../package.json'); diff --git a/packages/create-app/src/createApp.test.ts b/packages/create-app/src/createApp.test.ts index b689410cac..c854867de6 100644 --- a/packages/create-app/src/createApp.test.ts +++ b/packages/create-app/src/createApp.test.ts @@ -15,12 +15,12 @@ */ import inquirer from 'inquirer'; -import path from 'path'; +import path from 'node:path'; import { Command } from 'commander'; import * as tasks from './lib/tasks'; import createApp from './createApp'; import { findPaths } from '@backstage/cli-common'; -import { tmpdir } from 'os'; +import { tmpdir } from 'node:os'; import { createMockDirectory } from '@backstage/backend-test-utils'; jest.mock('./lib/tasks'); diff --git a/packages/create-app/src/createApp.ts b/packages/create-app/src/createApp.ts index b96c93b8f2..11e5503899 100644 --- a/packages/create-app/src/createApp.ts +++ b/packages/create-app/src/createApp.ts @@ -17,9 +17,9 @@ import chalk from 'chalk'; import { OptionValues } from 'commander'; import inquirer, { Answers } from 'inquirer'; -import { resolve as resolvePath } from 'path'; +import { resolve as resolvePath } from 'node:path'; import { findPaths } from '@backstage/cli-common'; -import os from 'os'; +import os from 'node:os'; import fs from 'fs-extra'; import { Task, diff --git a/packages/create-app/src/lib/tasks.test.ts b/packages/create-app/src/lib/tasks.test.ts index 86a7008b4d..be6852e3ab 100644 --- a/packages/create-app/src/lib/tasks.test.ts +++ b/packages/create-app/src/lib/tasks.test.ts @@ -15,9 +15,9 @@ */ import fs from 'fs-extra'; -import child_process from 'child_process'; -import { resolve as resolvePath } from 'path'; -import os from 'os'; +import child_process from 'node:child_process'; +import { resolve as resolvePath } from 'node:path'; +import os from 'node:os'; import { Task, buildAppTask, diff --git a/packages/create-app/src/lib/tasks.ts b/packages/create-app/src/lib/tasks.ts index 0ab31dd5f4..7819711699 100644 --- a/packages/create-app/src/lib/tasks.ts +++ b/packages/create-app/src/lib/tasks.ts @@ -27,11 +27,11 @@ import { dirname, resolve as resolvePath, relative as relativePath, -} from 'path'; -import { exec as execCb } from 'child_process'; +} from 'node:path'; +import { exec as execCb } from 'node:child_process'; import { packageVersions } from './versions'; -import { promisify } from 'util'; -import os from 'os'; +import { promisify } from 'node:util'; +import os from 'node:os'; const TASK_NAME_MAX_LENGTH = 14; const TEN_MINUTES_MS = 1000 * 60 * 10; diff --git a/packages/create-app/src/lib/versions.ts b/packages/create-app/src/lib/versions.ts index 51fa8dff84..db865a2db5 100644 --- a/packages/create-app/src/lib/versions.ts +++ b/packages/create-app/src/lib/versions.ts @@ -55,6 +55,7 @@ import { version as ui } from '../../../ui/package.json'; import { version as pluginApiDocs } from '../../../../plugins/api-docs/package.json'; import { version as pluginAppVisualizer } from '../../../../plugins/app-visualizer/package.json'; import { version as pluginAppBackend } from '../../../../plugins/app-backend/package.json'; +import { version as pluginAppReact } from '../../../../plugins/app-react/package.json'; import { version as pluginAuthBackend } from '../../../../plugins/auth-backend/package.json'; import { version as pluginAuthBackendModuleGithubProvider } from '../../../../plugins/auth-backend-module-github-provider/package.json'; import { version as pluginAuthBackendModuleGuestProvider } from '../../../../plugins/auth-backend-module-guest-provider/package.json'; @@ -118,6 +119,7 @@ export const packageVersions = { '@backstage/repo-tools': repoTools, '@backstage/plugin-api-docs': pluginApiDocs, '@backstage/plugin-app-backend': pluginAppBackend, + '@backstage/plugin-app-react': pluginAppReact, '@backstage/plugin-app-visualizer': pluginAppVisualizer, '@backstage/plugin-auth-backend': pluginAuthBackend, '@backstage/plugin-auth-backend-module-github-provider': diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs index c1e4a51140..4e723ea078 100644 --- a/packages/create-app/templates/default-app/package.json.hbs +++ b/packages/create-app/templates/default-app/package.json.hbs @@ -31,8 +31,8 @@ "devDependencies": { "@backstage/cli": "^{{version '@backstage/cli'}}", "@backstage/e2e-test-utils": "^{{version '@backstage/e2e-test-utils'}}", - "@playwright/test": "^1.32.3", "@jest/environment-jsdom-abstract": "^30.0.0", + "@playwright/test": "^1.32.3", "@types/jest": "^30.0.0", "jest": "^30.2.0", "jsdom": "^27.1.0", diff --git a/packages/create-app/templates/default-app/packages/app/package.json.hbs b/packages/create-app/templates/default-app/packages/app/package.json.hbs index 5152113098..392a00200b 100644 --- a/packages/create-app/templates/default-app/packages/app/package.json.hbs +++ b/packages/create-app/templates/default-app/packages/app/package.json.hbs @@ -45,8 +45,8 @@ "@material-ui/icons": "^4.9.1", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router": "^6.3.0", - "react-router-dom": "^6.3.0" + "react-router": "^6.30.2", + "react-router-dom": "^6.30.2" }, "devDependencies": { "@backstage/test-utils": "^{{version '@backstage/test-utils'}}", diff --git a/packages/create-app/templates/default-app/packages/backend/Dockerfile b/packages/create-app/templates/default-app/packages/backend/Dockerfile index ee80245d8b..a70705fba1 100644 --- a/packages/create-app/templates/default-app/packages/backend/Dockerfile +++ b/packages/create-app/templates/default-app/packages/backend/Dockerfile @@ -12,7 +12,7 @@ # Alternatively, there is also a multi-stage Dockerfile documented here: # https://backstage.io/docs/deployment/docker#multi-stage-build -FROM node:22-bookworm-slim +FROM node:24-trixie-slim # Set Python interpreter for `node-gyp` to use ENV PYTHON=/usr/bin/python3 diff --git a/packages/create-app/templates/next-app/package.json.hbs b/packages/create-app/templates/next-app/package.json.hbs index 55a591067b..80ff4a9a06 100644 --- a/packages/create-app/templates/next-app/package.json.hbs +++ b/packages/create-app/templates/next-app/package.json.hbs @@ -53,7 +53,11 @@ "devDependencies": { "@backstage/cli": "^{{version '@backstage/cli'}}", "@backstage/e2e-test-utils": "^{{version '@backstage/e2e-test-utils'}}", + "@jest/environment-jsdom-abstract": "^30.0.0", "@playwright/test": "^1.32.3", + "@types/jest": "^30.0.0", + "jest": "^30.2.0", + "jsdom": "^27.1.0", "node-gyp": "^10.0.0", "prettier": "^2.3.2", "typescript": "~5.8.0" diff --git a/packages/create-app/templates/next-app/packages/app/package.json.hbs b/packages/create-app/templates/next-app/packages/app/package.json.hbs index 726983fd69..161ca3010d 100644 --- a/packages/create-app/templates/next-app/packages/app/package.json.hbs +++ b/packages/create-app/templates/next-app/packages/app/package.json.hbs @@ -21,21 +21,28 @@ "@backstage/frontend-defaults": "^{{ version '@backstage/frontend-defaults'}}", "@backstage/frontend-plugin-api": "^{{ version '@backstage/frontend-plugin-api'}}", "@backstage/integration-react": "^{{ version '@backstage/integration-react'}}", + "@backstage/plugin-api-docs": "^{{ version '@backstage/plugin-api-docs'}}", + "@backstage/plugin-app-react": "^{{ version '@backstage/plugin-app-react'}}", "@backstage/plugin-app-visualizer": "^{{ version '@backstage/plugin-app-visualizer'}}", "@backstage/plugin-catalog": "^{{ version '@backstage/plugin-catalog'}}", + "@backstage/plugin-catalog-graph": "^{{ version '@backstage/plugin-catalog-graph'}}", + "@backstage/plugin-catalog-import": "^{{ version '@backstage/plugin-catalog-import'}}", + "@backstage/plugin-kubernetes": "^{{ version '@backstage/plugin-kubernetes'}}", "@backstage/plugin-notifications": "^{{ version '@backstage/plugin-notifications'}}", "@backstage/plugin-org": "^{{ version '@backstage/plugin-org'}}", "@backstage/plugin-scaffolder": "^{{ version '@backstage/plugin-scaffolder'}}", "@backstage/plugin-search": "^{{ version '@backstage/plugin-search'}}", "@backstage/plugin-signals": "^{{ version '@backstage/plugin-signals'}}", + "@backstage/plugin-techdocs": "^{{ version '@backstage/plugin-techdocs'}}", + "@backstage/plugin-techdocs-module-addons-contrib": "^{{ version '@backstage/plugin-techdocs-module-addons-contrib'}}", "@backstage/plugin-user-settings": "^{{ version '@backstage/plugin-user-settings'}}", "@backstage/ui": "^{{ version '@backstage/ui'}}", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router": "^6.3.0", - "react-router-dom": "^6.3.0" + "react-router": "^6.30.2", + "react-router-dom": "^6.30.2" }, "devDependencies": { "@backstage/frontend-test-utils": "^{{ version '@backstage/frontend-test-utils'}}", diff --git a/packages/create-app/templates/next-app/packages/app/src/modules/nav/Sidebar.tsx b/packages/create-app/templates/next-app/packages/app/src/modules/nav/Sidebar.tsx index ddfdde64d0..9b7cd7a7e4 100644 --- a/packages/create-app/templates/next-app/packages/app/src/modules/nav/Sidebar.tsx +++ b/packages/create-app/templates/next-app/packages/app/src/modules/nav/Sidebar.tsx @@ -7,7 +7,7 @@ import { } from '@backstage/core-components'; import { compatWrapper } from '@backstage/core-compat-api'; import { Sidebar } from '@backstage/core-components'; -import { NavContentBlueprint } from '@backstage/frontend-plugin-api'; +import { NavContentBlueprint } from '@backstage/plugin-app-react'; import { SidebarLogo } from './SidebarLogo'; import CreateComponentIcon from '@material-ui/icons/AddCircleOutline'; import HomeIcon from '@material-ui/icons/Home'; @@ -15,6 +15,7 @@ import MenuIcon from '@material-ui/icons/Menu'; import SearchIcon from '@material-ui/icons/Search'; import { SidebarSearchModal } from '@backstage/plugin-search'; import { UserSettingsSignInAvatar, Settings as SidebarSettings } from '@backstage/plugin-user-settings'; +import { NotificationsSidebarItem } from '@backstage/plugin-notifications'; export const SidebarContent = NavContentBlueprint.make({ params: { @@ -45,6 +46,8 @@ export const SidebarContent = NavContentBlueprint.make({ + + } diff --git a/packages/create-app/templates/next-app/packages/backend/Dockerfile b/packages/create-app/templates/next-app/packages/backend/Dockerfile index ee80245d8b..a70705fba1 100644 --- a/packages/create-app/templates/next-app/packages/backend/Dockerfile +++ b/packages/create-app/templates/next-app/packages/backend/Dockerfile @@ -12,7 +12,7 @@ # Alternatively, there is also a multi-stage Dockerfile documented here: # https://backstage.io/docs/deployment/docker#multi-stage-build -FROM node:22-bookworm-slim +FROM node:24-trixie-slim # Set Python interpreter for `node-gyp` to use ENV PYTHON=/usr/bin/python3 diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md index 8cee8bab77..198b100a69 100644 --- a/packages/dev-utils/CHANGELOG.md +++ b/packages/dev-utils/CHANGELOG.md @@ -1,5 +1,91 @@ # @backstage/dev-utils +## 1.1.20-next.2 + +### 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/ui@0.12.0-next.2 + - @backstage/plugin-catalog-react@2.0.0-next.2 + - @backstage/core-app-api@1.19.5-next.1 + - @backstage/integration-react@1.2.15-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/app-defaults@1.7.5-next.2 + - @backstage/theme@0.7.2-next.1 + +## 1.1.20-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/ui@0.12.0-next.1 + - @backstage/theme@0.7.2-next.0 + - @backstage/app-defaults@1.7.5-next.1 + - @backstage/core-components@0.18.7-next.1 + - @backstage/integration-react@1.2.15-next.1 + +## 1.1.20-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.6-next.0 + - @backstage/ui@0.12.0-next.0 + - @backstage/core-components@0.18.6-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/core-app-api@1.19.4-next.0 + - @backstage/app-defaults@1.7.5-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/integration-react@1.2.15-next.0 + - @backstage/theme@0.7.1 + +## 1.1.19 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0 + - @backstage/core-components@0.18.5 + - @backstage/app-defaults@1.7.4 + - @backstage/integration-react@1.2.14 + - @backstage/plugin-catalog-react@1.21.5 + +## 1.1.19-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/app-defaults@1.7.4-next.0 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.1 + +## 1.1.19-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-catalog-react@1.21.5-next.0 + +## 1.1.19-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0-next.0 + - @backstage/app-defaults@1.7.3 + - @backstage/catalog-model@1.7.6 + - @backstage/core-app-api@1.19.3 + - @backstage/core-components@0.18.4 + - @backstage/core-plugin-api@1.12.1 + - @backstage/integration-react@1.2.13 + - @backstage/theme@0.7.1 + - @backstage/plugin-catalog-react@1.21.4 + ## 1.1.18 ### Patch Changes diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json index e2c963e40f..c567499e22 100644 --- a/packages/dev-utils/package.json +++ b/packages/dev-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/dev-utils", - "version": "1.1.18", + "version": "1.1.20-next.2", "description": "Utilities for developing Backstage plugins.", "backstage": { "role": "web-library" @@ -59,14 +59,14 @@ "@types/react": "^18.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router-dom": "^6.3.0", + "react-router-dom": "^6.30.2", "zen-observable": "^0.10.0" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/e2e-test-utils/CHANGELOG.md b/packages/e2e-test-utils/CHANGELOG.md index d897a9a63a..47524e8f1f 100644 --- a/packages/e2e-test-utils/CHANGELOG.md +++ b/packages/e2e-test-utils/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/e2e-test-utils +## 0.1.2-next.1 + +### Patch Changes + +- b96c20e: Added optional `channel` option to `generateProjects()` to allow customizing the Playwright browser channel for testing against different browsers variants. When not provided, the function defaults to 'chrome' to maintain backward compatibility. + + Example usage: + + ```ts + import { generateProjects } from '@backstage/e2e-test-utils'; + + export default defineConfig({ + projects: generateProjects({ channel: 'msedge' }), + }); + ``` + +## 0.1.2-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports + ## 0.1.1 ### Patch Changes diff --git a/packages/e2e-test-utils/package.json b/packages/e2e-test-utils/package.json index b3044facf6..834fa31704 100644 --- a/packages/e2e-test-utils/package.json +++ b/packages/e2e-test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/e2e-test-utils", - "version": "0.1.1", + "version": "0.1.2-next.1", "description": "Shared end-to-end test utilities Backstage", "backstage": { "role": "node-library" diff --git a/packages/e2e-test-utils/report-playwright.api.md b/packages/e2e-test-utils/report-playwright.api.md index 7153f2e578..f286c84f4d 100644 --- a/packages/e2e-test-utils/report-playwright.api.md +++ b/packages/e2e-test-utils/report-playwright.api.md @@ -9,7 +9,9 @@ import { PlaywrightTestConfig } from '@playwright/test'; export function failOnBrowserErrors(): void; // @public -export function generateProjects(): PlaywrightTestConfig['projects']; +export function generateProjects(options?: { + channel?: string; +}): PlaywrightTestConfig['projects']; // (No @packageDocumentation comment for this package) ``` diff --git a/packages/e2e-test-utils/src/playwright/generateProjects.ts b/packages/e2e-test-utils/src/playwright/generateProjects.ts index b6f3d159c5..33a30e2813 100644 --- a/packages/e2e-test-utils/src/playwright/generateProjects.ts +++ b/packages/e2e-test-utils/src/playwright/generateProjects.ts @@ -15,7 +15,7 @@ */ import fs from 'fs-extra'; -import { resolve as resolvePath } from 'path'; +import { resolve as resolvePath } from 'node:path'; import { PlaywrightTestConfig } from '@playwright/test'; import { getPackagesSync } from '@manypkg/get-packages'; import type { BackstagePackage } from '@backstage/cli-node'; @@ -24,8 +24,14 @@ import type { BackstagePackage } from '@backstage/cli-node'; * Generates a list of playwright projects by scanning the monorepo for packages with an `e2e-tests/` folder. * * @public + * + * @param options - Optional configuration for the generated Playwright projects. + * When provided, `options.channel` controls the browser channel used for tests. + * Valid values are listed in the [Playwright documentation](https://playwright.dev/docs/api/class-testoptions#test-options-channel). */ -export function generateProjects(): PlaywrightTestConfig['projects'] { +export function generateProjects(options?: { + channel?: string; +}): PlaywrightTestConfig['projects'] { // TODO(Rugvip): Switch this over to use @backstage/cli-node once released, and support SINCE=origin/main const { root, packages } = getPackagesSync(process.cwd()); const e2eTestPackages = [...(root ? [root] : []), ...packages].filter(pkg => { @@ -36,7 +42,7 @@ export function generateProjects(): PlaywrightTestConfig['projects'] { name: pkg.packageJson.name, testDir: resolvePath(pkg.dir, 'e2e-tests'), use: { - channel: 'chrome', + channel: options?.channel ?? 'chrome', }, })); } diff --git a/packages/e2e-test/CHANGELOG.md b/packages/e2e-test/CHANGELOG.md index 3931c55007..badbaf6581 100644 --- a/packages/e2e-test/CHANGELOG.md +++ b/packages/e2e-test/CHANGELOG.md @@ -1,5 +1,31 @@ # e2e-test +## 0.2.37-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.1.18-next.0 + - @backstage/create-app@0.7.9-next.0 + - @backstage/errors@1.2.7 + +## 0.2.36 + +### Patch Changes + +- Updated dependencies + - @backstage/cli-common@0.1.17 + - @backstage/create-app@0.7.8 + +## 0.2.36-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/create-app@0.7.8-next.0 + - @backstage/cli-common@0.1.16 + - @backstage/errors@1.2.7 + ## 0.2.35 ### Patch Changes diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index efceeef449..edc4fbe9d2 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -1,6 +1,6 @@ { "name": "e2e-test", - "version": "0.2.35", + "version": "0.2.37-next.0", "description": "E2E test for verifying Backstage packages", "backstage": { "role": "cli" diff --git a/packages/e2e-test/src/commands/runCommand.ts b/packages/e2e-test/src/commands/runCommand.ts index 112937dbe7..f0701d0e5d 100644 --- a/packages/e2e-test/src/commands/runCommand.ts +++ b/packages/e2e-test/src/commands/runCommand.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import os from 'os'; +import os from 'node:os'; import fs from 'fs-extra'; import fetch from 'cross-fetch'; import handlebars from 'handlebars'; import killTree from 'tree-kill'; -import { resolve as resolvePath, join as joinPath } from 'path'; -import path from 'path'; +import { resolve as resolvePath, join as joinPath } from 'node:path'; +import path from 'node:path'; import { waitFor, print } from '../lib/helpers'; diff --git a/packages/eslint-plugin/CHANGELOG.md b/packages/eslint-plugin/CHANGELOG.md index a823de9ee5..3eb1e96932 100644 --- a/packages/eslint-plugin/CHANGELOG.md +++ b/packages/eslint-plugin/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/eslint-plugin +## 0.2.1-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports + ## 0.2.0 ### Minor Changes diff --git a/packages/eslint-plugin/lib/getPackages.js b/packages/eslint-plugin/lib/getPackages.js index 68739d358b..d4ed1b6372 100644 --- a/packages/eslint-plugin/lib/getPackages.js +++ b/packages/eslint-plugin/lib/getPackages.js @@ -16,7 +16,7 @@ // @ts-check -const path = require('path'); +const path = require('node:path'); const manypkg = require('@manypkg/get-packages'); /** diff --git a/packages/eslint-plugin/lib/visitImports.js b/packages/eslint-plugin/lib/visitImports.js index 376c37575f..85c5ac0568 100644 --- a/packages/eslint-plugin/lib/visitImports.js +++ b/packages/eslint-plugin/lib/visitImports.js @@ -16,7 +16,7 @@ // @ts-check -const { builtinModules } = require('module'); +const { builtinModules } = require('node:module'); const getPackages = require('./getPackages'); /** diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 13db908e16..e8ee18ed8c 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/eslint-plugin", - "version": "0.2.0", + "version": "0.2.1-next.0", "description": "Backstage ESLint plugin", "publishConfig": { "access": "public" diff --git a/packages/eslint-plugin/rules/no-relative-monorepo-imports.js b/packages/eslint-plugin/rules/no-relative-monorepo-imports.js index df30d35f67..107e21049f 100644 --- a/packages/eslint-plugin/rules/no-relative-monorepo-imports.js +++ b/packages/eslint-plugin/rules/no-relative-monorepo-imports.js @@ -16,7 +16,7 @@ // @ts-check -const path = require('path'); +const path = require('node:path'); const visitImports = require('../lib/visitImports'); const getPackageMap = require('../lib/getPackages'); diff --git a/packages/eslint-plugin/rules/no-undeclared-imports.js b/packages/eslint-plugin/rules/no-undeclared-imports.js index 17331d2fce..6ca02d49f7 100644 --- a/packages/eslint-plugin/rules/no-undeclared-imports.js +++ b/packages/eslint-plugin/rules/no-undeclared-imports.js @@ -16,11 +16,11 @@ // @ts-check -const path = require('path'); +const path = require('node:path'); const getPackageMap = require('../lib/getPackages'); const visitImports = require('../lib/visitImports'); const minimatch = require('minimatch'); -const { execFileSync } = require('child_process'); +const { execFileSync } = require('node:child_process'); const depFields = /** @type {const} */ ({ dep: 'dependencies', diff --git a/packages/eslint-plugin/src/no-forbidden-package-imports.test.ts b/packages/eslint-plugin/src/no-forbidden-package-imports.test.ts index c46f82f4fc..c7407cd388 100644 --- a/packages/eslint-plugin/src/no-forbidden-package-imports.test.ts +++ b/packages/eslint-plugin/src/no-forbidden-package-imports.test.ts @@ -15,7 +15,7 @@ */ import { RuleTester } from 'eslint'; -import path from 'path'; +import path from 'node:path'; import rule from '../rules/no-forbidden-package-imports'; const RULE = 'no-forbidden-package-imports'; diff --git a/packages/eslint-plugin/src/no-mixed-plugin-imports.test.ts b/packages/eslint-plugin/src/no-mixed-plugin-imports.test.ts index 45764ca71a..1c97ad2767 100644 --- a/packages/eslint-plugin/src/no-mixed-plugin-imports.test.ts +++ b/packages/eslint-plugin/src/no-mixed-plugin-imports.test.ts @@ -15,7 +15,7 @@ */ import { RuleTester } from 'eslint'; -import path from 'path'; +import path from 'node:path'; import rule from '../rules/no-mixed-plugin-imports'; const RULE = 'no-mixed-plugin-imports'; diff --git a/packages/eslint-plugin/src/no-relative-monorepo-imports.test.ts b/packages/eslint-plugin/src/no-relative-monorepo-imports.test.ts index 31e1674b76..6ffa66ccab 100644 --- a/packages/eslint-plugin/src/no-relative-monorepo-imports.test.ts +++ b/packages/eslint-plugin/src/no-relative-monorepo-imports.test.ts @@ -15,7 +15,7 @@ */ import { RuleTester } from 'eslint'; -import path from 'path'; +import path from 'node:path'; import rule from '../rules/no-relative-monorepo-imports'; const RULE = 'no-relative-monorepo-imports'; diff --git a/packages/eslint-plugin/src/no-ui-css-imports-in-non-frontend.test.ts b/packages/eslint-plugin/src/no-ui-css-imports-in-non-frontend.test.ts index 373659ae6e..9e8ded54bc 100644 --- a/packages/eslint-plugin/src/no-ui-css-imports-in-non-frontend.test.ts +++ b/packages/eslint-plugin/src/no-ui-css-imports-in-non-frontend.test.ts @@ -15,7 +15,7 @@ */ import { RuleTester } from 'eslint'; -import path from 'path'; +import path from 'node:path'; import rule from '../rules/no-ui-css-imports-in-non-frontend'; const RULE = 'no-ui-css-imports-in-non-frontend'; diff --git a/packages/eslint-plugin/src/no-undeclared-imports.test.ts b/packages/eslint-plugin/src/no-undeclared-imports.test.ts index 7127d2f344..0021dd0636 100644 --- a/packages/eslint-plugin/src/no-undeclared-imports.test.ts +++ b/packages/eslint-plugin/src/no-undeclared-imports.test.ts @@ -15,7 +15,7 @@ */ import { RuleTester } from 'eslint'; -import { join as joinPath } from 'path'; +import { join as joinPath } from 'node:path'; import rule from '../rules/no-undeclared-imports'; jest.mock('child_process', () => ({ diff --git a/packages/filter-predicates/.eslintrc.js b/packages/filter-predicates/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/packages/filter-predicates/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/packages/filter-predicates/CHANGELOG.md b/packages/filter-predicates/CHANGELOG.md new file mode 100644 index 0000000000..e25eb3fc38 --- /dev/null +++ b/packages/filter-predicates/CHANGELOG.md @@ -0,0 +1,7 @@ +# @backstage/filter-predicates + +## 0.1.0-next.0 + +### Minor Changes + +- 7feb83b: Introduced package, basically as the extracted predicate types from `@backstage/plugin-catalog-react/alpha` diff --git a/packages/filter-predicates/README.md b/packages/filter-predicates/README.md new file mode 100644 index 0000000000..e8f70fe5aa --- /dev/null +++ b/packages/filter-predicates/README.md @@ -0,0 +1,18 @@ +# @backstage/filter-predicates + +Contains types and implementations related to the concept of +[filter predicate expressions](https://backstage.io/docs/features/software-catalog/catalog-customization#entity-predicate-queries). + +These allow you to uniformly express filters, including logical operators and +advanced matchers, for filtering through structured data. + +Example: + +```json +{ + "filter": { + "kind": "Component", + "spec.type": { "$in": ["service", "website"] } + } +} +``` diff --git a/packages/filter-predicates/catalog-info.yaml b/packages/filter-predicates/catalog-info.yaml new file mode 100644 index 0000000000..63be7ba015 --- /dev/null +++ b/packages/filter-predicates/catalog-info.yaml @@ -0,0 +1,10 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: backstage-filter-predicates + title: '@backstage/filter-predicates' + description: A library for expressing filter predicates and evaluating them against values +spec: + lifecycle: experimental + type: backstage-common-library + owner: framework-maintainers diff --git a/packages/filter-predicates/package.json b/packages/filter-predicates/package.json new file mode 100644 index 0000000000..7f90ab1391 --- /dev/null +++ b/packages/filter-predicates/package.json @@ -0,0 +1,48 @@ +{ + "name": "@backstage/filter-predicates", + "version": "0.1.0-next.0", + "description": "A library for expressing filter predicates and evaluating them against values", + "backstage": { + "role": "common-library" + }, + "publishConfig": { + "access": "public", + "main": "dist/index.cjs.js", + "module": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "keywords": [ + "backstage" + ], + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "packages/filter-predicates" + }, + "license": "Apache-2.0", + "sideEffects": false, + "main": "src/index.ts", + "types": "src/index.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "backstage-cli package build", + "clean": "backstage-cli package clean", + "lint": "backstage-cli package lint", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "test": "backstage-cli package test" + }, + "dependencies": { + "@backstage/config": "workspace:^", + "@backstage/errors": "workspace:^", + "@backstage/types": "workspace:^", + "zod": "^3.25.76", + "zod-validation-error": "^4.0.2" + }, + "devDependencies": { + "@backstage/cli": "workspace:^" + } +} diff --git a/packages/filter-predicates/report.api.md b/packages/filter-predicates/report.api.md new file mode 100644 index 0000000000..76edeb61d2 --- /dev/null +++ b/packages/filter-predicates/report.api.md @@ -0,0 +1,107 @@ +## API Report File for "@backstage/filter-predicates" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { Config } from '@backstage/config'; +import { JsonValue } from '@backstage/types'; +import * as zodV3 from 'zod/v3'; + +// @public +export function createZodV3FilterPredicateSchema( + z: typeof zodV3.z, +): zodV3.ZodType; + +// @public +export function evaluateFilterPredicate( + predicate: FilterPredicate, + value: unknown, +): boolean; + +// @public +export type FilterPredicate = + | FilterPredicateExpression + | FilterPredicatePrimitive + | { + $all: FilterPredicate[]; + } + | { + $any: FilterPredicate[]; + } + | { + $not: FilterPredicate; + } + | UnknownFilterPredicateOperator; + +// @public +export type FilterPredicateExpression = { + [KPath in string]: FilterPredicateValue; +} & { + [KPath in `$${string}`]: never; +}; + +// @public +export type FilterPredicatePrimitive = string | number | boolean; + +// @public +export function filterPredicateToFilterFunction( + predicate: FilterPredicate, +): (value: T) => boolean; + +// @public +export type FilterPredicateValue = + | FilterPredicatePrimitive + | { + $exists: boolean; + } + | { + $in: FilterPredicatePrimitive[]; + } + | { + $contains: FilterPredicate; + } + | { + $hasPrefix: string; + } + | UnknownFilterPredicateValueMatcher; + +// @public +export function getJsonValueAtPath( + value: JsonValue | undefined, + path: string, +): JsonValue | undefined; + +// @public +export function parseFilterPredicate(value: unknown): FilterPredicate; + +// @public +export function readFilterPredicateFromConfig( + config: Config, + options?: ReadFilterPredicateFromConfigOptions, +): FilterPredicate; + +// @public +export interface ReadFilterPredicateFromConfigOptions { + key?: string; +} + +// @public +export function readOptionalFilterPredicateFromConfig( + config: Config, + options?: ReadFilterPredicateFromConfigOptions, +): FilterPredicate | undefined; + +// @public +export type UnknownFilterPredicateOperator = { + [KOperator in `$${string}`]: JsonValue; +} & { + [KOperator in '$all' | '$any' | '$not']: never; +}; + +// @public +export type UnknownFilterPredicateValueMatcher = { + [KMatcher in `$${string}`]: JsonValue; +} & { + [KMatcher in '$exists' | '$in' | '$contains' | '$hasPrefix']: never; +}; +``` diff --git a/packages/filter-predicates/src/index.ts b/packages/filter-predicates/src/index.ts new file mode 100644 index 0000000000..414b4127a5 --- /dev/null +++ b/packages/filter-predicates/src/index.ts @@ -0,0 +1,23 @@ +/* + * 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. + */ + +/** + * Contains types and implementations related to the concept of filter predicate expressions. + * + * @packageDocumentation + */ + +export * from './predicates'; diff --git a/packages/filter-predicates/src/predicates/config.test.ts b/packages/filter-predicates/src/predicates/config.test.ts new file mode 100644 index 0000000000..494e707f40 --- /dev/null +++ b/packages/filter-predicates/src/predicates/config.test.ts @@ -0,0 +1,112 @@ +/* + * 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 { ConfigReader } from '@backstage/config'; +import { + readFilterPredicateFromConfig, + readOptionalFilterPredicateFromConfig, +} from './config'; + +describe('readFilterPredicateFromConfig', () => { + it('should read a filter predicate from config', () => { + const config = new ConfigReader({ + predicate: { kind: 'component', 'spec.type': 'service' }, + }); + + const result = readFilterPredicateFromConfig(config, { key: 'predicate' }); + + expect(result).toEqual({ kind: 'component', 'spec.type': 'service' }); + }); + + it('should read a filter predicate from the root config', () => { + const config = new ConfigReader({ + kind: 'component', + 'spec.type': 'service', + }); + + const result = readFilterPredicateFromConfig(config); + + expect(result).toEqual({ kind: 'component', 'spec.type': 'service' }); + }); + + it('should throw when filter predicate is missing', () => { + const config = new ConfigReader({}); + + expect(() => + readFilterPredicateFromConfig(config, { key: 'predicate' }), + ).toThrow(/predicate/); + }); + + it('should throw when filter predicate is invalid', () => { + const config = new ConfigReader({ + predicate: { kind: { $invalid: 'foo' } }, + }); + + expect(() => + readFilterPredicateFromConfig(config, { key: 'predicate' }), + ).toThrow(/Could not read filter predicate from config at 'predicate':/); + }); +}); + +describe('readOptionalFilterPredicateFromConfig', () => { + it('should read a filter predicate from config', () => { + const config = new ConfigReader({ + predicate: { kind: 'component' }, + }); + + const result = readOptionalFilterPredicateFromConfig(config, { + key: 'predicate', + }); + + expect(result).toEqual({ kind: 'component' }); + }); + + it('should return undefined when filter predicate is missing', () => { + const config = new ConfigReader({}); + + const result = readOptionalFilterPredicateFromConfig(config, { + key: 'predicate', + }); + + expect(result).toBeUndefined(); + }); + + it('should throw when filter predicate is invalid', () => { + const config = new ConfigReader({ + predicate: { kind: { $invalid: 'foo' } }, + }); + + expect(() => + readOptionalFilterPredicateFromConfig(config, { key: 'predicate' }), + ).toThrow(/Could not read filter predicate from config at 'predicate':/); + }); + + it('should read complex filter predicates', () => { + const config = new ConfigReader({ + filter: { + $any: [{ kind: 'component', 'spec.type': 'service' }, { kind: 'api' }], + }, + }); + + const result = readOptionalFilterPredicateFromConfig(config, { + key: 'filter', + }); + + expect(result).toEqual({ + $any: [{ kind: 'component', 'spec.type': 'service' }, { kind: 'api' }], + }); + }); +}); diff --git a/packages/filter-predicates/src/predicates/config.ts b/packages/filter-predicates/src/predicates/config.ts new file mode 100644 index 0000000000..12f0620523 --- /dev/null +++ b/packages/filter-predicates/src/predicates/config.ts @@ -0,0 +1,75 @@ +/* + * 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 { Config } from '@backstage/config'; +import { InputError, stringifyError } from '@backstage/errors'; +import { parseFilterPredicate } from './schema'; +import { FilterPredicate } from './types'; + +/** + * Options for {@link readFilterPredicateFromConfig} and {@link readOptionalFilterPredicateFromConfig}. + * + * @public + */ +export interface ReadFilterPredicateFromConfigOptions { + /** + * The key to read from the config. If not provided, the entire config is used. + */ + key?: string; +} + +/** + * Read a filter predicate expression from a config object. + * + * @public + */ +export function readFilterPredicateFromConfig( + config: Config, + options?: ReadFilterPredicateFromConfigOptions, +): FilterPredicate { + const key = options?.key; + const value = key ? config.get(key) : config.get(); + + try { + return parseFilterPredicate(value); + } catch (error) { + const where = key ? ` at '${key}'` : ''; + throw new InputError( + `Could not read filter predicate from config${where}: ${stringifyError( + error, + )}`, + ); + } +} + +/** + * Read an optional filter predicate expression from a config object. + * + * @public + */ +export function readOptionalFilterPredicateFromConfig( + config: Config, + options?: ReadFilterPredicateFromConfigOptions, +): FilterPredicate | undefined { + const key = options?.key; + const value = key ? config.getOptional(key) : config.getOptional(); + + if (value === undefined) { + return undefined; + } + + return readFilterPredicateFromConfig(config, options); +} diff --git a/plugins/catalog-react/src/alpha/predicates/entityPredicateToFilterFunction.test.ts b/packages/filter-predicates/src/predicates/evaluate.test.ts similarity index 79% rename from plugins/catalog-react/src/alpha/predicates/entityPredicateToFilterFunction.test.ts rename to packages/filter-predicates/src/predicates/evaluate.test.ts index 152230de7c..6eb54c3c92 100644 --- a/plugins/catalog-react/src/alpha/predicates/entityPredicateToFilterFunction.test.ts +++ b/packages/filter-predicates/src/predicates/evaluate.test.ts @@ -14,10 +14,13 @@ * limitations under the License. */ -import { entityPredicateToFilterFunction } from './entityPredicateToFilterFunction'; -import { EntityPredicate } from './types'; +import { + evaluateFilterPredicate, + filterPredicateToFilterFunction, +} from './evaluate'; +import { FilterPredicate } from './types'; -describe('entityPredicateToFilterFunction', () => { +describe('evaluate', () => { const entities = [ { apiVersion: 'backstage.io/v1alpha1', @@ -129,7 +132,7 @@ describe('entityPredicateToFilterFunction', () => { }, ]; - it.each([ + describe.each([ ['s', { kind: 'component', 'spec.type': 'service' }], ['s', { 'metadata.tags': { $contains: 'java' } }], [ @@ -186,7 +189,7 @@ describe('entityPredicateToFilterFunction', () => { metadata: { $contains: { name: 'a' } }, }, ], - ['', { $unknown: 'ignored' } as unknown as EntityPredicate], + ['', { $unknown: 'ignored' } as unknown as FilterPredicate], [ 's,w', { kind: 'component', 'spec.type': { $in: ['service', 'website'] } }, @@ -234,12 +237,33 @@ describe('entityPredicateToFilterFunction', () => { 'metadata.annotations.github.com/repo': { $exists: true }, }, ], + ['a', { 'spec.type': { $hasPrefix: 'g' } }], ])('filter entry %#', (expected, filter) => { - const filtered = entities.filter(entity => - entityPredicateToFilterFunction(filter)(entity), - ); - expect(filtered.map(e => e.metadata.name).sort()).toEqual( - expected.split(',').filter(Boolean).sort(), - ); + it('filterPredicateToFilterFunction', () => { + const filtered = entities.filter(entity => + filterPredicateToFilterFunction(filter)(entity), + ); + expect(filtered.map(e => e.metadata.name).sort()).toEqual( + expected.split(',').filter(Boolean).sort(), + ); + }); + + it('evaluateFilterPredicate', () => { + const filtered = entities.filter(entity => + evaluateFilterPredicate(filter, entity), + ); + expect(filtered.map(e => e.metadata.name).sort()).toEqual( + expected.split(',').filter(Boolean).sort(), + ); + }); + }); + + it('handles unknown filter predicate operators and matchers', () => { + const operator = { $unknown: 'foo' } as unknown as FilterPredicate; + const value = { kind: { $unknown: 'foo' } } as unknown as FilterPredicate; + expect(evaluateFilterPredicate(operator, entities[0])).toBe(false); + expect(evaluateFilterPredicate(value, entities[0])).toBe(false); + expect(filterPredicateToFilterFunction(operator)(entities[0])).toBe(false); + expect(filterPredicateToFilterFunction(value)(entities[0])).toBe(false); }); }); diff --git a/plugins/catalog-react/src/alpha/predicates/entityPredicateToFilterFunction.ts b/packages/filter-predicates/src/predicates/evaluate.ts similarity index 53% rename from plugins/catalog-react/src/alpha/predicates/entityPredicateToFilterFunction.ts rename to packages/filter-predicates/src/predicates/evaluate.ts index f223911992..2006265004 100644 --- a/plugins/catalog-react/src/alpha/predicates/entityPredicateToFilterFunction.ts +++ b/packages/filter-predicates/src/predicates/evaluate.ts @@ -15,51 +15,48 @@ */ import { JsonValue } from '@backstage/types'; -import { EntityPredicate, EntityPredicateValue } from './types'; -import { valueAtPath } from './valueAtPath'; +import { FilterPredicate, FilterPredicateValue } from './types'; +import { getJsonValueAtPath } from './getJsonValueAtPath'; /** - * Convert an entity predicate to a filter function that can be used to filter entities. - * @alpha - */ -export function entityPredicateToFilterFunction( - entityPredicate: EntityPredicate, -): (value: T) => boolean { - return value => evaluateEntityPredicate(entityPredicate, value); -} - -/** - * Evaluate a entity predicate against a value, typically an entity. + * Evaluate a filter predicate against a value. * - * @internal + * @public */ -function evaluateEntityPredicate( - filter: EntityPredicate, - value: JsonValue, +export function evaluateFilterPredicate( + predicate: FilterPredicate, + value: unknown, ): boolean { - if (typeof filter !== 'object' || filter === null || Array.isArray(filter)) { - return valuesAreEqual(value, filter); + if ( + typeof predicate !== 'object' || + predicate === null || + Array.isArray(predicate) + ) { + return valuesAreEqual(value, predicate); } - if ('$all' in filter) { - return filter.$all.every(f => evaluateEntityPredicate(f, value)); + if ('$all' in predicate) { + return predicate.$all.every(f => evaluateFilterPredicate(f, value)); } - if ('$any' in filter) { - return filter.$any.some(f => evaluateEntityPredicate(f, value)); + if ('$any' in predicate) { + return predicate.$any.some(f => evaluateFilterPredicate(f, value)); } - if ('$not' in filter) { - return !evaluateEntityPredicate(filter.$not, value); + if ('$not' in predicate) { + return !evaluateFilterPredicate(predicate.$not, value); } - for (const filterKey in filter) { - if (!Object.hasOwn(filter, filterKey)) { + for (const filterKey in predicate) { + if (!Object.hasOwn(predicate, filterKey)) { continue; } if (filterKey.startsWith('$')) { return false; } if ( - !evaluatePredicateValue(filter[filterKey], valueAtPath(value, filterKey)) + !evaluateFilterPredicateValue( + predicate[filterKey], + getJsonValueAtPath(value as JsonValue, filterKey), + ) ) { return false; } @@ -69,13 +66,24 @@ function evaluateEntityPredicate( } /** - * Evaluate a single value against a predicate value. + * Convert a filter predicate to a filter function. + * + * @public + */ +export function filterPredicateToFilterFunction( + predicate: FilterPredicate, +): (value: T) => boolean { + return value => evaluateFilterPredicate(predicate, value); +} + +/** + * Evaluate a single value against a filter predicate value. * * @internal */ -function evaluatePredicateValue( - filter: EntityPredicateValue, - value: JsonValue | undefined, +function evaluateFilterPredicateValue( + filter: FilterPredicateValue, + value: unknown, ): boolean { if (typeof filter !== 'object' || filter === null || Array.isArray(filter)) { return valuesAreEqual(value, filter); @@ -85,7 +93,7 @@ function evaluatePredicateValue( if (!Array.isArray(value)) { return false; } - return value.some(v => evaluateEntityPredicate(filter.$contains, v)); + return value.some(v => evaluateFilterPredicate(filter.$contains, v)); } if ('$in' in filter) { return filter.$in.some(search => valuesAreEqual(value, search)); @@ -96,14 +104,19 @@ function evaluatePredicateValue( } return value === undefined; } + if ('$hasPrefix' in filter) { + if (typeof value !== 'string') { + return false; + } + return value + .toLocaleUpperCase('en-US') + .startsWith(filter.$hasPrefix.toLocaleUpperCase('en-US')); + } return false; } -function valuesAreEqual( - a: JsonValue | undefined, - b: JsonValue | undefined, -): boolean { +function valuesAreEqual(a: unknown, b: unknown): boolean { if (a === null || b === null) { return false; } diff --git a/plugins/catalog-react/src/alpha/predicates/valueAtPath.test.ts b/packages/filter-predicates/src/predicates/getJsonValueAtPath.test.ts similarity index 92% rename from plugins/catalog-react/src/alpha/predicates/valueAtPath.test.ts rename to packages/filter-predicates/src/predicates/getJsonValueAtPath.test.ts index 7ea563e4a1..40421232f4 100644 --- a/plugins/catalog-react/src/alpha/predicates/valueAtPath.test.ts +++ b/packages/filter-predicates/src/predicates/getJsonValueAtPath.test.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { valueAtPath } from './valueAtPath'; +import { getJsonValueAtPath } from './getJsonValueAtPath'; -describe('valueAtPath', () => { +describe('getJsonValueAtPath', () => { const subject = { name: 'Test', fields: { @@ -58,6 +58,6 @@ describe('valueAtPath', () => { ['mixed.annotations.example.com/description', 'A test subject'], ['mixed.annotations.long.domain.example.com/custom', 'long'], ])(`should find value at path %s`, (path, expected) => { - expect(valueAtPath(subject, path)).toEqual(expected); + expect(getJsonValueAtPath(subject, path)).toEqual(expected); }); }); diff --git a/plugins/catalog-react/src/alpha/predicates/valueAtPath.ts b/packages/filter-predicates/src/predicates/getJsonValueAtPath.ts similarity index 95% rename from plugins/catalog-react/src/alpha/predicates/valueAtPath.ts rename to packages/filter-predicates/src/predicates/getJsonValueAtPath.ts index acb46995d8..2dc982d896 100644 --- a/plugins/catalog-react/src/alpha/predicates/valueAtPath.ts +++ b/packages/filter-predicates/src/predicates/getJsonValueAtPath.ts @@ -27,9 +27,9 @@ import { JsonValue } from '@backstage/types'; * * This lookup does not traverse into arrays, returning `undefined` instead. * - * @internal + * @public */ -export function valueAtPath( +export function getJsonValueAtPath( value: JsonValue | undefined, path: string, ): JsonValue | undefined { @@ -55,7 +55,7 @@ export function valueAtPath( } } if (path.startsWith(`${valueKey}.`)) { - const found = valueAtPath( + const found = getJsonValueAtPath( value[valueKey], path.slice(valueKey.length + 1), ); diff --git a/packages/filter-predicates/src/predicates/index.ts b/packages/filter-predicates/src/predicates/index.ts new file mode 100644 index 0000000000..5684c7e62f --- /dev/null +++ b/packages/filter-predicates/src/predicates/index.ts @@ -0,0 +1,38 @@ +/* + * 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. + */ + +export { + readFilterPredicateFromConfig, + readOptionalFilterPredicateFromConfig, +} from './config'; +export type { ReadFilterPredicateFromConfigOptions } from './config'; +export { + evaluateFilterPredicate, + filterPredicateToFilterFunction, +} from './evaluate'; +export { getJsonValueAtPath } from './getJsonValueAtPath'; +export { + createZodV3FilterPredicateSchema, + parseFilterPredicate, +} from './schema'; +export type { + FilterPredicate, + FilterPredicateExpression, + FilterPredicatePrimitive, + FilterPredicateValue, + UnknownFilterPredicateOperator, + UnknownFilterPredicateValueMatcher, +} from './types'; diff --git a/packages/filter-predicates/src/predicates/schema.test.ts b/packages/filter-predicates/src/predicates/schema.test.ts new file mode 100644 index 0000000000..08c92c20e8 --- /dev/null +++ b/packages/filter-predicates/src/predicates/schema.test.ts @@ -0,0 +1,221 @@ +/* + * 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 { z } from 'zod'; +import { + createZodV3FilterPredicateSchema, + parseFilterPredicate, +} from './schema'; +import { FilterPredicate } from './types'; + +describe('createZodV3FilterPredicateSchema', () => { + const schema = createZodV3FilterPredicateSchema(z); + + describe('valid predicates', () => { + const predicates: FilterPredicate[] = [ + 'string', + '', + 1, + { kind: 'component', 'spec.type': 'service' }, + { 'metadata.tags': { $in: ['java'] } }, + { 'metadata.tags': { $contains: 'java' } }, + { + $all: [ + { 'metadata.tags': { $contains: 'java' } }, + { 'metadata.tags': { $contains: 'spring' } }, + ], + }, + { 'metadata.tags': { $in: ['go'] } }, + { 'metadata.tags.0': 'java' }, + { $not: { 'metadata.tags': { $in: ['java'] } } }, + { + $any: [ + { kind: 'component', 'spec.type': 'service' }, + { kind: 'group' }, + ], + }, + { + relations: { + $contains: { type: 'ownedBy', targetRef: 'group:default/g' }, + }, + }, + { + metadata: { $contains: { name: 'a' } }, + }, + { kind: 'component', 'spec.type': { $in: ['service', 'website'] } }, + { + $any: [ + { + $all: [ + { + kind: 'component', + 'spec.type': { $in: ['service', 'website'] }, + }, + ], + }, + { $all: [{ kind: 'api', 'spec.type': 'grpc' }] }, + ], + }, + { kind: 'component', 'spec.type': { $in: ['service'] } }, + { 'spec.owner': { $exists: true } }, + { 'spec.owner': { $exists: false } }, + { 'spec.type': 'service' }, + { $not: { 'spec.type': 'service' } }, + { + kind: 'component', + 'metadata.annotations.github.com/repo': { $exists: true }, + }, + { $all: [{ x: { $exists: true } }] }, + { $any: [{ x: { $exists: true } }] }, + { $not: { x: { $exists: true } } }, + { $not: { $all: [{ x: { $exists: true } }] } }, + ]; + + it.each(predicates)('should accept valid predicate %j', predicate => { + expect(schema.parse(predicate)).toEqual(predicate); + }); + }); + + describe('invalid predicates', () => { + const predicates: Array< + Exclude + > = [ + [], + ['foo', 'bar'], + { kind: { 1: 'foo' } }, + { kind: { foo: 'bar' } }, + { kind: { $unknown: 'foo' } }, + { kind: { $in: 'foo' } }, + { kind: { $in: [{ x: 'foo' }] } }, + { kind: { $in: [{ x: 'foo' }] } }, + { 'spec.type': null }, + { $all: [{ x: { $unknown: true } }] }, + { $any: [{ x: { $unknown: true } }] }, + { $not: { x: { $unknown: true } } }, + { $not: { $all: [{ x: { $unknown: true } }] } }, + { $unknown: 'foo' }, + { 'metadata.tags': ['foo', 'bar'] }, + ]; + + it.each(predicates)('should reject invalid predicate %j', predicate => { + const result = schema.safeParse(predicate); + expect(result.success).toBe(false); + }); + }); +}); + +describe('parseFilterPredicate', () => { + describe('valid predicates', () => { + const predicates: FilterPredicate[] = [ + 'string', + '', + 1, + { kind: 'component', 'spec.type': 'service' }, + { 'metadata.tags': { $in: ['java'] } }, + { 'metadata.tags': { $contains: 'java' } }, + { + $all: [ + { 'metadata.tags': { $contains: 'java' } }, + { 'metadata.tags': { $contains: 'spring' } }, + ], + }, + { 'metadata.tags': { $in: ['go'] } }, + { 'metadata.tags.0': 'java' }, + { $not: { 'metadata.tags': { $in: ['java'] } } }, + { + $any: [ + { kind: 'component', 'spec.type': 'service' }, + { kind: 'group' }, + ], + }, + { + relations: { + $contains: { type: 'ownedBy', targetRef: 'group:default/g' }, + }, + }, + { + metadata: { $contains: { name: 'a' } }, + }, + { kind: 'component', 'spec.type': { $in: ['service', 'website'] } }, + { + $any: [ + { + $all: [ + { + kind: 'component', + 'spec.type': { $in: ['service', 'website'] }, + }, + ], + }, + { $all: [{ kind: 'api', 'spec.type': 'grpc' }] }, + ], + }, + { kind: 'component', 'spec.type': { $in: ['service'] } }, + { 'spec.owner': { $exists: true } }, + { 'spec.owner': { $exists: false } }, + { 'spec.type': 'service' }, + { $not: { 'spec.type': 'service' } }, + { + kind: 'component', + 'metadata.annotations.github.com/repo': { $exists: true }, + }, + { $all: [{ x: { $exists: true } }] }, + { $any: [{ x: { $exists: true } }] }, + { $not: { x: { $exists: true } } }, + { $not: { $all: [{ x: { $exists: true } }] } }, + { kind: { $hasPrefix: 'Com' } }, + ]; + + it.each(predicates)( + 'should return the predicate for valid input %j', + predicate => { + expect(parseFilterPredicate(predicate)).toEqual(predicate); + }, + ); + }); + + describe('invalid predicates', () => { + const predicates: Array< + Exclude + > = [ + [], + ['foo', 'bar'], + { kind: { 1: 'foo' } }, + { kind: { foo: 'bar' } }, + { kind: { $unknown: 'foo' } }, + { kind: { $in: 'foo' } }, + { kind: { $in: [{ x: 'foo' }] } }, + { kind: { $in: [{ x: 'foo' }] } }, + { 'spec.type': null }, + { $all: [{ x: { $unknown: true } }] }, + { $any: [{ x: { $unknown: true } }] }, + { $not: { x: { $unknown: true } } }, + { $not: { $all: [{ x: { $unknown: true } }] } }, + { $unknown: 'foo' }, + { kind: { $hasPrefix: 1 } }, + { 'metadata.tags': ['foo', 'bar'] }, + ]; + + it.each(predicates)( + 'should throw InputError for invalid predicate %j', + predicate => { + expect(() => parseFilterPredicate(predicate)).toThrow( + /Invalid filter predicate/, + ); + }, + ); + }); +}); diff --git a/plugins/catalog-react/src/alpha/predicates/createEntityPredicateSchema.ts b/packages/filter-predicates/src/predicates/schema.ts similarity index 52% rename from plugins/catalog-react/src/alpha/predicates/createEntityPredicateSchema.ts rename to packages/filter-predicates/src/predicates/schema.ts index 3e31ec4d35..81652786c6 100644 --- a/plugins/catalog-react/src/alpha/predicates/createEntityPredicateSchema.ts +++ b/packages/filter-predicates/src/predicates/schema.ts @@ -14,31 +14,39 @@ * limitations under the License. */ +import { InputError } from '@backstage/errors'; +import { fromZodError } from 'zod-validation-error/v3'; +import * as zodV3 from 'zod/v3'; import { - EntityPredicate, - EntityPredicateExpression, - EntityPredicatePrimitive, - EntityPredicateValue, + FilterPredicate, + FilterPredicateExpression, + FilterPredicatePrimitive, + FilterPredicateValue, } from './types'; -import type { z as zImpl, ZodType } from 'zod'; -/** @internal */ -export function createEntityPredicateSchema(z: typeof zImpl) { +/** + * Create a Zod schema for validating filter predicates. + * + * @public + */ +export function createZodV3FilterPredicateSchema( + z: typeof zodV3.z, +): zodV3.ZodType { const primitiveSchema = z.union([ z.string(), z.number(), z.boolean(), - ]) as ZodType; + ]) as zodV3.ZodType; // eslint-disable-next-line prefer-const - let valuePredicateSchema: ZodType; + let valuePredicateSchema: zodV3.ZodType; const expressionSchema = z.lazy(() => z.union([ z.record(z.string().regex(/^(?!\$).*$/), valuePredicateSchema), z.record(z.string().regex(/^\$/), z.never()), ]), - ) as ZodType; + ) as zodV3.ZodType; const predicateSchema = z.lazy(() => z.union([ @@ -48,14 +56,34 @@ export function createEntityPredicateSchema(z: typeof zImpl) { z.object({ $any: z.array(predicateSchema) }), z.object({ $not: predicateSchema }), ]), - ) as ZodType; + ) as zodV3.ZodType; valuePredicateSchema = z.union([ primitiveSchema, z.object({ $exists: z.boolean() }), z.object({ $in: z.array(primitiveSchema) }), z.object({ $contains: predicateSchema }), - ]) as ZodType; + z.object({ $hasPrefix: z.string() }), + ]) as zodV3.ZodType; return predicateSchema; } + +/** + * Parses a value to check that it's a valid filter predicate. + * + * @public + * @param value - The value to parse. + * @returns A valid filter predicate. + * @throws An error if the value is not a valid filter predicate. + */ +export function parseFilterPredicate(value: unknown): FilterPredicate { + const schema = createZodV3FilterPredicateSchema(zodV3.z); + const result = schema.safeParse(value); + if (!result.success) { + throw new InputError( + `Invalid filter predicate: ${fromZodError(result.error)}`, + ); + } + return result.data; +} diff --git a/packages/filter-predicates/src/predicates/types.ts b/packages/filter-predicates/src/predicates/types.ts new file mode 100644 index 0000000000..8c5b298719 --- /dev/null +++ b/packages/filter-predicates/src/predicates/types.ts @@ -0,0 +1,200 @@ +/* + * 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 { JsonValue } from '@backstage/types'; + +/** + * Represents future additions to the set of filter predicate operators. + * + * @remarks + * + * If you write code that explicitly inspects filter predicate expressions, you + * should be ready for the appearance of such operators and deliberately + * gracefully fail to match them. + * + * @public + */ +export type UnknownFilterPredicateOperator = { + [KOperator in `$${string}`]: JsonValue; +} & { + [KOperator in '$all' | '$any' | '$not']: never; +}; + +/** + * A filter predicate that can be evaluated against a value. + * + * @remarks + * + * A predicate is always an object at the root. The most basic use case is to + * declare keys that are dot-separated paths into a structured data value, and + * values that all need to match the corresponding property value in the data. + * + * The equality test is case-insensitive and numbers are converted to strings, + * i.e. `"Component"` and `"component"` are considered equal, and so are `7` and + * `"7"`. + * + * Example that matches catalog entity components that are of type `service`: + * + * ```json + * { + * "kind": "Component", + * "spec.type": "service" + * } + * ``` + * + * The special keys `$all`, `$any`, and `$not` are logical operators that can be + * used to combine multiple predicates or negate their result. These must be + * used standalone, i.e. they cannot be combined with other matchers. + * + * Example: + * + * ```json + * { + * "$all": [ + * { + * "kind": "Component" + * }, + * { + * "$any": [{ "spec.type": "service" }, { "spec.type": "website" }] + * } + * ] + * } + * ``` + * + * Objects with the special keys `$exists`, `$in`, and `$contains` are value + * operators that can be used to perform more advanced matching against property + * values than just equality. + * + * Example: + * + * ```json + * { + * "filter": { + * "kind": "Component", + * "spec.type": { "$in": ["service", "website"] }, + * "metadata.annotations.github.com/project-slug": { $exists: true } + * } + * } + * ``` + * + * @public + */ +export type FilterPredicate = + | FilterPredicateExpression + | FilterPredicatePrimitive + | { + /** + * Asserts that all of the given predicates must be true. + */ + $all: FilterPredicate[]; + } + | { + /** + * Asserts that at least one of the given predicates must be true. + */ + $any: FilterPredicate[]; + } + | { + /** + * Asserts that the given predicate must not be true. + */ + $not: FilterPredicate; + } + | UnknownFilterPredicateOperator; + +/** + * A filter predicate expression that matches against one or more object + * properties. + * + * @remarks + * + * Each key of a record is a dot-separated path into the entity structure, e.g. + * `metadata.name`. + * + * The values are filter predicates that are evaluated against the value of the + * property at the given path. + * + * For values that are given as primitives, the equality test is + * case-insensitive and numbers are converted to strings, i.e. `"Component"` and + * `"component"` are considered equal, and so are `7` and `"7"`. + * + * @public + */ +export type FilterPredicateExpression = { + [KPath in string]: FilterPredicateValue; +} & { + [KPath in `$${string}`]: never; +}; + +/** + * Represents future additions to the set of filter predicate value matchers. + * + * @remarks + * + * If you write code that explicitly inspects filter predicate expressions, you + * should be ready for the appearance of such matchers and deliberately + * gracefully fail to match them. + * + * @public + */ +export type UnknownFilterPredicateValueMatcher = { + [KMatcher in `$${string}`]: JsonValue; +} & { + [KMatcher in '$exists' | '$in' | '$contains' | '$hasPrefix']: never; +}; + +/** + * A filter predicate value that can be used to match against a property value. + * + * @public + */ +export type FilterPredicateValue = + | FilterPredicatePrimitive + | { + /** + * Asserts that the property exists and has any value (`true`) - or not + * (`false`). + */ + $exists: boolean; + } + | { + /** + * Asserts that the property value is any one of the given possible + * values. + */ + $in: FilterPredicatePrimitive[]; + } + | { + /** + * Asserts that the property value is an array, and that at least one of + * its elements matches the given predicate. + */ + $contains: FilterPredicate; + } + | { + /** + * Asserts that the property value is string, and that it starts with the given string. + */ + $hasPrefix: string; + } + | UnknownFilterPredicateValueMatcher; + +/** + * A primitive value that can be used in filter predicates. + * + * @public + */ +export type FilterPredicatePrimitive = string | number | boolean; diff --git a/packages/filter-predicates/src/setupTests.ts b/packages/filter-predicates/src/setupTests.ts new file mode 100644 index 0000000000..e512e4ba83 --- /dev/null +++ b/packages/filter-predicates/src/setupTests.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 {}; diff --git a/packages/frontend-app-api/CHANGELOG.md b/packages/frontend-app-api/CHANGELOG.md index 625c96f42a..b721fa3d8e 100644 --- a/packages/frontend-app-api/CHANGELOG.md +++ b/packages/frontend-app-api/CHANGELOG.md @@ -1,5 +1,76 @@ # @backstage/frontend-app-api +## 0.15.0-next.2 + +### 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/core-app-api@1.19.5-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/frontend-defaults@0.4.0-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/version-bridge@1.0.12-next.0 + +## 0.15.0-next.1 + +### Minor Changes + +- 55b2ef6: **BREAKING**: Updated the behavior of the new API override logic to reject the override and block app startup instead of just logging a deprecation warning. + +### Patch Changes + +- 09032d7: Internal update to simplify testing utility implementations. +- Updated dependencies + - @backstage/frontend-defaults@0.4.0-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + +## 0.14.1-next.0 + +### Patch Changes + +- 17e0eb3: Updated the behavior of the new API override logic to log a deprecation warning instead of rejecting the override and blocking app startup, as was originally intended. +- 7edb810: Implemented support for the `internal` extension input option. +- 492503a: Updated error reporting and app tree resolution logic to attribute errors to the correct extension and allow app startup to proceed more optimistically: + + - If an attachment fails to provide the required input data, the error is now attributed to the attachment rather than the parent extension. + - Singleton extension inputs will now only forward attachment errors if the input is required. + - Array extension inputs will now filter out failed attachments instead of failing the entire app tree resolution. + +- 122d39c: Completely removed support for the deprecated `app.experimental.packages` configuration. Replace existing usage directly with `app.packages`. +- 9554c36: **DEPRECATED**: Deprecated support for multiple attachment points. +- 53b6549: Plugins in the new frontend system now have a `pluginId` field rather than `id` to better align with naming conventions used throughout the frontend and backend systems. The old field is still present but marked as deprecated. All internal code has been updated to prefer `pluginId` while maintaining backward compatibility by falling back to `id` when needed. +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/frontend-defaults@0.3.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/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## 0.14.0 + +### Minor Changes + +- 3bd2a1a: BREAKING: The ability for plugins to override APIs has been restricted to only allow overrides of APIs within the same plugin. For example, a plugin can no longer override any of the core APIs provided by the `app` plugin, this must be done with an `app` module instead. + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/frontend-defaults@0.3.5 + +## 0.13.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-defaults@0.3.5-next.0 + - @backstage/frontend-plugin-api@0.13.2 + ## 0.13.3 ### Patch Changes diff --git a/packages/frontend-app-api/config.d.ts b/packages/frontend-app-api/config.d.ts index 7032cd378d..2a9197750e 100644 --- a/packages/frontend-app-api/config.d.ts +++ b/packages/frontend-app-api/config.d.ts @@ -16,15 +16,6 @@ export interface Config { app?: { - experimental?: { - /** - * @visibility frontend - * @deepVisibility frontend - * @deprecated This is no longer experimental; use `app.packages` instead. - */ - packages?: 'all' | { include?: string[]; exclude?: string[] }; - }; - /** * Controls what packages are loaded by the new frontend system. * diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json index 1c1f486e12..f84b3d1cf4 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.13.3", + "version": "0.15.0-next.2", "backstage": { "role": "web-library" }, @@ -41,7 +41,7 @@ "@backstage/types": "workspace:^", "@backstage/version-bridge": "workspace:^", "lodash": "^4.17.21", - "zod": "^3.22.4" + "zod": "^3.25.76" }, "devDependencies": { "@backstage/cli": "workspace:^", @@ -53,13 +53,13 @@ "@types/react": "^18.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/frontend-app-api/report.api.md b/packages/frontend-app-api/report.api.md index bd0709813b..e8fc019007 100644 --- a/packages/frontend-app-api/report.api.md +++ b/packages/frontend-app-api/report.api.md @@ -59,6 +59,14 @@ export type AppErrorTypes = { inputName: string; }; }; + EXTENSION_INPUT_INTERNAL_IGNORED: { + context: { + node: AppNode; + inputName: string; + extensionId: string; + plugin: FrontendPlugin; + }; + }; EXTENSION_ATTACHMENT_CONFLICT: { context: { node: AppNode; @@ -109,6 +117,14 @@ export type AppErrorTypes = { node: AppNode; }; }; + API_FACTORY_CONFLICT: { + context: { + node: AppNode; + apiRefId: string; + pluginId: string; + existingPluginId: string; + }; + }; ROUTE_DUPLICATE: { context: { routeId: string; diff --git a/packages/frontend-app-api/src/tree/instantiateAppNodeTree.test.ts b/packages/frontend-app-api/src/tree/instantiateAppNodeTree.test.ts index a07fdf352d..b1da35313e 100644 --- a/packages/frontend-app-api/src/tree/instantiateAppNodeTree.test.ts +++ b/packages/frontend-app-api/src/tree/instantiateAppNodeTree.test.ts @@ -142,6 +142,36 @@ function createV1Extension(opts: { return ext; } +function mirrorInputs(ctx: { + inputs: { + [name in string]: + | undefined + | ResolvedExtensionInput + | Array>; + }; +}) { + return [ + inputMirrorDataRef( + Object.fromEntries( + Object.entries(ctx.inputs).map(([k, v]) => [ + k, + Array.isArray(v) + ? v.map(vi => ({ + node: vi.node, + test: vi.get(testDataRef), + other: vi.get(otherDataRef), + })) + : { + node: v?.node, + test: v?.get(testDataRef), + other: v?.get(otherDataRef), + }, + ]), + ), + ), + ]; +} + describe('instantiateAppNodeTree', () => { describe('v1', () => { const simpleExtension = createV1Extension({ @@ -237,6 +267,60 @@ describe('instantiateAppNodeTree', () => { expect(childNode?.instance).toBeDefined(); }); + it('should ignore non-matching plugin attachments for internal inputs', () => { + const otherPlugin = createFrontendPlugin({ pluginId: 'other' }); + const tree = resolveAppTree( + 'root-node', + [ + makeSpec( + resolveExtensionDefinition( + createExtension({ + attachTo: { id: 'ignored', input: 'ignored' }, + inputs: { + test: createExtensionInput([testDataRef], { + singleton: true, + internal: true, + }), + }, + output: [inputMirrorDataRef], + factory: mirrorInputs, + }), + { namespace: 'root-node' }, + ), + ), + makeSpec(simpleExtension, { + id: 'child-node-app', + attachTo: { id: 'root-node', input: 'test' }, + }), + makeSpec(simpleExtension, { + id: 'child-node-other', + attachTo: { id: 'root-node', input: 'test' }, + plugin: otherPlugin, + }), + ], + collector, + ); + + instantiateAppNodeTree(tree.root, testApis, collector); + + expect(tree.root.instance?.getData(inputMirrorDataRef)).toMatchObject({ + test: { node: { spec: { id: 'child-node-app' } }, test: 'test' }, + }); + expect(collector.collectErrors()).toEqual([ + { + code: 'EXTENSION_INPUT_INTERNAL_IGNORED', + message: + "extension 'child-node-other' from plugin 'other' attached to input 'test' on 'root-node' was ignored, the input is marked as internal and attached extensions must therefore be provided via an override or a module for the 'app' plugin, not the 'other' plugin", + context: { + node: tree.root, + inputName: 'test', + extensionId: 'child-node-other', + plugin: otherPlugin, + }, + }, + ]); + }); + it('should not instantiate disabled attachments', () => { const tree = resolveAppTree( 'root-node', @@ -783,36 +867,6 @@ describe('instantiateAppNodeTree', () => { { namespace: 'app' }, ); - function mirrorInputs(ctx: { - inputs: { - [name in string]: - | undefined - | ResolvedExtensionInput - | Array>; - }; - }) { - return [ - inputMirrorDataRef( - Object.fromEntries( - Object.entries(ctx.inputs).map(([k, v]) => [ - k, - Array.isArray(v) - ? v.map(vi => ({ - node: vi.node, - test: vi.get(testDataRef), - other: vi.get(otherDataRef), - })) - : { - node: v?.node, - test: v?.get(testDataRef), - other: v?.get(otherDataRef), - }, - ]), - ), - ), - ]; - } - it('should instantiate a single node', () => { const tree = resolveAppTree( 'root-node', @@ -1574,41 +1628,158 @@ describe('instantiateAppNodeTree', () => { ]); }); - it('should refuse to create an instance with multiple inputs that did not provide required data', () => { - const node = makeNode( - resolveExtensionDefinition( - createExtension({ - name: 'test', - attachTo: { id: 'ignored', input: 'ignored' }, - inputs: { - singleton: createExtensionInput([otherDataRef], { - singleton: true, - }), - }, - output: [], - factory: () => [], - }), - { namespace: 'app' }, - ), + describe('with attachment failures', () => { + const inputCountRef = createExtensionDataRef().with({ + id: 'input-count', + }); + + const attachmentWithoutRequiredData = makeInstanceWithId( + simpleExtension, + undefined, ); - expect( - createAppNodeInstance({ - apis: testApis, - attachments: new Map([ - ['singleton', [makeInstanceWithId(simpleExtension, undefined)]], - ]), - node, - collector, - }), - ).toBeUndefined(); - expect(collector.collectErrors()).toEqual([ - { - code: 'EXTENSION_INPUT_DATA_MISSING', - message: - "extension 'app/test' could not be attached because its output data ('test') does not match what the input 'singleton' requires ('other')", - context: { node, inputName: 'singleton' }, - }, - ]); + + it('should proceed if input is optional', () => { + const node = makeNode( + resolveExtensionDefinition( + createExtension({ + name: 'test', + attachTo: { id: 'ignored', input: 'ignored' }, + inputs: { + singleton: createExtensionInput([otherDataRef], { + singleton: true, + optional: true, + }), + }, + output: [inputCountRef], + factory: ({ inputs }) => [ + inputCountRef(inputs.singleton ? 1 : 0), + ], + }), + { namespace: 'app' }, + ), + ); + expect( + createAppNodeInstance({ + apis: testApis, + attachments: new Map([ + ['singleton', [attachmentWithoutRequiredData]], + ]), + node, + collector, + })?.getData(inputCountRef), + ).toBe(0); + + expect(collector.collectErrors()).toEqual([ + { + code: 'EXTENSION_INPUT_DATA_MISSING', + message: + "extension 'app/test' could not be attached because its output data ('test') does not match what the input 'singleton' requires ('other')", + context: { + node: attachmentWithoutRequiredData, + inputName: 'singleton', + }, + }, + ]); + }); + + it('should fail if input is required', () => { + const node = makeNode( + resolveExtensionDefinition( + createExtension({ + name: 'test', + attachTo: { id: 'ignored', input: 'ignored' }, + inputs: { + singleton: createExtensionInput([otherDataRef], { + singleton: true, + }), + }, + output: [inputCountRef], + factory: ({ inputs }) => [ + inputCountRef(inputs.singleton ? 1 : 0), + ], + }), + { namespace: 'app' }, + ), + ); + + expect( + createAppNodeInstance({ + apis: testApis, + attachments: new Map([ + ['singleton', [attachmentWithoutRequiredData]], + ]), + node, + collector, + })?.getData(inputCountRef), + ).toBeUndefined(); + + expect(collector.collectErrors()).toEqual([ + { + code: 'EXTENSION_ATTACHMENT_MISSING', + message: + "input 'singleton' is required but it failed to be instantiated", + context: { inputName: 'singleton', node }, + }, + { + code: 'EXTENSION_INPUT_DATA_MISSING', + message: + "extension 'app/test' could not be attached because its output data ('test') does not match what the input 'singleton' requires ('other')", + context: { + node: attachmentWithoutRequiredData, + inputName: 'singleton', + }, + }, + ]); + }); + + it('should filter out failed attachments for non-singleton inputs', () => { + const node = makeNode( + resolveExtensionDefinition( + createExtension({ + name: 'test', + attachTo: { id: 'ignored', input: 'ignored' }, + inputs: { + children: createExtensionInput([otherDataRef]), + }, + output: [inputCountRef], + factory: ({ inputs }) => [ + inputCountRef(inputs.children.length), + ], + }), + { namespace: 'app' }, + ), + ); + expect( + createAppNodeInstance({ + apis: testApis, + attachments: new Map([ + [ + 'children', + [ + attachmentWithoutRequiredData, + makeInstanceWithId(simpleExtension, { + other: 42, + }), + ], + ], + ]), + node, + collector, + })?.getData(inputCountRef), + ).toBe(1); + + expect(collector.collectErrors()).toEqual([ + { + code: 'EXTENSION_INPUT_DATA_MISSING', + message: + "extension 'app/test' could not be attached because its output data ('test') does not match what the input 'children' requires ('other')", + context: { + node: attachmentWithoutRequiredData, + inputName: 'children', + }, + }, + ]); + }); }); }); }); diff --git a/packages/frontend-app-api/src/tree/instantiateAppNodeTree.ts b/packages/frontend-app-api/src/tree/instantiateAppNodeTree.ts index 04082f8520..070cf1d687 100644 --- a/packages/frontend-app-api/src/tree/instantiateAppNodeTree.ts +++ b/packages/frontend-app-api/src/tree/instantiateAppNodeTree.ts @@ -38,21 +38,22 @@ const INSTANTIATION_FAILED = new Error('Instantiation failed'); function mapWithFailures( iterable: Iterable, callback: (item: T) => U, + options?: { ignoreFailures?: boolean }, ): U[] { let failed = false; - const results = Array.from(iterable).map(item => { + const results = []; + for (const item of iterable) { try { - return callback(item); + results.push(callback(item)); } catch (error) { if (error === INSTANTIATION_FAILED) { failed = true; } else { throw error; } - return null as any; } - }); - if (failed) { + } + if (failed && !options?.ignoreFailures) { throw INSTANTIATION_FAILED; } return results; @@ -119,7 +120,7 @@ function resolveInputDataContainer( .map(r => `'${r.id}'`) .join(', '); - collector.report({ + collector.child({ node: attachment }).report({ code: 'EXTENSION_INPUT_DATA_MISSING', message: `extension '${attachment.spec.id}' could not be attached because its output data (${provided}) does not match what the input '${inputName}' requires (${expected})`, }); @@ -246,10 +247,32 @@ function resolveV2Inputs( inputMap: { [inputName in string]: ExtensionInput }, attachments: ReadonlyMap, parentCollector: ErrorCollector<{ node: AppNode }>, + node: AppNode, ): ResolvedExtensionInputs<{ [inputName in string]: ExtensionInput }> { return mapValues(inputMap, (input, inputName) => { - const attachedNodes = attachments.get(inputName) ?? []; + const allAttachedNodes = attachments.get(inputName) ?? []; const collector = parentCollector.child({ inputName }); + const inputPluginId = node.spec.plugin.pluginId; + + const attachedNodes = input.config.internal + ? allAttachedNodes.filter(attachment => { + const attachmentPluginId = attachment.spec.plugin.pluginId; + if (attachmentPluginId !== inputPluginId) { + collector.report({ + code: 'EXTENSION_INPUT_INTERNAL_IGNORED', + message: + `extension '${attachment.spec.id}' from plugin '${attachmentPluginId}' attached to input '${inputName}' on '${node.spec.id}' was ignored, ` + + `the input is marked as internal and attached extensions must therefore be provided via an override or a module for the '${inputPluginId}' plugin, not the '${attachmentPluginId}' plugin`, + context: { + extensionId: attachment.spec.id, + plugin: attachment.spec.plugin, + }, + }); + return false; + } + return true; + }) + : allAttachedNodes; if (input.config.singleton) { if (attachedNodes.length > 1) { @@ -271,21 +294,37 @@ function resolveV2Inputs( } return undefined; } - return resolveInputDataContainer( - input.extensionData, - attachedNodes[0], - inputName, - collector, - ); + try { + return resolveInputDataContainer( + input.extensionData, + attachedNodes[0], + inputName, + collector, + ); + } catch (error) { + if (error === INSTANTIATION_FAILED) { + if (input.config.optional) { + return undefined; + } + collector.report({ + code: 'EXTENSION_ATTACHMENT_MISSING', + message: `input '${inputName}' is required but it failed to be instantiated`, + }); + } + throw error; + } } - return mapWithFailures(attachedNodes, attachment => - resolveInputDataContainer( - input.extensionData, - attachment, - inputName, - collector, - ), + return mapWithFailures( + attachedNodes, + attachment => + resolveInputDataContainer( + input.extensionData, + attachment, + inputName, + collector, + ), + { ignoreFailures: true }, ); }) as ResolvedExtensionInputs<{ [inputName in string]: ExtensionInput }>; } @@ -354,6 +393,7 @@ export function createAppNodeInstance(options: { internalExtension.inputs, attachments, collector, + node, ), }; const outputDataValues = options.extensionFactoryMiddleware diff --git a/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts b/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts index d3b4ad6723..a095acee0e 100644 --- a/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts +++ b/packages/frontend-app-api/src/tree/resolveAppNodeSpecs.ts @@ -32,6 +32,14 @@ import { import { toInternalExtension } from '../../../frontend-plugin-api/src/wiring/resolveExtensionDefinition'; import { ErrorCollector } from '../wiring/createErrorCollector'; +function normalizePlugin(plugin: FrontendPlugin): FrontendPlugin { + // Ensure pluginId is always set for plugins in the app + if (!plugin.pluginId && 'id' in plugin && typeof plugin.id === 'string') { + (plugin as any).pluginId = plugin.id; + } + return plugin; +} + /** @internal */ export function resolveAppNodeSpecs(options: { features?: FrontendFeature[]; @@ -48,7 +56,9 @@ export function resolveAppNodeSpecs(options: { collector, } = options; - const plugins = features.filter(OpaqueFrontendPlugin.isType); + const plugins = features + .filter(OpaqueFrontendPlugin.isType) + .map(normalizePlugin); const modules = features.filter(isInternalFrontendModule); const filterForbidden = ( @@ -57,7 +67,7 @@ export function resolveAppNodeSpecs(options: { if (forbidden.has(extension.id)) { collector.report({ code: 'EXTENSION_IGNORED', - message: `It is forbidden to override the '${extension.id}' extension, attempted by the '${extension.plugin.id}' plugin`, + message: `It is forbidden to override the '${extension.id}' extension, attempted by the '${extension.plugin.pluginId}' plugin`, context: { plugin: extension.plugin, extensionId: extension.id, @@ -80,7 +90,7 @@ export function resolveAppNodeSpecs(options: { toInternalFrontendModule(mod) .extensions.flatMap(extension => { // Modules for plugins that are not installed are ignored - const plugin = plugins.find(p => p.id === mod.pluginId); + const plugin = plugins.find(p => p.pluginId === mod.pluginId); if (!plugin) { return []; } @@ -91,7 +101,7 @@ export function resolveAppNodeSpecs(options: { ); const appPlugin = - plugins.find(plugin => plugin.id === 'app') ?? + plugins.find(plugin => plugin.pluginId === 'app') ?? createFrontendPlugin({ pluginId: 'app', }); @@ -159,7 +169,7 @@ export function resolveAppNodeSpecs(options: { if (seenExtensionIds.has(extension.id)) { collector.report({ code: 'EXTENSION_IGNORED', - message: `The '${extension.id}' extension from the '${params.plugin.id}' plugin is a duplicate and will be ignored`, + message: `The '${extension.id}' extension from the '${params.plugin.pluginId}' plugin is a duplicate and will be ignored`, context: { plugin: params.plugin, extensionId: extension.id, diff --git a/packages/frontend-app-api/src/tree/resolveAppTree.ts b/packages/frontend-app-api/src/tree/resolveAppTree.ts index f2f31f8950..c2054c4bac 100644 --- a/packages/frontend-app-api/src/tree/resolveAppTree.ts +++ b/packages/frontend-app-api/src/tree/resolveAppTree.ts @@ -165,6 +165,12 @@ export function resolveAppTree( if (spec.id === rootNodeId) { rootNode = node; } else if (Array.isArray(spec.attachTo)) { + // eslint-disable-next-line no-console + console.warn( + `Extension '${spec.id}' is using multiple attachment points which is deprecated and will be removed in a future release. ` + + `Use a Utility API instead to share functionality across multiple locations. ` + + `See https://backstage.io/docs/frontend-system/architecture/27-sharing-extensions for migration guidance.`, + ); let foundFirstParent = false; for (const origAttachTo of spec.attachTo) { let attachTo = origAttachTo; diff --git a/packages/frontend-app-api/src/wiring/createErrorCollector.ts b/packages/frontend-app-api/src/wiring/createErrorCollector.ts index c20e92d0f0..5f081bc092 100644 --- a/packages/frontend-app-api/src/wiring/createErrorCollector.ts +++ b/packages/frontend-app-api/src/wiring/createErrorCollector.ts @@ -38,6 +38,14 @@ export type AppErrorTypes = { EXTENSION_INPUT_DATA_MISSING: { context: { node: AppNode; inputName: string }; }; + EXTENSION_INPUT_INTERNAL_IGNORED: { + context: { + node: AppNode; + inputName: string; + extensionId: string; + plugin: FrontendPlugin; + }; + }; EXTENSION_ATTACHMENT_CONFLICT: { context: { node: AppNode; inputName: string }; }; @@ -66,6 +74,14 @@ export type AppErrorTypes = { API_EXTENSION_INVALID: { context: { node: AppNode }; }; + API_FACTORY_CONFLICT: { + context: { + node: AppNode; + apiRefId: string; + pluginId: string; + existingPluginId: string; + }; + }; // routing ROUTE_DUPLICATE: { context: { routeId: string }; diff --git a/packages/frontend-app-api/src/wiring/createPluginInfoAttacher.ts b/packages/frontend-app-api/src/wiring/createPluginInfoAttacher.ts index dc2b54f534..bfab0ae9a3 100644 --- a/packages/frontend-app-api/src/wiring/createPluginInfoAttacher.ts +++ b/packages/frontend-app-api/src/wiring/createPluginInfoAttacher.ts @@ -77,7 +77,10 @@ export function createPluginInfoAttacher( }), }); - const infoWithOverrides = applyInfoOverrides(plugin.id, resolvedInfo); + const infoWithOverrides = applyInfoOverrides( + plugin.pluginId, + resolvedInfo, + ); return normalizePluginInfo(infoWithOverrides); }), }; diff --git a/packages/frontend-app-api/src/wiring/createSpecializedApp.test.tsx b/packages/frontend-app-api/src/wiring/createSpecializedApp.test.tsx index 5622af0448..e21befc80e 100644 --- a/packages/frontend-app-api/src/wiring/createSpecializedApp.test.tsx +++ b/packages/frontend-app-api/src/wiring/createSpecializedApp.test.tsx @@ -20,7 +20,9 @@ import { coreExtensionData, createExtension, createFrontendPlugin, + createFrontendModule, ApiBlueprint, + createApiRef, createRouteRef, createExternalRouteRef, createExtensionInput, @@ -36,21 +38,22 @@ import { MemoryRouter } from 'react-router-dom'; import { ApiProvider, ConfigReader } from '@backstage/core-app-api'; import { Fragment } from 'react'; +function makeAppPlugin(label: string = 'Test') { + return createFrontendPlugin({ + pluginId: 'app', + extensions: [ + createExtension({ + attachTo: { id: 'root', input: 'app' }, + output: [coreExtensionData.reactElement], + factory: () => [coreExtensionData.reactElement(
    {label}
    )], + }), + ], + }); +} describe('createSpecializedApp', () => { it('should render the root app', () => { const app = createSpecializedApp({ - features: [ - createFrontendPlugin({ - pluginId: 'test', - extensions: [ - createExtension({ - attachTo: { id: 'root', input: 'app' }, - output: [coreExtensionData.reactElement], - factory: () => [coreExtensionData.reactElement(
    Test
    )], - }), - ], - }), - ], + features: [makeAppPlugin()], }); render(app.tree.root.instance!.getData(coreExtensionData.reactElement)); @@ -60,32 +63,7 @@ describe('createSpecializedApp', () => { it('should deduplicate features keeping the last received one', () => { const app = createSpecializedApp({ - features: [ - createFrontendPlugin({ - pluginId: 'test', - extensions: [ - createExtension({ - attachTo: { id: 'root', input: 'app' }, - output: [coreExtensionData.reactElement], - factory: () => [ - coreExtensionData.reactElement(
    Test 1
    ), - ], - }), - ], - }), - createFrontendPlugin({ - pluginId: 'test', - extensions: [ - createExtension({ - attachTo: { id: 'root', input: 'app' }, - output: [coreExtensionData.reactElement], - factory: () => [ - coreExtensionData.reactElement(
    Test 2
    ), - ], - }), - ], - }), - ], + features: [makeAppPlugin('Test 1'), makeAppPlugin('Test 2')], }); render(app.tree.root.instance!.getData(coreExtensionData.reactElement)); @@ -249,8 +227,9 @@ describe('createSpecializedApp', () => { const app = createSpecializedApp({ features: [ - createFrontendPlugin({ - pluginId: 'first', + makeAppPlugin(), + createFrontendModule({ + pluginId: 'app', extensions: [ ApiBlueprint.make({ params: defineParams => @@ -264,9 +243,8 @@ describe('createSpecializedApp', () => { }), ], }), - createFrontendPlugin({ - pluginId: 'test', - featureFlags: [{ name: 'a' }, { name: 'b' }], + createFrontendModule({ + pluginId: 'app', extensions: [ createExtension({ attachTo: { id: 'root', input: 'app' }, @@ -311,6 +289,107 @@ describe('createSpecializedApp', () => { expect(mockAnalyticsApi).toHaveBeenCalled(); }); + it('should select the API factory from the owning plugin on conflict', () => { + const testApiRef = createApiRef<{ value: string }>({ id: 'test.api' }); + + const app = createSpecializedApp({ + features: [ + makeAppPlugin(), + createFrontendPlugin({ + pluginId: 'other-before', + extensions: [ + ApiBlueprint.make({ + params: defineParams => + defineParams({ + api: testApiRef, + deps: {}, + factory: () => ({ value: 'other' }), + }), + }), + ], + }), + createFrontendPlugin({ + pluginId: 'test', + extensions: [ + ApiBlueprint.make({ + params: defineParams => + defineParams({ + api: testApiRef, + deps: {}, + factory: () => ({ value: 'owner' }), + }), + }), + ], + }), + createFrontendPlugin({ + pluginId: 'other-after', + extensions: [ + ApiBlueprint.make({ + params: defineParams => + defineParams({ + api: testApiRef, + deps: {}, + factory: () => ({ value: 'other' }), + }), + }), + ], + }), + ], + }); + + expect(app.errors).toEqual([ + expect.objectContaining({ + code: 'API_FACTORY_CONFLICT', + message: expect.stringContaining("API 'test.api'"), + }), + expect.objectContaining({ + code: 'API_FACTORY_CONFLICT', + message: expect.stringContaining("API 'test.api'"), + }), + ]); + + expect(app.apis.get(testApiRef)).toEqual({ value: 'owner' }); + }); + + it('should allow API overrides within the same plugin', () => { + const testApiRef = createApiRef<{ value: string }>({ id: 'test.api' }); + + const app = createSpecializedApp({ + features: [ + makeAppPlugin(), + createFrontendPlugin({ + pluginId: 'test', + extensions: [ + ApiBlueprint.make({ + params: defineParams => + defineParams({ + api: testApiRef, + deps: {}, + factory: () => ({ value: 'plugin' }), + }), + }), + ], + }), + createFrontendModule({ + pluginId: 'test', + extensions: [ + ApiBlueprint.make({ + params: defineParams => + defineParams({ + api: testApiRef, + deps: {}, + factory: () => ({ value: 'module' }), + }), + }), + ], + }), + ], + }); + + expect(app.errors).toBeUndefined(); + expect(app.apis.get(testApiRef)).toEqual({ value: 'module' }); + }); + it('should use provided apis', async () => { const app = createSpecializedApp({ advanced: { @@ -569,12 +648,13 @@ describe('createSpecializedApp', () => { output: [coreExtensionData.reactElement], factory: () => [coreExtensionData.reactElement(
    )], }), + // Test backward compatibility - runtime still supports multiple attachment points createExtension({ name: 'cloned', attachTo: [ { id: 'test/a', input: 'children' }, { id: 'test/b', input: 'children' }, - ], + ] as any, output: [coreExtensionData.reactElement], factory: () => [coreExtensionData.reactElement(
    )], }), diff --git a/packages/frontend-app-api/src/wiring/createSpecializedApp.tsx b/packages/frontend-app-api/src/wiring/createSpecializedApp.tsx index 9e75d19454..d56a609bb9 100644 --- a/packages/frontend-app-api/src/wiring/createSpecializedApp.tsx +++ b/packages/frontend-app-api/src/wiring/createSpecializedApp.tsx @@ -284,6 +284,14 @@ export type CreateSpecializedAppOptions = { }; }; +// Internal options type, not exported in the public API +export interface CreateSpecializedAppInternalOptions + extends CreateSpecializedAppOptions { + __internal?: { + apiFactoryOverrides?: AnyApiFactory[]; + }; +} + /** * Creates an empty app without any default features. This is a low-level API is * intended for use in tests or specialized setups. Typically you want to use @@ -296,6 +304,7 @@ export function createSpecializedApp(options?: CreateSpecializedAppOptions): { tree: AppTree; errors?: AppError[]; } { + const internalOptions = options as CreateSpecializedAppInternalOptions; const config = options?.config ?? new ConfigReader({}, 'empty-config'); const features = deduplicateFeatures(options?.features ?? []).map( createPluginInfoAttacher(config, options?.advanced?.pluginInfoResolver), @@ -337,6 +346,7 @@ export function createSpecializedApp(options?: CreateSpecializedAppOptions): { createApiFactory(configApiRef, config), createApiFactory(routeResolutionApiRef, routeResolutionApi), createApiFactory(identityApiRef, appIdentityProxy), + ...(internalOptions?.__internal?.apiFactoryOverrides ?? []), ], }); @@ -388,7 +398,10 @@ function createApiFactories(options: { collector: ErrorCollector; }): AnyApiFactory[] { const emptyApiHolder = ApiRegistry.from([]); - const factories = new Array(); + const factoriesById = new Map< + string, + { pluginId: string; factory: AnyApiFactory } + >(); for (const apiNode of options.tree.root.edges.attachments.get('apis') ?? []) { if (!instantiateAppNodeTree(apiNode, emptyApiHolder, options.collector)) { @@ -396,7 +409,45 @@ function createApiFactories(options: { } const apiFactory = apiNode.instance?.getData(ApiBlueprint.dataRefs.factory); if (apiFactory) { - factories.push(apiFactory); + const apiRefId = apiFactory.api.id; + const ownerId = getApiOwnerId(apiRefId); + const pluginId = apiNode.spec.plugin.pluginId ?? 'app'; + const existingFactory = factoriesById.get(apiRefId); + + // This allows modules to override factories provided by the plugin, but + // it rejects API overrides from other plugins. In the event of a + // conflict, the owning plugin is attempted to be inferred from the API + // reference ID. + if (existingFactory && existingFactory.pluginId !== pluginId) { + const shouldReplace = + ownerId === pluginId && existingFactory.pluginId !== ownerId; + const acceptedPluginId = shouldReplace + ? pluginId + : existingFactory.pluginId; + const rejectedPluginId = shouldReplace + ? existingFactory.pluginId + : pluginId; + + options.collector.report({ + code: 'API_FACTORY_CONFLICT', + message: `API '${apiRefId}' is already provided by plugin '${acceptedPluginId}', cannot also be provided by '${rejectedPluginId}'.`, + context: { + node: apiNode, + apiRefId, + pluginId: rejectedPluginId, + existingPluginId: acceptedPluginId, + }, + }); + if (shouldReplace) { + factoriesById.set(apiRefId, { + pluginId, + factory: apiFactory, + }); + } + continue; + } + + factoriesById.set(apiRefId, { pluginId, factory: apiFactory }); } else { options.collector.report({ code: 'API_EXTENSION_INVALID', @@ -408,7 +459,23 @@ function createApiFactories(options: { } } - return factories; + return Array.from(factoriesById.values(), entry => entry.factory); +} + +// TODO(Rugvip): It would be good if this was more explicit, but I think that +// might need to wait for some future update for API factories. +function getApiOwnerId(apiRefId: string): string { + const [prefix, ...rest] = apiRefId.split('.'); + if (!prefix) { + return apiRefId; + } + if (prefix === 'core') { + return 'app'; + } + if (prefix === 'plugin' && rest[0]) { + return rest[0]; + } + return prefix; } function createApiHolder(options: { diff --git a/packages/frontend-defaults/CHANGELOG.md b/packages/frontend-defaults/CHANGELOG.md index eea14a159c..751b492c0c 100644 --- a/packages/frontend-defaults/CHANGELOG.md +++ b/packages/frontend-defaults/CHANGELOG.md @@ -1,5 +1,73 @@ # @backstage/frontend-defaults +## 0.4.0-next.2 + +### 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/frontend-plugin-api@0.14.0-next.2 + - @backstage/frontend-app-api@0.15.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/plugin-app@0.4.0-next.2 + +## 0.4.0-next.1 + +### Minor Changes + +- 55b2ef6: **BREAKING**: The `API_FACTORY_CONFLICT` warning is now treated as an error and will prevent the app from starting. + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-app-api@0.15.0-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/plugin-app@0.4.0-next.1 + - @backstage/core-components@0.18.7-next.1 + +## 0.3.6-next.0 + +### Patch Changes + +- 17e0eb3: The `API_FACTORY_CONFLICT` error is now treated as a warning and will not prevent the app from starting. +- 122d39c: Completely removed support for the deprecated `app.experimental.packages` configuration. Replace existing usage directly with `app.packages`. +- c38b74d: Dependency update for tests. +- 53b6549: Plugins in the new frontend system now have a `pluginId` field rather than `id` to better align with naming conventions used throughout the frontend and backend systems. The old field is still present but marked as deprecated. All internal code has been updated to prefer `pluginId` while maintaining backward compatibility by falling back to `id` when needed. +- Updated dependencies + - @backstage/frontend-app-api@0.14.1-next.0 + - @backstage/core-components@0.18.6-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/plugin-app@0.4.0-next.0 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## 0.3.5 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + - @backstage/plugin-app@0.3.4 + - @backstage/frontend-app-api@0.14.0 + +## 0.3.5-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/plugin-app@0.3.4-next.1 + +## 0.3.5-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-app@0.3.4-next.0 + - @backstage/frontend-app-api@0.13.4-next.0 + - @backstage/frontend-plugin-api@0.13.2 + ## 0.3.4 ### Patch Changes diff --git a/packages/frontend-defaults/package.json b/packages/frontend-defaults/package.json index 9cfacb3237..aa445ef8e1 100644 --- a/packages/frontend-defaults/package.json +++ b/packages/frontend-defaults/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/frontend-defaults", - "version": "0.3.4", + "version": "0.4.0-next.2", "backstage": { "role": "web-library" }, @@ -42,19 +42,20 @@ "devDependencies": { "@backstage/cli": "workspace:^", "@backstage/core-plugin-api": "workspace:^", + "@backstage/plugin-app-react": "workspace:^", "@backstage/test-utils": "workspace:^", "@testing-library/jest-dom": "^6.0.0", "@testing-library/react": "^16.0.0", "@types/react": "^18.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/frontend-defaults/src/createApp.test.tsx b/packages/frontend-defaults/src/createApp.test.tsx index 7b5e345e12..3a9ea91bec 100644 --- a/packages/frontend-defaults/src/createApp.test.tsx +++ b/packages/frontend-defaults/src/createApp.test.tsx @@ -22,11 +22,11 @@ import { PageBlueprint, createFrontendPlugin, createFrontendFeatureLoader, - ThemeBlueprint, createFrontendModule, useAppNode, FrontendPluginInfo, } from '@backstage/frontend-plugin-api'; +import { ThemeBlueprint } from '@backstage/plugin-app-react'; import { screen, waitFor } from '@testing-library/react'; import { createApp } from './createApp'; import { mockApis, renderWithEffects } from '@backstage/test-utils'; @@ -60,8 +60,8 @@ describe('createApp', () => { }), }, features: [ - createFrontendPlugin({ - pluginId: 'test', + createFrontendModule({ + pluginId: 'app', extensions: [ ThemeBlueprint.make({ name: 'derp', @@ -392,6 +392,7 @@ describe('createApp', () => { + ] diff --git a/packages/frontend-defaults/src/createPublicSignInApp.test.tsx b/packages/frontend-defaults/src/createPublicSignInApp.test.tsx index e80d058140..398dbcbf4a 100644 --- a/packages/frontend-defaults/src/createPublicSignInApp.test.tsx +++ b/packages/frontend-defaults/src/createPublicSignInApp.test.tsx @@ -14,10 +14,8 @@ * limitations under the License. */ -import { - SignInPageBlueprint, - createFrontendModule, -} from '@backstage/frontend-plugin-api'; +import { createFrontendModule } from '@backstage/frontend-plugin-api'; +import { SignInPageBlueprint } from '@backstage/plugin-app-react'; import { render, screen, waitFor } from '@testing-library/react'; import { useEffect } from 'react'; import { createPublicSignInApp } from './createPublicSignInApp'; diff --git a/packages/frontend-defaults/src/discovery.ts b/packages/frontend-defaults/src/discovery.ts index 71d831b58c..584f202c54 100644 --- a/packages/frontend-defaults/src/discovery.ts +++ b/packages/frontend-defaults/src/discovery.ts @@ -26,10 +26,7 @@ interface DiscoveryGlobal { } function readPackageDetectionConfig(config: Config) { - // The experimental key is deprecated, but supported still for backwards compatibility - const packages = - config.getOptional('app.packages') ?? - config.getOptional('app.experimental.packages'); + const packages = config.getOptional('app.packages'); if (packages === undefined || packages === null) { return undefined; } diff --git a/packages/frontend-defaults/src/maybeCreateErrorPage.tsx b/packages/frontend-defaults/src/maybeCreateErrorPage.tsx index 6bad97f666..152c37fdd3 100644 --- a/packages/frontend-defaults/src/maybeCreateErrorPage.tsx +++ b/packages/frontend-defaults/src/maybeCreateErrorPage.tsx @@ -22,6 +22,7 @@ const DEFAULT_WARNING_CODES: Array = [ 'EXTENSION_IGNORED', 'INVALID_EXTENSION_CONFIG_KEY', 'EXTENSION_INPUT_DATA_IGNORED', + 'EXTENSION_INPUT_INTERNAL_IGNORED', 'EXTENSION_OUTPUT_IGNORED', ]; @@ -33,13 +34,15 @@ function AppErrorItem(props: { error: AppError }): JSX.Element { 'extensionId' in context ? context.extensionId : node?.spec.id; const routeId = 'routeId' in context ? context.routeId : undefined; const plugin = 'plugin' in context ? context.plugin : node?.spec.plugin; - const pluginId = plugin?.id ?? 'N/A'; + const pluginId = plugin?.pluginId ?? 'N/A'; const [info, setInfo] = useState(undefined); useEffect(() => { plugin?.info().then(setInfo, error => { // eslint-disable-next-line no-console - console.error(`Failed to load info for plugin ${plugin.id}: ${error}`); + console.error( + `Failed to load info for plugin ${plugin.pluginId}: ${error}`, + ); }); }, [plugin]); diff --git a/packages/frontend-dynamic-feature-loader/CHANGELOG.md b/packages/frontend-dynamic-feature-loader/CHANGELOG.md index 58cb740bd5..d102c57b06 100644 --- a/packages/frontend-dynamic-feature-loader/CHANGELOG.md +++ b/packages/frontend-dynamic-feature-loader/CHANGELOG.md @@ -1,5 +1,21 @@ # @backstage/frontend-dynamic-feature-loader +## 0.1.9-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/frontend-plugin-api@0.14.0-next.2 + +## 0.1.9-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/config@1.3.6 + ## 0.1.8 ### Patch Changes diff --git a/packages/frontend-dynamic-feature-loader/package.json b/packages/frontend-dynamic-feature-loader/package.json index c8771ca154..105e3c0884 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.8", + "version": "0.1.9-next.1", "backstage": { "role": "web-library" }, @@ -34,9 +34,10 @@ "dependencies": { "@backstage/config": "workspace:^", "@backstage/frontend-plugin-api": "workspace:^", - "@module-federation/enhanced": "^0.9.0", - "@module-federation/runtime": "^0.9.0", - "@module-federation/sdk": "^0.9.0", + "@backstage/module-federation-common": "workspace:^", + "@module-federation/enhanced": "^0.21.6", + "@module-federation/runtime": "^0.21.6", + "@module-federation/sdk": "^0.21.6", "cross-fetch": "^4.0.0", "uri-template": "^2.0.0" }, @@ -49,13 +50,13 @@ "msw": "^1.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/frontend-dynamic-feature-loader/report.api.md b/packages/frontend-dynamic-feature-loader/report.api.md index 3188551bad..fb14cb7c57 100644 --- a/packages/frontend-dynamic-feature-loader/report.api.md +++ b/packages/frontend-dynamic-feature-loader/report.api.md @@ -3,8 +3,9 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { FederationRuntimePlugin } from '@module-federation/enhanced/runtime'; import { FrontendFeatureLoader } from '@backstage/frontend-plugin-api'; +import { ModuleFederation } from '@module-federation/enhanced/runtime'; +import { ModuleFederationRuntimePlugin } from '@module-federation/enhanced/runtime'; import { ShareStrategy } from '@module-federation/runtime/types'; import { UserOptions } from '@module-federation/runtime/types'; @@ -18,7 +19,8 @@ export type DynamicFrontendFeaturesLoaderOptions = { moduleFederation: { shared?: UserOptions['shared']; shareStrategy?: ShareStrategy; - plugins?: Array; + plugins?: Array; + instance?: ModuleFederation; }; }; ``` diff --git a/packages/frontend-dynamic-feature-loader/src/loader.test.tsx b/packages/frontend-dynamic-feature-loader/src/loader.test.tsx index c0bf5822cc..cb066e8b21 100644 --- a/packages/frontend-dynamic-feature-loader/src/loader.test.tsx +++ b/packages/frontend-dynamic-feature-loader/src/loader.test.tsx @@ -15,21 +15,44 @@ */ import { mockApis, registerMswTestHooks } from '@backstage/test-utils'; -import { - DynamicFrontendFeaturesLoaderOptions, - dynamicFrontendFeaturesLoader, -} from './loader'; +import { dynamicFrontendFeaturesLoader } from './loader'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; +import { ModuleFederationRuntimePlugin } from '@module-federation/enhanced/runtime'; import { RemoteEntryExports } from '@module-federation/runtime/types'; import { Module } from '@module-federation/sdk'; import { createFrontendPlugin } from '@backstage/frontend-plugin-api'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { InternalFrontendFeatureLoader } from '../../frontend-plugin-api/src/wiring/createFrontendFeatureLoader'; import { resetFederationGlobalInfo } from '@module-federation/runtime/core'; +import { Config } from '@backstage/config'; const baseUrl = 'http://localhost:7007'; +function mockDefaultConfig(): Config { + return mockApis.config({ + data: { + app: { + packages: { + include: [], + }, + }, + backend: { + baseUrl, + }, + dynamicPlugins: {}, + }, + }); +} + +// eslint-disable-next-line @backstage/no-relative-monorepo-imports +import { BACKSTAGE_RUNTIME_SHARED_DEPENDENCIES_GLOBAL } from '../../module-federation-common/src/types'; + +const globalSpy = jest.fn(); +Object.defineProperty(global, BACKSTAGE_RUNTIME_SHARED_DEPENDENCIES_GLOBAL, { + get: globalSpy, +}); + describe('dynamicFrontendFeaturesLoader', () => { const server = setupServer(); registerMswTestHooks(server); @@ -46,31 +69,27 @@ describe('dynamicFrontendFeaturesLoader', () => { }, }; - const getCommonOptions = (): DynamicFrontendFeaturesLoaderOptions => ({ - moduleFederation: { + const testModuleFederationPlugins: ModuleFederationRuntimePlugin[] = [ + { // We add this module federation plugin to mock the // effective retrieval of the remote content, since it // normally requires a host application built with module federation support, // and won't work by default in Jest tests. - plugins: [ - { - name: 'load-entry-mock', - loadEntry: async args => { - return { - get: (id: string) => async () => { - return await mocks.federation.get({ - name: args.remoteInfo.name, - id, - }); - }, - init: async () => {}, - } as RemoteEntryExports; + name: 'load-entry-mock', + loadEntry: async args => { + return { + get: (id: string) => async () => { + return await mocks.federation.get({ + name: args.remoteInfo.name, + id, + }); }, - onLoad: mocks.federation.onLoad, - }, - ], + init: async () => {}, + } as RemoteEntryExports; + }, + onLoad: mocks.federation.onLoad, }, - }); + ]; const manifestDummyData = { metaData: { @@ -104,9 +123,68 @@ describe('dynamicFrontendFeaturesLoader', () => { mocks.console.debug.mockReset(); mocks.federation.get.mockReset(); mocks.federation.onLoad.mockReset(); + globalSpy.mockReset(); resetFederationGlobalInfo(); }); + const mockedDefaultSharedItems = [ + { + name: 'react', + version: '18.3.1', + lib: async () => ({ default: {} }), + shareConfig: { singleton: true, requiredVersion: '*', eager: true }, + }, + { + name: 'react-dom', + version: '18.3.1', + lib: async () => ({ default: {} }), + shareConfig: { singleton: true, requiredVersion: '*', eager: true }, + }, + { + name: 'react-router', + version: '6.28.2', + lib: async () => ({ default: {} }), + shareConfig: { singleton: true, requiredVersion: '*', eager: true }, + }, + { + name: 'react-router-dom', + version: '6.28.2', + lib: async () => ({ default: {} }), + shareConfig: { singleton: true, requiredVersion: '*', eager: true }, + }, + { + name: '@material-ui/core/styles', + version: '4.12.4', + lib: async () => ({ default: {} }), + shareConfig: { singleton: true, requiredVersion: '*', eager: true }, + }, + { + name: '@material-ui/styles', + version: '4.11.5', + lib: async () => ({ default: {} }), + shareConfig: { singleton: true, requiredVersion: '*', eager: true }, + }, + { + name: '@mui/material/styles/', + version: '5.16.14', + lib: async () => ({ default: {} }), + shareConfig: { singleton: true, requiredVersion: '*', eager: true }, + }, + { + name: '@emotion/react', + version: '11.13.5', + lib: async () => ({ default: {} }), + shareConfig: { singleton: true, requiredVersion: '*', eager: true }, + }, + ]; + + beforeEach(() => { + globalSpy.mockReturnValue({ + items: mockedDefaultSharedItems, + version: 'v1', + }); + }); + it('should return immediately if dynamic plugins are not enabled in config', async () => { let manifestsEndpointCalled = false; server.use( @@ -121,7 +199,9 @@ describe('dynamicFrontendFeaturesLoader', () => { const features = await ( dynamicFrontendFeaturesLoader({ - ...getCommonOptions(), + moduleFederation: { + plugins: testModuleFederationPlugins, + }, }) as InternalFrontendFeatureLoader ).loader({ config: mockApis.config({ @@ -196,22 +276,12 @@ describe('dynamicFrontendFeaturesLoader', () => { const features = await ( dynamicFrontendFeaturesLoader({ - ...getCommonOptions(), + moduleFederation: { + plugins: testModuleFederationPlugins, + }, }) as InternalFrontendFeatureLoader ).loader({ - config: mockApis.config({ - data: { - app: { - packages: { - include: [], - }, - }, - backend: { - baseUrl, - }, - dynamicPlugins: {}, - }, - }), + config: mockDefaultConfig(), }); const errorCalls = mocks.console.error.mock.calls.flatMap(e => e[0]); @@ -320,22 +390,12 @@ describe('dynamicFrontendFeaturesLoader', () => { const features = await ( dynamicFrontendFeaturesLoader({ - ...getCommonOptions(), + moduleFederation: { + plugins: testModuleFederationPlugins, + }, }) as InternalFrontendFeatureLoader ).loader({ - config: mockApis.config({ - data: { - app: { - packages: { - include: [], - }, - }, - backend: { - baseUrl, - }, - dynamicPlugins: {}, - }, - }), + config: mockDefaultConfig(), }); const errorCalls = mocks.console.error.mock.calls.flatMap(e => e[0]); @@ -435,22 +495,12 @@ describe('dynamicFrontendFeaturesLoader', () => { const features = await ( dynamicFrontendFeaturesLoader({ - ...getCommonOptions(), + moduleFederation: { + plugins: testModuleFederationPlugins, + }, }) as InternalFrontendFeatureLoader ).loader({ - config: mockApis.config({ - data: { - app: { - packages: { - include: [], - }, - }, - backend: { - baseUrl, - }, - dynamicPlugins: {}, - }, - }), + config: mockDefaultConfig(), }); const errorCalls = mocks.console.error.mock.calls.flatMap(e => e[0]); @@ -526,22 +576,12 @@ describe('dynamicFrontendFeaturesLoader', () => { const features = await ( dynamicFrontendFeaturesLoader({ - ...getCommonOptions(), + moduleFederation: { + plugins: testModuleFederationPlugins, + }, }) as InternalFrontendFeatureLoader ).loader({ - config: mockApis.config({ - data: { - app: { - packages: { - include: [], - }, - }, - backend: { - baseUrl, - }, - dynamicPlugins: {}, - }, - }), + config: mockDefaultConfig(), }); const errorCalls = mocks.console.error.mock.calls.flatMap(e => e[0]); @@ -588,22 +628,12 @@ describe('dynamicFrontendFeaturesLoader', () => { const features = await ( dynamicFrontendFeaturesLoader({ - ...getCommonOptions(), + moduleFederation: { + plugins: testModuleFederationPlugins, + }, }) as InternalFrontendFeatureLoader ).loader({ - config: mockApis.config({ - data: { - app: { - packages: { - include: [], - }, - }, - backend: { - baseUrl, - }, - dynamicPlugins: {}, - }, - }), + config: mockDefaultConfig(), }); const errorCalls = mocks.console.error.mock.calls.flatMap(e => e[0]); @@ -635,22 +665,12 @@ describe('dynamicFrontendFeaturesLoader', () => { const features = await ( dynamicFrontendFeaturesLoader({ - ...getCommonOptions(), + moduleFederation: { + plugins: testModuleFederationPlugins, + }, }) as InternalFrontendFeatureLoader ).loader({ - config: mockApis.config({ - data: { - app: { - packages: { - include: [], - }, - }, - backend: { - baseUrl, - }, - dynamicPlugins: {}, - }, - }), + config: mockDefaultConfig(), }); const errorCalls = mocks.console.error.mock.calls.flatMap(e => e[0]); @@ -739,22 +759,12 @@ describe('dynamicFrontendFeaturesLoader', () => { const features = await ( dynamicFrontendFeaturesLoader({ - ...getCommonOptions(), + moduleFederation: { + plugins: testModuleFederationPlugins, + }, }) as InternalFrontendFeatureLoader ).loader({ - config: mockApis.config({ - data: { - app: { - packages: { - include: [], - }, - }, - backend: { - baseUrl, - }, - dynamicPlugins: {}, - }, - }), + config: mockDefaultConfig(), }); const errorCalls = mocks.console.error.mock.calls.flatMap(e => e[0]); @@ -867,22 +877,12 @@ describe('dynamicFrontendFeaturesLoader', () => { const features = await ( dynamicFrontendFeaturesLoader({ - ...getCommonOptions(), + moduleFederation: { + plugins: testModuleFederationPlugins, + }, }) as InternalFrontendFeatureLoader ).loader({ - config: mockApis.config({ - data: { - app: { - packages: { - include: [], - }, - }, - backend: { - baseUrl, - }, - dynamicPlugins: {}, - }, - }), + config: mockDefaultConfig(), }); const errorCalls = mocks.console.error.mock.calls.flatMap(e => e[0]); @@ -978,30 +978,21 @@ describe('dynamicFrontendFeaturesLoader', () => { const features = await ( dynamicFrontendFeaturesLoader({ - ...getCommonOptions(), + moduleFederation: { + plugins: testModuleFederationPlugins, + }, }) as InternalFrontendFeatureLoader ).loader({ - config: mockApis.config({ - data: { - app: { - packages: { - include: [], - }, - }, - backend: { - baseUrl, - }, - dynamicPlugins: {}, - }, - }), + config: mockDefaultConfig(), }); const errorCalls = mocks.console.error.mock.calls.flatMap(e => e[0]); - expect(errorCalls).toEqual([ - "Failed loading remote module 'plugin_1' of dynamic plugin 'plugin-1': Error: [ Federation Runtime ]: [ Federation Runtime ]: [ Federation Runtime ]: http://localhost:7007/.backstage/dynamic-features/remotes/plugin-1/mf-manifest.json is not a federation manifest", - ]); const warnCalls = mocks.console.warn.mock.calls.flatMap(e => e[0]); - expect(warnCalls).toEqual([]); + + expect(warnCalls).toEqual(['[ Federation Runtime ]']); + expect(errorCalls).toEqual([ + "Failed loading remote module 'plugin_1' of dynamic plugin 'plugin-1': Error: [ Federation Runtime ]: http://localhost:7007/.backstage/dynamic-features/remotes/plugin-1/mf-manifest.json is not a federation manifest", + ]); expect(features).toMatchObject([ { $$type: '@backstage/FrontendPlugin', @@ -1086,30 +1077,20 @@ describe('dynamicFrontendFeaturesLoader', () => { const features = await ( dynamicFrontendFeaturesLoader({ - ...getCommonOptions(), + moduleFederation: { + plugins: testModuleFederationPlugins, + }, }) as InternalFrontendFeatureLoader ).loader({ - config: mockApis.config({ - data: { - app: { - packages: { - include: [], - }, - }, - backend: { - baseUrl, - }, - dynamicPlugins: {}, - }, - }), + config: mockDefaultConfig(), }); const errorCalls = mocks.console.error.mock.calls.flatMap(e => e[0]); - expect(errorCalls).toEqual([ - "Failed loading remote module 'plugin_1' of dynamic plugin 'plugin-1': Error: [ Federation Runtime ]: [ Federation Runtime ]: [ Federation Runtime ]: http://localhost:7007/.backstage/dynamic-features/remotes/plugin-1/mf-manifest.json is not a federation manifest", - ]); const warnCalls = mocks.console.warn.mock.calls.flatMap(e => e[0]); - expect(warnCalls).toEqual([]); + expect(warnCalls).toEqual(['[ Federation Runtime ]']); + expect(errorCalls).toEqual([ + "Failed loading remote module 'plugin_1' of dynamic plugin 'plugin-1': Error: [ Federation Runtime ]: http://localhost:7007/.backstage/dynamic-features/remotes/plugin-1/mf-manifest.json is not a federation manifest", + ]); expect(features).toMatchObject([ { $$type: '@backstage/FrontendPlugin', @@ -1133,4 +1114,185 @@ describe('dynamicFrontendFeaturesLoader', () => { }, ]); }); + + it('should initialize module federation with resolved shared dependencies', async () => { + server.use( + rest.get( + `${baseUrl}/.backstage/dynamic-features/remotes`, + (_, res, ctx) => res(ctx.json([])), + ), + ); + + const spyInit = jest.fn(); + await ( + dynamicFrontendFeaturesLoader({ + moduleFederation: { + plugins: [ + { + name: 'spy-init', + init: args => { + spyInit(args); + return args; + }, + }, + ...testModuleFederationPlugins, + ], + }, + }) as InternalFrontendFeatureLoader + ).loader({ + config: mockDefaultConfig(), + }); + + expect(spyInit).toHaveBeenCalledTimes(1); + expect(spyInit.mock.calls[0][0].options).toMatchObject({ + shared: Object.fromEntries( + mockedDefaultSharedItems.map(item => [ + item.name, + [ + { + version: item.version, + shareConfig: { + singleton: item.shareConfig.singleton, + requiredVersion: item.shareConfig.requiredVersion, + eager: item.shareConfig.eager, + }, + strategy: 'version-first', + }, + ], + ]), + ), + }); + }); + + it('should initialize module federation with shareStrategy option', async () => { + server.use( + rest.get( + `${baseUrl}/.backstage/dynamic-features/remotes`, + (_, res, ctx) => res(ctx.json([])), + ), + ); + + const spyInit = jest.fn(); + await ( + dynamicFrontendFeaturesLoader({ + moduleFederation: { + shareStrategy: 'loaded-first', + plugins: [ + { + name: 'spy-init', + init: args => { + spyInit(args); + return args; + }, + }, + ...testModuleFederationPlugins, + ], + }, + }) as InternalFrontendFeatureLoader + ).loader({ + config: mockDefaultConfig(), + }); + + const errorCalls = mocks.console.error.mock.calls.flatMap(e => e[0]); + expect(errorCalls).toEqual([]); + const warnCalls = mocks.console.warn.mock.calls.flatMap(e => e[0]); + expect(warnCalls).toEqual([]); + const infoCalls = mocks.console.info.mock.calls.flatMap(e => e[0]); + expect(infoCalls).toEqual([]); + const debugCalls = mocks.console.debug.mock.calls.flatMap(e => e[0]); + expect(debugCalls).toEqual([]); + expect(spyInit).toHaveBeenCalledTimes(1); + expect(spyInit.mock.calls[0][0].options).toMatchObject({ + shareStrategy: 'loaded-first', + shared: { + react: [ + { + version: '18.3.1', + shareConfig: { + singleton: true, + requiredVersion: '*', + }, + strategy: 'loaded-first', + }, + ], + }, + }); + }); + + it('should return an empty list of features if module federation initialization fails', async () => { + server.use( + rest.get( + `${baseUrl}/.backstage/dynamic-features/remotes`, + (_, res, ctx) => + res( + ctx.json([ + { + packageName: 'plugin-test-dynamic', + exposedModules: ['.'], + remoteInfo: { + name: 'test_plugin', + entry: `${baseUrl}/.backstage/dynamic-features/remotes/plugin-test-dynamic/mf-manifest.json`, + }, + }, + ]), + ), + ), + rest.get( + `${baseUrl}/.backstage/dynamic-features/remotes/plugin-test-dynamic/mf-manifest.json`, + (_, res, ctx) => + res( + ctx.json({ + name: 'test_plugin', + ...manifestDummyData, + exposes: [ + { + id: 'test_plugin:.', + name: '.', + path: '.', + ...manifestExposedRemoteDummyData, + }, + ], + }), + ), + ), + ); + + mocks.federation.get.mockReturnValue({ + default: createFrontendPlugin({ + pluginId: 'test-plugin', + extensions: [], + }), + }); + + const features = await ( + dynamicFrontendFeaturesLoader({ + moduleFederation: { + plugins: [ + ...testModuleFederationPlugins, + { + name: 'fail-init', + init: () => { + throw new Error('An initialization error'); + }, + }, + ], + }, + }) as InternalFrontendFeatureLoader + ).loader({ + config: mockDefaultConfig(), + }); + + const errorCalls = mocks.console.error.mock.calls.flatMap(e => e[0]); + expect(errorCalls).toEqual([ + 'Failed initializing module federation: Error: An initialization error', + ]); + const warnCalls = mocks.console.warn.mock.calls.flatMap(e => e[0]); + expect(warnCalls).toEqual([]); + const infoCalls = mocks.console.info.mock.calls.flatMap(e => e[0]); + expect(infoCalls).toEqual([]); + const debugCalls = mocks.console.debug.mock.calls.flatMap(e => e[0]); + expect(debugCalls).toEqual([]); + expect(mocks.federation.get.mock.calls.flatMap(e => e[0])).toEqual([]); + expect(features).toEqual([]); + }); }); diff --git a/packages/frontend-dynamic-feature-loader/src/loader.ts b/packages/frontend-dynamic-feature-loader/src/loader.ts index 9e2585d1fa..9542977203 100644 --- a/packages/frontend-dynamic-feature-loader/src/loader.ts +++ b/packages/frontend-dynamic-feature-loader/src/loader.ts @@ -15,9 +15,9 @@ */ import { - FederationRuntimePlugin, - init, - loadRemote, + ModuleFederationRuntimePlugin, + createInstance, + ModuleFederation, } from '@module-federation/enhanced/runtime'; import { Module } from '@module-federation/sdk'; import { DefaultApiClient, Remote } from './schema/openapi'; @@ -27,6 +27,7 @@ import { createFrontendFeatureLoader, } from '@backstage/frontend-plugin-api'; import { ShareStrategy, UserOptions } from '@module-federation/runtime/types'; +import { loadModuleFederationHostShared } from '@backstage/module-federation-common'; /** * @@ -39,7 +40,8 @@ export type DynamicFrontendFeaturesLoaderOptions = { moduleFederation: { shared?: UserOptions['shared']; shareStrategy?: ShareStrategy; - plugins?: Array; + plugins?: Array; + instance?: ModuleFederation; }; }; @@ -98,18 +100,49 @@ export function dynamicFrontendFeaturesLoader( return []; } + let instance: ModuleFederation; try { - init({ - ...options?.moduleFederation, - name: appPackageName - .replaceAll('@', '') - .replaceAll('/', '__') - .replaceAll('-', '_'), - remotes: frontendPluginRemotes.map(remote => ({ - alias: remote.packageName, - ...remote.remoteInfo, - })), - }); + if (options?.moduleFederation?.instance) { + instance = options.moduleFederation.instance; + } else { + const shared = await loadModuleFederationHostShared({ + onError: err => error(err.message, err.cause), + }); + + const createOptions: UserOptions = { + name: appPackageName + .replaceAll('@', '') + .replaceAll('/', '__') + .replaceAll('-', '_'), + shared, + remotes: [], + }; + if (options?.moduleFederation?.shareStrategy) { + createOptions.shareStrategy = + options.moduleFederation.shareStrategy; + } + instance = createInstance(createOptions); + } + + const userOptions: UserOptions = { + name: instance.name, + remotes: [], + }; + + if (options?.moduleFederation?.plugins) { + userOptions.plugins = options.moduleFederation.plugins; + } + if (options?.moduleFederation?.shareStrategy) { + userOptions.shareStrategy = options.moduleFederation.shareStrategy; + } + if (options?.moduleFederation?.shared) { + userOptions.shared = options.moduleFederation.shared; + } + userOptions.remotes = frontendPluginRemotes.map(remote => ({ + alias: remote.packageName, + ...remote.remoteInfo, + })); + instance.initOptions(userOptions); } catch (err) { error(`Failed initializing module federation`, err); return []; @@ -131,7 +164,7 @@ export function dynamicFrontendFeaturesLoader( : `${remote.remoteInfo.name}/${exposedModuleName}`; let module: Module; try { - module = await loadRemote(remoteModuleName); + module = await instance.loadRemote(remoteModuleName); } catch (err) { error( `Failed loading remote module '${remoteModuleName}' of dynamic plugin '${remote.packageName}'`, diff --git a/packages/frontend-internal/CHANGELOG.md b/packages/frontend-internal/CHANGELOG.md index de5b02e547..654687a36e 100644 --- a/packages/frontend-internal/CHANGELOG.md +++ b/packages/frontend-internal/CHANGELOG.md @@ -1,5 +1,22 @@ # @internal/frontend +## 0.0.17-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/version-bridge@1.0.12-next.0 + +## 0.0.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + ## 0.0.16 ### Patch Changes diff --git a/packages/frontend-internal/package.json b/packages/frontend-internal/package.json index 705aec5835..92a344d524 100644 --- a/packages/frontend-internal/package.json +++ b/packages/frontend-internal/package.json @@ -1,6 +1,6 @@ { "name": "@internal/frontend", - "version": "0.0.16", + "version": "0.0.17-next.1", "backstage": { "role": "web-library", "inline": true diff --git a/packages/frontend-plugin-api/CHANGELOG.md b/packages/frontend-plugin-api/CHANGELOG.md index f2c4f2029c..30effaf5c3 100644 --- a/packages/frontend-plugin-api/CHANGELOG.md +++ b/packages/frontend-plugin-api/CHANGELOG.md @@ -1,5 +1,71 @@ # @backstage/frontend-plugin-api +## 0.14.0-next.2 + +### 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/version-bridge@1.0.12-next.0 + +## 0.14.0-next.1 + +### Minor Changes + +- bb9b471: Plugin IDs that do not match the standard format are deprecated (letters, digits, and dashes only, starting with a letter). Plugin IDs that do no match this format will be rejected in a future release. +- 10ebed4: **BREAKING**: Removed type support for multiple attachment points in the `ExtensionDefinitionAttachTo` type. Extensions can no longer specify an array of attachment points in the `attachTo` property. + + The runtime still supports multiple attachment points for backward compatibility with existing compiled code, but new code will receive type errors if attempting to use this pattern. + + Extensions that previously used multiple attachment points should migrate to using a Utility API pattern instead. See the [Sharing Extensions Across Multiple Locations](https://backstage.io/docs/frontend-system/architecture/27-sharing-extensions) guide for the recommended approach. + +## 0.14.0-next.0 + +### Minor Changes + +- c38b74d: **BREAKING**: The following blueprints have been removed and are now only available from `@backstage/plugin-app-react`: + + - `IconBundleBlueprint` + - `NavContentBlueprint` + - `RouterBlueprint` + - `SignInPageBlueprint` + - `SwappableComponentBlueprint` + - `ThemeBlueprint` + - `TranslationBlueprint` + +### Patch Changes + +- 7edb810: Added a new `internal` option to `createExtensionInput` that marks the input as only allowing attachments from the same plugin. +- 9554c36: **DEPRECATED**: Multiple attachment points for extensions have been deprecated. The functionality continues to work for backward compatibility, but will log a deprecation warning and be removed in a future release. + + Extensions using array attachment points should migrate to using Utility APIs instead. See the [Sharing Extensions Across Multiple Locations](https://backstage.io/docs/frontend-system/architecture/27-sharing-extensions) guide for the recommended pattern. + +- 53b6549: Plugins in the new frontend system now have a `pluginId` field rather than `id` to better align with naming conventions used throughout the frontend and backend systems. The old field is still present but marked as deprecated. All internal code has been updated to prefer `pluginId` while maintaining backward compatibility by falling back to `id` when needed. +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## 0.13.3 + +### Patch Changes + +- 3bd2a1a: Updated documentation for `createApiRef` to clarify the role of the ID in specifying the owning plugin of an API. +- 9ccf84e: The following blueprints are being restricted to only be used in app plugin overrides and modules. They are being moved to the `@backstage/plugin-app-react` package and have been deprecated: + + - `AppRootWrapperBlueprint` + - `IconBundleBlueprint` + - `NavContentBlueprint` + - `RouterBlueprint` + - `SignInPageBlueprint` + - `SwappableComponentBlueprint` + - `ThemeBlueprint` + - `TranslationBlueprint` + +- 4554a4e: Added an alpha `PluginWrapperBlueprint` exported from `@backstage/frontend-plugin-api/alpha`, which can install components that will wrap all plugin elements. +- 872eb91: Upgrade `zod-to-json-schema` to latest version + ## 0.13.2 ### Patch Changes diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json index bda034ac78..aeffe8f3fc 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.13.2", + "version": "0.14.0-next.2", "backstage": { "role": "web-library" }, @@ -16,12 +16,16 @@ "sideEffects": false, "exports": { ".": "./src/index.ts", + "./alpha": "./src/alpha.ts", "./package.json": "./package.json" }, "main": "src/index.ts", "types": "src/index.ts", "typesVersions": { "*": { + "alpha": [ + "src/alpha.ts" + ], "package.json": [ "package.json" ] @@ -43,8 +47,8 @@ "@backstage/errors": "workspace:^", "@backstage/types": "workspace:^", "@backstage/version-bridge": "workspace:^", - "zod": "^3.22.4", - "zod-to-json-schema": "^3.21.4" + "zod": "^3.25.76", + "zod-to-json-schema": "^3.25.1" }, "devDependencies": { "@backstage/cli": "workspace:^", @@ -58,13 +62,13 @@ "history": "^5.3.0", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/frontend-plugin-api/report-alpha.api.md b/packages/frontend-plugin-api/report-alpha.api.md new file mode 100644 index 0000000000..77a377bb8e --- /dev/null +++ b/packages/frontend-plugin-api/report-alpha.api.md @@ -0,0 +1,68 @@ +## API Report File for "@backstage/frontend-plugin-api" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { ApiRef } from '@backstage/frontend-plugin-api'; +import { ComponentType } from 'react'; +import { ConfigurableExtensionDataRef } from '@backstage/frontend-plugin-api'; +import { ExtensionBlueprint } from '@backstage/frontend-plugin-api'; +import { ExtensionBlueprintParams } from '@backstage/frontend-plugin-api'; +import { ExtensionDataRef } from '@backstage/frontend-plugin-api'; +import { ReactNode } from 'react'; + +// @alpha +export type PluginWrapperApi = { + getPluginWrapper(pluginId: string): + | ComponentType<{ + children: ReactNode; + }> + | undefined; +}; + +// @alpha +export const pluginWrapperApiRef: ApiRef; + +// @alpha +export const PluginWrapperBlueprint: ExtensionBlueprint<{ + kind: 'plugin-wrapper'; + params: (params: { + loader: () => Promise<{ + component: ComponentType<{ + children: ReactNode; + }>; + }>; + }) => ExtensionBlueprintParams<{ + loader: () => Promise<{ + component: ComponentType<{ + children: ReactNode; + }>; + }>; + }>; + output: ExtensionDataRef< + () => Promise<{ + component: ComponentType<{ + children: ReactNode; + }>; + }>, + 'core.plugin-wrapper.loader', + {} + >; + inputs: {}; + config: {}; + configInput: {}; + dataRefs: { + wrapper: ConfigurableExtensionDataRef< + () => Promise<{ + component: ComponentType<{ + children: ReactNode; + }>; + }>, + 'core.plugin-wrapper.loader', + {} + >; + }; +}>; + +// (No @packageDocumentation comment for this package) +``` diff --git a/packages/frontend-plugin-api/report.api.md b/packages/frontend-plugin-api/report.api.md index fbe7110d80..89fc72992a 100644 --- a/packages/frontend-plugin-api/report.api.md +++ b/packages/frontend-plugin-api/report.api.md @@ -13,7 +13,6 @@ import { ExpandRecursive } from '@backstage/types'; import { ExtensionBlueprint as ExtensionBlueprint_2 } from '@backstage/frontend-plugin-api'; import { ExtensionBlueprintParams as ExtensionBlueprintParams_2 } from '@backstage/frontend-plugin-api'; import { ExtensionDataRef as ExtensionDataRef_2 } from '@backstage/frontend-plugin-api'; -import { IconComponent as IconComponent_2 } from '@backstage/frontend-plugin-api'; import { JsonObject } from '@backstage/types'; import { JsonValue } from '@backstage/types'; import { JSX as JSX_2 } from 'react/jsx-runtime'; @@ -21,7 +20,6 @@ import { JSX as JSX_3 } from 'react'; import { Observable } from '@backstage/types'; import { PropsWithChildren } from 'react'; import { ReactNode } from 'react'; -import { RouteRef as RouteRef_2 } from '@backstage/frontend-plugin-api'; import { SwappableComponentRef as SwappableComponentRef_2 } from '@backstage/frontend-plugin-api'; import type { z } from 'zod'; @@ -271,30 +269,6 @@ export const AppRootElementBlueprint: ExtensionBlueprint_2<{ dataRefs: never; }>; -// @public -export const AppRootWrapperBlueprint: ExtensionBlueprint_2<{ - kind: 'app-root-wrapper'; - params: { - Component?: [error: 'Use the `component` parameter instead']; - component: (props: { children: ReactNode }) => JSX.Element | null; - }; - output: ExtensionDataRef_2< - (props: { children: ReactNode }) => JSX.Element | null, - 'app.root.wrapper', - {} - >; - inputs: {}; - config: {}; - configInput: {}; - dataRefs: { - component: ConfigurableExtensionDataRef_2< - (props: { children: ReactNode }) => JSX.Element | null, - 'app.root.wrapper', - {} - >; - }; -}>; - // @public export type AppTheme = { id: string; @@ -604,7 +578,7 @@ export function createExtensionDataRef(): { }): ConfigurableExtensionDataRef; }; -// @public (undocumented) +// @public export function createExtensionInput< UExtensionData extends ExtensionDataRef< unknown, @@ -616,6 +590,7 @@ export function createExtensionInput< TConfig extends { singleton?: boolean; optional?: boolean; + internal?: boolean; }, >( extensionData: Array, @@ -630,6 +605,7 @@ export function createExtensionInput< { singleton: TConfig['singleton'] extends true ? true : false; optional: TConfig['optional'] extends true ? true : false; + internal: TConfig['internal'] extends true ? true : false; } >; @@ -1229,23 +1205,7 @@ export type ExtensionDefinitionAttachTo< input: string; id?: never; } - | ExtensionInput - | Array< - | { - id: string; - input: string; - relative?: never; - } - | { - relative: { - kind?: string; - name?: string; - }; - input: string; - id?: never; - } - | ExtensionInput - >; + | ExtensionInput; // @public (undocumented) export type ExtensionDefinitionParameters = { @@ -1288,9 +1248,11 @@ export interface ExtensionInput< TConfig extends { singleton: boolean; optional: boolean; + internal?: boolean; } = { singleton: boolean; optional: boolean; + internal?: boolean; }, > { // (undocumented) @@ -1405,9 +1367,10 @@ export interface FrontendPlugin< readonly $$type: '@backstage/FrontendPlugin'; // (undocumented) readonly externalRoutes: TExternalRoutes; - // (undocumented) + // @deprecated readonly id: string; info(): Promise; + readonly pluginId: string; // (undocumented) readonly routes: TRoutes; } @@ -1457,33 +1420,6 @@ export const googleAuthApiRef: ApiRef< SessionApi >; -// @public (undocumented) -export const IconBundleBlueprint: ExtensionBlueprint_2<{ - kind: 'icon-bundle'; - params: { - icons: { [key in string]: IconComponent }; - }; - output: ExtensionDataRef_2< - { - [x: string]: IconComponent; - }, - 'core.icons', - {} - >; - inputs: {}; - config: {}; - configInput: {}; - dataRefs: { - icons: ConfigurableExtensionDataRef_2< - { - [x: string]: IconComponent; - }, - 'core.icons', - {} - >; - }; -}>; - // @public export type IconComponent = ComponentType<{ fontSize?: 'medium' | 'large' | 'small' | 'inherit'; @@ -1522,45 +1458,6 @@ export const microsoftAuthApiRef: ApiRef< SessionApi >; -// @public -export const NavContentBlueprint: ExtensionBlueprint_2<{ - kind: 'nav-content'; - params: { - component: NavContentComponent; - }; - output: ExtensionDataRef_2< - NavContentComponent, - 'core.nav-content.component', - {} - >; - inputs: {}; - config: {}; - configInput: {}; - dataRefs: { - component: ConfigurableExtensionDataRef_2< - NavContentComponent, - 'core.nav-content.component', - {} - >; - }; -}>; - -// @public -export type NavContentComponent = ( - props: NavContentComponentProps, -) => JSX.Element | null; - -// @public -export interface NavContentComponentProps { - items: Array<{ - icon: IconComponent_2; - title: string; - routeRef: RouteRef_2; - to: string; - text: string; - }>; -} - // @public export const NavItemBlueprint: ExtensionBlueprint_2<{ kind: 'nav-item'; @@ -1923,30 +1820,6 @@ export type RouteFunc = ( : readonly [params: TParams] ) => string; -// @public (undocumented) -export const RouterBlueprint: ExtensionBlueprint_2<{ - kind: 'app-router-component'; - params: { - Component?: [error: 'Use the `component` parameter instead']; - component: (props: { children: ReactNode }) => JSX.Element | null; - }; - output: ExtensionDataRef_2< - (props: { children: ReactNode }) => JSX.Element | null, - 'app.router.wrapper', - {} - >; - inputs: {}; - config: {}; - configInput: {}; - dataRefs: { - component: ConfigurableExtensionDataRef_2< - (props: { children: ReactNode }) => JSX.Element | null, - 'app.router.wrapper', - {} - >; - }; -}>; - // @public export interface RouteRef< TParams extends AnyRouteRefParams = AnyRouteRefParams, @@ -1998,35 +1871,6 @@ export namespace SessionState { export type SignedOut = typeof SessionState.SignedOut; } -// @public -export const SignInPageBlueprint: ExtensionBlueprint_2<{ - kind: 'sign-in-page'; - params: { - loader: () => Promise>; - }; - output: ExtensionDataRef_2< - ComponentType, - 'core.sign-in-page.component', - {} - >; - inputs: {}; - config: {}; - configInput: {}; - dataRefs: { - component: ConfigurableExtensionDataRef_2< - ComponentType, - 'core.sign-in-page.component', - {} - >; - }; -}>; - -// @public -export type SignInPageProps = { - onSignInSuccess(identityApi: IdentityApi): void; - children?: ReactNode; -}; - // @public export interface StorageApi { forBucket(name: string): StorageApi; @@ -2066,65 +1910,6 @@ export interface SubRouteRef< readonly T: TParams; } -// @public -export const SwappableComponentBlueprint: ExtensionBlueprint_2<{ - kind: 'component'; - params: >(params: { - component: Ref extends SwappableComponentRef< - any, - infer IExternalComponentProps - > - ? { - ref: Ref; - } & ((props: IExternalComponentProps) => JSX.Element | null) - : never; - loader: Ref extends SwappableComponentRef - ? - | (() => (props: IInnerComponentProps) => JSX.Element | null) - | (() => Promise<(props: IInnerComponentProps) => JSX.Element | null>) - : never; - }) => ExtensionBlueprintParams_2<{ - component: Ref extends SwappableComponentRef< - any, - infer IExternalComponentProps - > - ? { - ref: Ref; - } & ((props: IExternalComponentProps) => JSX.Element | null) - : never; - loader: Ref extends SwappableComponentRef - ? - | (() => (props: IInnerComponentProps) => JSX.Element | null) - | (() => Promise<(props: IInnerComponentProps) => JSX.Element | null>) - : never; - }>; - output: ExtensionDataRef_2< - { - ref: SwappableComponentRef; - loader: - | (() => (props: {}) => JSX.Element | null) - | (() => Promise<(props: {}) => JSX.Element | null>); - }, - 'core.swappableComponent', - {} - >; - inputs: {}; - config: {}; - configInput: {}; - dataRefs: { - component: ConfigurableExtensionDataRef_2< - { - ref: SwappableComponentRef; - loader: - | (() => (props: {}) => JSX.Element | null) - | (() => Promise<(props: {}) => JSX.Element | null>); - }, - 'core.swappableComponent', - {} - >; - }; -}>; - // @public (undocumented) export type SwappableComponentRef< TInnerComponentProps extends {} = {}, @@ -2150,21 +1935,6 @@ export interface SwappableComponentsApi { // @public export const swappableComponentsApiRef: ApiRef_2; -// @public -export const ThemeBlueprint: ExtensionBlueprint_2<{ - kind: 'theme'; - params: { - theme: AppTheme; - }; - output: ExtensionDataRef_2; - inputs: {}; - config: {}; - configInput: {}; - dataRefs: { - theme: ConfigurableExtensionDataRef_2; - }; -}>; - // @public (undocumented) export type TranslationApi = { getTranslation< @@ -2186,43 +1956,6 @@ export type TranslationApi = { // @public (undocumented) export const translationApiRef: ApiRef; -// @public -export const TranslationBlueprint: ExtensionBlueprint_2<{ - kind: 'translation'; - params: { - resource: TranslationResource | TranslationMessages; - }; - output: ExtensionDataRef_2< - | TranslationResource - | TranslationMessages< - string, - { - [x: string]: string; - }, - boolean - >, - 'core.translation.translation', - {} - >; - inputs: {}; - config: {}; - configInput: {}; - dataRefs: { - translation: ConfigurableExtensionDataRef_2< - | TranslationResource - | TranslationMessages< - string, - { - [x: string]: string; - }, - boolean - >, - 'core.translation.translation', - {} - >; - }; -}>; - // @public (undocumented) export type TranslationFunction< TMessages extends { diff --git a/packages/frontend-plugin-api/src/alpha.ts b/packages/frontend-plugin-api/src/alpha.ts new file mode 100644 index 0000000000..2251bfafb7 --- /dev/null +++ b/packages/frontend-plugin-api/src/alpha.ts @@ -0,0 +1,21 @@ +/* + * Copyright 2024 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 { PluginWrapperBlueprint } from './blueprints/PluginWrapperBlueprint'; +export { + type PluginWrapperApi, + pluginWrapperApiRef, +} from './apis/definitions/PluginWrapperApi'; diff --git a/packages/frontend-plugin-api/src/apis/definitions/PluginWrapperApi.ts b/packages/frontend-plugin-api/src/apis/definitions/PluginWrapperApi.ts new file mode 100644 index 0000000000..a4b66d6128 --- /dev/null +++ b/packages/frontend-plugin-api/src/apis/definitions/PluginWrapperApi.ts @@ -0,0 +1,50 @@ +/* + * Copyright 2024 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 { ComponentType, ReactNode } from 'react'; +import { createApiRef } from '@backstage/frontend-plugin-api'; + +/** + * The Plugin Wrapper API is used to wrap plugin extensions with providers, + * plugins should generally use `ExtensionBoundary` instead. + * + * @remarks + * + * This API is primarily intended for internal use by the Backstage frontend + * system, but can be used for advanced use-cases. If you do override it, be + * sure to include the default implementation as well. + * + * @alpha + */ +export type PluginWrapperApi = { + /** + * Returns a wrapper component for a specific plugin, or undefined if no + * wrappers exist. Do not use this API directly, instead use + * `ExtensionBoundary` to wrap your plugin components if needed. + */ + getPluginWrapper( + pluginId: string, + ): ComponentType<{ children: ReactNode }> | undefined; +}; + +/** + * The API reference of {@link PluginWrapperApi}. + * + * @alpha + */ +export const pluginWrapperApiRef = createApiRef({ + id: 'core.plugin-wrapper.alpha', +}); diff --git a/packages/frontend-plugin-api/src/apis/system/ApiRef.ts b/packages/frontend-plugin-api/src/apis/system/ApiRef.ts index adedff9f73..0db3d89bd5 100644 --- a/packages/frontend-plugin-api/src/apis/system/ApiRef.ts +++ b/packages/frontend-plugin-api/src/apis/system/ApiRef.ts @@ -53,7 +53,15 @@ class ApiRefImpl implements ApiRef { } /** - * Creates a reference to an API. + * Creates a reference to an API. The provided `id` is a stable identifier for + * the API implementation. + * + * @remarks + * + * The frontend system infers the owning plugin for an API from the `id`. The + * recommended pattern is `plugin..*` (for example, + * `plugin.catalog.entity-presentation`). This ensures that other plugins can't + * mistakenly override your API implementation. * * @param config - The descriptor of the API to reference. * @returns An API reference. diff --git a/packages/frontend-plugin-api/src/blueprints/AnalyticsImplementationBlueprint.test.ts b/packages/frontend-plugin-api/src/blueprints/AnalyticsImplementationBlueprint.test.ts index b297b3a3a9..06ad9b877e 100644 --- a/packages/frontend-plugin-api/src/blueprints/AnalyticsImplementationBlueprint.test.ts +++ b/packages/frontend-plugin-api/src/blueprints/AnalyticsImplementationBlueprint.test.ts @@ -32,12 +32,10 @@ describe('AnalyticsBlueprint', () => { { "$$type": "@backstage/ExtensionDefinition", "T": undefined, - "attachTo": [ - { - "id": "api:app/analytics", - "input": "implementations", - }, - ], + "attachTo": { + "id": "api:app/analytics", + "input": "implementations", + }, "configSchema": undefined, "disabled": false, "factory": [Function], diff --git a/packages/frontend-plugin-api/src/blueprints/AnalyticsImplementationBlueprint.ts b/packages/frontend-plugin-api/src/blueprints/AnalyticsImplementationBlueprint.ts index 91a0f27092..23b5982738 100644 --- a/packages/frontend-plugin-api/src/blueprints/AnalyticsImplementationBlueprint.ts +++ b/packages/frontend-plugin-api/src/blueprints/AnalyticsImplementationBlueprint.ts @@ -41,7 +41,7 @@ const factoryDataRef = */ export const AnalyticsImplementationBlueprint = createExtensionBlueprint({ kind: 'analytics', - attachTo: [{ id: 'api:app/analytics', input: 'implementations' }], + attachTo: { id: 'api:app/analytics', input: 'implementations' }, output: [factoryDataRef], dataRefs: { factory: factoryDataRef, diff --git a/packages/frontend-plugin-api/src/blueprints/ApiBlueprint.test.ts b/packages/frontend-plugin-api/src/blueprints/ApiBlueprint.test.ts index 6d16a215e1..8043752687 100644 --- a/packages/frontend-plugin-api/src/blueprints/ApiBlueprint.test.ts +++ b/packages/frontend-plugin-api/src/blueprints/ApiBlueprint.test.ts @@ -200,6 +200,7 @@ describe('ApiBlueprint', () => { "test": { "$$type": "@backstage/ExtensionInput", "config": { + "internal": false, "optional": false, "singleton": false, }, diff --git a/packages/frontend-plugin-api/src/blueprints/AppRootElementBlueprint.test.tsx b/packages/frontend-plugin-api/src/blueprints/AppRootElementBlueprint.test.tsx index 31d7323aec..57984761ac 100644 --- a/packages/frontend-plugin-api/src/blueprints/AppRootElementBlueprint.test.tsx +++ b/packages/frontend-plugin-api/src/blueprints/AppRootElementBlueprint.test.tsx @@ -15,11 +15,7 @@ */ import { screen, waitFor } from '@testing-library/react'; -import { - MockErrorApi, - TestApiProvider, - withLogCollector, -} from '@backstage/test-utils'; +import { MockErrorApi, withLogCollector } from '@backstage/test-utils'; import { errorApiRef } from '../apis'; import { createExtensionTester, @@ -74,11 +70,9 @@ describe('AppRootElementBlueprint', () => { }); const tester = createExtensionTester(extension); - renderInTestApp( - - {tester.reactElement()} - , - ); + renderInTestApp(tester.reactElement(), { + apis: [[errorApiRef, errorApi]], + }); await waitFor(() => { const errors = errorApi.getErrors(); diff --git a/packages/frontend-plugin-api/src/blueprints/PageBlueprint.test.tsx b/packages/frontend-plugin-api/src/blueprints/PageBlueprint.test.tsx index 680d93cd1c..c5c34fc02f 100644 --- a/packages/frontend-plugin-api/src/blueprints/PageBlueprint.test.tsx +++ b/packages/frontend-plugin-api/src/blueprints/PageBlueprint.test.tsx @@ -153,4 +153,61 @@ describe('PageBlueprint', () => { expect(getByText("I'm a lovely card")).toBeInTheDocument(), ); }); + + it('should produce a correct extension tree snapshot with child extensions', () => { + const myPage = PageBlueprint.makeWithOverrides({ + name: 'test-page', + inputs: { + cards: createExtensionInput([coreExtensionData.reactElement], { + optional: false, + singleton: false, + }), + }, + factory(originalFactory, { inputs }) { + return originalFactory({ + loader: async () => ( +
    + {inputs.cards.map(c => c.get(coreExtensionData.reactElement))} +
    + ), + path: '/test', + routeRef: mockRouteRef, + }); + }, + }); + + const CardBlueprint = createExtensionBlueprint({ + kind: 'card', + attachTo: { id: 'page:test-page', input: 'cards' }, + output: [coreExtensionData.reactElement], + factory() { + return [coreExtensionData.reactElement(
    I'm a lovely card
    )]; + }, + }); + + const tester = createExtensionTester(myPage).add( + CardBlueprint.make({ name: 'card', params: {} }), + ); + + expect(tester.snapshot()).toMatchInlineSnapshot(` + { + "children": { + "cards": [ + { + "id": "card:card", + "outputs": [ + "core.reactElement", + ], + }, + ], + }, + "id": "page:test-page", + "outputs": [ + "core.reactElement", + "core.routing.path", + "core.routing.ref", + ], + } + `); + }); }); diff --git a/packages/frontend-plugin-api/src/blueprints/PluginWrapperBlueprint.tsx b/packages/frontend-plugin-api/src/blueprints/PluginWrapperBlueprint.tsx new file mode 100644 index 0000000000..f6f673bd93 --- /dev/null +++ b/packages/frontend-plugin-api/src/blueprints/PluginWrapperBlueprint.tsx @@ -0,0 +1,50 @@ +/* + * Copyright 2024 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 { ComponentType, ReactNode } from 'react'; +import { + createExtensionBlueprint, + createExtensionBlueprintParams, + createExtensionDataRef, +} from '../wiring'; + +const wrapperDataRef = createExtensionDataRef< + () => Promise<{ component: ComponentType<{ children: ReactNode }> }> +>().with({ id: 'core.plugin-wrapper.loader' }); + +/** + * Creates extensions that wrap plugin extensions with providers. + * + * @alpha + */ +export const PluginWrapperBlueprint = createExtensionBlueprint({ + kind: 'plugin-wrapper', + attachTo: { id: 'api:app/plugin-wrapper', input: 'wrappers' }, + output: [wrapperDataRef], + dataRefs: { + wrapper: wrapperDataRef, + }, + defineParams(params: { + loader: () => Promise<{ + component: ComponentType<{ children: ReactNode }>; + }>; + }) { + return createExtensionBlueprintParams(params); + }, + *factory(params) { + yield wrapperDataRef(params.loader); + }, +}); diff --git a/packages/frontend-plugin-api/src/blueprints/index.ts b/packages/frontend-plugin-api/src/blueprints/index.ts index 379c8d237b..344b44dbff 100644 --- a/packages/frontend-plugin-api/src/blueprints/index.ts +++ b/packages/frontend-plugin-api/src/blueprints/index.ts @@ -20,20 +20,5 @@ export { } from './AnalyticsImplementationBlueprint'; export { ApiBlueprint } from './ApiBlueprint'; export { AppRootElementBlueprint } from './AppRootElementBlueprint'; -export { AppRootWrapperBlueprint } from './AppRootWrapperBlueprint'; -export { IconBundleBlueprint } from './IconBundleBlueprint'; -export { - NavContentBlueprint, - type NavContentComponent, - type NavContentComponentProps, -} from './NavContentBlueprint'; export { NavItemBlueprint } from './NavItemBlueprint'; export { PageBlueprint } from './PageBlueprint'; -export { RouterBlueprint } from './RouterBlueprint'; -export { - type SignInPageProps, - SignInPageBlueprint, -} from './SignInPageBlueprint'; -export { ThemeBlueprint } from './ThemeBlueprint'; -export { TranslationBlueprint } from './TranslationBlueprint'; -export { SwappableComponentBlueprint } from './SwappableComponentBlueprint'; diff --git a/packages/frontend-plugin-api/src/components/ExtensionBoundary.test.tsx b/packages/frontend-plugin-api/src/components/ExtensionBoundary.test.tsx index ae741f8922..1215c7576f 100644 --- a/packages/frontend-plugin-api/src/components/ExtensionBoundary.test.tsx +++ b/packages/frontend-plugin-api/src/components/ExtensionBoundary.test.tsx @@ -14,9 +14,9 @@ * limitations under the License. */ -import { useEffect } from 'react'; +import { useEffect, ReactNode } from 'react'; import { act, screen, waitFor } from '@testing-library/react'; -import { TestApiProvider, withLogCollector } from '@backstage/test-utils'; +import { withLogCollector } from '@backstage/test-utils'; import { ExtensionBoundary } from './ExtensionBoundary'; import { coreExtensionData, createExtension } from '../wiring'; import { analyticsApiRef } from '../apis/definitions/AnalyticsApi'; @@ -26,6 +26,11 @@ import { createExtensionTester, renderInTestApp, } from '@backstage/frontend-test-utils'; +import { + pluginWrapperApiRef, + PluginWrapperApi, +} from '../apis/definitions/PluginWrapperApi'; +import { useAppNode } from '@backstage/frontend-plugin-api'; const wrapInBoundaryExtension = (element?: JSX.Element) => { const routeRef = createRouteRef(); @@ -101,11 +106,12 @@ describe('ExtensionBoundary', () => { }; renderInTestApp( - - {createExtensionTester( - wrapInBoundaryExtension(), - ).reactElement()} - , + createExtensionTester( + wrapInBoundaryExtension(), + ).reactElement(), + { + apis: [[analyticsApiRef, analyticsApiMock]], + }, ); await waitFor(() => { @@ -121,9 +127,91 @@ describe('ExtensionBoundary', () => { }); }); - // TODO(Rugvip): Need a way to be able to override APIs in the app to be able to test this properly - // eslint-disable-next-line jest/no-disabled-tests - it.skip('should emit analytics events if routable', async () => { + it('should wrap children with PluginWrapper when provided', async () => { + const text = 'Wrapped Content'; + const TextComponent = () => { + return

    {text}

    ; + }; + + const WrapperComponent = ({ children }: { children: ReactNode }) => { + const node = useAppNode(); + return ( +
    + Wrapper for {node?.spec.id} + {children} +
    + ); + }; + + const pluginWrapperApi: PluginWrapperApi = { + getPluginWrapper: jest.fn((pluginId: string) => { + if (pluginId === 'app') { + return WrapperComponent; + } + return undefined; + }), + }; + + renderInTestApp( + createExtensionTester( + wrapInBoundaryExtension(), + ).reactElement(), + { + apis: [[pluginWrapperApiRef, pluginWrapperApi]], + }, + ); + + const wrappers = await screen.findAllByTestId('plugin-wrapper'); + expect(wrappers.length).toBeGreaterThan(1); + expect(screen.getByText('Wrapper for app')).toBeInTheDocument(); + expect(screen.getByText('Wrapper for test')).toBeInTheDocument(); + expect(screen.getByText(text)).toBeInTheDocument(); + expect(pluginWrapperApi.getPluginWrapper).toHaveBeenCalledWith('app'); + }); + + it('should handle errors thrown by PluginWrapper with ErrorDisplayBoundary', async () => { + const errorMsg = 'PluginWrapper error'; + const TextComponent = () => { + return

    Content

    ; + }; + + const ThrowingWrapper = () => { + throw new Error(errorMsg); + }; + + const pluginWrapperApi: PluginWrapperApi = { + getPluginWrapper: jest.fn((pluginId: string) => { + if (pluginId === 'app') { + return ThrowingWrapper; + } + return undefined; + }), + }; + + const { error } = await withLogCollector(['error'], async () => { + renderInTestApp( + createExtensionTester( + wrapInBoundaryExtension(), + ).reactElement(), + { + apis: [[pluginWrapperApiRef, pluginWrapperApi]], + }, + ); + await waitFor(() => + expect(screen.getByText(errorMsg)).toBeInTheDocument(), + ); + }); + + expect(error).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + message: expect.stringContaining(errorMsg), + }), + ]), + ); + }); + + it('should emit analytics events if routable', async () => { const Emitter = () => { const analytics = useAnalytics(); useEffect(() => { @@ -138,22 +226,25 @@ describe('ExtensionBoundary', () => { createExtensionTester( wrapInBoundaryExtension(), ).reactElement(), - // { apis: [[analyticsApiRef, analyticsApiMock]] }, + { apis: [[analyticsApiRef, analyticsApiMock]] }, ); }); + // The navigate event is emitted by the app's routing, with app context expect(analyticsApiMock.captureEvent).toHaveBeenCalledWith( expect.objectContaining({ action: 'navigate', subject: '/', + }), + ); + // The dummy event from our test extension has the correct extension context + expect(analyticsApiMock.captureEvent).toHaveBeenCalledWith( + expect.objectContaining({ + action: 'dummy', context: expect.objectContaining({ - pluginId: 'root', extensionId: 'test', }), }), ); - expect(analyticsApiMock.captureEvent).toHaveBeenCalledWith( - expect.objectContaining({ action: 'dummy' }), - ); }); }); diff --git a/packages/frontend-plugin-api/src/components/ExtensionBoundary.tsx b/packages/frontend-plugin-api/src/components/ExtensionBoundary.tsx index 6e4487ed9b..09cfc51bd7 100644 --- a/packages/frontend-plugin-api/src/components/ExtensionBoundary.tsx +++ b/packages/frontend-plugin-api/src/components/ExtensionBoundary.tsx @@ -19,6 +19,7 @@ import { ReactNode, Suspense, useEffect, + useMemo, lazy as reactLazy, } from 'react'; import { AnalyticsContext, useAnalytics } from '../analytics'; @@ -27,6 +28,10 @@ import { ErrorApiBoundary } from './ErrorApiBoundary'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { routableExtensionRenderedEvent } from '../../../core-plugin-api/src/analytics/Tracker'; import { AppNode, ErrorApi, errorApiRef, useApi } from '../apis'; +import { + PluginWrapperApi, + pluginWrapperApiRef, +} from '../apis/definitions/PluginWrapperApi'; import { coreExtensionData } from '../wiring'; import { AppNodeProvider } from './AppNodeProvider'; import { Progress } from './DefaultSwappableComponents'; @@ -39,6 +44,13 @@ function useOptionalErrorApi(): ErrorApi | undefined { } } +function useOptionalPluginWrapperApi(): PluginWrapperApi | undefined { + try { + return useApi(pluginWrapperApiRef); + } catch { + return undefined; + } +} type RouteTrackerProps = PropsWithChildren<{ enabled?: boolean; }>; @@ -78,11 +90,18 @@ export function ExtensionBoundary(props: ExtensionBoundaryProps) { ); const plugin = node.spec.plugin; + const pluginId = plugin.pluginId ?? 'app'; + + const pluginWrapperApi = useOptionalPluginWrapperApi(); + + const PluginWrapper = useMemo(() => { + return pluginWrapperApi?.getPluginWrapper(pluginId); + }, [pluginWrapperApi, pluginId]); // Skipping "routeRef" attribute in the new system, the extension "id" should provide more insight const attributes = { extensionId: node.spec.id, - pluginId: plugin.id ?? 'app', + pluginId, }; let content = ( @@ -91,6 +110,10 @@ export function ExtensionBoundary(props: ExtensionBoundaryProps) { ); + if (PluginWrapper) { + content = {content}; + } + if (props.errorPresentation === 'error-api') { content = ( diff --git a/packages/frontend-plugin-api/src/wiring/constants.ts b/packages/frontend-plugin-api/src/wiring/constants.ts new file mode 100644 index 0000000000..5300cfc27f --- /dev/null +++ b/packages/frontend-plugin-api/src/wiring/constants.ts @@ -0,0 +1,30 @@ +/* + * 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. + */ + +// NOTE: changing any of these constants need to be reflected in +// @backstage/backend-plugin-api/src/wiring/constants.ts as well + +/** + * The pattern that IDs must match. + * + * @remarks + * ids must only contain the letters `a` through `z` and digits, in groups separated by + * dashes. Additionally, the very first character of the first group + * must be a letter, not a digit + * + * @public + */ +export const ID_PATTERN = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/i; diff --git a/packages/frontend-plugin-api/src/wiring/createExtension.test.ts b/packages/frontend-plugin-api/src/wiring/createExtension.test.ts index 989dcf4468..8f259be6f9 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtension.test.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtension.test.ts @@ -202,12 +202,14 @@ describe('createExtension', () => { }); }); - it('should create an extension with multiple attachment points', () => { + // Tests for backward compatibility - runtime still supports multiple attachment points + // but the TypeScript types no longer allow them + it('should create an extension with multiple attachment points (backward compat)', () => { const extension = createExtension({ attachTo: [ { id: 'root', input: 'default' }, { id: 'other', input: 'default' }, - ], + ] as any, output: [stringDataRef, numberDataRef.optional()], factory: () => [stringDataRef('bar')], }); @@ -216,14 +218,14 @@ describe('createExtension', () => { ); }); - it('should create an extension with relative attachment points', () => { + it('should create an extension with relative attachment points (backward compat)', () => { const extension = createExtension({ attachTo: [ { relative: {}, input: 'tabs' }, { relative: { kind: 'page' }, input: 'tabs' }, { relative: { name: 'index' }, input: 'tabs' }, { relative: { kind: 'page', name: 'index' }, input: 'tabs' }, - ], + ] as any, output: [stringDataRef], factory: () => [stringDataRef('bar')], }); @@ -232,7 +234,7 @@ describe('createExtension', () => { ); }); - it('should create an extension with relative attachment points by reference', () => { + it('should create an extension with relative attachment points by reference (backward compat)', () => { const baseOpts = { attachTo: { id: 'root', input: 'children' }, inputs: { @@ -269,7 +271,7 @@ describe('createExtension', () => { parent2.inputs.tabs, parent3.inputs.tabs, parent4.inputs.otherTabs, - ], + ] as any, output: [stringDataRef], factory: () => [stringDataRef('bar')], }); @@ -281,7 +283,7 @@ describe('createExtension', () => { parent2.inputs.tabs, parent3.inputs.tabs, parent4.inputs.otherTabs, - ], + ] as any, }); expect(String(overrdeExtension)).toBe( 'ExtensionDefinition{attachTo=page:@tabs+/index@tabs+page:/index@otherTabs}', diff --git a/packages/frontend-plugin-api/src/wiring/createExtension.ts b/packages/frontend-plugin-api/src/wiring/createExtension.ts index 6e4aba2910..4d3eeece2c 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtension.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtension.ts @@ -134,11 +134,10 @@ export type VerifyExtensionAttachTo< * * A standard attachment point declaration will specify the ID of the parent extension, as well as the name of the input to attach to. * - * There are three more advanced forms that are available for more complex use-cases: + * There are two more advanced forms that are available for more complex use-cases: * * 1. Relative attachment points: using the `relative` property instead of `id`, the attachment point is resolved relative to the current plugin. * 2. Extension input references: using a reference in code to another extension's input in the same plugin. These references are always relative. - * 3. Array of attachment points: an array of attachment points can be used to clone and attach to multiple extensions at once. * * @example * ```ts @@ -151,12 +150,6 @@ export type VerifyExtensionAttachTo< * // Attach to a specific input of another extension * const page = ParentBlueprint.make({ ... }); * const child = ChildBlueprint.make({ attachTo: page.inputs.children }); - * - * // Attach to multiple parents at once - * [ - * { id: 'page/home', input: 'widgets' }, - * { relative: { kind: 'page' }, input: 'widgets' }, - * ] * ``` * * @public @@ -166,16 +159,7 @@ export type ExtensionDefinitionAttachTo< > = | { id: string; input: string; relative?: never } | { relative: { kind?: string; name?: string }; input: string; id?: never } - | ExtensionInput - | Array< - | { id: string; input: string; relative?: never } - | { - relative: { kind?: string; name?: string }; - input: string; - id?: never; - } - | ExtensionInput - >; + | ExtensionInput; /** @public */ export type CreateExtensionOptions< diff --git a/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.test.tsx b/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.test.tsx index 4759441187..7f3ef5cb88 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.test.tsx +++ b/packages/frontend-plugin-api/src/wiring/createExtensionBlueprint.test.tsx @@ -92,11 +92,7 @@ describe('createExtensionBlueprint', () => { it('should allow creation of extension blueprints with a generator', () => { const TestExtensionBlueprint = createExtensionBlueprint({ kind: 'test-extension', - // Try multiple attachment points for this one - attachTo: [ - { id: 'test-1', input: 'default' }, - { id: 'test-2', input: 'default' }, - ], + attachTo: { id: 'test-1', input: 'default' }, output: [coreExtensionData.reactElement], *factory(params: { text: string }) { yield coreExtensionData.reactElement(

    {params.text}

    ); @@ -112,10 +108,7 @@ describe('createExtensionBlueprint', () => { expect(extension).toEqual({ $$type: '@backstage/ExtensionDefinition', - attachTo: [ - { id: 'test-1', input: 'default' }, - { id: 'test-2', input: 'default' }, - ], + attachTo: { id: 'test-1', input: 'default' }, configSchema: undefined, disabled: false, inputs: {}, @@ -1345,7 +1338,9 @@ describe('createExtensionBlueprint', () => { ).toThrow('Refused to override params and factory at the same time'); }); - describe('with relative attachment points', () => { + // Tests for backward compatibility - runtime still supports multiple attachment points + // but the TypeScript types no longer allow them + describe('with relative attachment points (backward compat)', () => { const dataRef = createExtensionDataRef().with({ id: 'test.data' }); it('should create an extension with relative attachment points', () => { @@ -1356,7 +1351,7 @@ describe('createExtensionBlueprint', () => { { relative: { kind: 'page' }, input: 'tabs' }, { relative: { name: 'index' }, input: 'tabs' }, { relative: { kind: 'page', name: 'index' }, input: 'tabs' }, - ], + ] as any, output: [dataRef], factory: () => [dataRef('bar')], }); @@ -1371,7 +1366,7 @@ describe('createExtensionBlueprint', () => { { relative: { kind: 'page' }, input: 'tabs' }, { relative: { name: 'index' }, input: 'tabs' }, { relative: { kind: 'page', name: 'index' }, input: 'tabs' }, - ], + ] as any, params: {}, }), ), @@ -1431,7 +1426,7 @@ describe('createExtensionBlueprint', () => { parent2.inputs.tabs, parent3.inputs.tabs, parent4.inputs.otherTabs, - ], + ] as any, output: [dataRef], factory: () => [dataRef('bar')], }); @@ -1445,7 +1440,7 @@ describe('createExtensionBlueprint', () => { parent2.inputs.tabs, parent3.inputs.tabs, parent4.inputs.otherTabs, - ], + ] as any, params: {}, }), ), diff --git a/packages/frontend-plugin-api/src/wiring/createExtensionInput.test.ts b/packages/frontend-plugin-api/src/wiring/createExtensionInput.test.ts index 279878542a..9b32ca947f 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtensionInput.test.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtensionInput.test.ts @@ -29,28 +29,28 @@ describe('createExtensionInput', () => { expect(input).toEqual({ $$type: '@backstage/ExtensionInput', extensionData: [stringDataRef, numberDataRef], - config: { singleton: false, optional: false }, + config: { singleton: false, optional: false, internal: false }, withContext: expect.any(Function), }); const x1: ExtensionInput< typeof stringDataRef | typeof numberDataRef, - { singleton: false; optional: false } + { singleton: false; optional: false; internal: false } > = input; // @ts-expect-error const x2: ExtensionInput< typeof stringDataRef, - { singleton: false; optional: false } + { singleton: false; optional: false; internal: false } > = input; // @ts-expect-error const x3: ExtensionInput< typeof stringDataRef | typeof numberDataRef, - { singleton: true; optional: false } + { singleton: true; optional: false; internal: false } > = input; // @ts-expect-error const x4: ExtensionInput< typeof stringDataRef | typeof numberDataRef, - { singleton: false; optional: true } + { singleton: false; optional: true; internal: false } > = input; unused(x1, x2, x3, x4); @@ -64,7 +64,7 @@ describe('createExtensionInput', () => { expect(inputWithContext).toEqual({ $$type: '@backstage/ExtensionInput', extensionData: [stringDataRef, numberDataRef], - config: { singleton: false, optional: false }, + config: { singleton: false, optional: false, internal: false }, withContext: expect.any(Function), context, }); @@ -77,28 +77,28 @@ describe('createExtensionInput', () => { expect(input).toEqual({ $$type: '@backstage/ExtensionInput', extensionData: [stringDataRef, numberDataRef], - config: { singleton: true, optional: false }, + config: { singleton: true, optional: false, internal: false }, withContext: expect.any(Function), }); const x1: ExtensionInput< typeof stringDataRef | typeof numberDataRef, - { singleton: true; optional: false } + { singleton: true; optional: false; internal: false } > = input; // @ts-expect-error const x2: ExtensionInput< typeof stringDataRef, - { singleton: true; optional: false } + { singleton: true; optional: false; internal: false } > = input; // @ts-expect-error const x3: ExtensionInput< typeof stringDataRef | typeof numberDataRef, - { singleton: false; optional: false } + { singleton: false; optional: false; internal: false } > = input; // @ts-expect-error const x4: ExtensionInput< typeof stringDataRef | typeof numberDataRef, - { singleton: false; optional: true } + { singleton: false; optional: true; internal: false } > = input; unused(x1, x2, x3, x4); @@ -112,28 +112,28 @@ describe('createExtensionInput', () => { expect(input).toEqual({ $$type: '@backstage/ExtensionInput', extensionData: [stringDataRef, numberDataRef], - config: { singleton: true, optional: true }, + config: { singleton: true, optional: true, internal: false }, withContext: expect.any(Function), }); const x1: ExtensionInput< typeof stringDataRef | typeof numberDataRef, - { singleton: true; optional: true } + { singleton: true; optional: true; internal: false } > = input; // @ts-expect-error const x2: ExtensionInput< typeof stringDataRef, - { singleton: true; optional: true } + { singleton: true; optional: true; internal: false } > = input; // @ts-expect-error const x3: ExtensionInput< typeof stringDataRef | typeof numberDataRef, - { singleton: false; optional: false } + { singleton: false; optional: false; internal: false } > = input; // @ts-expect-error const x4: ExtensionInput< typeof stringDataRef | typeof numberDataRef, - { singleton: false; optional: true } + { singleton: false; optional: true; internal: false } > = input; unused(x1, x2, x3, x4); @@ -144,4 +144,14 @@ describe('createExtensionInput', () => { createExtensionInput([stringDataRef, stringDataRef], { singleton: true }), ).toThrow("ExtensionInput may not have duplicate data refs: 'str'"); }); + + it('should create an internal input', () => { + const input = createExtensionInput([stringDataRef], { internal: true }); + expect(input).toEqual({ + $$type: '@backstage/ExtensionInput', + extensionData: [stringDataRef], + config: { singleton: false, optional: false, internal: true }, + withContext: expect.any(Function), + }); + }); }); diff --git a/packages/frontend-plugin-api/src/wiring/createExtensionInput.ts b/packages/frontend-plugin-api/src/wiring/createExtensionInput.ts index 57040c8adf..760bd4b984 100644 --- a/packages/frontend-plugin-api/src/wiring/createExtensionInput.ts +++ b/packages/frontend-plugin-api/src/wiring/createExtensionInput.ts @@ -27,9 +27,14 @@ export interface ExtensionInput< string, { optional?: true } > = ExtensionDataRef, - TConfig extends { singleton: boolean; optional: boolean } = { + TConfig extends { singleton: boolean; optional: boolean; + internal?: boolean; + } = { + singleton: boolean; + optional: boolean; + internal?: boolean; }, > { readonly $$type: '@backstage/ExtensionInput'; @@ -38,10 +43,60 @@ export interface ExtensionInput< readonly replaces?: Array<{ id: string; input: string }>; } -/** @public */ +/** + * Creates a new extension input to be passed to the input map of an extension. + * + * @remarks + * + * Extension inputs created with this function can be passed to any `inputs` map + * as part of creating or overriding an extension. + * + * The array of extension data references defines the data this input expects. + * If the required data is not provided by the attached extension, the + * attachment will fail. + * + * The `config` object can be used to restrict the behavior and shape of the + * input. By default an input will accept zero or more extensions from any + * plugin. The following options are available: + * + * - `singleton`: If set to `true`, only one extension can be attached to the + * input at a time. Additional extensions will trigger an app error and be + * ignored. + * - `optional`: If set to `true`, the input is optional and can be omitted, + * this only has an effect if the `singleton` is set to `true`. + * - `internal`: If set to `true`, only extensions from the same plugin will be + * allowed to attach to this input. Other extensions will trigger an app error + * and be ignored. + * + * @param extensionData - The array of extension data references that this input + * expects. + * @param config - The configuration object for the input. + * @returns An extension input declaration. + * @example + * ```ts + * const extension = createExtension({ + * attachTo: { id: 'example-parent', input: 'example-input' }, + * inputs: { + * content: createExtensionInput([coreExtensionData.reactElement], { + * singleton: true, + * }), + * }, + * output: [coreExtensionData.reactElement], + * *factory({ inputs }) { + * const content = inputs.content?.get(coreExtensionData.reactElement); + * yield coreExtensionData.reactElement({content}); + * }, + * }); + * ``` + * @public + */ export function createExtensionInput< UExtensionData extends ExtensionDataRef, - TConfig extends { singleton?: boolean; optional?: boolean }, + TConfig extends { + singleton?: boolean; + optional?: boolean; + internal?: boolean; + }, >( extensionData: Array, config?: TConfig & { replaces?: Array<{ id: string; input: string }> }, @@ -50,6 +105,7 @@ export function createExtensionInput< { singleton: TConfig['singleton'] extends true ? true : false; optional: TConfig['optional'] extends true ? true : false; + internal: TConfig['internal'] extends true ? true : false; } > { if (process.env.NODE_ENV !== 'production') { @@ -81,6 +137,9 @@ export function createExtensionInput< optional: Boolean(config?.optional) as TConfig['optional'] extends true ? true : false, + internal: Boolean(config?.internal) as TConfig['internal'] extends true + ? true + : false, }, replaces: config?.replaces, }; @@ -90,6 +149,7 @@ export function createExtensionInput< { singleton: TConfig['singleton'] extends true ? true : false; optional: TConfig['optional'] extends true ? true : false; + internal: TConfig['internal'] extends true ? true : false; } > { return OpaqueExtensionInput.createInstance(undefined, { diff --git a/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.test.ts b/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.test.ts index a3226721a1..1e1f7e1a84 100644 --- a/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.test.ts +++ b/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.test.ts @@ -142,6 +142,17 @@ describe('createFrontendPlugin', () => { expect(String(plugin)).toBe('Plugin{id=test}'); }); + it('should warn about invalid plugin IDs', () => { + const consoleWarn = jest + .spyOn(console, 'warn') + .mockImplementation(() => {}); + createFrontendPlugin({ pluginId: 'invalid&id' }); + expect(consoleWarn).toHaveBeenCalledWith( + expect.stringContaining("The pluginId 'invalid&id' will be invalid soon"), + ); + consoleWarn.mockRestore(); + }); + it('should create a plugin with extension instances', async () => { const plugin = createFrontendPlugin({ pluginId: 'test', diff --git a/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.ts b/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.ts index 68b5826baa..62fd1e88ff 100644 --- a/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.ts +++ b/packages/frontend-plugin-api/src/wiring/createFrontendPlugin.ts @@ -30,6 +30,7 @@ import { FeatureFlagConfig } from './types'; import { MakeSortedExtensionsMap } from './MakeSortedExtensionsMap'; import { JsonObject } from '@backstage/types'; import { RouteRef, SubRouteRef, ExternalRouteRef } from '../routing'; +import { ID_PATTERN } from './constants'; /** * Information about the plugin. @@ -130,6 +131,15 @@ export interface FrontendPlugin< }, > { readonly $$type: '@backstage/FrontendPlugin'; + /** + * The plugin ID. + */ + readonly pluginId: string; + /** + * Deprecated alias for `pluginId`. + * + * @deprecated Use `pluginId` instead. + */ readonly id: string; readonly routes: TRoutes; readonly externalRoutes: TExternalRoutes; @@ -199,6 +209,13 @@ export function createFrontendPlugin< > { const pluginId = options.pluginId; + if (!ID_PATTERN.test(pluginId)) { + // eslint-disable-next-line no-console + console.warn( + `WARNING: The pluginId '${pluginId}' will be invalid soon, please change it to match the pattern ${ID_PATTERN} (letters, digits, and dashes only, starting with a letter)`, + ); + } + const extensions = new Array>(); const extensionDefinitionsById = new Map< string, @@ -231,6 +248,7 @@ export function createFrontendPlugin< } return OpaqueFrontendPlugin.createInstance('v1', { + pluginId, id: pluginId, routes: options.routes ?? ({} as TRoutes), externalRoutes: options.externalRoutes ?? ({} as TExternalRoutes), diff --git a/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.test.ts b/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.test.ts index 79749af77c..e080ab1f64 100644 --- a/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.test.ts +++ b/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.test.ts @@ -140,6 +140,7 @@ describe('resolveExtensionDefinition', () => { input: 'children', }); + // Test for backward compatibility - runtime still supports multiple attachment points expect( resolveExtensionDefinition( OpaqueExtensionDefinition.toInternal({ @@ -157,7 +158,7 @@ describe('resolveExtensionDefinition', () => { kind: 'k3', input: 'children', }), - ], + ] as any, }), { namespace: 'test' }, ).attachTo, diff --git a/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.ts b/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.ts index f99d586e87..605e75bfe8 100644 --- a/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.ts +++ b/packages/frontend-plugin-api/src/wiring/resolveExtensionDefinition.ts @@ -149,11 +149,11 @@ function resolveExtensionId( } function resolveAttachTo( - attachTo: ExtensionDefinitionAttachTo, + attachTo: ExtensionDefinitionAttachTo | ExtensionDefinitionAttachTo[], namespace?: string, ): ExtensionAttachToSpec { const resolveSpec = ( - spec: Exclude>, + spec: ExtensionDefinitionAttachTo, ): { id: string; input: string } => { if (OpaqueExtensionInput.isType(spec)) { const { context } = OpaqueExtensionInput.toInternal(spec); diff --git a/packages/frontend-plugin-api/src/wiring/resolveInputOverrides.ts b/packages/frontend-plugin-api/src/wiring/resolveInputOverrides.ts index b46bb426fa..b9f239842d 100644 --- a/packages/frontend-plugin-api/src/wiring/resolveInputOverrides.ts +++ b/packages/frontend-plugin-api/src/wiring/resolveInputOverrides.ts @@ -37,6 +37,7 @@ export type ResolvedInputValueOverrides< { optional: infer IOptional extends boolean; singleton: boolean; + internal?: boolean; } > ? IOptional extends true @@ -44,7 +45,11 @@ export type ResolvedInputValueOverrides< : KName : never]: TInputs[KName] extends ExtensionInput< infer IDataRefs, - { optional: boolean; singleton: infer ISingleton extends boolean } + { + optional: boolean; + singleton: infer ISingleton extends boolean; + internal?: boolean; + } > ? ISingleton extends true ? Iterable> @@ -56,6 +61,7 @@ export type ResolvedInputValueOverrides< { optional: infer IOptional extends boolean; singleton: boolean; + internal?: boolean; } > ? IOptional extends true @@ -63,7 +69,11 @@ export type ResolvedInputValueOverrides< : never : never]?: TInputs[KName] extends ExtensionInput< infer IDataRefs, - { optional: boolean; singleton: infer ISingleton extends boolean } + { + optional: boolean; + singleton: infer ISingleton extends boolean; + internal?: boolean; + } > ? ISingleton extends true ? Iterable> diff --git a/packages/frontend-test-utils/CHANGELOG.md b/packages/frontend-test-utils/CHANGELOG.md index c5399dc2e2..13f426ef46 100644 --- a/packages/frontend-test-utils/CHANGELOG.md +++ b/packages/frontend-test-utils/CHANGELOG.md @@ -1,5 +1,137 @@ # @backstage/frontend-test-utils +## 0.5.0-next.2 + +### Minor Changes + +- 09a6aad: **BREAKING**: Removed the `TestApiRegistry` class, use `TestApiProvider` directly instead, storing reused APIs in a variable, e.g. `const apis = [...] as const`. +- d2ac2ec: Added `MockAlertApi` and `MockFeatureFlagsApi` implementations to the `mockApis` namespace. The mock implementations include useful testing methods like `clearAlerts()`, `waitForAlert()`, `getState()`, `setState()`, and `clearState()` for better test ergonomics. +- 09a6aad: **BREAKING**: The `mockApis` namespace is no longer a re-export from `@backstage/test-utils`. It's now a standalone namespace with mock implementations of most core APIs. Mock API instances can be passed directly to `TestApiProvider`, `renderInTestApp`, and `renderTestApp` without needing `[apiRef, impl]` tuples. As part of this change, the `.factory()` method on some mocks has been removed, since it's now redundant. + + ```tsx + // Before + import { mockApis } from '@backstage/frontend-test-utils'; + + renderInTestApp(, { + apis: [[identityApiRef, mockApis.identity()]], + }); + + // After - mock APIs can be passed directly + renderInTestApp(, { + apis: [mockApis.identity()], + }); + ``` + + This change also adds `createApiMock`, a public utility for creating mock API factories, intended for plugin authors to create their own `.mock()` variants. + +### Patch Changes + +- 15ed3f9: Added `snapshot()` method to `ExtensionTester`, which returns a tree-shaped representation of the resolved extension hierarchy. Convenient to use with `toMatchInlineSnapshot()`. +- 013ec22: Added `mountedRoutes` option to `renderTestApp` for binding route refs to paths, matching the existing option in `renderInTestApp`: + + ```typescript + renderTestApp({ + extensions: [...], + mountedRoutes: { + '/my-path': myRouteRef, + }, + }); + ``` + +- 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/core-app-api@1.19.5-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/frontend-app-api@0.15.0-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-permission-react@0.4.40-next.1 + - @backstage/version-bridge@1.0.12-next.0 + - @backstage/test-utils@1.7.15-next.2 + - @backstage/plugin-app@0.4.0-next.2 + - @backstage/plugin-app-react@0.1.1-next.0 + +## 0.4.6-next.1 + +### Patch Changes + +- 22864b7: Added an `apis` option to `createExtensionTester`, `renderInTestApp`, and `renderTestApp` to override APIs when testing extensions. Use the `mockApis` helpers to create mock implementations: + + ```typescript + import { identityApiRef } from '@backstage/frontend-plugin-api'; + import { mockApis } from '@backstage/frontend-test-utils'; + + // Override APIs in createExtensionTester + const tester = createExtensionTester(myExtension, { + apis: [ + [ + identityApiRef, + mockApis.identity({ userEntityRef: 'user:default/guest' }), + ], + ], + }); + + // Override APIs in renderInTestApp + renderInTestApp(, { + apis: [ + [ + identityApiRef, + mockApis.identity({ userEntityRef: 'user:default/guest' }), + ], + ], + }); + + // Override APIs in renderTestApp + renderTestApp({ + extensions: [myExtension], + apis: [ + [ + identityApiRef, + mockApis.identity({ userEntityRef: 'user:default/guest' }), + ], + ], + }); + ``` + +- Updated dependencies + - @backstage/frontend-app-api@0.15.0-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/plugin-app@0.4.0-next.1 + - @backstage/test-utils@1.7.15-next.1 + +## 0.4.5-next.0 + +### Patch Changes + +- d7dd5bd: Fixed Router deprecation warning and switched to using new `RouterBlueprint` from `@backstage/plugin-app-api`. +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/frontend-app-api@0.14.1-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/plugin-app@0.4.0-next.0 + - @backstage/plugin-app-react@0.1.1-next.0 + - @backstage/config@1.3.6 + - @backstage/test-utils@1.7.15-next.0 + - @backstage/types@1.2.2 + - @backstage/version-bridge@1.0.11 + +## 0.4.3 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/plugin-app@0.3.4 + - @backstage/frontend-app-api@0.14.0 + +## 0.4.3-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-app@0.3.4-next.0 + - @backstage/frontend-app-api@0.13.4-next.0 + - @backstage/frontend-plugin-api@0.13.2 + ## 0.4.2 ### Patch Changes diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json index d6b63b22da..3e2194704c 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.4.2", + "version": "0.5.0-next.2", "backstage": { "role": "web-library" }, @@ -32,30 +32,44 @@ }, "dependencies": { "@backstage/config": "workspace:^", + "@backstage/core-app-api": "workspace:^", + "@backstage/core-plugin-api": "workspace:^", "@backstage/frontend-app-api": "workspace:^", "@backstage/frontend-plugin-api": "workspace:^", "@backstage/plugin-app": "workspace:^", + "@backstage/plugin-app-react": "workspace:^", + "@backstage/plugin-permission-common": "workspace:^", + "@backstage/plugin-permission-react": "workspace:^", "@backstage/test-utils": "workspace:^", "@backstage/types": "workspace:^", "@backstage/version-bridge": "workspace:^", - "zod": "^3.22.4" + "i18next": "^22.4.15", + "zen-observable": "^0.10.0", + "zod": "^3.25.76" }, "devDependencies": { "@backstage/cli": "workspace:^", "@testing-library/jest-dom": "^6.0.0", + "@types/jest": "*", "@types/react": "^18.0.0", + "@types/zen-observable": "^0.8.0", + "msw": "^2.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependencies": { "@testing-library/react": "^16.0.0", + "@types/jest": "*", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { + "@types/jest": { + "optional": true + }, "@types/react": { "optional": true } diff --git a/packages/frontend-test-utils/report.api.md b/packages/frontend-test-utils/report.api.md index b99cf843d4..748eee15d3 100644 --- a/packages/frontend-test-utils/report.api.md +++ b/packages/frontend-test-utils/report.api.md @@ -3,46 +3,95 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { AlertApi } from '@backstage/frontend-plugin-api'; +import { AlertMessage } from '@backstage/frontend-plugin-api'; import { AnalyticsApi } from '@backstage/frontend-plugin-api'; import { AnalyticsEvent } from '@backstage/frontend-plugin-api'; -import { ApiMock } from '@backstage/test-utils'; +import { ApiFactory } from '@backstage/frontend-plugin-api'; +import { ApiRef } from '@backstage/frontend-plugin-api'; import { AppNode } from '@backstage/frontend-plugin-api'; import { AppNodeInstance } from '@backstage/frontend-plugin-api'; -import { ErrorWithContext } from '@backstage/test-utils'; +import { AuthorizeResult } from '@backstage/plugin-permission-common'; +import { Config } from '@backstage/config'; +import { ConfigApi } from '@backstage/core-plugin-api'; +import { ConfigApi as ConfigApi_2 } from '@backstage/frontend-plugin-api'; +import { DiscoveryApi } from '@backstage/frontend-plugin-api'; +import { DiscoveryApi as DiscoveryApi_2 } from '@backstage/core-plugin-api'; +import { ErrorApi } from '@backstage/core-plugin-api'; +import { ErrorApi as ErrorApi_2 } from '@backstage/frontend-plugin-api'; +import { ErrorApiError } from '@backstage/core-plugin-api'; +import { ErrorApiErrorContext } from '@backstage/core-plugin-api'; +import { EvaluatePermissionRequest } from '@backstage/plugin-permission-common'; +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 { FeatureFlag } from '@backstage/frontend-plugin-api'; +import { FeatureFlagsApi } from '@backstage/frontend-plugin-api'; +import { FeatureFlagsSaveOptions } from '@backstage/frontend-plugin-api'; +import { FeatureFlagState } from '@backstage/frontend-plugin-api'; +import { FetchApi } from '@backstage/core-plugin-api'; +import { FetchApi as FetchApi_2 } from '@backstage/frontend-plugin-api'; import { FrontendFeature } from '@backstage/frontend-plugin-api'; +import { IdentityApi } from '@backstage/frontend-plugin-api'; +import { IdentityApi as IdentityApi_2 } from '@backstage/core-plugin-api'; import { JsonObject } from '@backstage/types'; -import { mockApis } from '@backstage/test-utils'; -import { MockConfigApi } from '@backstage/test-utils'; -import { MockErrorApi } from '@backstage/test-utils'; -import { MockErrorApiOptions } from '@backstage/test-utils'; -import { MockFetchApi } from '@backstage/test-utils'; -import { MockFetchApiOptions } from '@backstage/test-utils'; -import { MockPermissionApi } from '@backstage/test-utils'; -import { MockStorageApi } from '@backstage/test-utils'; -import { MockStorageBucket } from '@backstage/test-utils'; +import { JsonValue } from '@backstage/types'; +import { Observable } from '@backstage/types'; +import { PermissionApi } from '@backstage/plugin-permission-react'; +import { ReactNode } from 'react'; import { registerMswTestHooks } from '@backstage/test-utils'; import { RenderResult } from '@testing-library/react'; import { RouteRef } from '@backstage/frontend-plugin-api'; -import { TestApiProvider } from '@backstage/test-utils'; -import { TestApiProviderProps } from '@backstage/test-utils'; -import { TestApiRegistry } from '@backstage/test-utils'; -import { testingLibraryDomTypesQueries } from '@testing-library/dom/types/queries'; +import { StorageApi } from '@backstage/core-plugin-api'; +import { StorageApi as StorageApi_2 } from '@backstage/frontend-plugin-api'; +import { StorageValueSnapshot } from '@backstage/core-plugin-api'; +import { TranslationApi } from '@backstage/core-plugin-api/alpha'; +import { TranslationApi as TranslationApi_2 } from '@backstage/frontend-plugin-api'; +import { TranslationRef } from '@backstage/core-plugin-api/alpha'; +import { TranslationSnapshot } from '@backstage/core-plugin-api/alpha'; import { withLogCollector } from '@backstage/test-utils'; -export { ApiMock }; +// @public +export type ApiMock = { + [mockApiFactorySymbol]: ApiFactory; +} & { + [Key in keyof TApi]: TApi[Key] extends (...args: infer Args) => infer Return + ? TApi[Key] & jest.MockInstance + : TApi[Key]; +}; + +// @public +export function attachMockApiFactory( + apiRef: ApiRef, + implementation: TImpl, +): TImpl & { + [mockApiFactorySymbol]: ApiFactory; +}; + +// @public +export function createApiMock( + apiRef: ApiRef, + mockFactory: () => jest.Mocked, +): (partialImpl?: Partial) => ApiMock; // @public (undocumented) -export function createExtensionTester( +export function createExtensionTester< + T extends ExtensionDefinitionParameters, + TApiPairs extends any[] = any[], +>( subject: ExtensionDefinition, options?: { config?: T['configInput']; + apis?: readonly [...TestApiPairs]; }, ): ExtensionTester>; -export { ErrorWithContext }; +// @public +export type ErrorWithContext = { + error: ErrorApiError; + context?: ErrorApiErrorContext; +}; // @public (undocumented) export class ExtensionQuery { @@ -61,6 +110,14 @@ export class ExtensionQuery { get node(): AppNode; } +// @public +export interface ExtensionSnapshotNode { + children?: Record; + disabled?: true; + id: string; + outputs?: string[]; +} + // @public (undocumented) export class ExtensionTester { // (undocumented) @@ -84,6 +141,21 @@ export class ExtensionTester { ): ExtensionQuery>; // (undocumented) reactElement(): JSX.Element; + snapshot(): ExtensionSnapshotNode; +} + +// @public +export class MockAlertApi implements AlertApi { + // (undocumented) + alert$(): Observable; + clearAlerts(): void; + getAlerts(): AlertMessage[]; + // (undocumented) + post(alert: AlertMessage): void; + waitForAlert( + predicate: (alert: AlertMessage) => boolean, + timeoutMs?: number, + ): Promise; } // @public @@ -94,59 +166,311 @@ export class MockAnalyticsApi implements AnalyticsApi { getEvents(): AnalyticsEvent[]; } -export { mockApis }; +// @public +export type MockApiFactorySymbol = typeof mockApiFactorySymbol; -export { MockConfigApi }; +// @public +export namespace mockApis { + export function alert(): MockWithApiFactory; + export namespace alert { + const mock: ( + partialImpl?: Partial | undefined, + ) => ApiMock; + } + export function analytics(): MockAnalyticsApi & + MockWithApiFactory; + export namespace analytics { + const // (undocumented) + mock: ( + partialImpl?: Partial | undefined, + ) => ApiMock; + } + export function config(options?: { + data?: JsonObject; + }): MockConfigApi & MockWithApiFactory; + export namespace config { + const // (undocumented) + mock: (partialImpl?: Partial | undefined) => ApiMock; + } + export function discovery(options?: { + baseUrl?: string; + }): DiscoveryApi & MockWithApiFactory; + export namespace discovery { + const // (undocumented) + mock: ( + partialImpl?: Partial | undefined, + ) => ApiMock; + } + export function error( + options?: MockErrorApiOptions, + ): MockErrorApi & MockWithApiFactory; + export namespace error { + const // (undocumented) + mock: ( + partialImpl?: Partial | undefined, + ) => ApiMock; + } + export function featureFlags( + options?: MockFeatureFlagsApiOptions, + ): MockWithApiFactory; + export namespace featureFlags { + const mock: ( + partialImpl?: Partial | undefined, + ) => ApiMock; + } + export function fetch( + options?: MockFetchApiOptions, + ): MockFetchApi & MockWithApiFactory; + export namespace fetch { + const // (undocumented) + mock: ( + partialImpl?: Partial | undefined, + ) => ApiMock; + } + export function identity(options?: { + userEntityRef?: string; + ownershipEntityRefs?: string[]; + token?: string; + email?: string; + displayName?: string; + picture?: string; + }): MockWithApiFactory; + export namespace identity { + const // (undocumented) + mock: ( + partialImpl?: Partial | undefined, + ) => ApiMock; + } + export function permission(options?: { + authorize?: + | AuthorizeResult.ALLOW + | AuthorizeResult.DENY + | (( + request: EvaluatePermissionRequest, + ) => AuthorizeResult.ALLOW | AuthorizeResult.DENY); + }): MockPermissionApi & MockWithApiFactory; + export namespace permission { + const // (undocumented) + mock: ( + partialImpl?: Partial | undefined, + ) => ApiMock; + } + export function storage(options?: { + data?: JsonObject; + }): MockStorageApi & MockWithApiFactory; + export namespace storage { + const // (undocumented) + mock: ( + partialImpl?: Partial | undefined, + ) => ApiMock; + } + export function translation(): MockTranslationApi & + MockWithApiFactory; + export namespace translation { + const mock: ( + partialImpl?: Partial | undefined, + ) => ApiMock; + } +} -export { MockErrorApi }; +// @public +export class MockConfigApi implements ConfigApi { + constructor({ data }: { data: JsonObject }); + get(key?: string): T; + getBoolean(key: string): boolean; + getConfig(key: string): Config; + getConfigArray(key: string): Config[]; + getNumber(key: string): number; + getOptional(key?: string): T | undefined; + getOptionalBoolean(key: string): boolean | undefined; + getOptionalConfig(key: string): Config | undefined; + getOptionalConfigArray(key: string): Config[] | undefined; + getOptionalNumber(key: string): number | undefined; + getOptionalString(key: string): string | undefined; + getOptionalStringArray(key: string): string[] | undefined; + getString(key: string): string; + getStringArray(key: string): string[]; + has(key: string): boolean; + keys(): string[]; +} -export { MockErrorApiOptions }; +// @public +export class MockErrorApi implements ErrorApi { + constructor(options?: MockErrorApiOptions); + // (undocumented) + error$(): Observable<{ + error: ErrorApiError; + context?: ErrorApiErrorContext; + }>; + // (undocumented) + getErrors(): ErrorWithContext[]; + // (undocumented) + post(error: ErrorApiError, context?: ErrorApiErrorContext): void; + // (undocumented) + waitForError(pattern: RegExp, timeoutMs?: number): Promise; +} -export { MockFetchApi }; +// @public +export type MockErrorApiOptions = { + collect?: boolean; +}; -export { MockFetchApiOptions }; +// @public +export class MockFeatureFlagsApi implements FeatureFlagsApi { + constructor(options?: MockFeatureFlagsApiOptions); + clearState(): void; + // (undocumented) + getRegisteredFlags(): FeatureFlag[]; + getState(): Record; + // (undocumented) + isActive(name: string): boolean; + // (undocumented) + registerFlag(flag: FeatureFlag): void; + // (undocumented) + save(options: FeatureFlagsSaveOptions): void; + setState(states: Record): void; +} -export { MockPermissionApi }; +// @public +export interface MockFeatureFlagsApiOptions { + initialStates?: Record; +} -export { MockStorageApi }; +// @public +export class MockFetchApi implements FetchApi { + constructor(options?: MockFetchApiOptions); + get fetch(): typeof fetch; +} -export { MockStorageBucket }; +// @public +export interface MockFetchApiOptions { + baseImplementation?: undefined | 'none' | typeof fetch; + injectIdentityAuth?: + | undefined + | { + token: string; + } + | { + identityApi: Pick; + }; + resolvePluginProtocol?: + | undefined + | { + discoveryApi: Pick; + }; +} + +// @public +export class MockPermissionApi implements PermissionApi { + constructor( + requestHandler?: ( + request: EvaluatePermissionRequest, + ) => AuthorizeResult.ALLOW | AuthorizeResult.DENY, + ); + // (undocumented) + authorize( + request: EvaluatePermissionRequest, + ): Promise; +} + +// @public +export class MockStorageApi implements StorageApi { + // (undocumented) + static create(data?: JsonObject): MockStorageApi; + // (undocumented) + forBucket(name: string): StorageApi; + // (undocumented) + observe$( + key: string, + ): Observable>; + // (undocumented) + remove(key: string): Promise; + // (undocumented) + set(key: string, data: T): Promise; + // (undocumented) + snapshot(key: string): StorageValueSnapshot; +} + +// @public +export class MockTranslationApi implements TranslationApi { + // (undocumented) + static create(): MockTranslationApi; + // (undocumented) + getTranslation< + TMessages extends { + [key in string]: string; + }, + >( + translationRef: TranslationRef, + ): TranslationSnapshot; + // (undocumented) + translation$< + TMessages extends { + [key in string]: string; + }, + >(): Observable>; +} + +// @public +export type MockWithApiFactory = TApi & { + [mockApiFactorySymbol]: ApiFactory; +}; export { registerMswTestHooks }; // @public -export function renderInTestApp( +export function renderInTestApp( element: JSX.Element, - options?: TestAppOptions, + options?: TestAppOptions, ): RenderResult; // @public -export function renderTestApp( - options: RenderTestAppOptions, -): RenderResult; +export function renderTestApp( + options?: RenderTestAppOptions, +): RenderResult; // @public -export type RenderTestAppOptions = { +export type RenderTestAppOptions = { config?: JsonObject; extensions?: ExtensionDefinition[]; features?: FrontendFeature[]; initialRouteEntries?: string[]; + mountedRoutes?: { + [path: string]: RouteRef; + }; + apis?: readonly [...TestApiPairs]; }; -export { TestApiProvider }; - -export { TestApiProviderProps }; - -export { TestApiRegistry }; +// @public +export type TestApiPair = + | readonly [ApiRef, TApi extends infer TImpl ? Partial : never] + | MockWithApiFactory; // @public -export type TestAppOptions = { +export type TestApiPairs = { + [TIndex in keyof TApiPairs]: TestApiPair; +}; + +// @public +export function TestApiProvider( + props: TestApiProviderProps, +): JSX.Element; + +// @public +export type TestApiProviderProps = { + apis: readonly [...TestApiPairs]; + children: ReactNode; +}; + +// @public +export type TestAppOptions = { mountedRoutes?: { [path: string]: RouteRef; }; config?: JsonObject; features?: FrontendFeature[]; initialRouteEntries?: string[]; + apis?: readonly [...TestApiPairs]; }; export { withLogCollector }; diff --git a/packages/frontend-test-utils/src/apis/AlertApi/MockAlertApi.test.ts b/packages/frontend-test-utils/src/apis/AlertApi/MockAlertApi.test.ts new file mode 100644 index 0000000000..ddfbacd3b9 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/AlertApi/MockAlertApi.test.ts @@ -0,0 +1,107 @@ +/* + * 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 { MockAlertApi } from './MockAlertApi'; + +describe('MockAlertApi', () => { + it('should collect alerts', () => { + const api = new MockAlertApi(); + + api.post({ message: 'Test alert 1' }); + api.post({ message: 'Test alert 2', severity: 'error' }); + api.post({ + message: 'Test alert 3', + severity: 'warning', + display: 'permanent', + }); + + expect(api.getAlerts()).toHaveLength(3); + expect(api.getAlerts()[0]).toMatchObject({ message: 'Test alert 1' }); + expect(api.getAlerts()[1]).toMatchObject({ + message: 'Test alert 2', + severity: 'error', + }); + }); + + it('should clear alerts', () => { + const api = new MockAlertApi(); + + api.post({ message: 'Test alert' }); + expect(api.getAlerts()).toHaveLength(1); + + api.clearAlerts(); + expect(api.getAlerts()).toHaveLength(0); + }); + + it('should notify observers', async () => { + const api = new MockAlertApi(); + const messages: string[] = []; + + const collected = new Promise(resolve => { + api.alert$().subscribe({ + next: alert => { + messages.push(alert.message); + if (messages.length === 2) { + resolve(); + } + }, + }); + }); + + api.post({ message: 'First' }); + api.post({ message: 'Second' }); + + await collected; + expect(messages).toEqual(['First', 'Second']); + }); + + it('should wait for matching alert', async () => { + const api = new MockAlertApi(); + + setTimeout(() => { + api.post({ message: 'Wrong alert' }); + api.post({ message: 'Right alert', severity: 'error' }); + }, 10); + + const alert = await api.waitForAlert( + a => a.message === 'Right alert', + 1000, + ); + + expect(alert).toMatchObject({ message: 'Right alert', severity: 'error' }); + }); + + it('should timeout if alert never appears', async () => { + const api = new MockAlertApi(); + + await expect( + api.waitForAlert(a => a.message === 'Never posted', 100), + ).rejects.toThrow('Timed out waiting for alert'); + }); + + it('should resolve immediately if alert already exists', async () => { + const api = new MockAlertApi(); + + api.post({ message: 'Already posted' }); + + const alert = await api.waitForAlert( + a => a.message === 'Already posted', + 1000, + ); + + expect(alert).toMatchObject({ message: 'Already posted' }); + }); +}); diff --git a/packages/frontend-test-utils/src/apis/AlertApi/MockAlertApi.ts b/packages/frontend-test-utils/src/apis/AlertApi/MockAlertApi.ts new file mode 100644 index 0000000000..305a527b87 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/AlertApi/MockAlertApi.ts @@ -0,0 +1,102 @@ +/* + * 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 { AlertMessage } from '@backstage/frontend-plugin-api'; +import { AlertApi } from '@backstage/frontend-plugin-api'; +import { Observable } from '@backstage/types'; +import ObservableImpl from 'zen-observable'; + +/** + * Mock implementation of {@link @backstage/frontend-plugin-api#AlertApi} for testing alert behavior. + * + * @public + * @example + * ```ts + * const alertApi = new MockAlertApi(); + * alertApi.post({ message: 'Test alert' }); + * expect(alertApi.getAlerts()).toHaveLength(1); + * ``` + */ +export class MockAlertApi implements AlertApi { + private readonly alerts: AlertMessage[] = []; + private readonly observers = new Set<(alert: AlertMessage) => void>(); + + post(alert: AlertMessage) { + this.alerts.push(alert); + this.observers.forEach(observer => observer(alert)); + } + + alert$(): Observable { + return new ObservableImpl(subscriber => { + const observer = (alert: AlertMessage) => { + subscriber.next(alert); + }; + this.observers.add(observer); + return () => { + this.observers.delete(observer); + }; + }); + } + + /** + * Get all alerts that have been posted. + */ + getAlerts(): AlertMessage[] { + return this.alerts; + } + + /** + * Clear all collected alerts. + */ + clearAlerts(): void { + this.alerts.length = 0; + } + + /** + * Wait for an alert matching the given predicate. + * + * @param predicate - Function to test each alert + * @param timeoutMs - Maximum time to wait in milliseconds + * @returns Promise that resolves with the matching alert + */ + async waitForAlert( + predicate: (alert: AlertMessage) => boolean, + timeoutMs: number = 2000, + ): Promise { + const existing = this.alerts.find(predicate); + if (existing) { + return existing; + } + const observers = this.observers; + + return new Promise((resolve, reject) => { + const timeoutId = setTimeout(() => { + observers.delete(observer); + reject(new Error('Timed out waiting for alert')); + }, timeoutMs); + + function observer(alert: AlertMessage) { + if (predicate(alert)) { + clearTimeout(timeoutId); + observers.delete(observer); + resolve(alert); + } + } + + observers.add(observer); + }); + } +} diff --git a/packages/frontend-test-utils/src/apis/AlertApi/index.ts b/packages/frontend-test-utils/src/apis/AlertApi/index.ts new file mode 100644 index 0000000000..919149e249 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/AlertApi/index.ts @@ -0,0 +1,17 @@ +/* + * 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. + */ + +export { MockAlertApi } from './MockAlertApi'; diff --git a/packages/frontend-test-utils/src/apis/ConfigApi/MockConfigApi.test.ts b/packages/frontend-test-utils/src/apis/ConfigApi/MockConfigApi.test.ts new file mode 100644 index 0000000000..c3157a8aff --- /dev/null +++ b/packages/frontend-test-utils/src/apis/ConfigApi/MockConfigApi.test.ts @@ -0,0 +1,44 @@ +/* + * Copyright 2022 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 { MockConfigApi } from './MockConfigApi'; + +describe('MockConfigApi', () => { + it('is able to read some basic config', () => { + const mock = new MockConfigApi({ + data: { + app: { + title: 'Hello', + }, + x: 1, + y: false, + z: [{ a: 3 }], + }, + }); + + expect(mock.getString('app.title')).toEqual('Hello'); + expect(mock.getNumber('x')).toEqual(1); + expect(mock.getBoolean('y')).toEqual(false); + expect(mock.getConfigArray('z')[0].getOptionalNumber('a')).toEqual(3); + + expect(() => mock.getString('x')).toThrow( + "Invalid type in config for key 'x' in 'mock-config', got number, wanted string", + ); + expect(() => mock.getString('missing')).toThrow( + "Missing required config value at 'missing'", + ); + }); +}); diff --git a/packages/frontend-test-utils/src/apis/ConfigApi/MockConfigApi.ts b/packages/frontend-test-utils/src/apis/ConfigApi/MockConfigApi.ts new file mode 100644 index 0000000000..349eee0d3a --- /dev/null +++ b/packages/frontend-test-utils/src/apis/ConfigApi/MockConfigApi.ts @@ -0,0 +1,111 @@ +/* + * Copyright 2022 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 { Config, ConfigReader } from '@backstage/config'; +import { JsonObject, JsonValue } from '@backstage/types'; +import { ConfigApi } from '@backstage/core-plugin-api'; + +/** + * MockConfigApi is a thin wrapper around {@link @backstage/config#ConfigReader} + * that can be used to mock configuration using a plain object. + * + * @public + * @example + * ```tsx + * const mockConfig = new MockConfigApi({ + * data: { app: { baseUrl: 'https://example.com' } }, + * }); + * + * const rendered = await renderInTestApp( + * + * + * , + * ); + * ``` + */ +export class MockConfigApi implements ConfigApi { + private readonly config: ConfigReader; + + // NOTE: not extending in order to avoid inheriting the static `.fromConfigs` + constructor({ data }: { data: JsonObject }) { + this.config = new ConfigReader(data); + } + + /** {@inheritdoc @backstage/config#Config.has} */ + has(key: string): boolean { + return this.config.has(key); + } + /** {@inheritdoc @backstage/config#Config.keys} */ + keys(): string[] { + return this.config.keys(); + } + /** {@inheritdoc @backstage/config#Config.get} */ + get(key?: string): T { + return this.config.get(key); + } + /** {@inheritdoc @backstage/config#Config.getOptional} */ + getOptional(key?: string): T | undefined { + return this.config.getOptional(key); + } + /** {@inheritdoc @backstage/config#Config.getConfig} */ + getConfig(key: string): Config { + return this.config.getConfig(key); + } + /** {@inheritdoc @backstage/config#Config.getOptionalConfig} */ + getOptionalConfig(key: string): Config | undefined { + return this.config.getOptionalConfig(key); + } + /** {@inheritdoc @backstage/config#Config.getConfigArray} */ + getConfigArray(key: string): Config[] { + return this.config.getConfigArray(key); + } + /** {@inheritdoc @backstage/config#Config.getOptionalConfigArray} */ + getOptionalConfigArray(key: string): Config[] | undefined { + return this.config.getOptionalConfigArray(key); + } + /** {@inheritdoc @backstage/config#Config.getNumber} */ + getNumber(key: string): number { + return this.config.getNumber(key); + } + /** {@inheritdoc @backstage/config#Config.getOptionalNumber} */ + getOptionalNumber(key: string): number | undefined { + return this.config.getOptionalNumber(key); + } + /** {@inheritdoc @backstage/config#Config.getBoolean} */ + getBoolean(key: string): boolean { + return this.config.getBoolean(key); + } + /** {@inheritdoc @backstage/config#Config.getOptionalBoolean} */ + getOptionalBoolean(key: string): boolean | undefined { + return this.config.getOptionalBoolean(key); + } + /** {@inheritdoc @backstage/config#Config.getString} */ + getString(key: string): string { + return this.config.getString(key); + } + /** {@inheritdoc @backstage/config#Config.getOptionalString} */ + getOptionalString(key: string): string | undefined { + return this.config.getOptionalString(key); + } + /** {@inheritdoc @backstage/config#Config.getStringArray} */ + getStringArray(key: string): string[] { + return this.config.getStringArray(key); + } + /** {@inheritdoc @backstage/config#Config.getOptionalStringArray} */ + getOptionalStringArray(key: string): string[] | undefined { + return this.config.getOptionalStringArray(key); + } +} diff --git a/packages/frontend-test-utils/src/apis/ConfigApi/index.ts b/packages/frontend-test-utils/src/apis/ConfigApi/index.ts new file mode 100644 index 0000000000..6418899f79 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/ConfigApi/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2022 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 { MockConfigApi } from './MockConfigApi'; diff --git a/packages/frontend-test-utils/src/apis/ErrorApi/MockErrorApi.test.ts b/packages/frontend-test-utils/src/apis/ErrorApi/MockErrorApi.test.ts new file mode 100644 index 0000000000..1fbfb576bd --- /dev/null +++ b/packages/frontend-test-utils/src/apis/ErrorApi/MockErrorApi.test.ts @@ -0,0 +1,104 @@ +/* + * Copyright 2020 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 { MockErrorApi } from './MockErrorApi'; + +async function ifResolved(promise: Promise): Promise { + return Promise.race([promise, Promise.resolve<'not-yet'>('not-yet')]); +} + +describe('MockErrorApi', () => { + it('should throw errors by default', () => { + const api = new MockErrorApi(); + expect(() => api.post(new Error('NOPE'))).toThrow( + 'MockErrorApi received unexpected error, Error: NOPE', + ); + }); + + it('should collect errors', () => { + const api = new MockErrorApi({ collect: true }); + + api.post(new Error('e1')); + api.post(new Error('e2'), { hidden: true }); + api.post(new Error('e3')); + + expect(api.getErrors()).toEqual([ + { + error: new Error('e1'), + }, + { + error: new Error('e2'), + context: { hidden: true }, + }, + { + error: new Error('e3'), + }, + ]); + }); + + it('should not emit values', async () => { + const api = new MockErrorApi({ collect: true }); + + const promise = new Promise((resolve, reject) => { + api.error$().subscribe({ + next({ error }) { + reject(error); + }, + error(error) { + reject(error); + }, + complete() { + reject(new Error('observable was completed')); + }, + }); + + setTimeout(() => resolve('timed-out'), 100); + }); + + await expect(promise).resolves.toBe('timed-out'); + }); + + it('should wait for errors', async () => { + const api = new MockErrorApi({ collect: true }); + + const wait1 = api.waitForError(/1/); + const wait2 = api.waitForError(/2/); + + await expect(ifResolved(wait1)).resolves.toBe('not-yet'); + await expect(ifResolved(wait2)).resolves.toBe('not-yet'); + api.post(new Error('e0')); + await expect(ifResolved(wait1)).resolves.toBe('not-yet'); + await expect(ifResolved(wait2)).resolves.toBe('not-yet'); + api.post(new Error('e1')); + await expect(ifResolved(wait1)).resolves.toEqual({ + error: new Error('e1'), + }); + await expect(ifResolved(wait2)).resolves.toBe('not-yet'); + api.post(new Error('e2'), { hidden: true }); + await expect(ifResolved(wait2)).resolves.toEqual({ + error: new Error('e2'), + context: { hidden: true }, + }); + }); + + it('should time out waiting for error', async () => { + const api = new MockErrorApi({ collect: true }); + + await expect(api.waitForError(/1/, 1)).rejects.toThrow( + 'Timed out waiting for error', + ); + }); +}); diff --git a/packages/frontend-test-utils/src/apis/ErrorApi/MockErrorApi.ts b/packages/frontend-test-utils/src/apis/ErrorApi/MockErrorApi.ts new file mode 100644 index 0000000000..c7c8556355 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/ErrorApi/MockErrorApi.ts @@ -0,0 +1,106 @@ +/* + * Copyright 2020 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 { + ErrorApi, + ErrorApiError, + ErrorApiErrorContext, +} from '@backstage/core-plugin-api'; +import { Observable } from '@backstage/types'; + +/** + * Constructor arguments for {@link MockErrorApi} + * @public + */ +export type MockErrorApiOptions = { + // Need to be true if getErrors is used in testing. + collect?: boolean; +}; + +/** + * ErrorWithContext contains error and ErrorApiErrorContext + * @public + */ +export type ErrorWithContext = { + error: ErrorApiError; + context?: ErrorApiErrorContext; +}; + +type Waiter = { + pattern: RegExp; + resolve: (err: ErrorWithContext) => void; +}; + +const nullObservable = { + subscribe: () => ({ unsubscribe: () => {}, closed: true }), + + [Symbol.observable]() { + return this; + }, +}; + +/** + * Mock implementation of the {@link core-plugin-api#ErrorApi} to be used in tests. + * Includes withForError and getErrors methods for error testing. + * @public + */ +export class MockErrorApi implements ErrorApi { + private readonly errors = new Array(); + private readonly waiters = new Set(); + + constructor(private readonly options: MockErrorApiOptions = {}) {} + + post(error: ErrorApiError, context?: ErrorApiErrorContext) { + if (this.options.collect) { + this.errors.push({ error, context }); + + for (const waiter of this.waiters) { + if (waiter.pattern.test(error.message)) { + this.waiters.delete(waiter); + waiter.resolve({ error, context }); + } + } + + return; + } + + throw new Error(`MockErrorApi received unexpected error, ${error}`); + } + + error$(): Observable<{ + error: ErrorApiError; + context?: ErrorApiErrorContext; + }> { + return nullObservable; + } + + getErrors(): ErrorWithContext[] { + return this.errors; + } + + waitForError( + pattern: RegExp, + timeoutMs: number = 2000, + ): Promise { + return new Promise((resolve, reject) => { + setTimeout(() => { + reject(new Error('Timed out waiting for error')); + }, timeoutMs); + + this.waiters.add({ resolve, pattern }); + }); + } +} diff --git a/packages/frontend-test-utils/src/apis/ErrorApi/index.ts b/packages/frontend-test-utils/src/apis/ErrorApi/index.ts new file mode 100644 index 0000000000..1273a91531 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/ErrorApi/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright 2020 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 { MockErrorApi } from './MockErrorApi'; +export type { MockErrorApiOptions, ErrorWithContext } from './MockErrorApi'; diff --git a/packages/frontend-test-utils/src/apis/FeatureFlagsApi/MockFeatureFlagsApi.test.ts b/packages/frontend-test-utils/src/apis/FeatureFlagsApi/MockFeatureFlagsApi.test.ts new file mode 100644 index 0000000000..0798fb48fd --- /dev/null +++ b/packages/frontend-test-utils/src/apis/FeatureFlagsApi/MockFeatureFlagsApi.test.ts @@ -0,0 +1,143 @@ +/* + * 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 { FeatureFlagState } from '@backstage/frontend-plugin-api'; +import { MockFeatureFlagsApi } from './MockFeatureFlagsApi'; + +describe('MockFeatureFlagsApi', () => { + it('should register flags', () => { + const api = new MockFeatureFlagsApi(); + + api.registerFlag({ + name: 'test-flag-1', + pluginId: 'test-plugin', + description: 'Test flag 1', + }); + + api.registerFlag({ + name: 'test-flag-2', + pluginId: 'test-plugin', + description: 'Test flag 2', + }); + + expect(api.getRegisteredFlags()).toHaveLength(2); + expect(api.getRegisteredFlags()[0].name).toBe('test-flag-1'); + }); + + it('should not register duplicate flags', () => { + const api = new MockFeatureFlagsApi(); + + api.registerFlag({ + name: 'test-flag', + pluginId: 'test-plugin', + description: 'Test flag', + }); + + api.registerFlag({ + name: 'test-flag', + pluginId: 'test-plugin', + description: 'Test flag duplicate', + }); + + expect(api.getRegisteredFlags()).toHaveLength(1); + }); + + it('should handle feature flag states', () => { + const api = new MockFeatureFlagsApi(); + + expect(api.isActive('test-flag')).toBe(false); + + api.save({ states: { 'test-flag': FeatureFlagState.Active } }); + expect(api.isActive('test-flag')).toBe(true); + + api.save({ states: { 'test-flag': FeatureFlagState.None } }); + expect(api.isActive('test-flag')).toBe(false); + }); + + it('should initialize with states', () => { + const api = new MockFeatureFlagsApi({ + initialStates: { + 'flag-1': FeatureFlagState.Active, + 'flag-2': FeatureFlagState.None, + }, + }); + + expect(api.isActive('flag-1')).toBe(true); + expect(api.isActive('flag-2')).toBe(false); + }); + + it('should save and replace states', () => { + const api = new MockFeatureFlagsApi({ + initialStates: { 'flag-1': FeatureFlagState.Active }, + }); + + expect(api.isActive('flag-1')).toBe(true); + + api.save({ + states: { + 'flag-2': FeatureFlagState.Active, + }, + }); + + expect(api.isActive('flag-1')).toBe(false); + expect(api.isActive('flag-2')).toBe(true); + }); + + it('should save and merge states', () => { + const api = new MockFeatureFlagsApi({ + initialStates: { 'flag-1': FeatureFlagState.Active }, + }); + + expect(api.isActive('flag-1')).toBe(true); + + api.save({ + states: { + 'flag-2': FeatureFlagState.Active, + }, + merge: true, + }); + + expect(api.isActive('flag-1')).toBe(true); + expect(api.isActive('flag-2')).toBe(true); + }); + + it('should get and set state', () => { + const api = new MockFeatureFlagsApi(); + + api.setState({ + 'flag-1': FeatureFlagState.Active, + 'flag-2': FeatureFlagState.None, + }); + + const state = api.getState(); + expect(state).toEqual({ + 'flag-1': FeatureFlagState.Active, + 'flag-2': FeatureFlagState.None, + }); + }); + + it('should clear state', () => { + const api = new MockFeatureFlagsApi({ + initialStates: { 'flag-1': FeatureFlagState.Active }, + }); + + expect(api.isActive('flag-1')).toBe(true); + + api.clearState(); + expect(api.isActive('flag-1')).toBe(false); + expect(api.getState()).toEqual({}); + }); +}); diff --git a/packages/frontend-test-utils/src/apis/FeatureFlagsApi/MockFeatureFlagsApi.ts b/packages/frontend-test-utils/src/apis/FeatureFlagsApi/MockFeatureFlagsApi.ts new file mode 100644 index 0000000000..5421687c65 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/FeatureFlagsApi/MockFeatureFlagsApi.ts @@ -0,0 +1,105 @@ +/* + * 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 { + FeatureFlag, + FeatureFlagsApi, + FeatureFlagsSaveOptions, + FeatureFlagState, +} from '@backstage/frontend-plugin-api'; + +/** + * Options for configuring {@link MockFeatureFlagsApi}. + * + * @public + */ +export interface MockFeatureFlagsApiOptions { + /** + * Initial feature flag states. + */ + initialStates?: Record; +} + +/** + * Mock implementation of {@link @backstage/frontend-plugin-api#FeatureFlagsApi} for testing feature flag behavior. + * + * @public + * @example + * ```ts + * const api = new MockFeatureFlagsApi({ + * initialStates: { 'my-feature': FeatureFlagState.Active } + * }); + * expect(api.isActive('my-feature')).toBe(true); + * ``` + */ +export class MockFeatureFlagsApi implements FeatureFlagsApi { + private readonly registeredFlags: FeatureFlag[] = []; + private readonly states: Map; + + constructor(options?: MockFeatureFlagsApiOptions) { + this.states = new Map(Object.entries(options?.initialStates ?? {})); + } + + registerFlag(flag: FeatureFlag): void { + if (!this.registeredFlags.some(f => f.name === flag.name)) { + this.registeredFlags.push(flag); + } + } + + getRegisteredFlags(): FeatureFlag[] { + return this.registeredFlags; + } + + isActive(name: string): boolean { + return this.states.get(name) === FeatureFlagState.Active; + } + + save(options: FeatureFlagsSaveOptions): void { + if (options.merge) { + for (const [name, state] of Object.entries(options.states)) { + this.states.set(name, state); + } + } else { + this.states.clear(); + for (const [name, state] of Object.entries(options.states)) { + this.states.set(name, state); + } + } + } + + /** + * Get the current state of all feature flags as a record. + */ + getState(): Record { + return Object.fromEntries(this.states); + } + + /** + * Set the state of multiple feature flags. + */ + setState(states: Record): void { + for (const [name, state] of Object.entries(states)) { + this.states.set(name, state); + } + } + + /** + * Clear all feature flag states. + */ + clearState(): void { + this.states.clear(); + } +} diff --git a/packages/frontend-test-utils/src/apis/FeatureFlagsApi/index.ts b/packages/frontend-test-utils/src/apis/FeatureFlagsApi/index.ts new file mode 100644 index 0000000000..370e9f3b88 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/FeatureFlagsApi/index.ts @@ -0,0 +1,18 @@ +/* + * 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. + */ + +export { MockFeatureFlagsApi } from './MockFeatureFlagsApi'; +export type { MockFeatureFlagsApiOptions } from './MockFeatureFlagsApi'; diff --git a/packages/frontend-test-utils/src/apis/FetchApi/MockFetchApi.test.ts b/packages/frontend-test-utils/src/apis/FetchApi/MockFetchApi.test.ts new file mode 100644 index 0000000000..ae4486d38f --- /dev/null +++ b/packages/frontend-test-utils/src/apis/FetchApi/MockFetchApi.test.ts @@ -0,0 +1,95 @@ +/* + * Copyright 2022 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 { http, HttpResponse } from 'msw'; +import { setupServer } from 'msw/node'; +import { registerMswTestHooks } from '../../..'; +import { MockFetchApi } from './MockFetchApi'; + +describe('MockFetchApi', () => { + const worker = setupServer(); + registerMswTestHooks(worker); + + it('works with default constructor', async () => { + worker.use( + http.get('http://example.com/data.json', () => + HttpResponse.json({ a: 'foo' }, { status: 200 }), + ), + ); + const m = new MockFetchApi(); + const response = await m.fetch('http://example.com/data.json'); + await expect(response.json()).resolves.toEqual({ a: 'foo' }); + }); + + describe('baseImplementation', () => { + it('works with a mock implementation', async () => { + const inner = jest.fn(); + const m = new MockFetchApi({ baseImplementation: inner }); + await m.fetch('http://example.com/data.json'); + expect(inner).toHaveBeenLastCalledWith('http://example.com/data.json'); + }); + }); + + describe('resolvePluginProtocol', () => { + it('works', async () => { + const inner = jest.fn(); + const m = new MockFetchApi({ + baseImplementation: inner, + resolvePluginProtocol: { + discoveryApi: { + getBaseUrl: async id => `https://blah.com/api/${id}`, + }, + }, + }); + await m.fetch('plugin://the-plugin/a/data.json'); + expect(inner.mock.calls[0][0]).toBe( + 'https://blah.com/api/the-plugin/a/data.json', + ); + }); + }); + + describe('injectIdentityAuth', () => { + it('works with token', async () => { + const inner = jest.fn(); + const m = new MockFetchApi({ + baseImplementation: inner, + injectIdentityAuth: { token: 'hello' }, + }); + await m.fetch('http://example.com/data.json'); + expect(inner.mock.calls[0][0].headers?.get('authorization')).toBe( + 'Bearer hello', + ); + }); + + it('works with identityApi', async () => { + const inner = jest.fn(); + const m = new MockFetchApi({ + baseImplementation: inner, + injectIdentityAuth: { + identityApi: { + async getCredentials() { + return { token: 'hello2' }; + }, + }, + }, + }); + await m.fetch('http://example.com/data.json'); + expect(inner.mock.calls[0][0].headers?.get('authorization')).toBe( + 'Bearer hello2', + ); + }); + }); +}); diff --git a/packages/frontend-test-utils/src/apis/FetchApi/MockFetchApi.ts b/packages/frontend-test-utils/src/apis/FetchApi/MockFetchApi.ts new file mode 100644 index 0000000000..b61ca680d1 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/FetchApi/MockFetchApi.ts @@ -0,0 +1,167 @@ +/* + * Copyright 2022 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 { + createFetchApi, + FetchMiddleware, + FetchMiddlewares, +} from '@backstage/core-app-api'; +import { + DiscoveryApi, + FetchApi, + IdentityApi, +} from '@backstage/core-plugin-api'; +/** + * The options given when constructing a {@link MockFetchApi}. + * + * @public + */ +export interface MockFetchApiOptions { + /** + * Define the underlying base `fetch` implementation. + * + * @defaultValue undefined + * @remarks + * + * Leaving out this parameter or passing `undefined`, makes the API use the + * global `fetch` implementation to make real network requests. + * + * `'none'` swallows all calls and makes no requests at all. + * + * You can also pass in any `fetch` compatible callback, such as a + * `jest.fn()`, if you want to use a custom implementation or to just track + * and assert on calls. + */ + baseImplementation?: undefined | 'none' | typeof fetch; + + /** + * Add translation from `plugin://` URLs to concrete http(s) URLs, basically + * simulating what + * {@link @backstage/core-app-api#FetchMiddlewares.resolvePluginProtocol} + * does. + * + * @defaultValue undefined + * @remarks + * + * Leaving out this parameter or passing `undefined`, disables plugin protocol + * translation. + * + * To enable the feature, pass in a discovery API which is then used to + * resolve the URLs. + */ + resolvePluginProtocol?: + | undefined + | { discoveryApi: Pick }; + + /** + * Add token based Authorization headers to requests, basically simulating + * what {@link @backstage/core-app-api#FetchMiddlewares.injectIdentityAuth} + * does. + * + * @defaultValue undefined + * @remarks + * + * Leaving out this parameter or passing `undefined`, disables auth injection. + * + * To enable the feature, pass in either a static token or an identity API + * which is queried on each request for a token. + */ + injectIdentityAuth?: + | undefined + | { token: string } + | { identityApi: Pick }; +} + +/** + * A test helper implementation of {@link @backstage/core-plugin-api#FetchApi}. + * + * @public + */ +export class MockFetchApi implements FetchApi { + private readonly implementation: FetchApi; + + /** + * Creates a mock {@link @backstage/core-plugin-api#FetchApi}. + */ + constructor(options?: MockFetchApiOptions) { + this.implementation = build(options); + } + + /** {@inheritdoc @backstage/core-plugin-api#FetchApi.fetch} */ + get fetch(): typeof fetch { + return this.implementation.fetch; + } +} + +// +// Helpers +// + +function build(options?: MockFetchApiOptions): FetchApi { + return createFetchApi({ + baseImplementation: baseImplementation(options), + middleware: [ + resolvePluginProtocol(options), + injectIdentityAuth(options), + ].filter((x): x is FetchMiddleware => Boolean(x)), + }); +} + +function baseImplementation( + options: MockFetchApiOptions | undefined, +): typeof fetch { + const implementation = options?.baseImplementation; + if (!implementation) { + // Return a wrapper that evaluates global.fetch at call time, not construction time. + // This allows MSW to patch global.fetch after MockFetchApi is constructed. + return (input, init) => global.fetch(input, init); + } else if (implementation === 'none') { + return () => Promise.resolve(new Response()); + } + return implementation; +} + +function resolvePluginProtocol( + allOptions: MockFetchApiOptions | undefined, +): FetchMiddleware | undefined { + const options = allOptions?.resolvePluginProtocol; + if (!options) { + return undefined; + } + + return FetchMiddlewares.resolvePluginProtocol({ + discoveryApi: options.discoveryApi, + }); +} + +function injectIdentityAuth( + allOptions: MockFetchApiOptions | undefined, +): FetchMiddleware | undefined { + const options = allOptions?.injectIdentityAuth; + if (!options) { + return undefined; + } + + const identityApi: Pick = + 'token' in options + ? { getCredentials: async () => ({ token: options.token }) } + : options.identityApi; + + return FetchMiddlewares.injectIdentityAuth({ + identityApi: identityApi as IdentityApi, + allowUrl: () => true, + }); +} diff --git a/packages/frontend-test-utils/src/apis/FetchApi/index.ts b/packages/frontend-test-utils/src/apis/FetchApi/index.ts new file mode 100644 index 0000000000..5ac0c08ff1 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/FetchApi/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright 2022 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 { MockFetchApi } from './MockFetchApi'; +export type { MockFetchApiOptions } from './MockFetchApi'; diff --git a/packages/frontend-test-utils/src/apis/MockWithApiFactory.ts b/packages/frontend-test-utils/src/apis/MockWithApiFactory.ts new file mode 100644 index 0000000000..55bb7653e5 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/MockWithApiFactory.ts @@ -0,0 +1,114 @@ +/* + * 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 { ApiRef } from '@backstage/frontend-plugin-api'; +import { ApiFactory } from '@backstage/frontend-plugin-api'; + +/** + * Symbol used to mark mock API instances with their corresponding API factory. + * + * @ignore + */ +export const mockApiFactorySymbol = Symbol.for('@backstage/mock-api'); + +/** + * Symbol used to mark mock API instances with their corresponding API factory. + * This allows mock APIs to be passed directly to test utilities without + * needing to explicitly provide the [apiRef, implementation] tuple. + * + * @public + */ +export type MockApiFactorySymbol = typeof mockApiFactorySymbol; + +/** + * Type for an API instance that has been marked as a mock API. + * + * @public + */ +export type MockWithApiFactory = TApi & { + [mockApiFactorySymbol]: ApiFactory; +}; + +/** + * Helper to attach mock API metadata to an instance. + * + * @internal + */ +export function mockWithApiFactory( + apiRef: ApiRef, + implementation: TImpl, +): TImpl & { [mockApiFactorySymbol]: ApiFactory } { + const marked = implementation as TImpl & { + [mockApiFactorySymbol]: ApiFactory; + }; + (marked as any)[mockApiFactorySymbol] = { + api: apiRef, + deps: {}, + factory: () => implementation, + }; + return marked; +} + +/** + * Attaches mock API factory metadata to an API instance, allowing it to be + * passed directly to test utilities without needing to explicitly provide + * the [apiRef, implementation] tuple. + * + * @public + * @example + * ```ts + * const catalogApi = attachMockApiFactory( + * catalogApiRef, + * new InMemoryCatalogClient() + * ); + * // Can now be passed directly to TestApiProvider + * + * ``` + */ +export function attachMockApiFactory( + apiRef: ApiRef, + implementation: TImpl, +): TImpl & { [mockApiFactorySymbol]: ApiFactory } { + const marked = implementation as TImpl & { + [mockApiFactorySymbol]: ApiFactory; + }; + (marked as any)[mockApiFactorySymbol] = { + api: apiRef, + deps: {}, + factory: () => implementation, + }; + return marked; +} + +/** + * Retrieves the API factory from a mock API instance. + * Returns undefined if the value is not a mock API instance. + * + * @internal + */ +export function getMockApiFactory( + value: unknown, +): ApiFactory | undefined { + if ( + typeof value === 'object' && + value !== null && + mockApiFactorySymbol in value && + typeof (value as any)[mockApiFactorySymbol] === 'object' + ) { + return (value as any)[mockApiFactorySymbol]; + } + return undefined; +} diff --git a/packages/frontend-test-utils/src/apis/PermissionApi/MockPermissionApi.test.ts b/packages/frontend-test-utils/src/apis/PermissionApi/MockPermissionApi.test.ts new file mode 100644 index 0000000000..b617d89cc4 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/PermissionApi/MockPermissionApi.test.ts @@ -0,0 +1,47 @@ +/* + * Copyright 2021 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 { + AuthorizeResult, + createPermission, +} from '@backstage/plugin-permission-common'; +import { MockPermissionApi } from './MockPermissionApi'; + +describe('MockPermissionApi', () => { + it('returns ALLOW by default', async () => { + const api = new MockPermissionApi(); + + await expect( + api.authorize({ + permission: createPermission({ name: 'permission.1', attributes: {} }), + }), + ).resolves.toEqual({ result: AuthorizeResult.ALLOW }); + }); + + it('allows passing a handler to customize the result', async () => { + const api = new MockPermissionApi(request => + request.permission.name === 'permission.2' + ? AuthorizeResult.DENY + : AuthorizeResult.ALLOW, + ); + + await expect( + api.authorize({ + permission: createPermission({ name: 'permission.2', attributes: {} }), + }), + ).resolves.toEqual({ result: AuthorizeResult.DENY }); + }); +}); diff --git a/packages/frontend-test-utils/src/apis/PermissionApi/MockPermissionApi.ts b/packages/frontend-test-utils/src/apis/PermissionApi/MockPermissionApi.ts new file mode 100644 index 0000000000..c54a3993d3 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/PermissionApi/MockPermissionApi.ts @@ -0,0 +1,45 @@ +/* + * Copyright 2022 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 { PermissionApi } from '@backstage/plugin-permission-react'; +import { + EvaluatePermissionResponse, + EvaluatePermissionRequest, + AuthorizeResult, +} from '@backstage/plugin-permission-common'; + +/** + * Mock implementation of + * {@link @backstage/plugin-permission-react#PermissionApi}. Supply a + * requestHandler function to override the mock result returned for a given + * request. + * + * @public + */ +export class MockPermissionApi implements PermissionApi { + constructor( + private readonly requestHandler: ( + request: EvaluatePermissionRequest, + ) => AuthorizeResult.ALLOW | AuthorizeResult.DENY = () => + AuthorizeResult.ALLOW, + ) {} + + async authorize( + request: EvaluatePermissionRequest, + ): Promise { + return { result: this.requestHandler(request) }; + } +} diff --git a/packages/frontend-test-utils/src/apis/PermissionApi/index.ts b/packages/frontend-test-utils/src/apis/PermissionApi/index.ts new file mode 100644 index 0000000000..f69316b811 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/PermissionApi/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2022 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 { MockPermissionApi } from './MockPermissionApi'; diff --git a/packages/frontend-test-utils/src/apis/StorageApi/MockStorageApi.test.ts b/packages/frontend-test-utils/src/apis/StorageApi/MockStorageApi.test.ts new file mode 100644 index 0000000000..34908f561a --- /dev/null +++ b/packages/frontend-test-utils/src/apis/StorageApi/MockStorageApi.test.ts @@ -0,0 +1,280 @@ +/* + * Copyright 2020 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 { StorageApi } from '@backstage/core-plugin-api'; +import { MockStorageApi } from './MockStorageApi'; + +describe('WebStorage Storage API', () => { + const createMockStorage = (): StorageApi => { + return MockStorageApi.create(); + }; + + it('should return undefined for values which are unset', async () => { + const storage = createMockStorage(); + + expect(storage.snapshot('myfakekey').value).toBeUndefined(); + expect(storage.snapshot('myfakekey')).toEqual({ + key: 'myfakekey', + presence: 'absent', + value: undefined, + }); + }); + + it('should allow the setting and snapshotting of the simple data structures', async () => { + const storage = createMockStorage(); + + await storage.set('myfakekey', 'helloimastring'); + await storage.set('mysecondfakekey', 1234); + await storage.set('mythirdfakekey', true); + expect(storage.snapshot('myfakekey').value).toBe('helloimastring'); + expect(storage.snapshot('mysecondfakekey').value).toBe(1234); + expect(storage.snapshot('mythirdfakekey').value).toBe(true); + expect(storage.snapshot('myfakekey')).toEqual({ + key: 'myfakekey', + presence: 'present', + value: 'helloimastring', + }); + expect(storage.snapshot('mysecondfakekey')).toEqual({ + key: 'mysecondfakekey', + presence: 'present', + value: 1234, + }); + expect(storage.snapshot('mythirdfakekey')).toEqual({ + key: 'mythirdfakekey', + presence: 'present', + value: true, + }); + }); + + it('should allow setting of complex datastructures', async () => { + const storage = createMockStorage(); + + const mockData = { + something: 'here', + is: [{ super: { complex: [{ but: 'something', why: true }] } }], + }; + + await storage.set('myfakekey', mockData); + + expect(storage.snapshot('myfakekey').value).toEqual(mockData); + expect(storage.snapshot('myfakekey')).toEqual({ + key: 'myfakekey', + presence: 'present', + value: mockData, + }); + }); + + it('should subscribe to key changes when setting a new value', async () => { + const storage = createMockStorage(); + + const wrongKeyNextHandler = jest.fn(); + const selectedKeyNextHandler = jest.fn(); + const mockData = { hello: 'im a great new value' }; + + await new Promise(resolve => { + storage.observe$('correctKey').subscribe({ + next: (...args) => { + selectedKeyNextHandler(...args); + resolve(); + }, + }); + + storage.observe$('wrongKey').subscribe({ next: wrongKeyNextHandler }); + + storage.set('correctKey', mockData); + }); + + expect(wrongKeyNextHandler).not.toHaveBeenCalled(); + expect(selectedKeyNextHandler).toHaveBeenCalledTimes(1); + expect(selectedKeyNextHandler).toHaveBeenCalledWith({ + key: 'correctKey', + presence: 'present', + value: mockData, + }); + }); + + it('should subscribe to key changes when deleting a value', async () => { + const storage = createMockStorage(); + + const wrongKeyNextHandler = jest.fn(); + const selectedKeyNextHandler = jest.fn(); + const mockData = { hello: 'im a great new value' }; + + storage.set('correctKey', mockData); + + await new Promise(resolve => { + storage.observe$('correctKey').subscribe({ + next: (...args) => { + selectedKeyNextHandler(...args); + resolve(); + }, + }); + + storage.observe$('wrongKey').subscribe({ next: wrongKeyNextHandler }); + + storage.remove('correctKey'); + }); + + expect(wrongKeyNextHandler).not.toHaveBeenCalled(); + expect(selectedKeyNextHandler).toHaveBeenCalledTimes(1); + expect(selectedKeyNextHandler).toHaveBeenCalledWith({ + key: 'correctKey', + presence: 'absent', + value: undefined, + }); + }); + + it('should be able to create different buckets for different uses', async () => { + const rootStorage = createMockStorage(); + + const firstStorage = rootStorage.forBucket('userSettings'); + const secondStorage = rootStorage.forBucket('profileSettings'); + const keyName = 'blobby'; + + await firstStorage.set(keyName, 'boop'); + await secondStorage.set(keyName, 'deerp'); + + expect(firstStorage.snapshot(keyName)).not.toBe( + secondStorage.snapshot(keyName), + ); + expect(firstStorage.snapshot(keyName).value).toBe('boop'); + expect(secondStorage.snapshot(keyName).value).toBe('deerp'); + expect(firstStorage.snapshot(keyName)).not.toEqual( + secondStorage.snapshot(keyName), + ); + expect(firstStorage.snapshot(keyName)).toEqual({ + key: keyName, + presence: 'present', + value: 'boop', + }); + expect(secondStorage.snapshot(keyName)).toEqual({ + key: keyName, + presence: 'present', + value: 'deerp', + }); + }); + + it('should not clash with other namespaces when creating buckets', async () => { + const rootStorage = createMockStorage(); + + // when getting key test2 it will translate to /profile/something/deep/test2 + const firstStorage = rootStorage + .forBucket('profile') + .forBucket('something') + .forBucket('deep'); + // when getting key deep/test2 it will translate to /profile/something/deep/test2 + const secondStorage = rootStorage.forBucket('profile/something'); + + await firstStorage.set('test2', { error: true }); + + expect(secondStorage.snapshot('deep/test2').value).toBe(undefined); + expect(secondStorage.snapshot('deep/test2')).toMatchObject({ + presence: 'absent', + }); + }); + + it('should not reuse storage instances between different rootStorages', async () => { + const rootStorage1 = createMockStorage(); + const rootStorage2 = createMockStorage(); + + const firstStorage = rootStorage1.forBucket('something'); + const secondStorage = rootStorage2.forBucket('something'); + + await firstStorage.set('test2', true); + + expect(firstStorage.snapshot('test2').value).toBe(true); + expect(secondStorage.snapshot('test2').value).toBe(undefined); + expect(firstStorage.snapshot('test2')).toEqual({ + key: 'test2', + presence: 'present', + value: true, + }); + expect(secondStorage.snapshot('test2')).toEqual({ + key: 'test2', + presence: 'absent', + value: undefined, + }); + }); + + it('should freeze the snapshot value', async () => { + const storage = createMockStorage(); + + const data = { foo: 'bar', baz: [{ foo: 'bar' }] }; + storage.set('foo', data); + + const snapshot = storage.snapshot('foo'); + expect(snapshot.value).not.toBe(data); + + if (snapshot.presence !== 'present') { + throw new Error('Invalid presence'); + } + + expect(() => { + snapshot.value.foo = 'buzz'; + }).toThrow(/Cannot assign to read only property/); + expect(() => { + snapshot.value.baz[0].foo = 'buzz'; + }).toThrow(/Cannot assign to read only property/); + expect(() => { + snapshot.value.baz.push({ foo: 'buzz' }); + }).toThrow(/Cannot add property 1, object is not extensible/); + }); + + it('should freeze observed values', async () => { + const storage = createMockStorage(); + + const snapshotPromise = new Promise(resolve => { + storage.observe$('test').subscribe({ + next: resolve, + }); + }); + + storage.set('test', { + foo: { + bar: 'baz', + }, + }); + + const snapshot = await snapshotPromise; + expect(snapshot.presence).toBe('present'); + expect(() => { + snapshot.value!.foo.bar = 'qux'; + }).toThrow(/Cannot assign to read only property 'bar' of object/); + }); + + it('should JSON serialize stored values', async () => { + const storage = createMockStorage(); + + storage.set('test', { + foo: { + toJSON() { + return { + bar: 'baz', + }; + }, + }, + }); + + expect(storage.snapshot('test')).toMatchObject({ + presence: 'present', + value: { + foo: { + bar: 'baz', + }, + }, + }); + }); +}); diff --git a/packages/frontend-test-utils/src/apis/StorageApi/MockStorageApi.ts b/packages/frontend-test-utils/src/apis/StorageApi/MockStorageApi.ts new file mode 100644 index 0000000000..b4cf762599 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/StorageApi/MockStorageApi.ts @@ -0,0 +1,141 @@ +/* + * Copyright 2020 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 { StorageApi, StorageValueSnapshot } from '@backstage/core-plugin-api'; +import { JsonObject, JsonValue, Observable } from '@backstage/types'; +import ObservableImpl from 'zen-observable'; + +/** + * Mock implementation of the {@link core-plugin-api#StorageApi} to be used in tests + * + * @public + */ +export class MockStorageApi implements StorageApi { + private readonly namespace: string; + private readonly data: JsonObject; + private readonly bucketStorageApis: Map; + + private constructor( + namespace: string, + bucketStorageApis: Map, + data?: JsonObject, + ) { + this.namespace = namespace; + this.bucketStorageApis = bucketStorageApis; + this.data = { ...data }; + } + + static create(data?: JsonObject) { + // Translate a nested data object structure into a flat object with keys + // like `/a/b` with their corresponding leaf values + const keyValues: { [key: string]: any } = {}; + function put(value: { [key: string]: any }, namespace: string) { + for (const [key, val] of Object.entries(value)) { + if (typeof val === 'object' && val !== null) { + put(val, `${namespace}/${key}`); + } else { + const namespacedKey = `${namespace}/${key.replace(/^\//, '')}`; + keyValues[namespacedKey] = val; + } + } + } + put(data ?? {}, ''); + return new MockStorageApi('', new Map(), keyValues); + } + + forBucket(name: string): StorageApi { + if (!this.bucketStorageApis.has(name)) { + this.bucketStorageApis.set( + name, + new MockStorageApi( + `${this.namespace}/${name}`, + this.bucketStorageApis, + this.data, + ), + ); + } + return this.bucketStorageApis.get(name)!; + } + + snapshot(key: string): StorageValueSnapshot { + if (this.data.hasOwnProperty(this.getKeyName(key))) { + const data = this.data[this.getKeyName(key)]; + return { + key, + presence: 'present', + value: data as T, + }; + } + return { + key, + presence: 'absent', + value: undefined, + }; + } + + async set(key: string, data: T): Promise { + const serialized = JSON.parse(JSON.stringify(data), (_key, value) => { + if (typeof value === 'object' && value !== null) { + Object.freeze(value); + } + return value; + }); + this.data[this.getKeyName(key)] = serialized; + this.notifyChanges({ + key, + presence: 'present', + value: serialized, + }); + } + + async remove(key: string): Promise { + delete this.data[this.getKeyName(key)]; + this.notifyChanges({ + key, + presence: 'absent', + value: undefined, + }); + } + + observe$( + key: string, + ): Observable> { + return this.observable.filter(({ key: messageKey }) => messageKey === key); + } + + private getKeyName(key: string) { + return `${this.namespace}/${encodeURIComponent(key)}`; + } + + private notifyChanges(message: StorageValueSnapshot) { + for (const subscription of this.subscribers) { + subscription.next(message); + } + } + + private subscribers = new Set< + ZenObservable.SubscriptionObserver> + >(); + + private readonly observable = new ObservableImpl< + StorageValueSnapshot + >(subscriber => { + this.subscribers.add(subscriber); + return () => { + this.subscribers.delete(subscriber); + }; + }); +} diff --git a/packages/techdocs-cli-embedded-app/src/plugins.ts b/packages/frontend-test-utils/src/apis/StorageApi/index.ts similarity index 89% rename from packages/techdocs-cli-embedded-app/src/plugins.ts rename to packages/frontend-test-utils/src/apis/StorageApi/index.ts index 42fc16b339..6e2ebc6918 100644 --- a/packages/techdocs-cli-embedded-app/src/plugins.ts +++ b/packages/frontend-test-utils/src/apis/StorageApi/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { plugin as TechDocsPlugin } from '@backstage/plugin-techdocs'; +export { MockStorageApi } from './MockStorageApi'; diff --git a/packages/frontend-test-utils/src/apis/TestApiProvider.tsx b/packages/frontend-test-utils/src/apis/TestApiProvider.tsx new file mode 100644 index 0000000000..215e8c8a71 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/TestApiProvider.tsx @@ -0,0 +1,127 @@ +/* + * Copyright 2020 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'; +// eslint-disable-next-line @backstage/no-relative-monorepo-imports +import { ApiProvider } from '../../../core-app-api/src/apis/system'; +import { ApiHolder, ApiRef } from '@backstage/frontend-plugin-api'; +import { + getMockApiFactory, + type MockWithApiFactory, +} from './MockWithApiFactory'; + +/** + * Represents a single API implementation, either as a tuple of the reference and the implementation, or a mock with an embedded factory. + * @public + */ +export type TestApiPair = + | readonly [ApiRef, TApi extends infer TImpl ? Partial : never] + | MockWithApiFactory; + +/** + * Represents an array of mock API implementation. + * @public + */ +export type TestApiPairs = { + [TIndex in keyof TApiPairs]: TestApiPair; +}; + +/** @internal */ +export function resolveTestApiEntries( + apis: readonly [...TestApiPairs], +): ApiHolder { + const apiMap = new Map(); + + for (const entry of apis) { + const mockFactory = getMockApiFactory(entry); + if (mockFactory) { + apiMap.set(mockFactory.api.id, mockFactory.factory({})); + } else { + const [apiRef, impl] = entry as readonly [ApiRef, any]; + apiMap.set(apiRef.id, impl); + } + } + + return { + get: (ref: ApiRef) => apiMap.get(ref.id) as T | undefined, + }; +} + +/** + * Properties for the {@link TestApiProvider} component. + * + * @public + */ +export type TestApiProviderProps = { + apis: readonly [...TestApiPairs]; + children: ReactNode; +}; + +/** + * The `TestApiProvider` is a Utility API context provider for standalone rendering + * scenarios where you're not using `renderInTestApp` or other test utilities. + * + * It lets you provide any number of API implementations, without necessarily + * having to fully implement each of the APIs. + * + * @remarks + * + * For most test scenarios, prefer using the `apis` option in `renderInTestApp` or + * `createExtensionTester` instead of wrapping components with `TestApiProvider`. + * + * @example + * ```tsx + * import { render } from '\@testing-library/react'; + * import { myCustomApiRef } from '../apis'; + * import { TestApiProvider, mockApis } from '\@backstage/frontend-test-utils'; + * + * // Mock custom APIs with tuple syntax + * const myCustomApiMock = { myMethod: jest.fn() }; + * render( + * + * + * + * ); + * + * // Use with built-in mock APIs (no tuples needed) + * render( + * + * + * + * ); + * ``` + * + * @public + */ +export function TestApiProvider( + props: TestApiProviderProps, +): JSX.Element { + return ( + + ); +} diff --git a/packages/frontend-test-utils/src/apis/TranslationApi/MockTranslationApi.test.tsx b/packages/frontend-test-utils/src/apis/TranslationApi/MockTranslationApi.test.tsx new file mode 100644 index 0000000000..4bee969a6d --- /dev/null +++ b/packages/frontend-test-utils/src/apis/TranslationApi/MockTranslationApi.test.tsx @@ -0,0 +1,212 @@ +/* + * Copyright 2020 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 { createTranslationRef } from '@backstage/core-plugin-api/alpha'; +import { MockTranslationApi } from './MockTranslationApi'; + +describe('MockTranslationApi', () => { + function snapshotWithMessages< + const TMessages extends { [key in string]: string }, + >(messages: TMessages) { + const translationApi = MockTranslationApi.create(); + const ref = createTranslationRef({ + id: 'test', + messages, + }); + const snapshot = translationApi.getTranslation(ref); + if (!snapshot.ready) { + throw new Error('Translation snapshot is not ready'); + } + return snapshot; + } + + it('should format plain messages', () => { + const snapshot = snapshotWithMessages({ + foo: 'Foo', + bar: 'Bar', + baz: 'Baz', + }); + + expect(snapshot.t('foo')).toBe('Foo'); + expect(snapshot.t('bar')).toBe('Bar'); + expect(snapshot.t('baz')).toBe('Baz'); + }); + + it('should support interpolation', () => { + const snapshot = snapshotWithMessages({ + shallow: 'Foo {{ bar }}', + multiple: 'Foo {{ bar }} {{ baz }}', + deep: 'Foo {{ bar.baz }}', + }); + + // @ts-expect-error + expect(snapshot.t('shallow')).toBe('Foo {{ bar }}'); + expect(snapshot.t('shallow', { bar: 'Bar' })).toBe('Foo Bar'); + + // @ts-expect-error + expect(snapshot.t('multiple')).toBe('Foo {{ bar }} {{ baz }}'); + // @ts-expect-error + expect(snapshot.t('multiple', { bar: 'Bar' })).toBe('Foo Bar {{ baz }}'); + expect(snapshot.t('multiple', { bar: 'Bar', baz: 'Baz' })).toBe( + 'Foo Bar Baz', + ); + + // @ts-expect-error + expect(snapshot.t('deep')).toBe('Foo {{ bar.baz }}'); + expect(snapshot.t('deep', { bar: { baz: 'Baz' } })).toBe('Foo Baz'); + }); + + // Escaping isn't as useful in React, since we don't need to escape HTML in strings + it('should not escape by default', () => { + const snapshot = snapshotWithMessages({ + foo: 'Foo {{ foo }}', + }); + + expect(snapshot.t('foo', { foo: '
    ' })).toBe('Foo
    '); + expect( + snapshot.t('foo', { + foo: '
    ', + interpolation: { escapeValue: true }, + }), + ).toBe('Foo <div>'); + }); + + it('should support nesting', () => { + const snapshot = snapshotWithMessages({ + foo: 'Foo $t(bar) $t(baz)', + bar: 'Nested', + baz: 'Baz {{ qux }}', + }); + + expect(snapshot.t('foo', { qux: 'Deep' })).toBe('Foo Nested Baz Deep'); + }); + + it('should support jsx interpolation', () => { + const snapshot = snapshotWithMessages({ + empty: 'derp', + jsx: '={{ x }}', + jsxNested: '={{ x.y.z }}', + jsxDeep: '<$t(jsx)>', + }); + + expect(snapshot.t('jsx', { x:

    hello

    })).toMatchInlineSnapshot(` + + = +

    + hello +

    +
    + `); + expect(snapshot.t('jsx', { replace: { x:

    hello

    } })) + .toMatchInlineSnapshot(` + + = +

    + hello +

    +
    + `); + expect( + snapshot.t('jsxNested', { replace: { x: { y: { z:

    hello

    } } } }), + ).toMatchInlineSnapshot(` + + = +

    + hello +

    +
    + `); + expect(snapshot.t('jsxDeep', { x:

    hello

    })).toMatchInlineSnapshot(` + + <= +

    + hello +

    + > +
    + `); + }); + + it('should support formatting', () => { + const snapshot = snapshotWithMessages({ + plain: '= {{ x }}', + number: '= {{ x, number }}', + numberFixed: '= {{ x, number(minimumFractionDigits: 2) }}', + relativeTime: '= {{ x, relativeTime }}', + relativeSeconds: '= {{ x, relativeTime(second) }}', + relativeSecondsShort: + '= {{ x, relativeTime(range: second; style: short) }}', + list: '= {{ x, list }}', + }); + + expect(snapshot.t('plain', { x: '5' })).toBe('= 5'); + expect(snapshot.t('number', { x: 5 })).toBe('= 5'); + expect( + snapshot.t('number', { + x: 5, + formatParams: { x: { minimumFractionDigits: 1 } }, + }), + ).toBe('= 5.0'); + expect(snapshot.t('numberFixed', { x: 5 })).toBe('= 5.00'); + expect( + snapshot.t('numberFixed', { + x: 5, + formatParams: { x: { minimumFractionDigits: 3 } }, + }), + ).toBe('= 5.000'); + expect(snapshot.t('relativeTime', { x: 3 })).toBe('= in 3 days'); + expect(snapshot.t('relativeTime', { x: -3 })).toBe('= 3 days ago'); + expect( + snapshot.t('relativeTime', { + x: 15, + formatParams: { x: { range: 'weeks' } }, + }), + ).toBe('= in 15 weeks'); + expect( + snapshot.t('relativeTime', { + x: 15, + formatParams: { x: { range: 'weeks', style: 'short' } }, + }), + ).toBe('= in 15 wk.'); + expect(snapshot.t('relativeSeconds', { x: 1 })).toBe('= in 1 second'); + expect(snapshot.t('relativeSeconds', { x: 2 })).toBe('= in 2 seconds'); + expect(snapshot.t('relativeSeconds', { x: -3 })).toBe('= 3 seconds ago'); + expect(snapshot.t('relativeSeconds', { x: 0 })).toBe('= in 0 seconds'); + expect(snapshot.t('relativeSecondsShort', { x: 1 })).toBe('= in 1 sec.'); + expect(snapshot.t('relativeSecondsShort', { x: 2 })).toBe('= in 2 sec.'); + expect(snapshot.t('relativeSecondsShort', { x: -3 })).toBe('= 3 sec. ago'); + expect(snapshot.t('relativeSecondsShort', { x: 0 })).toBe('= in 0 sec.'); + expect(snapshot.t('list', { x: ['a'] })).toBe('= a'); + expect(snapshot.t('list', { x: ['a', 'b'] })).toBe('= a and b'); + expect(snapshot.t('list', { x: ['a', 'b', 'c'] })).toBe('= a, b, and c'); + }); + + it('should support plurals', () => { + const snapshot = snapshotWithMessages({ + derp_one: 'derp', + derp_other: 'derps', + derpWithCount_one: '{{ count }} derp', + derpWithCount_other: '{{ count }} derps', + }); + + expect(snapshot.t('derp', { count: 1 })).toBe('derp'); + expect(snapshot.t('derp', { count: 2 })).toBe('derps'); + expect(snapshot.t('derp', { count: 0 })).toBe('derps'); + expect(snapshot.t('derpWithCount', { count: 1 })).toBe('1 derp'); + expect(snapshot.t('derpWithCount', { count: 2 })).toBe('2 derps'); + expect(snapshot.t('derpWithCount', { count: 0 })).toBe('0 derps'); + }); +}); diff --git a/packages/frontend-test-utils/src/apis/TranslationApi/MockTranslationApi.ts b/packages/frontend-test-utils/src/apis/TranslationApi/MockTranslationApi.ts new file mode 100644 index 0000000000..d5fa29ea73 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/TranslationApi/MockTranslationApi.ts @@ -0,0 +1,110 @@ +/* + * Copyright 2023 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 { + TranslationApi, + TranslationRef, + TranslationSnapshot, +} from '@backstage/core-plugin-api/alpha'; +import { createInstance as createI18n, type i18n as I18n } from 'i18next'; +import ObservableImpl from 'zen-observable'; + +import { Observable } from '@backstage/types'; +// Internal import to avoid code duplication, this will lead to duplication in build output +// eslint-disable-next-line @backstage/no-relative-monorepo-imports +import { toInternalTranslationRef } from '../../../../frontend-plugin-api/src/translation/TranslationRef'; +// eslint-disable-next-line @backstage/no-relative-monorepo-imports +import { JsxInterpolator } from '../../../../core-app-api/src/apis/implementations/TranslationApi/I18nextTranslationApi'; + +const DEFAULT_LANGUAGE = 'en'; + +/** + * Mock implementation of {@link @backstage/core-plugin-api/alpha#TranslationApi}. + * + * @public + */ +export class MockTranslationApi implements TranslationApi { + static create() { + const i18n = createI18n({ + fallbackLng: DEFAULT_LANGUAGE, + supportedLngs: [DEFAULT_LANGUAGE], + interpolation: { + escapeValue: false, + // Used for the JsxInterpolator format hook + alwaysFormat: true, + }, + ns: [], + defaultNS: false, + fallbackNS: false, + + // Disable resource loading on init, meaning i18n will be ready to use immediately + initImmediate: false, + }); + + i18n.init(); + if (!i18n.isInitialized) { + throw new Error('i18next was unexpectedly not initialized'); + } + + const interpolator = JsxInterpolator.fromI18n(i18n); + + return new MockTranslationApi(i18n, interpolator); + } + + readonly #i18n: I18n; + readonly #interpolator: JsxInterpolator; + readonly #registeredRefs = new Set(); + + private constructor(i18n: I18n, interpolator: JsxInterpolator) { + this.#i18n = i18n; + this.#interpolator = interpolator; + } + + getTranslation( + translationRef: TranslationRef, + ): TranslationSnapshot { + const internalRef = toInternalTranslationRef(translationRef); + + if (!this.#registeredRefs.has(internalRef.id)) { + this.#registeredRefs.add(internalRef.id); + this.#i18n.addResourceBundle( + DEFAULT_LANGUAGE, + internalRef.id, + internalRef.getDefaultMessages(), + false, // do not merge + true, // overwrite existing + ); + } + + const t = this.#interpolator.wrapT( + this.#i18n.getFixedT(null, internalRef.id), + ); + + return { + ready: true, + t, + }; + } + + translation$(): Observable< + TranslationSnapshot + > { + // No need to implement, getTranslation will always return a ready snapshot + return new ObservableImpl>(_subscriber => { + return () => {}; + }); + } +} diff --git a/packages/frontend-test-utils/src/apis/TranslationApi/index.ts b/packages/frontend-test-utils/src/apis/TranslationApi/index.ts new file mode 100644 index 0000000000..2c10347545 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/TranslationApi/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2023 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 { MockTranslationApi } from './MockTranslationApi'; diff --git a/packages/frontend-test-utils/src/apis/createApiMock.test.ts b/packages/frontend-test-utils/src/apis/createApiMock.test.ts new file mode 100644 index 0000000000..8b03b6df75 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/createApiMock.test.ts @@ -0,0 +1,86 @@ +/* + * 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 { createApiRef } from '@backstage/frontend-plugin-api'; +import { createApiMock } from './createApiMock'; +import { getMockApiFactory } from './MockWithApiFactory'; + +describe('createApiMock', () => { + type TestApi = { + greet(name: string): string; + count: number; + }; + + const testApiRef = createApiRef({ id: 'test.create-mock' }); + + it('returns a factory function that produces jest mocks', () => { + const mock = createApiMock(testApiRef, () => ({ + greet: jest.fn(), + count: 0 as any, + })); + + const api = mock(); + api.greet('world'); + expect(api.greet).toHaveBeenCalledTimes(1); + expect(api.greet).toHaveBeenCalledWith('world'); + }); + + it('applies partial implementations via mockImplementation', () => { + const mock = createApiMock(testApiRef, () => ({ + greet: jest.fn(), + count: 0 as any, + })); + + const api = mock({ greet: (name: string) => `Hello ${name}!` }); + expect(api.greet('world')).toBe('Hello world!'); + expect(api.greet).toHaveBeenCalledTimes(1); + }); + + it('preserves non-function partial values', () => { + const mock = createApiMock(testApiRef, () => ({ + greet: jest.fn(), + count: 0 as any, + })); + + const api = mock({ count: 42 }); + expect(api.count).toBe(42); + }); + + it('attaches a mock API factory via the symbol', () => { + const mock = createApiMock(testApiRef, () => ({ + greet: jest.fn(), + count: 0 as any, + })); + + const api = mock(); + const factory = getMockApiFactory(api); + expect(factory).toBeDefined(); + expect(factory!.api).toBe(testApiRef); + }); + + it('creates fresh mocks on each call', () => { + const mock = createApiMock(testApiRef, () => ({ + greet: jest.fn(), + count: 0 as any, + })); + + const api1 = mock(); + const api2 = mock(); + api1.greet('a'); + expect(api1.greet).toHaveBeenCalledTimes(1); + expect(api2.greet).toHaveBeenCalledTimes(0); + }); +}); diff --git a/packages/frontend-test-utils/src/apis/createApiMock.ts b/packages/frontend-test-utils/src/apis/createApiMock.ts new file mode 100644 index 0000000000..759a8a1616 --- /dev/null +++ b/packages/frontend-test-utils/src/apis/createApiMock.ts @@ -0,0 +1,87 @@ +/* + * 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 { ApiFactory, type ApiRef } from '@backstage/frontend-plugin-api'; +import { mockApiFactorySymbol } from './MockWithApiFactory'; + +/** + * Represents a mocked version of an API, where you automatically have access to + * the mocked versions of all of its methods along with a factory that returns + * that same mock. + * + * @public + */ +export type ApiMock = { + [mockApiFactorySymbol]: ApiFactory; +} & { + [Key in keyof TApi]: TApi[Key] extends (...args: infer Args) => infer Return + ? TApi[Key] & jest.MockInstance + : TApi[Key]; +}; + +/** + * Creates a standardized Backstage Utility API mockfactory function for + * producing mock API instances. + * + * @remarks + * + * Each method in the mock factory is a `jest.fn()`, and you can optionally pass + * partial implementations when calling the returned function. No type + * parameters should be provided to this function, they will be inferred from + * the provided API reference. + * + * @public + * @example + * ```ts + * import { createApiMock } from '@backstage/frontend-test-utils'; + * import { myApiRef } from '../apis'; + * + * // Set up the mock factory + * const mock = createApiMock(myApiRef, () => ({ + * greet: jest.fn(), + * })); + * + * // Create a mock with default behavior + * const api = mock(); + * + * // Or with a partial implementation + * const api = mock({ greet: async () => 'Hello!' }); + * expect(api.greet).toHaveBeenCalledTimes(1); + * ``` + */ +export function createApiMock( + apiRef: ApiRef, + mockFactory: () => jest.Mocked, +): (partialImpl?: Partial) => ApiMock { + return partialImpl => { + const mock = mockFactory(); + if (partialImpl) { + for (const [key, impl] of Object.entries(partialImpl)) { + if (typeof impl === 'function') { + (mock as any)[key].mockImplementation(impl); + } else { + (mock as any)[key] = impl; + } + } + } + (mock as any)[mockApiFactorySymbol] = { + api: apiRef, + deps: {}, + factory: () => mock, + }; + return mock as unknown as ApiMock; + }; +} diff --git a/packages/frontend-test-utils/src/apis/index.ts b/packages/frontend-test-utils/src/apis/index.ts index e5a0786cd0..6e09833298 100644 --- a/packages/frontend-test-utils/src/apis/index.ts +++ b/packages/frontend-test-utils/src/apis/index.ts @@ -14,18 +14,73 @@ * limitations under the License. */ +export { mockApis } from './mockApis'; +export { createApiMock, type ApiMock } from './createApiMock'; export { - MockConfigApi, - type ErrorWithContext, - MockErrorApi, - type MockErrorApiOptions, - MockFetchApi, - type MockFetchApiOptions, - MockPermissionApi, - MockStorageApi, - type MockStorageBucket, - mockApis, - type ApiMock, -} from '@backstage/test-utils'; + type MockApiFactorySymbol, + type MockWithApiFactory, + attachMockApiFactory, +} from './MockWithApiFactory'; +export { + TestApiProvider, + type TestApiProviderProps, + type TestApiPair, + type TestApiPairs, +} from './TestApiProvider'; -export { MockAnalyticsApi } from './AnalyticsApi/MockAnalyticsApi'; +/** + * Mock API classes are exported as types only to prevent direct instantiation. + * Always use the `mockApis` namespace to create mock instances (e.g., `mockApis.alert()`). + */ + +/** + * @public + */ +export type { MockAlertApi } from './AlertApi'; + +/** + * @public + */ +export type { MockAnalyticsApi } from './AnalyticsApi'; + +/** + * @public + */ +export type { MockConfigApi } from './ConfigApi'; + +/** + * @public + */ +export type { + MockErrorApi, + MockErrorApiOptions, + ErrorWithContext, +} from './ErrorApi'; + +/** + * @public + */ +export type { MockFetchApi, MockFetchApiOptions } from './FetchApi'; + +/** + * @public + */ +export type { + MockFeatureFlagsApi, + MockFeatureFlagsApiOptions, +} from './FeatureFlagsApi'; + +/** + * @public + */ +export type { MockPermissionApi } from './PermissionApi'; + +/** + * @public + */ +export type { MockStorageApi } from './StorageApi'; + +/** + * @public + */ +export type { MockTranslationApi } from './TranslationApi'; diff --git a/packages/frontend-test-utils/src/apis/mockApis.test.ts b/packages/frontend-test-utils/src/apis/mockApis.test.ts new file mode 100644 index 0000000000..9c6310ca9c --- /dev/null +++ b/packages/frontend-test-utils/src/apis/mockApis.test.ts @@ -0,0 +1,119 @@ +/* + * 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 { FeatureFlagState } from '@backstage/frontend-plugin-api'; +import { mockApis } from './mockApis'; + +describe('mockApis', () => { + describe('alert', () => { + it('can create an instance', () => { + const alert = mockApis.alert(); + alert.post({ message: 'test alert' }); + expect(alert.getAlerts()).toHaveLength(1); + expect(alert.getAlerts()[0]).toMatchObject({ message: 'test alert' }); + }); + + it('can clear alerts', () => { + const alert = mockApis.alert(); + alert.post({ message: 'test' }); + expect(alert.getAlerts()).toHaveLength(1); + alert.clearAlerts(); + expect(alert.getAlerts()).toHaveLength(0); + }); + + it('can create a mock and make assertions on it', () => { + const alert = mockApis.alert.mock({ + post: jest.fn(msg => { + expect(msg).toMatchObject({ message: 'test' }); + }), + }); + alert.post({ message: 'test' }); + expect(alert.post).toHaveBeenCalledTimes(1); + }); + }); + + describe('featureFlags', () => { + it('can create an instance', () => { + const featureFlags = mockApis.featureFlags({ + initialStates: { 'test-flag': FeatureFlagState.Active }, + }); + expect(featureFlags.isActive('test-flag')).toBe(true); + expect(featureFlags.isActive('other-flag')).toBe(false); + }); + + it('can save and merge state', () => { + const featureFlags = mockApis.featureFlags({ + initialStates: { 'flag-1': FeatureFlagState.Active }, + }); + + featureFlags.save({ + states: { 'flag-2': FeatureFlagState.Active }, + merge: true, + }); + + expect(featureFlags.isActive('flag-1')).toBe(true); + expect(featureFlags.isActive('flag-2')).toBe(true); + }); + + it('can set and clear state using helper methods', () => { + const featureFlags = mockApis.featureFlags(); + featureFlags.setState({ 'test-flag': FeatureFlagState.Active }); + expect(featureFlags.getState()).toEqual({ + 'test-flag': FeatureFlagState.Active, + }); + featureFlags.clearState(); + expect(featureFlags.getState()).toEqual({}); + }); + + it('can create a mock and make assertions on it', () => { + const featureFlags = mockApis.featureFlags.mock({ + isActive: jest.fn(() => true), + }); + expect(featureFlags.isActive('test')).toBe(true); + expect(featureFlags.isActive).toHaveBeenCalledTimes(1); + }); + }); + + describe('re-exported APIs from test-utils', () => { + it('should have analytics', () => { + expect(mockApis.analytics).toBeDefined(); + }); + + it('should have config', () => { + expect(mockApis.config).toBeDefined(); + }); + + it('should have discovery', () => { + expect(mockApis.discovery).toBeDefined(); + }); + + it('should have identity', () => { + expect(mockApis.identity).toBeDefined(); + }); + + it('should have permission', () => { + expect(mockApis.permission).toBeDefined(); + }); + + it('should have storage', () => { + expect(mockApis.storage).toBeDefined(); + }); + + it('should have translation', () => { + expect(mockApis.translation).toBeDefined(); + }); + }); +}); diff --git a/packages/frontend-test-utils/src/apis/mockApis.ts b/packages/frontend-test-utils/src/apis/mockApis.ts new file mode 100644 index 0000000000..9e3dce1e3a --- /dev/null +++ b/packages/frontend-test-utils/src/apis/mockApis.ts @@ -0,0 +1,465 @@ +/* + * 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 { + alertApiRef, + analyticsApiRef, + configApiRef, + discoveryApiRef, + errorApiRef, + fetchApiRef, + featureFlagsApiRef, + identityApiRef, + storageApiRef, + translationApiRef, + type AnalyticsApi, + type ConfigApi, + type DiscoveryApi, + type ErrorApi, + type FetchApi, + type IdentityApi, + type StorageApi, + type TranslationApi, +} from '@backstage/frontend-plugin-api'; +import { + permissionApiRef, + type PermissionApi, +} from '@backstage/plugin-permission-react'; +import { JsonObject } from '@backstage/types'; +import { + AuthorizeResult, + EvaluatePermissionRequest, +} from '@backstage/plugin-permission-common'; +import { MockAlertApi } from './AlertApi'; +import { + MockFeatureFlagsApi, + MockFeatureFlagsApiOptions, +} from './FeatureFlagsApi'; +import { MockAnalyticsApi } from './AnalyticsApi'; +import { MockConfigApi } from './ConfigApi'; +import { MockErrorApi, MockErrorApiOptions } from './ErrorApi'; +import { MockFetchApi, MockFetchApiOptions } from './FetchApi'; +import { MockStorageApi } from './StorageApi'; +import { MockPermissionApi } from './PermissionApi'; +import { MockTranslationApi } from './TranslationApi'; +import { + mockWithApiFactory, + type MockWithApiFactory, +} from './MockWithApiFactory'; +import { createApiMock } from './createApiMock'; + +/** + * Mock implementations of the core utility APIs, to be used in tests. + * + * @public + * @remarks + * + * There are some variations among the APIs depending on what needs tests + * might have, but overall there are two main usage patterns: + * + * 1: Creating an actual fake API instance, often with a simplified version + * of functionality, by calling the mock API itself as a function. + * + * ```ts + * // The function often accepts parameters that control its behavior + * const foo = mockApis.foo(); + * ``` + * + * 2: Creating a mock API, where all methods are replaced with jest mocks, by + * calling the API's `mock` function. + * + * ```ts + * // You can optionally supply a subset of its methods to implement + * const foo = mockApis.foo.mock({ + * someMethod: () => 'mocked result', + * }); + * // After exercising your test, you can make assertions on the mock: + * expect(foo.someMethod).toHaveBeenCalledTimes(2); + * expect(foo.otherMethod).toHaveBeenCalledWith(testData); + * ``` + */ +export namespace mockApis { + /** + * Fake implementation of {@link @backstage/frontend-plugin-api#AlertApi}. + * + * @public + * @example + * + * ```tsx + * const alertApi = mockApis.alert(); + * alertApi.post({ message: 'Test alert' }); + * expect(alertApi.getAlerts()).toHaveLength(1); + * ``` + */ + export function alert(): MockWithApiFactory { + const instance = new MockAlertApi(); + return mockWithApiFactory( + alertApiRef, + instance, + ) as MockWithApiFactory; + } + /** + * Mock helpers for {@link @backstage/frontend-plugin-api#AlertApi}. + * + * @see {@link @backstage/frontend-plugin-api#mockApis.alert} + * @public + */ + export namespace alert { + /** + * Creates a mock implementation of + * {@link @backstage/frontend-plugin-api#AlertApi}. All methods are + * replaced with jest mock functions, and you can optionally pass in a + * subset of methods with an explicit implementation. + * + * @public + */ + export const mock = createApiMock(alertApiRef, () => ({ + post: jest.fn(), + alert$: jest.fn(), + })); + } + + /** + * Fake implementation of {@link @backstage/frontend-plugin-api#FeatureFlagsApi}. + * + * @public + * @example + * + * ```tsx + * const featureFlagsApi = mockApis.featureFlags({ + * initialStates: { 'my-feature': FeatureFlagState.Active }, + * }); + * expect(featureFlagsApi.isActive('my-feature')).toBe(true); + * ``` + */ + export function featureFlags( + options?: MockFeatureFlagsApiOptions, + ): MockWithApiFactory { + const instance = new MockFeatureFlagsApi(options); + return mockWithApiFactory( + featureFlagsApiRef, + instance, + ) as MockWithApiFactory; + } + /** + * Mock helpers for {@link @backstage/frontend-plugin-api#FeatureFlagsApi}. + * + * @see {@link @backstage/frontend-plugin-api#mockApis.featureFlags} + * @public + */ + export namespace featureFlags { + /** + * Creates a mock implementation of + * {@link @backstage/frontend-plugin-api#FeatureFlagsApi}. All methods are + * replaced with jest mock functions, and you can optionally pass in a + * subset of methods with an explicit implementation. + * + * @public + */ + export const mock = createApiMock(featureFlagsApiRef, () => ({ + registerFlag: jest.fn(), + getRegisteredFlags: jest.fn(), + isActive: jest.fn(), + save: jest.fn(), + })); + } + + /** + * Fake implementation of {@link @backstage/core-plugin-api#AnalyticsApi}. + * + * @public + */ + export function analytics(): MockAnalyticsApi & + MockWithApiFactory { + const instance = new MockAnalyticsApi(); + return mockWithApiFactory(analyticsApiRef, instance) as MockAnalyticsApi & + MockWithApiFactory; + } + + /** + * Mock helpers for {@link @backstage/core-plugin-api#AnalyticsApi}. + * + * @public + */ + export namespace analytics { + export const mock = createApiMock(analyticsApiRef, () => ({ + captureEvent: jest.fn(), + })); + } + + /** + * Fake implementation of {@link @backstage/core-plugin-api/alpha#TranslationApi}. + * By default returns the default translation. + * + * @public + */ + export function translation(): MockTranslationApi & + MockWithApiFactory { + const instance = MockTranslationApi.create(); + return mockWithApiFactory( + translationApiRef, + instance, + ) as MockTranslationApi & MockWithApiFactory; + } + + /** + * Mock helpers for {@link @backstage/core-plugin-api/alpha#TranslationApi}. + * + * @see {@link @backstage/frontend-plugin-api#mockApis.translation} + * @public + */ + export namespace translation { + /** + * Creates a mock of {@link @backstage/core-plugin-api/alpha#TranslationApi}. + * + * @public + */ + export const mock = createApiMock(translationApiRef, () => ({ + getTranslation: jest.fn(), + translation$: jest.fn(), + })); + } + + /** + * Fake implementation of {@link @backstage/core-plugin-api#ConfigApi}. + * + * @public + */ + export function config(options?: { + data?: JsonObject; + }): MockConfigApi & MockWithApiFactory { + const instance = new MockConfigApi({ data: options?.data ?? {} }); + return mockWithApiFactory(configApiRef, instance) as MockConfigApi & + MockWithApiFactory; + } + + /** + * Mock helpers for {@link @backstage/core-plugin-api#ConfigApi}. + * + * @public + */ + export namespace config { + export const mock = createApiMock(configApiRef, () => ({ + has: jest.fn(), + keys: jest.fn(), + get: jest.fn(), + getOptional: jest.fn(), + getConfig: jest.fn(), + getOptionalConfig: jest.fn(), + getConfigArray: jest.fn(), + getOptionalConfigArray: jest.fn(), + getNumber: jest.fn(), + getOptionalNumber: jest.fn(), + getBoolean: jest.fn(), + getOptionalBoolean: jest.fn(), + getString: jest.fn(), + getOptionalString: jest.fn(), + getStringArray: jest.fn(), + getOptionalStringArray: jest.fn(), + })); + } + + /** + * Fake implementation of {@link @backstage/core-plugin-api#DiscoveryApi}. + * + * @public + */ + export function discovery(options?: { + baseUrl?: string; + }): DiscoveryApi & MockWithApiFactory { + const baseUrl = options?.baseUrl ?? 'http://example.com'; + const instance: DiscoveryApi = { + async getBaseUrl(pluginId: string) { + return `${baseUrl}/api/${pluginId}`; + }, + }; + return mockWithApiFactory(discoveryApiRef, instance) as DiscoveryApi & + MockWithApiFactory; + } + + /** + * Mock helpers for {@link @backstage/core-plugin-api#DiscoveryApi}. + * + * @public + */ + export namespace discovery { + export const mock = createApiMock(discoveryApiRef, () => ({ + getBaseUrl: jest.fn(), + })); + } + + /** + * Fake implementation of {@link @backstage/core-plugin-api#IdentityApi}. + * + * @public + */ + export function identity(options?: { + userEntityRef?: string; + ownershipEntityRefs?: string[]; + token?: string; + email?: string; + displayName?: string; + picture?: string; + }): MockWithApiFactory { + const { + userEntityRef = 'user:default/test', + ownershipEntityRefs = ['user:default/test'], + token, + email, + displayName, + picture, + } = options ?? {}; + const instance: IdentityApi = { + async getBackstageIdentity() { + return { type: 'user', ownershipEntityRefs, userEntityRef }; + }, + async getCredentials() { + return { token }; + }, + async getProfileInfo() { + return { email, displayName, picture }; + }, + async signOut() {}, + }; + return mockWithApiFactory(identityApiRef, instance) as IdentityApi & + MockWithApiFactory; + } + + /** + * Mock helpers for {@link @backstage/core-plugin-api#IdentityApi}. + * + * @public + */ + export namespace identity { + export const mock = createApiMock(identityApiRef, () => ({ + getBackstageIdentity: jest.fn(), + getCredentials: jest.fn(), + getProfileInfo: jest.fn(), + signOut: jest.fn(), + })); + } + + /** + * Fake implementation of {@link @backstage/plugin-permission-react#PermissionApi}. + * + * @public + */ + export function permission(options?: { + authorize?: + | AuthorizeResult.ALLOW + | AuthorizeResult.DENY + | (( + request: EvaluatePermissionRequest, + ) => AuthorizeResult.ALLOW | AuthorizeResult.DENY); + }): MockPermissionApi & MockWithApiFactory { + const authorizeInput = options?.authorize; + const handler = + typeof authorizeInput === 'function' + ? authorizeInput + : () => authorizeInput ?? AuthorizeResult.ALLOW; + const instance = new MockPermissionApi(handler); + return mockWithApiFactory(permissionApiRef, instance) as MockPermissionApi & + MockWithApiFactory; + } + + /** + * Mock helpers for {@link @backstage/plugin-permission-react#PermissionApi}. + * + * @public + */ + export namespace permission { + export const mock = createApiMock(permissionApiRef, () => ({ + authorize: jest.fn(), + })); + } + + /** + * Fake implementation of {@link @backstage/core-plugin-api#StorageApi}. + * + * @public + */ + export function storage(options?: { + data?: JsonObject; + }): MockStorageApi & MockWithApiFactory { + const instance = MockStorageApi.create(options?.data); + return mockWithApiFactory(storageApiRef, instance) as MockStorageApi & + MockWithApiFactory; + } + + /** + * Mock helpers for {@link @backstage/core-plugin-api#StorageApi}. + * + * @public + */ + export namespace storage { + export const mock = createApiMock(storageApiRef, () => ({ + forBucket: jest.fn(), + snapshot: jest.fn(), + set: jest.fn(), + remove: jest.fn(), + observe$: jest.fn(), + })); + } + + /** + * Fake implementation of {@link @backstage/core-plugin-api#ErrorApi}. + * + * @public + */ + export function error( + options?: MockErrorApiOptions, + ): MockErrorApi & MockWithApiFactory { + const instance = new MockErrorApi(options); + return mockWithApiFactory(errorApiRef, instance) as MockErrorApi & + MockWithApiFactory; + } + + /** + * Mock helpers for {@link @backstage/core-plugin-api#ErrorApi}. + * + * @public + */ + export namespace error { + export const mock = createApiMock(errorApiRef, () => ({ + post: jest.fn(), + error$: jest.fn(), + })); + } + + /** + * Fake implementation of {@link @backstage/core-plugin-api#FetchApi}. + * + * @public + */ + export function fetch( + options?: MockFetchApiOptions, + ): MockFetchApi & MockWithApiFactory { + const instance = new MockFetchApi(options); + return mockWithApiFactory(fetchApiRef, instance) as MockFetchApi & + MockWithApiFactory; + } + + /** + * Mock helpers for {@link @backstage/core-plugin-api#FetchApi}. + * + * @public + */ + export namespace fetch { + export const mock = createApiMock(fetchApiRef, () => ({ + fetch: jest.fn(), + })); + } +} diff --git a/packages/frontend-test-utils/src/app/createExtensionTester.test.tsx b/packages/frontend-test-utils/src/app/createExtensionTester.test.tsx index f412f29b65..9ce1863186 100644 --- a/packages/frontend-test-utils/src/app/createExtensionTester.test.tsx +++ b/packages/frontend-test-utils/src/app/createExtensionTester.test.tsx @@ -15,12 +15,16 @@ */ import { + analyticsApiRef, coreExtensionData, createExtension, createExtensionDataRef, createExtensionInput, + useAnalytics, } from '@backstage/frontend-plugin-api'; import { createExtensionTester } from './createExtensionTester'; +import { screen } from '@testing-library/react'; +import { renderInTestApp } from './renderInTestApp'; const stringDataRef = createExtensionDataRef().with({ id: 'test.string', @@ -152,4 +156,193 @@ describe('createExtensionTester', () => { expect([test, test2, test3]).toBeDefined(); }); + + it('should support API overrides via options', async () => { + const analyticsApiMock = { captureEvent: jest.fn() }; + + const TestComponent = () => { + const analytics = useAnalytics(); + analytics.captureEvent('test', 'value'); + return
    Test
    ; + }; + + const extension = createExtension({ + attachTo: { id: 'ignored', input: 'ignored' }, + output: [coreExtensionData.reactElement], + factory: () => [coreExtensionData.reactElement()], + }); + + const tester = createExtensionTester(extension, { + apis: [[analyticsApiRef, analyticsApiMock] as const], + }); + + renderInTestApp(tester.reactElement(), { + apis: [[analyticsApiRef, analyticsApiMock] as const], + }); + + expect(screen.getByText('Test')).toBeInTheDocument(); + expect(analyticsApiMock.captureEvent).toHaveBeenCalledWith( + expect.objectContaining({ + action: 'test', + subject: 'value', + }), + ); + }); + + describe('snapshot', () => { + it('should return a snapshot of the extension tree', () => { + const extension = createExtension({ + name: 'root', + attachTo: { id: 'ignored', input: 'ignored' }, + output: [stringDataRef], + factory: () => [stringDataRef('test-text')], + }); + + const tester = createExtensionTester(extension); + + expect(tester.snapshot()).toMatchInlineSnapshot(` + { + "id": "root", + "outputs": [ + "test.string", + ], + } + `); + }); + + it('should include child extensions in the tree', () => { + const childInput = createExtensionInput([stringDataRef]); + + const rootExtension = createExtension({ + name: 'root', + attachTo: { id: 'ignored', input: 'ignored' }, + inputs: { + children: childInput, + }, + output: [coreExtensionData.reactElement], + factory: () => [coreExtensionData.reactElement(
    root
    )], + }); + + const childExtension = createExtension({ + name: 'child', + attachTo: { id: 'root', input: 'children' }, + output: [stringDataRef], + factory: () => [stringDataRef('child-data')], + }); + + const tester = createExtensionTester(rootExtension).add(childExtension); + + expect(tester.snapshot()).toMatchInlineSnapshot(` + { + "children": { + "children": [ + { + "id": "child", + "outputs": [ + "test.string", + ], + }, + ], + }, + "id": "root", + "outputs": [ + "core.reactElement", + ], + } + `); + }); + + it('should include multiple children in sorted order', () => { + const childInput = createExtensionInput([stringDataRef]); + + const rootExtension = createExtension({ + name: 'root', + attachTo: { id: 'ignored', input: 'ignored' }, + inputs: { + children: childInput, + }, + output: [coreExtensionData.reactElement], + factory: () => [coreExtensionData.reactElement(
    root
    )], + }); + + const child1 = createExtension({ + name: 'child1', + attachTo: { id: 'root', input: 'children' }, + output: [stringDataRef], + factory: () => [stringDataRef('child1-data')], + }); + + const child2 = createExtension({ + name: 'child2', + attachTo: { id: 'root', input: 'children' }, + output: [stringDataRef], + factory: () => [stringDataRef('child2-data')], + }); + + const tester = createExtensionTester(rootExtension) + .add(child1) + .add(child2); + + expect(tester.snapshot()).toMatchInlineSnapshot(` + { + "children": { + "children": [ + { + "id": "child1", + "outputs": [ + "test.string", + ], + }, + { + "id": "child2", + "outputs": [ + "test.string", + ], + }, + ], + }, + "id": "root", + "outputs": [ + "core.reactElement", + ], + } + `); + }); + + it('should omit empty children and outputs', () => { + const extension = createExtension({ + name: 'root', + attachTo: { id: 'ignored', input: 'ignored' }, + output: [], + factory: () => [], + }); + + const tester = createExtensionTester(extension); + + expect(tester.snapshot()).toMatchInlineSnapshot(` + { + "id": "root", + } + `); + }); + + it('should produce serializable snapshot data', () => { + const extension = createExtension({ + name: 'root', + attachTo: { id: 'ignored', input: 'ignored' }, + output: [stringDataRef], + factory: () => [stringDataRef('test-text')], + }); + + const tester = createExtensionTester(extension); + const snapshot = tester.snapshot(); + + expect(snapshot).toEqual({ + id: 'root', + outputs: ['test.string'], + }); + + expect(JSON.parse(JSON.stringify(snapshot))).toEqual(snapshot); + }); + }); }); diff --git a/packages/frontend-test-utils/src/app/createExtensionTester.tsx b/packages/frontend-test-utils/src/app/createExtensionTester.tsx index 50d65fddc7..3a373b3b3a 100644 --- a/packages/frontend-test-utils/src/app/createExtensionTester.tsx +++ b/packages/frontend-test-utils/src/app/createExtensionTester.tsx @@ -37,8 +37,24 @@ import { instantiateAppNodeTree } from '../../../frontend-app-api/src/tree/insta import { readAppExtensionsConfig } from '../../../frontend-app-api/src/tree/readAppExtensionsConfig'; // eslint-disable-next-line @backstage/no-relative-monorepo-imports import { createErrorCollector } from '../../../frontend-app-api/src/wiring/createErrorCollector'; -import { TestApiRegistry } from '@backstage/test-utils'; import { OpaqueExtensionDefinition } from '@internal/frontend'; +import { resolveTestApiEntries, TestApiPairs } from '../apis/TestApiProvider'; + +/** + * Represents a snapshot of an extension in the app tree. + * + * @public + */ +export interface ExtensionSnapshotNode { + /** The ID of the extension */ + id: string; + /** The IDs of output data refs produced by this extension */ + outputs?: string[]; + /** Child extensions organized by input name */ + children?: Record; + /** Whether this extension is disabled */ + disabled?: true; +} /** @public */ export class ExtensionQuery { @@ -78,16 +94,23 @@ export class ExtensionQuery { /** @public */ export class ExtensionTester { /** @internal */ - static forSubject( + static forSubject< + T extends ExtensionDefinitionParameters, + const TApiPairs extends any[], + >( subject: ExtensionDefinition, - options?: { config?: T['configInput'] }, + options?: { + config?: T['configInput']; + apis?: readonly [...TestApiPairs]; + }, ): ExtensionTester> { - const tester = new ExtensionTester(); + const tester = new ExtensionTester(options?.apis); tester.add(subject, options as T['configInput'] & {}); return tester; } #tree?: AppTree; + #apis?: readonly any[]; readonly #extensions = new Array<{ id: string; @@ -96,6 +119,10 @@ export class ExtensionTester { config?: JsonValue; }>(); + private constructor(apis?: readonly any[]) { + this.#apis = apis; + } + add( extension: ExtensionDefinition, options?: { config?: T['configInput'] }, @@ -181,6 +208,54 @@ export class ExtensionTester { return element; } + /** + * Returns a snapshot of the extension tree structure for testing and debugging. + * Convenient to use with Jest's inline snapshot testing. + * + * @example + * ```tsx + * const tester = createExtensionTester(myExtension); + * expect(tester.snapshot()).toMatchInlineSnapshot(); + * ``` + */ + snapshot(): ExtensionSnapshotNode { + const tree = this.#resolveTree(); + + const buildNode = (node: AppNode): ExtensionSnapshotNode => { + const outputs = node.instance + ? Array.from(node.instance.getDataRefs()) + .map(ref => ref.id) + .sort() + : []; + + const children: Record = {}; + for (const [inputName, attachedNodes] of node.edges.attachments) { + children[inputName] = attachedNodes + .map(n => buildNode(n)) + .sort((a, b) => a.id.localeCompare(b.id)); + } + + const result: ExtensionSnapshotNode = { + id: node.spec.id, + }; + + // Only include non-empty/non-default fields + if (outputs.length > 0) { + result.outputs = outputs; + } + if (Object.keys(children).length > 0) { + result.children = children; + } + if (node.spec.disabled) { + result.disabled = true; + } + + return result; + }; + + return buildNode(tree.root); + } + #resolveTree() { if (this.#tree) { return this.#tree; @@ -206,7 +281,9 @@ export class ExtensionTester { collector, ); - instantiateAppNodeTree(tree.root, TestApiRegistry.from(), collector); + const apiHolder = resolveTestApiEntries(this.#apis ?? []); + + instantiateAppNodeTree(tree.root, apiHolder, collector); const errors = collector.collectErrors(); if (errors) { @@ -260,9 +337,15 @@ export class ExtensionTester { } /** @public */ -export function createExtensionTester( +export function createExtensionTester< + T extends ExtensionDefinitionParameters, + TApiPairs extends any[] = any[], +>( subject: ExtensionDefinition, - options?: { config?: T['configInput'] }, + options?: { + config?: T['configInput']; + apis?: readonly [...TestApiPairs]; + }, ): ExtensionTester> { return ExtensionTester.forSubject(subject, options); } diff --git a/packages/frontend-test-utils/src/app/index.ts b/packages/frontend-test-utils/src/app/index.ts index 9db67dbb49..71de66fce6 100644 --- a/packages/frontend-test-utils/src/app/index.ts +++ b/packages/frontend-test-utils/src/app/index.ts @@ -18,6 +18,7 @@ export { createExtensionTester, type ExtensionTester, type ExtensionQuery, + type ExtensionSnapshotNode, } from './createExtensionTester'; export { renderInTestApp, type TestAppOptions } from './renderInTestApp'; diff --git a/packages/frontend-test-utils/src/app/renderInTestApp.test.tsx b/packages/frontend-test-utils/src/app/renderInTestApp.test.tsx index 8e1b1e1ea0..c9d90715f6 100644 --- a/packages/frontend-test-utils/src/app/renderInTestApp.test.tsx +++ b/packages/frontend-test-utils/src/app/renderInTestApp.test.tsx @@ -16,11 +16,8 @@ import { useCallback } from 'react'; import { screen, fireEvent } from '@testing-library/react'; -import { - MockAnalyticsApi, - TestApiProvider, -} from '@backstage/frontend-test-utils'; -import { analyticsApiRef, useAnalytics } from '@backstage/frontend-plugin-api'; +import { mockApis, TestApiProvider } from '@backstage/frontend-test-utils'; +import { useAnalytics } from '@backstage/frontend-plugin-api'; import { Routes, Route } from 'react-router-dom'; import { renderInTestApp } from './renderInTestApp'; @@ -47,10 +44,10 @@ describe('renderInTestApp', () => { ); }; - const analyticsApiMock = new MockAnalyticsApi(); + const analyticsApiMock = mockApis.analytics(); renderInTestApp( - + , ); @@ -80,4 +77,35 @@ describe('renderInTestApp', () => { expect(screen.getByText('Second Page')).toBeInTheDocument(); }); + + it('should support API overrides via options', async () => { + const IndexPage = () => { + const analyticsApi = useAnalytics(); + const handleClick = useCallback(() => { + analyticsApi.captureEvent('click', 'Test action'); + }, [analyticsApi]); + return ( +
    + +
    + ); + }; + + const analyticsApiMock = mockApis.analytics(); + + renderInTestApp(, { + apis: [analyticsApiMock], + }); + + fireEvent.click(screen.getByRole('button', { name: 'Click me' })); + + expect(analyticsApiMock.getEvents()).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + action: 'click', + subject: 'Test action', + }), + ]), + ); + }); }); diff --git a/packages/frontend-test-utils/src/app/renderInTestApp.tsx b/packages/frontend-test-utils/src/app/renderInTestApp.tsx index 747229e8d6..10b36b68b4 100644 --- a/packages/frontend-test-utils/src/app/renderInTestApp.tsx +++ b/packages/frontend-test-utils/src/app/renderInTestApp.tsx @@ -27,12 +27,19 @@ import { RouteRef, useRouteRef, IconComponent, - RouterBlueprint, NavItemBlueprint, createFrontendPlugin, FrontendFeature, + createFrontendModule, + createApiFactory, + type ApiRef, } from '@backstage/frontend-plugin-api'; +import { RouterBlueprint } from '@backstage/plugin-app-react'; import appPlugin from '@backstage/plugin-app'; +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'; const DEFAULT_MOCK_CONFIG = { app: { baseUrl: 'http://localhost:3000' }, @@ -43,7 +50,7 @@ const DEFAULT_MOCK_CONFIG = { * Options to customize the behavior of the test app. * @public */ -export type TestAppOptions = { +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 @@ -76,6 +83,21 @@ export type TestAppOptions = { * Initial route entries to use for the router. */ initialRouteEntries?: string[]; + + /** + * API overrides to provide to the test app. Use `mockApis` helpers + * from `@backstage/frontend-test-utils` to create mock implementations. + * + * @example + * ```ts + * import { mockApis } from '@backstage/frontend-test-utils'; + * + * renderInTestApp(, { + * apis: [mockApis.identity({ userEntityRef: 'user:default/guest' })], + * }) + * ``` + */ + apis?: readonly [...TestApiPairs]; }; const NavItem = (props: { @@ -142,9 +164,9 @@ const appPluginOverride = appPlugin.withOverrides({ * @public * Renders the given element in a test app, for use in unit tests. */ -export function renderInTestApp( +export function renderInTestApp( element: JSX.Element, - options?: TestAppOptions, + options?: TestAppOptions, ): RenderResult { const extensions: Array = [ createExtension({ @@ -154,15 +176,6 @@ export function renderInTestApp( return [coreExtensionData.reactElement(element)]; }, }), - RouterBlueprint.make({ - params: { - component: ({ children }) => ( - - {children} - - ), - }, - }), ]; if (options?.mountedRoutes) { @@ -189,6 +202,26 @@ export function renderInTestApp( } const features: FrontendFeature[] = [ + createFrontendModule({ + pluginId: 'app', + extensions: [ + RouterBlueprint.make({ + params: { + component: ({ children }) => ( + + {children} + + ), + }, + }), + ], + }), createFrontendPlugin({ pluginId: 'test', extensions, @@ -208,7 +241,17 @@ export function renderInTestApp( data: options?.config ?? DEFAULT_MOCK_CONFIG, }, ]), - }); + __internal: options?.apis && { + apiFactoryOverrides: options.apis.map(entry => { + const mockFactory = getMockApiFactory(entry); + if (mockFactory) { + return mockFactory; + } + const [apiRef, implementation] = entry as readonly [ApiRef, any]; + return createApiFactory(apiRef, implementation); + }), + }, + } as CreateSpecializedAppInternalOptions); return render( app.tree.root.instance!.getData(coreExtensionData.reactElement), diff --git a/packages/frontend-test-utils/src/app/renderTestApp.tsx b/packages/frontend-test-utils/src/app/renderTestApp.tsx index e8d90cadd6..858ad462f4 100644 --- a/packages/frontend-test-utils/src/app/renderTestApp.tsx +++ b/packages/frontend-test-utils/src/app/renderTestApp.tsx @@ -14,19 +14,29 @@ * limitations under the License. */ +import { Fragment } from 'react'; import { createSpecializedApp } from '@backstage/frontend-app-api'; import { coreExtensionData, + createApiFactory, + createExtension, + createFrontendModule, createFrontendPlugin, ExtensionDefinition, FrontendFeature, - RouterBlueprint, + RouteRef, + type ApiRef, } from '@backstage/frontend-plugin-api'; -import { render } from '@testing-library/react'; +import { render, type RenderResult } from '@testing-library/react'; import appPlugin from '@backstage/plugin-app'; import { JsonObject } from '@backstage/types'; import { ConfigReader } from '@backstage/config'; import { MemoryRouter } from 'react-router-dom'; +import { RouterBlueprint } from '@backstage/plugin-app-react'; +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'; const DEFAULT_MOCK_CONFIG = { app: { baseUrl: 'http://localhost:3000' }, @@ -38,7 +48,7 @@ const DEFAULT_MOCK_CONFIG = { * * @public */ -export type RenderTestAppOptions = { +export type RenderTestAppOptions = { /** * Additional configuration passed to the app when rendering elements inside it. */ @@ -57,6 +67,39 @@ export type RenderTestAppOptions = { * Initial route entries to use for the router. */ initialRouteEntries?: string[]; + + /** + * 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 route refs to be used by `useRouteRef` in the rendered elements. + * + * @example + * ```ts + * renderTestApp({ + * mountedRoutes: { + * '/my-path': myRouteRef, + * }, + * extensions: [...], + * }) + * ``` + */ + mountedRoutes?: { [path: string]: RouteRef }; + + /** + * API overrides to provide to the test app. Use `mockApis` helpers + * from `@backstage/frontend-test-utils` to create mock implementations. + * + * @example + * ```ts + * import { mockApis } from '@backstage/frontend-test-utils'; + * + * renderTestApp({ + * apis: [mockApis.identity({ userEntityRef: 'user:default/guest' })], + * extensions: [...], + * }) + * ``` + */ + apis?: readonly [...TestApiPairs]; }; const appPluginOverride = appPlugin.withOverrides({ @@ -73,21 +116,54 @@ const appPluginOverride = appPlugin.withOverrides({ * * @public */ -export function renderTestApp(options: RenderTestAppOptions) { - const extensions = [ - RouterBlueprint.make({ - params: { - component: ({ children }) => ( - - {children} - - ), - }, - }), - ...(options.extensions ?? []), - ]; +export function renderTestApp( + options?: RenderTestAppOptions, +): RenderResult { + const extensions = [...(options?.extensions ?? [])]; + + if (options?.mountedRoutes) { + for (const [path, routeRef] of Object.entries(options.mountedRoutes)) { + extensions.push( + createExtension({ + kind: 'test-route', + name: path, + attachTo: { id: 'app/routes', input: 'routes' }, + output: [ + coreExtensionData.reactElement, + coreExtensionData.routePath, + coreExtensionData.routeRef, + ], + factory: () => [ + coreExtensionData.reactElement(), + coreExtensionData.routePath(path), + coreExtensionData.routeRef(routeRef), + ], + }), + ); + } + } const features: FrontendFeature[] = [ + createFrontendModule({ + pluginId: 'app', + extensions: [ + RouterBlueprint.make({ + params: { + component: ({ children }) => ( + + {children} + + ), + }, + }), + ], + }), createFrontendPlugin({ pluginId: 'test', extensions, @@ -95,7 +171,7 @@ export function renderTestApp(options: RenderTestAppOptions) { appPluginOverride, ]; - if (options.features) { + if (options?.features) { features.push(...options.features); } @@ -107,7 +183,17 @@ export function renderTestApp(options: RenderTestAppOptions) { data: options?.config ?? DEFAULT_MOCK_CONFIG, }, ]), - }); + __internal: options?.apis && { + apiFactoryOverrides: options.apis.map(entry => { + const mockFactory = getMockApiFactory(entry); + if (mockFactory) { + return mockFactory; + } + const [apiRef, implementation] = entry as readonly [ApiRef, any]; + return createApiFactory(apiRef, implementation); + }), + }, + } as CreateSpecializedAppInternalOptions); return render( app.tree.root.instance!.getData(coreExtensionData.reactElement), diff --git a/packages/frontend-test-utils/src/index.ts b/packages/frontend-test-utils/src/index.ts index cab66895e0..b4e7a4e007 100644 --- a/packages/frontend-test-utils/src/index.ts +++ b/packages/frontend-test-utils/src/index.ts @@ -23,9 +23,6 @@ export * from './apis'; export * from './app'; -export { TestApiProvider, TestApiRegistry } from '@backstage/test-utils'; -export type { TestApiProviderProps } from '@backstage/test-utils'; - export { withLogCollector } from '@backstage/test-utils'; export { registerMswTestHooks } from '@backstage/test-utils'; diff --git a/packages/integration-aws-node/CHANGELOG.md b/packages/integration-aws-node/CHANGELOG.md index 60d231e612..0b8e6effe1 100644 --- a/packages/integration-aws-node/CHANGELOG.md +++ b/packages/integration-aws-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/integration-aws-node +## 0.1.20-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + ## 0.1.19 ### Patch Changes diff --git a/packages/integration-aws-node/package.json b/packages/integration-aws-node/package.json index 0484a54e0a..0bbfe9f96f 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.19", + "version": "0.1.20-next.0", "description": "Helpers for fetching AWS account credentials", "backstage": { "role": "node-library" diff --git a/packages/integration-aws-node/src/DefaultAwsCredentialsManager.test.ts b/packages/integration-aws-node/src/DefaultAwsCredentialsManager.test.ts index 582b003724..c21ea13e4c 100644 --- a/packages/integration-aws-node/src/DefaultAwsCredentialsManager.test.ts +++ b/packages/integration-aws-node/src/DefaultAwsCredentialsManager.test.ts @@ -23,7 +23,7 @@ import { AssumeRoleCommand, } from '@aws-sdk/client-sts'; import { Config, ConfigReader } from '@backstage/config'; -import { promises } from 'fs'; +import { promises } from 'node:fs'; import { fromNodeProviderChain } from '@aws-sdk/credential-providers'; const env = process.env; diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md index e7becc9337..61dd6e737b 100644 --- a/packages/integration-react/CHANGELOG.md +++ b/packages/integration-react/CHANGELOG.md @@ -1,5 +1,44 @@ # @backstage/integration-react +## 1.2.15-next.2 + +### 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/integration@1.20.0-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + +## 1.2.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.20.0-next.1 + +## 1.2.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.3-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/config@1.3.6 + +## 1.2.14 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2 + +## 1.2.14-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/integration@1.19.2-next.0 + ## 1.2.13 ### Patch Changes diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json index 9879042ef1..507fc4cdb5 100644 --- a/packages/integration-react/package.json +++ b/packages/integration-react/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration-react", - "version": "1.2.13", + "version": "1.2.15-next.2", "description": "Frontend package for managing integrations towards external systems", "backstage": { "role": "web-library" @@ -50,13 +50,13 @@ "msw": "^1.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/integration-react/src/api/ScmIntegrationsApi.test.ts b/packages/integration-react/src/api/ScmIntegrationsApi.test.ts index 0a1f1b1b8f..55acd29eec 100644 --- a/packages/integration-react/src/api/ScmIntegrationsApi.test.ts +++ b/packages/integration-react/src/api/ScmIntegrationsApi.test.ts @@ -26,6 +26,6 @@ describe('scmIntegrationsApiRef', () => { it('should be instantiated', () => { const i = ScmIntegrationsApi.fromConfig(new ConfigReader({})); - expect(i.list().length).toBe(7); // The default ones + expect(i.list().length).toBe(8); // The default ones }); }); diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md index b732447310..9d4576b3c9 100644 --- a/packages/integration/CHANGELOG.md +++ b/packages/integration/CHANGELOG.md @@ -1,5 +1,40 @@ # @backstage/integration +## 1.20.0-next.2 + +### Patch Changes + +- cc6206e: Added support for `{org}.visualstudio.com` domains used by Azure DevOps + +## 1.20.0-next.1 + +### Minor Changes + +- 6999f6d: The AzureUrl class in the @backstage/integration package is now able to process BOTH git branches and git tags. Initially this class only processed git branches and threw an error when non-branch Azure URLs were passed in. + +## 1.19.3-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + +## 1.19.2 + +### Patch Changes + +- 3afeab4: Implementing `ScmIntegration` for `GoogleGcs` +- 9083273: Rollback the lowercase replacing in GitHub integration config + +## 1.19.2-next.0 + +### Patch Changes + +- 3afeab4: Implementing `ScmIntegration` for `GoogleGcs` +- 9083273: Rollback the lowercase replacing in GitHub integration config + ## 1.19.0 ### Minor Changes diff --git a/packages/integration/package.json b/packages/integration/package.json index a7f65efc9f..24eb80018f 100644 --- a/packages/integration/package.json +++ b/packages/integration/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/integration", - "version": "1.19.0", + "version": "1.20.0-next.2", "description": "Helpers for managing integrations towards external systems", "backstage": { "role": "common-library" diff --git a/packages/integration/report.api.md b/packages/integration/report.api.md index 561dea979d..abcdb8898b 100644 --- a/packages/integration/report.api.md +++ b/packages/integration/report.api.md @@ -781,8 +781,30 @@ export type GitLabIntegrationConfig = { commitSigningKey?: string; }; +// @public +export class GoogleGcsIntegration implements ScmIntegration { + constructor(integrationConfig: GoogleGcsIntegrationConfig); + // (undocumented) + get config(): GoogleGcsIntegrationConfig; + // (undocumented) + static factory: ScmIntegrationsFactory; + // (undocumented) + resolveEditUrl(url: string): string; + // (undocumented) + resolveUrl(options: { + url: string; + base: string; + lineNumber?: number | undefined; + }): string; + // (undocumented) + get title(): string; + // (undocumented) + get type(): string; +} + // @public export type GoogleGcsIntegrationConfig = { + host: string; clientEmail?: string; privateKey?: string; }; @@ -840,6 +862,8 @@ export interface IntegrationsByType { // (undocumented) gitlab: ScmIntegrationsGroup; // (undocumented) + googleGcs: ScmIntegrationsGroup; + // (undocumented) harness: ScmIntegrationsGroup; } @@ -1110,6 +1134,8 @@ export class ScmIntegrations implements ScmIntegrationRegistry { // (undocumented) get gitlab(): ScmIntegrationsGroup; // (undocumented) + get googleGcs(): ScmIntegrationsGroup; + // (undocumented) get harness(): ScmIntegrationsGroup; // (undocumented) list(): ScmIntegration[]; diff --git a/packages/integration/src/ScmIntegrations.test.ts b/packages/integration/src/ScmIntegrations.test.ts index 0e0c181861..7f75ab44fc 100644 --- a/packages/integration/src/ScmIntegrations.test.ts +++ b/packages/integration/src/ScmIntegrations.test.ts @@ -43,6 +43,7 @@ import { AzureBlobStorageIntegrationConfig, AzureBlobStorageIntergation, } from './azureBlobStorage'; +import { GoogleGcsIntegration, GoogleGcsIntegrationConfig } from './googleGcs'; describe('ScmIntegrations', () => { const awsS3 = new AwsS3Integration({ @@ -93,6 +94,10 @@ describe('ScmIntegrations', () => { host: 'harness.local', } as HarnessIntegrationConfig); + const googleGcs = new GoogleGcsIntegration({ + host: 'storage.cloud.google.com', + } as GoogleGcsIntegrationConfig); + const i = new ScmIntegrations({ awsS3: basicIntegrations([awsS3], item => item.config.host), awsCodeCommit: basicIntegrations([awsCodeCommit], item => item.config.host), @@ -108,6 +113,7 @@ describe('ScmIntegrations', () => { github: basicIntegrations([github], item => item.config.host), gitlab: basicIntegrations([gitlab], item => item.config.host), gitea: basicIntegrations([gitea], item => item.config.host), + googleGcs: basicIntegrations([googleGcs], item => item.config.host), harness: basicIntegrations([harness], item => item.config.host), }); diff --git a/packages/integration/src/ScmIntegrations.ts b/packages/integration/src/ScmIntegrations.ts index f11cb3c17e..573975da0e 100644 --- a/packages/integration/src/ScmIntegrations.ts +++ b/packages/integration/src/ScmIntegrations.ts @@ -30,6 +30,7 @@ import { ScmIntegrationRegistry } from './registry'; import { GiteaIntegration } from './gitea'; import { HarnessIntegration } from './harness/HarnessIntegration'; import { AzureBlobStorageIntergation } from './azureBlobStorage'; +import { GoogleGcsIntegration } from './googleGcs/GoogleGcsIntegration'; /** * The set of supported integrations. @@ -51,6 +52,7 @@ export interface IntegrationsByType { github: ScmIntegrationsGroup; gitlab: ScmIntegrationsGroup; gitea: ScmIntegrationsGroup; + googleGcs: ScmIntegrationsGroup; harness: ScmIntegrationsGroup; } @@ -75,6 +77,7 @@ export class ScmIntegrations implements ScmIntegrationRegistry { github: GithubIntegration.factory({ config }), gitlab: GitLabIntegration.factory({ config }), gitea: GiteaIntegration.factory({ config }), + googleGcs: GoogleGcsIntegration.factory({ config }), harness: HarnessIntegration.factory({ config }), }); } @@ -130,6 +133,10 @@ export class ScmIntegrations implements ScmIntegrationRegistry { return this.byType.gitea; } + get googleGcs(): ScmIntegrationsGroup { + return this.byType.googleGcs; + } + get harness(): ScmIntegrationsGroup { return this.byType.harness; } diff --git a/packages/integration/src/azure/AzureUrl.test.ts b/packages/integration/src/azure/AzureUrl.test.ts index a56f800133..e1285fc38e 100644 --- a/packages/integration/src/azure/AzureUrl.test.ts +++ b/packages/integration/src/azure/AzureUrl.test.ts @@ -27,6 +27,7 @@ describe('AzureUrl', () => { expect(url.getRepo()).toBe('my-project'); expect(url.getRef()).toBeUndefined(); expect(url.getPath()).toBeUndefined(); + expect(url.getPrefix()).toBeUndefined(); expect(url.toRepoUrl()).toBe( 'https://dev.azure.com/my-org/_git/my-project', @@ -52,6 +53,7 @@ describe('AzureUrl', () => { expect(url.getRepo()).toBe('my-project'); expect(url.getRef()).toBeUndefined(); expect(url.getPath()).toBe('/test.yaml'); + expect(url.getPrefix()).toBeUndefined(); expect(url.toRepoUrl()).toBe( 'https://dev.azure.com/my-org/_git/my-project?path=%2Ftest.yaml', @@ -67,7 +69,7 @@ describe('AzureUrl', () => { ); }); - it('should work with the short URL form with a path and ref', () => { + it('should work with the short URL form with a path and branch ref', () => { const url = AzureUrl.fromRepoUrl( 'https://dev.azure.com/my-org/_git/my-project?path=%2Ftest.yaml&version=GBtest-branch', ); @@ -77,6 +79,7 @@ describe('AzureUrl', () => { expect(url.getRepo()).toBe('my-project'); expect(url.getRef()).toBe('test-branch'); expect(url.getPath()).toBe('/test.yaml'); + expect(url.getPrefix()).toBe('GB'); expect(url.toRepoUrl()).toBe( 'https://dev.azure.com/my-org/_git/my-project?path=%2Ftest.yaml&version=GBtest-branch', @@ -92,6 +95,32 @@ describe('AzureUrl', () => { ); }); + it('should work with the short URL form with a path and tag ref', () => { + const url = AzureUrl.fromRepoUrl( + 'https://dev.azure.com/my-org/_git/my-project?path=%2Ftest.yaml&version=GTtest-tag', + ); + + expect(url.getOwner()).toBe('my-org'); + expect(url.getProject()).toBe('my-project'); + expect(url.getRepo()).toBe('my-project'); + expect(url.getRef()).toBe('test-tag'); + expect(url.getPath()).toBe('/test.yaml'); + expect(url.getPrefix()).toBe('GT'); + + expect(url.toRepoUrl()).toBe( + 'https://dev.azure.com/my-org/_git/my-project?path=%2Ftest.yaml&version=GTtest-tag', + ); + expect(url.toFileUrl()).toBe( + 'https://dev.azure.com/my-org/my-project/_apis/git/repositories/my-project/items?api-version=6.0&path=%2Ftest.yaml&version=test-tag', + ); + expect(url.toArchiveUrl()).toBe( + 'https://dev.azure.com/my-org/my-project/_apis/git/repositories/my-project/items?recursionLevel=full&download=true&api-version=6.0&scopePath=%2Ftest.yaml&version=test-tag', + ); + expect(url.toCommitsUrl()).toBe( + 'https://dev.azure.com/my-org/my-project/_apis/git/repositories/my-project/commits?api-version=6.0&searchCriteria.itemVersion.version=test-tag', + ); + }); + it('should work with the long URL', () => { const url = AzureUrl.fromRepoUrl( 'http://my-host/my-org/my-project/_git/my-repo', @@ -102,6 +131,7 @@ describe('AzureUrl', () => { expect(url.getRepo()).toBe('my-repo'); expect(url.getRef()).toBeUndefined(); expect(url.getPath()).toBeUndefined(); + expect(url.getPrefix()).toBeUndefined(); expect(url.toRepoUrl()).toBe( 'http://my-host/my-org/my-project/_git/my-repo', @@ -117,7 +147,7 @@ describe('AzureUrl', () => { ); }); - it('should work with the long URL form with a path and ref', () => { + it('should work with the long URL form with a path and branch ref', () => { const url = AzureUrl.fromRepoUrl( 'http://my-host/my-org/my-project/_git/my-repo?path=%2Ffolder&version=GBtest-branch', ); @@ -127,6 +157,7 @@ describe('AzureUrl', () => { expect(url.getRepo()).toBe('my-repo'); expect(url.getRef()).toBe('test-branch'); expect(url.getPath()).toBe('/folder'); + expect(url.getPrefix()).toBe('GB'); expect(url.toRepoUrl()).toBe( 'http://my-host/my-org/my-project/_git/my-repo?path=%2Ffolder&version=GBtest-branch', @@ -142,6 +173,32 @@ describe('AzureUrl', () => { ); }); + it('should work with the long URL form with a path and tag ref', () => { + const url = AzureUrl.fromRepoUrl( + 'http://my-host/my-org/my-project/_git/my-repo?path=%2Ffolder&version=GTtest-tag', + ); + + expect(url.getOwner()).toBe('my-org'); + expect(url.getProject()).toBe('my-project'); + expect(url.getRepo()).toBe('my-repo'); + expect(url.getRef()).toBe('test-tag'); + expect(url.getPath()).toBe('/folder'); + expect(url.getPrefix()).toBe('GT'); + + expect(url.toRepoUrl()).toBe( + 'http://my-host/my-org/my-project/_git/my-repo?path=%2Ffolder&version=GTtest-tag', + ); + expect(url.toFileUrl()).toBe( + 'http://my-host/my-org/my-project/_apis/git/repositories/my-repo/items?api-version=6.0&path=%2Ffolder&version=test-tag', + ); + expect(url.toArchiveUrl()).toBe( + 'http://my-host/my-org/my-project/_apis/git/repositories/my-repo/items?recursionLevel=full&download=true&api-version=6.0&scopePath=%2Ffolder&version=test-tag', + ); + expect(url.toCommitsUrl()).toBe( + 'http://my-host/my-org/my-project/_apis/git/repositories/my-repo/commits?api-version=6.0&searchCriteria.itemVersion.version=test-tag', + ); + }); + it('should work with the old tfs long URL', () => { const url = AzureUrl.fromRepoUrl( 'http://my-host/tfs/projects/my-project/_git/my-repo', @@ -152,9 +209,10 @@ describe('AzureUrl', () => { expect(url.getRepo()).toBe('my-repo'); expect(url.getRef()).toBeUndefined(); expect(url.getPath()).toBeUndefined(); + expect(url.getPrefix()).toBeUndefined(); }); - it('should work with the old tfs long URL form with a path and ref', () => { + it('should work with the old tfs long URL form with a path and branch ref', () => { const url = AzureUrl.fromRepoUrl( 'http://my-host/tfs/projects/my-project/_git/my-repo?path=%2Ffolder&version=GBtest-branch', ); @@ -164,14 +222,28 @@ describe('AzureUrl', () => { expect(url.getRepo()).toBe('my-repo'); expect(url.getRef()).toBe('test-branch'); expect(url.getPath()).toBe('/folder'); + expect(url.getPrefix()).toBe('GB'); }); - it('should reject non-branch refs', () => { + it('should work with the old tfs long URL form with a path and tag ref', () => { + const url = AzureUrl.fromRepoUrl( + 'http://my-host/tfs/projects/my-project/_git/my-repo?path=%2Ffolder&version=GTtest-tag', + ); + + expect(url.getOwner()).toBe('tfs/projects'); + expect(url.getProject()).toBe('my-project'); + expect(url.getRepo()).toBe('my-repo'); + expect(url.getRef()).toBe('test-tag'); + expect(url.getPath()).toBe('/folder'); + expect(url.getPrefix()).toBe('GT'); + }); + + it('should reject non-branch and non-tag refs', () => { expect(() => AzureUrl.fromRepoUrl( 'https://dev.azure.com/my-org/_git/my-project?version=GC6eead79870d998a3befd4bc7c72cc89e446f2970', ), - ).toThrow('Azure URL version must point to a git branch'); + ).toThrow('Azure URL version must point to a git branch or git tag'); }); it('should reject non-repo URLs', () => { @@ -198,4 +270,53 @@ describe('AzureUrl', () => { ), ).toThrow('Azure URL must point to a git repository'); }); + + it('should work with the old visualstudio long URL', () => { + const url = AzureUrl.fromRepoUrl( + 'https://my-org.visualstudio.com/my-project/_git/my-repo', + ); + + expect(url.getOwner()).toBe('my-org'); + expect(url.getProject()).toBe('my-project'); + expect(url.getRepo()).toBe('my-repo'); + expect(url.getRef()).toBeUndefined(); + expect(url.getPath()).toBeUndefined(); + }); + + it('should work with the old visualstudio long URL form with a path', () => { + const url = AzureUrl.fromRepoUrl( + 'https://my-org.visualstudio.com/my-project/_git/my-repo?path=%2Ftest.yaml', + ); + + expect(url.getOwner()).toBe('my-org'); + expect(url.getProject()).toBe('my-project'); + expect(url.getRepo()).toBe('my-repo'); + expect(url.getRef()).toBeUndefined(); + expect(url.getPath()).toBe('/test.yaml'); + + expect(url.toRepoUrl()).toBe( + 'https://my-org.visualstudio.com/my-project/_git/my-repo?path=%2Ftest.yaml', + ); + expect(url.toFileUrl()).toBe( + 'https://my-org.visualstudio.com/my-project/_apis/git/repositories/my-repo/items?api-version=6.0&path=%2Ftest.yaml', + ); + expect(url.toArchiveUrl()).toBe( + 'https://my-org.visualstudio.com/my-project/_apis/git/repositories/my-repo/items?recursionLevel=full&download=true&api-version=6.0&scopePath=%2Ftest.yaml', + ); + expect(url.toCommitsUrl()).toBe( + 'https://my-org.visualstudio.com/my-project/_apis/git/repositories/my-repo/commits?api-version=6.0', + ); + }); + + it('should work with the old visualstudio long URL form with a path and ref', () => { + const url = AzureUrl.fromRepoUrl( + 'https://my-org.visualstudio.com/my-project/_git/my-repo?path=%2Ffolder&version=GBtest-branch', + ); + + expect(url.getOwner()).toBe('my-org'); + expect(url.getProject()).toBe('my-project'); + expect(url.getRepo()).toBe('my-repo'); + expect(url.getRef()).toBe('test-branch'); + expect(url.getPath()).toBe('/folder'); + }); }); diff --git a/packages/integration/src/azure/AzureUrl.ts b/packages/integration/src/azure/AzureUrl.ts index 1161ab7a1b..58ccff24a4 100644 --- a/packages/integration/src/azure/AzureUrl.ts +++ b/packages/integration/src/azure/AzureUrl.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -const VERSION_PREFIX_GIT_BRANCH = 'GB'; +import { isVisualStudioDomain } from './core'; export class AzureUrl { /** @@ -30,7 +30,12 @@ export class AzureUrl { let repo; const parts = url.pathname.split('/').map(part => decodeURIComponent(part)); - if (parts[2] === '_git') { + + if (isVisualStudioDomain(url.origin) && parts[2] === '_git') { + owner = url.host.split('.')[0]; + project = parts[1]; + repo = parts[3]; + } else if (parts[2] === '_git') { owner = parts[1]; project = repo = parts[3]; } else if (parts[3] === '_git') { @@ -50,16 +55,19 @@ export class AzureUrl { const path = url.searchParams.get('path') ?? undefined; let ref; + let prefix; const version = url.searchParams.get('version'); if (version) { - const prefix = version.slice(0, 2); - if (prefix !== 'GB') { - throw new Error('Azure URL version must point to a git branch'); + prefix = version.slice(0, 2); + if (prefix !== 'GB' && prefix !== 'GT') { + throw new Error( + 'Azure URL version must point to a git branch or git tag', + ); } ref = version.slice(2); } - return new AzureUrl(url.origin, owner, project, repo, path, ref); + return new AzureUrl(url.origin, owner, project, repo, path, ref, prefix); } #origin: string; @@ -68,6 +76,7 @@ export class AzureUrl { #repo: string; #path?: string; #ref?: string; + #prefix?: string; private constructor( origin: string, @@ -76,6 +85,7 @@ export class AzureUrl { repo: string, path?: string, ref?: string, + prefix?: string, ) { this.#origin = origin; this.#owner = owner; @@ -83,6 +93,7 @@ export class AzureUrl { this.#repo = repo; this.#path = path; this.#ref = ref; + this.#prefix = prefix; } #baseUrl = (...parts: string[]): URL => { @@ -98,7 +109,9 @@ export class AzureUrl { */ toRepoUrl(): string { let url; - if (this.#project === this.#repo) { + if (isVisualStudioDomain(this.#origin)) { + url = this.#baseUrl(this.#project, '_git', this.#repo); + } else if (this.#project === this.#repo) { url = this.#baseUrl(this.#owner, '_git', this.#repo); } else { url = this.#baseUrl(this.#owner, this.#project, '_git', this.#repo); @@ -108,7 +121,7 @@ export class AzureUrl { url.searchParams.set('path', this.#path); } if (this.#ref) { - url.searchParams.set('version', VERSION_PREFIX_GIT_BRANCH + this.#ref); + url.searchParams.set('version', this.#prefix + this.#ref); } return url.toString(); @@ -126,15 +139,28 @@ export class AzureUrl { ); } - const url = this.#baseUrl( - this.#owner, - this.#project, - '_apis', - 'git', - 'repositories', - this.#repo, - 'items', - ); + let url; + if (isVisualStudioDomain(this.#origin)) { + url = this.#baseUrl( + this.#project, + '_apis', + 'git', + 'repositories', + this.#repo, + 'items', + ); + } else { + url = this.#baseUrl( + this.#owner, + this.#project, + '_apis', + 'git', + 'repositories', + this.#repo, + 'items', + ); + } + url.searchParams.set('api-version', '6.0'); url.searchParams.set('path', this.#path); @@ -151,15 +177,28 @@ export class AzureUrl { * Throws an error if the URL does not point to a repo. */ toArchiveUrl(): string { - const url = this.#baseUrl( - this.#owner, - this.#project, - '_apis', - 'git', - 'repositories', - this.#repo, - 'items', - ); + let url; + if (isVisualStudioDomain(this.#origin)) { + url = this.#baseUrl( + this.#project, + '_apis', + 'git', + 'repositories', + this.#repo, + 'items', + ); + } else { + url = this.#baseUrl( + this.#owner, + this.#project, + '_apis', + 'git', + 'repositories', + this.#repo, + 'items', + ); + } + url.searchParams.set('recursionLevel', 'full'); url.searchParams.set('download', 'true'); url.searchParams.set('api-version', '6.0'); @@ -180,15 +219,28 @@ export class AzureUrl { * Throws an error if the URL does not point to a commit. */ toCommitsUrl(): string { - const url = this.#baseUrl( - this.#owner, - this.#project, - '_apis', - 'git', - 'repositories', - this.#repo, - 'commits', - ); + let url; + if (isVisualStudioDomain(this.#origin)) { + url = this.#baseUrl( + this.#project, + '_apis', + 'git', + 'repositories', + this.#repo, + 'commits', + ); + } else { + url = this.#baseUrl( + this.#owner, + this.#project, + '_apis', + 'git', + 'repositories', + this.#repo, + 'commits', + ); + } + url.searchParams.set('api-version', '6.0'); if (this.#ref) { @@ -232,4 +284,11 @@ export class AzureUrl { getRef(): string | undefined { return this.#ref; } + + /** + * Returns the git prefix in the repo if the URL contains one. + */ + getPrefix(): string | undefined { + return this.#prefix; + } } diff --git a/packages/integration/src/azure/DefaultAzureDevOpsCredentialsProvider.test.ts b/packages/integration/src/azure/DefaultAzureDevOpsCredentialsProvider.test.ts index 6e171eff77..4b86e9869e 100644 --- a/packages/integration/src/azure/DefaultAzureDevOpsCredentialsProvider.test.ts +++ b/packages/integration/src/azure/DefaultAzureDevOpsCredentialsProvider.test.ts @@ -445,5 +445,25 @@ describe('DefaultAzureDevOpsCredentialProvider', () => { }); }); }); + describe('Azure DevOps (visualstudio.com)', () => { + it('Should return a token when a credential with the same organization is specified', async () => { + const provider = buildProvider([ + { + host: 'org1.visualstudio.com', + credentials: [ + { + personalAccessToken: 'pat', + }, + ], + }, + ]); + + const credentials = provider.getCredentials({ + url: 'https://org1.visualstudio.com/project1', + }); + + expect(credentials).toBeDefined(); + }); + }); }); }); diff --git a/packages/integration/src/azure/DefaultAzureDevOpsCredentialsProvider.ts b/packages/integration/src/azure/DefaultAzureDevOpsCredentialsProvider.ts index 1ff35b0612..29abddb0e9 100644 --- a/packages/integration/src/azure/DefaultAzureDevOpsCredentialsProvider.ts +++ b/packages/integration/src/azure/DefaultAzureDevOpsCredentialsProvider.ts @@ -20,6 +20,7 @@ import { import { CachedAzureDevOpsCredentialsProvider } from './CachedAzureDevOpsCredentialsProvider'; import { ScmIntegrationRegistry } from '../registry'; import { DefaultAzureCredential } from '@azure/identity'; +import { isVisualStudioDomain } from './core'; /** * Default implementation of AzureDevOpsCredentialsProvider. @@ -110,6 +111,17 @@ export class DefaultAzureDevOpsCredentialsProvider return undefined; } + private forVisualStudioOrganization( + url: URL, + ): AzureDevOpsCredentialsProvider | undefined { + const parts = url.host.split('.'); + if (isVisualStudioDomain(url.origin) && parts.length > 0) { + return this.providers.get(url.host); + } + + return undefined; + } + private forHost(url: URL): AzureDevOpsCredentialsProvider | undefined { return this.providers.get(url.host); } @@ -121,6 +133,7 @@ export class DefaultAzureDevOpsCredentialsProvider const provider = this.forAzureDevOpsOrganization(url) ?? this.forAzureDevOpsServerOrganization(url) ?? + this.forVisualStudioOrganization(url) ?? this.forHost(url); if (provider === undefined) { diff --git a/packages/integration/src/azure/core.ts b/packages/integration/src/azure/core.ts index 1c25373962..a004400ba4 100644 --- a/packages/integration/src/azure/core.ts +++ b/packages/integration/src/azure/core.ts @@ -53,3 +53,14 @@ export function getAzureDownloadUrl(url: string): string { export function getAzureCommitsUrl(url: string): string { return AzureUrl.fromRepoUrl(url).toCommitsUrl(); } + +/** + * Given a URL, return true if it contains `.visualstudio.com` and false if it does not + * URLs can be in these two formats: `dev.azure.com/{org}` or the legacy `{org}.visualstudio.com` + * + * @param origin - A URL origin string pointing to an Azure DevOps instance + * @public + */ +export function isVisualStudioDomain(origin: string): boolean { + return origin.endsWith('.visualstudio.com'); +} diff --git a/packages/integration/src/github/GithubIntegration.test.ts b/packages/integration/src/github/GithubIntegration.test.ts index c54d4db2ef..70f1c4a16c 100644 --- a/packages/integration/src/github/GithubIntegration.test.ts +++ b/packages/integration/src/github/GithubIntegration.test.ts @@ -134,24 +134,4 @@ describe('replaceGithubUrlType', () => { ), ).toBe('https://github.com/backstage/backstage/blob/tree/README.md'); }); - it('should replace with lowercase', () => { - expect( - replaceGithubUrlType( - 'https://githuB.com/backstage/backstage/blob/master/README.md', - 'edit', - ), - ).toBe('https://github.com/backstage/backstage/edit/master/README.md'); - expect( - replaceGithubUrlType( - 'https://github.com/Backstage/backstage/blob/master/README.md', - 'edit', - ), - ).toBe('https://github.com/backstage/backstage/edit/master/README.md'); - expect( - replaceGithubUrlType( - 'https://github.com/backstage/Backstage/blob/master/README.md', - 'edit', - ), - ).toBe('https://github.com/backstage/backstage/edit/master/README.md'); - }); }); diff --git a/packages/integration/src/github/GithubIntegration.ts b/packages/integration/src/github/GithubIntegration.ts index 79d5e7f421..880a2bed21 100644 --- a/packages/integration/src/github/GithubIntegration.ts +++ b/packages/integration/src/github/GithubIntegration.ts @@ -95,9 +95,7 @@ export function replaceGithubUrlType( return url.replace( /\/\/([^/]+)\/([^/]+)\/([^/]+)\/(blob|tree|edit)\//, (_, host, owner, repo) => { - return `//${host.toLocaleLowerCase('en-US')}/${owner.toLocaleLowerCase( - 'en-US', - )}/${repo.toLocaleLowerCase('en-US')}/${type}/`; + return `//${host}/${owner}/${repo}/${type}/`; }, ); } diff --git a/packages/integration/src/googleGcs/GoogleGcsIntegration.test.ts b/packages/integration/src/googleGcs/GoogleGcsIntegration.test.ts new file mode 100644 index 0000000000..5666a0aa5e --- /dev/null +++ b/packages/integration/src/googleGcs/GoogleGcsIntegration.test.ts @@ -0,0 +1,80 @@ +/* + * Copyright 2020 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 { ConfigReader } from '@backstage/config'; +import { GoogleGcsIntegration } from './GoogleGcsIntegration'; + +describe('GoogleGcsIntegration', () => { + it('has a working factory', () => { + const integrations = GoogleGcsIntegration.factory({ + config: new ConfigReader({ + integrations: { + googleGcs: { + clientEmail: 'someone@example.com', + privateKey: 'fake-key', + }, + }, + }), + }); + expect(integrations.list().length).toBe(1); + expect(integrations.list()[0].config.host).toBe('storage.cloud.google.com'); + }); + + it('returns default integration when no config', () => { + const integrations = GoogleGcsIntegration.factory({ + config: new ConfigReader({ + integrations: {}, + }), + }); + expect(integrations.list().length).toBe(1); + expect(integrations.list()[0].config.host).toBe('storage.cloud.google.com'); + }); + + it('returns the basics', () => { + const integration = new GoogleGcsIntegration({ + host: 'storage.cloud.google.com', + }); + expect(integration.type).toBe('googleGcs'); + expect(integration.title).toBe('storage.cloud.google.com'); + }); + + describe('resolveUrl', () => { + it('works for valid urls', () => { + const integration = new GoogleGcsIntegration({ + host: 'storage.cloud.google.com', + }); + + expect( + integration.resolveUrl({ + url: 'https://storage.cloud.google.com/bucket/catalog-info.yaml', + base: 'https://storage.cloud.google.com/bucket/catalog-info.yaml', + }), + ).toBe('https://storage.cloud.google.com/bucket/catalog-info.yaml'); + }); + }); + + it('resolve edit URL', () => { + const integration = new GoogleGcsIntegration({ + host: 'storage.cloud.google.com', + }); + + expect( + integration.resolveEditUrl( + 'https://storage.cloud.google.com/bucket/catalog-info.yaml', + ), + ).toBe('https://storage.cloud.google.com/bucket/catalog-info.yaml'); + }); +}); diff --git a/packages/integration/src/googleGcs/GoogleGcsIntegration.ts b/packages/integration/src/googleGcs/GoogleGcsIntegration.ts new file mode 100644 index 0000000000..11642a231c --- /dev/null +++ b/packages/integration/src/googleGcs/GoogleGcsIntegration.ts @@ -0,0 +1,71 @@ +/* + * Copyright 2020 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 { basicIntegrations, defaultScmResolveUrl } from '../helpers'; +import { ScmIntegration, ScmIntegrationsFactory } from '../types'; +import { + GoogleGcsIntegrationConfig, + readGoogleGcsIntegrationConfig, + GOOGLE_GCS_HOST, +} from './config'; + +/** + * A Google Cloud Storage based integration. + * + * @public + */ +export class GoogleGcsIntegration implements ScmIntegration { + static factory: ScmIntegrationsFactory = ({ + config, + }) => { + const gcsConfig = config.has('integrations.googleGcs') + ? readGoogleGcsIntegrationConfig( + config.getConfig('integrations.googleGcs'), + ) + : { host: GOOGLE_GCS_HOST }; + + return basicIntegrations( + [new GoogleGcsIntegration(gcsConfig)], + i => i.config.host, + ); + }; + + get type(): string { + return 'googleGcs'; + } + + get title(): string { + return this.integrationConfig.host; + } + + get config(): GoogleGcsIntegrationConfig { + return this.integrationConfig; + } + + constructor(private readonly integrationConfig: GoogleGcsIntegrationConfig) {} + + resolveUrl(options: { + url: string; + base: string; + lineNumber?: number | undefined; + }): string { + return defaultScmResolveUrl(options); + } + + resolveEditUrl(url: string): string { + return url; + } +} diff --git a/packages/integration/src/googleGcs/config.test.ts b/packages/integration/src/googleGcs/config.test.ts index 892440c64a..d074cb7129 100644 --- a/packages/integration/src/googleGcs/config.test.ts +++ b/packages/integration/src/googleGcs/config.test.ts @@ -33,13 +33,16 @@ describe('readGoogleGcsIntegrationConfig', () => { }), ); expect(output).toEqual({ + host: 'storage.cloud.google.com', privateKey: 'fake-key', clientEmail: 'someone@example.com', }); }); - it('does not fail when config is not set', () => { + it('returns default config when config is not set', () => { const output = readGoogleGcsIntegrationConfig(buildConfig({})); - expect(output).toEqual({}); + expect(output).toEqual({ + host: 'storage.cloud.google.com', + }); }); }); diff --git a/packages/integration/src/googleGcs/config.ts b/packages/integration/src/googleGcs/config.ts index 3c03204e4c..9421b9dfba 100644 --- a/packages/integration/src/googleGcs/config.ts +++ b/packages/integration/src/googleGcs/config.ts @@ -16,12 +16,22 @@ import { Config } from '@backstage/config'; +/** + * The default Google Cloud Storage host. + * + */ +export const GOOGLE_GCS_HOST = 'storage.cloud.google.com'; + /** * The configuration parameters for a single Google Cloud Storage provider. * * @public */ export type GoogleGcsIntegrationConfig = { + /** + * The host of the target that this matches on. + */ + host: string; /** * Service account email used to authenticate requests. */ @@ -42,15 +52,19 @@ export function readGoogleGcsIntegrationConfig( config: Config, ): GoogleGcsIntegrationConfig { if (!config) { - return {}; + return { host: GOOGLE_GCS_HOST }; } if (!config.has('clientEmail') && !config.has('privateKey')) { - return {}; + return { host: GOOGLE_GCS_HOST }; } const privateKey = config.getString('privateKey').split('\\n').join('\n'); - const clientEmail = config.getString('clientEmail'); - return { clientEmail: clientEmail, privateKey: privateKey }; + + return { + host: GOOGLE_GCS_HOST, + clientEmail, + privateKey, + }; } diff --git a/packages/integration/src/googleGcs/index.ts b/packages/integration/src/googleGcs/index.ts index 3d7beae59d..c30138fc3e 100644 --- a/packages/integration/src/googleGcs/index.ts +++ b/packages/integration/src/googleGcs/index.ts @@ -16,3 +16,4 @@ export { readGoogleGcsIntegrationConfig } from './config'; export type { GoogleGcsIntegrationConfig } from './config'; +export { GoogleGcsIntegration } from './GoogleGcsIntegration'; diff --git a/packages/integration/src/setupTests.ts b/packages/integration/src/setupTests.ts index d3232290a7..56d793eb48 100644 --- a/packages/integration/src/setupTests.ts +++ b/packages/integration/src/setupTests.ts @@ -14,4 +14,5 @@ * limitations under the License. */ -export {}; +global.setImmediate = require('node:timers').setImmediate; +global.clearImmediate = require('node:timers').clearImmediate; diff --git a/packages/module-federation-common/.eslintrc.js b/packages/module-federation-common/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/packages/module-federation-common/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/packages/module-federation-common/README.md b/packages/module-federation-common/README.md new file mode 100644 index 0000000000..fcf1f5726c --- /dev/null +++ b/packages/module-federation-common/README.md @@ -0,0 +1,11 @@ +# @backstage/module-federation-common + +This package provides a helper library for module federation, enabling a consistent management of shared dependencies +in both the module federation host (frontend application) at runtime, and remote modules at build-time through the CLI. + +It provides: + +- TypeScript types for both host and remote shared dependency definitions, +- a default list of shared dependencies (React, React Router, Material-UI, etc.) for both the host and remote modules, +- utilities used by the CLI to resolve versions of the shared dependencies for the host at build-time, +- utilities available for the frontend application to provide the list of resolved shared dependencies at runtime. diff --git a/packages/module-federation-common/catalog-info.yaml b/packages/module-federation-common/catalog-info.yaml new file mode 100644 index 0000000000..a5843ad116 --- /dev/null +++ b/packages/module-federation-common/catalog-info.yaml @@ -0,0 +1,10 @@ +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + name: backstage-module-federation-common + title: '@backstage/module-federation-common' + description: Helper library for module federation +spec: + lifecycle: experimental + type: backstage-common-library + owner: framework-maintainers diff --git a/packages/module-federation-common/package.json b/packages/module-federation-common/package.json new file mode 100644 index 0000000000..dfed332525 --- /dev/null +++ b/packages/module-federation-common/package.json @@ -0,0 +1,68 @@ +{ + "name": "@backstage/module-federation-common", + "version": "0.0.0", + "description": "Helper library for module federation", + "backstage": { + "role": "common-library" + }, + "publishConfig": { + "access": "public", + "main": "dist/index.cjs.js", + "module": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "keywords": [ + "backstage" + ], + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "packages/module-federation-common" + }, + "license": "Apache-2.0", + "sideEffects": false, + "main": "src/index.ts", + "types": "src/index.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "backstage-cli package build", + "clean": "backstage-cli package clean", + "lint": "backstage-cli package lint", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack", + "test": "backstage-cli package test" + }, + "dependencies": { + "@backstage/config": "workspace:^", + "@backstage/errors": "workspace:^", + "@backstage/types": "workspace:^", + "@module-federation/runtime": "^0.21.6" + }, + "devDependencies": { + "@backstage/cli": "workspace:^", + "@backstage/test-utils": "workspace:^", + "@types/react": "^18.0.0", + "react": "^18.0.2", + "react-dom": "^18.0.2", + "react-router-dom": "^6.30.2" + }, + "peerDependencies": { + "@emotion/react": "^11.10.5", + "@material-ui/core": "^4.12.2", + "@material-ui/styles": "^4.10.0", + "@mui/material": "^5.12.2", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0", + "react-router": "^6.30.2", + "react-router-dom": "^6.30.2" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } +} diff --git a/packages/module-federation-common/report.api.md b/packages/module-federation-common/report.api.md new file mode 100644 index 0000000000..08c28366df --- /dev/null +++ b/packages/module-federation-common/report.api.md @@ -0,0 +1,62 @@ +## API Report File for "@backstage/module-federation-common" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +// @public +export const BACKSTAGE_RUNTIME_SHARED_DEPENDENCIES_GLOBAL = + '__@backstage/module_federation_shared_dependencies__'; + +// @public +export function defaultHostSharedDependencies(): HostSharedDependencies; + +// @public +export function defaultRemoteSharedDependencies(): RemoteSharedDependencies; + +// @public +export type HostSharedDependencies = { + [name: string]: { + singleton: boolean; + eager: boolean; + requiredVersion: string; + version?: string; + }; +}; + +// @public +export type LoadedRuntimeSharedDependency = { + version: string; + lib: () => unknown; + shareConfig: HostSharedDependencies[string]; +}; + +// @public +export function loadModuleFederationHostShared(options?: { + onError?: (error: Error) => void; +}): Promise>; + +// @public +export type RemoteSharedDependencies = { + [name: string]: { + singleton: boolean; + eager: boolean; + import?: false | string; + requiredVersion: string; + }; +}; + +// @public +export type RuntimeSharedDependenciesGlobal = { + items: Array<{ + name: string; + version: string; + lib: () => Promise; + shareConfig: { + singleton: boolean; + requiredVersion: string; + eager: boolean; + }; + }>; + version: 'v1'; +}; +``` diff --git a/packages/module-federation-common/src/defaults.test.ts b/packages/module-federation-common/src/defaults.test.ts new file mode 100644 index 0000000000..f38379e1c9 --- /dev/null +++ b/packages/module-federation-common/src/defaults.test.ts @@ -0,0 +1,45 @@ +/* + * 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 { + defaultHostSharedDependencies, + defaultRemoteSharedDependencies, +} from './defaults'; + +describe('defaultHostSharedDependencies', () => { + it('should return shared dependencies with the host-only eager property', () => { + const result = defaultHostSharedDependencies(); + + expect(result.react).toEqual({ + requiredVersion: '*', + singleton: true, + eager: true, + }); + }); +}); + +describe('defaultRemoteSharedDependencies', () => { + it('should return shared dependencies with the remote-only import property', () => { + const result = defaultRemoteSharedDependencies(); + + expect(result.react).toEqual({ + requiredVersion: '*', + singleton: true, + eager: false, + import: false, + }); + }); +}); diff --git a/packages/module-federation-common/src/defaults.ts b/packages/module-federation-common/src/defaults.ts new file mode 100644 index 0000000000..27e0e292cf --- /dev/null +++ b/packages/module-federation-common/src/defaults.ts @@ -0,0 +1,104 @@ +/* + * 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 { RemoteSharedDependencies, HostSharedDependencies } from './types'; + +/** + * The list of default shared dependencies, expected to be the same + * for both the module federation host and remotes. + * + * @internal + */ +const defaultSharedDependencies = { + // React + react: { + host: {}, + remote: { import: false }, + }, + 'react-dom': { + host: {}, + remote: { import: false }, + }, + // React Router + 'react-router': { + host: {}, + remote: { import: false }, + }, + 'react-router-dom': { + host: {}, + remote: { import: false }, + }, + // MUI v4 + // not setting import: false for MUI packages as this + // will break once Backstage moves to BUI + '@material-ui/core/styles': { + host: {}, + remote: {}, + }, + '@material-ui/styles': { + host: {}, + remote: {}, + }, + // MUI v5 + // not setting import: false for MUI packages as this + // will break once Backstage moves to BUI + '@mui/material/styles/': { + host: {}, + remote: {}, + }, + '@emotion/react': { + host: {}, + remote: {}, + }, +} as const; + +/** + * Returns the list of default shared dependencies for the host, with host-only properties. + * + * @public + */ +export function defaultHostSharedDependencies(): HostSharedDependencies { + return Object.fromEntries( + Object.entries(defaultSharedDependencies).map(([name, p]) => [ + name, + { + eager: true, + singleton: true, + requiredVersion: '*', + ...p.host, + }, + ]), + ); +} + +/** + * Returns the list of default shared dependencies for the remote, with remote-only properties. + * + * @public + */ +export function defaultRemoteSharedDependencies(): RemoteSharedDependencies { + return Object.fromEntries( + Object.entries(defaultSharedDependencies).map(([name, p]) => [ + name, + { + eager: false, + singleton: true, + requiredVersion: '*', + ...p.remote, + }, + ]), + ); +} diff --git a/packages/module-federation-common/src/index.ts b/packages/module-federation-common/src/index.ts new file mode 100644 index 0000000000..290373ada3 --- /dev/null +++ b/packages/module-federation-common/src/index.ts @@ -0,0 +1,36 @@ +/* + * 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. + */ + +/** + * Helper library for module federation, enabling a consistent management of shared dependencies + * in both the module federation host (frontend application) at runtime, + * and remote modules at build time through the CLI. + * + * @packageDocumentation + */ + +export { loadModuleFederationHostShared } from './loadModuleFederationHostShared'; +export { + defaultHostSharedDependencies, + defaultRemoteSharedDependencies, +} from './defaults'; +export { + BACKSTAGE_RUNTIME_SHARED_DEPENDENCIES_GLOBAL, + type HostSharedDependencies, + type RemoteSharedDependencies, + type LoadedRuntimeSharedDependency, + type RuntimeSharedDependenciesGlobal, +} from './types'; diff --git a/packages/module-federation-common/src/loadModuleFederationHostShared.test.ts b/packages/module-federation-common/src/loadModuleFederationHostShared.test.ts new file mode 100644 index 0000000000..c62a8b6112 --- /dev/null +++ b/packages/module-federation-common/src/loadModuleFederationHostShared.test.ts @@ -0,0 +1,315 @@ +/* + * 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 { loadModuleFederationHostShared } from './loadModuleFederationHostShared'; +import { + BACKSTAGE_RUNTIME_SHARED_DEPENDENCIES_GLOBAL, + RuntimeSharedDependenciesGlobal, +} from './types'; +import { ForwardedError } from '@backstage/errors'; + +const globalSpy = jest.fn(); +Object.defineProperty(global, BACKSTAGE_RUNTIME_SHARED_DEPENDENCIES_GLOBAL, { + get: globalSpy, +}); + +function mockGlobal(items: RuntimeSharedDependenciesGlobal['items']) { + globalSpy.mockReturnValue({ items, version: 'v1' }); +} + +describe('loadModuleFederationHostShared', () => { + afterEach(jest.resetAllMocks); + + it('should preload and return shared dependencies keyed by name', async () => { + const reactMock = { default: { React: 'react' } }; + const reactDomMock = { default: { ReactDom: 'react-dom' } }; + + mockGlobal([ + { + name: 'react', + version: '18.2.0', + lib: async () => reactMock, + shareConfig: { + singleton: true, + requiredVersion: '*', + eager: false, + }, + }, + { + name: 'react-dom', + version: '18.2.0', + lib: async () => reactDomMock, + shareConfig: { + singleton: true, + requiredVersion: '*', + eager: false, + }, + }, + ]); + const shared = await loadModuleFederationHostShared(); + + expect(shared).toEqual({ + react: { + version: '18.2.0', + lib: expect.any(Function), + shareConfig: { + singleton: true, + requiredVersion: '*', + eager: false, + }, + }, + 'react-dom': { + version: '18.2.0', + lib: expect.any(Function), + shareConfig: { + singleton: true, + requiredVersion: '*', + eager: false, + }, + }, + }); + + expect(shared?.react?.lib()).toBe(reactMock); + expect(shared?.['react-dom']?.lib()).toBe(reactDomMock); + }); + + it('should preserve shareConfig properties from each remote', async () => { + mockGlobal([ + { + name: 'react', + version: '18.2.0', + lib: async () => ({ default: {} }), + shareConfig: { + singleton: true, + requiredVersion: '^18.0.0', + eager: true, + }, + }, + { + name: 'lodash', + version: '4.17.21', + lib: async () => ({ default: {} }), + shareConfig: { + singleton: false, + requiredVersion: '^4.17.0', + eager: false, + }, + }, + ]); + const shared = await loadModuleFederationHostShared(); + + expect(shared).toEqual({ + react: { + version: '18.2.0', + lib: expect.any(Function), + shareConfig: { + singleton: true, + requiredVersion: '^18.0.0', + eager: true, + }, + }, + lodash: { + version: '4.17.21', + lib: expect.any(Function), + shareConfig: { + singleton: false, + requiredVersion: '^4.17.0', + eager: false, + }, + }, + }); + }); + + it('should handle empty items', async () => { + mockGlobal([]); + expect(await loadModuleFederationHostShared()).toEqual({}); + }); + + it('should throw on unsupported or missing version', async () => { + globalSpy.mockReturnValue({ items: [], version: 'v2' }); + await expect(loadModuleFederationHostShared()).rejects.toThrow( + 'Unsupported version of the runtime shared dependencies: v2', + ); + + globalSpy.mockReturnValue({ items: [] }); + await expect(loadModuleFederationHostShared()).rejects.toThrow( + 'Unsupported version of the runtime shared dependencies: undefined', + ); + + globalSpy.mockReturnValue(undefined); + await expect(loadModuleFederationHostShared()).rejects.toThrow( + 'Unsupported version of the runtime shared dependencies: undefined', + ); + }); + + it('should report errors via onError and still return successful modules', async () => { + const mockError = new Error('Module import failed'); + const reactMock = { default: { React: 'react' } }; + const lodashMock = { default: { _: 'lodash' } }; + + mockGlobal([ + { + name: 'react', + version: '18.2.0', + lib: async () => reactMock, + shareConfig: { + singleton: true, + requiredVersion: '^18.0.0', + eager: false, + }, + }, + { + name: 'failing-module', + version: '0.0.0', + lib: async () => { + throw mockError; + }, + shareConfig: { + singleton: true, + requiredVersion: '*', + eager: false, + }, + }, + { + name: 'lodash', + version: '4.17.21', + lib: async () => lodashMock, + shareConfig: { + singleton: true, + requiredVersion: '^4.17.0', + eager: false, + }, + }, + ]); + + const errors: Error[] = []; + const shared = await loadModuleFederationHostShared({ + onError: err => errors.push(err), + }); + + expect(errors).toHaveLength(1); + expect(errors[0]).toBeInstanceOf(ForwardedError); + expect(errors[0].message).toContain( + 'Failed to preload module federation shared dependency', + ); + expect(errors[0]).toHaveProperty('cause', mockError); + + expect(shared).toEqual({ + react: { + version: '18.2.0', + lib: expect.any(Function), + shareConfig: { + singleton: true, + requiredVersion: '^18.0.0', + eager: false, + }, + }, + lodash: { + version: '4.17.21', + lib: expect.any(Function), + shareConfig: { + singleton: true, + requiredVersion: '^4.17.0', + eager: false, + }, + }, + }); + + expect(shared?.react?.lib()).toBe(reactMock); + expect(shared?.lodash?.lib()).toBe(lodashMock); + }); + + it('should throw on failure when no onError is provided', async () => { + const mockError = new Error('Module import failed'); + + mockGlobal([ + { + name: 'react', + version: '18.2.0', + lib: async () => ({ default: {} }), + shareConfig: { + singleton: true, + requiredVersion: '*', + eager: false, + }, + }, + { + name: 'failing-module', + version: '0.0.0', + lib: async () => { + throw mockError; + }, + shareConfig: { + singleton: true, + requiredVersion: '*', + eager: false, + }, + }, + ]); + + await expect(loadModuleFederationHostShared()).rejects.toMatchObject({ + message: expect.stringContaining( + 'Failed to preload module federation shared dependency', + ), + cause: mockError, + }); + }); + + it('should report multiple errors via onError', async () => { + const mockError1 = new Error('First module failed'); + const mockError2 = new Error('Second module failed'); + + mockGlobal([ + { + name: 'failing-module-1', + version: '0.0.0', + lib: async () => { + throw mockError1; + }, + shareConfig: { + singleton: true, + requiredVersion: '*', + eager: false, + }, + }, + { + name: 'failing-module-2', + version: '0.0.0', + lib: async () => { + throw mockError2; + }, + shareConfig: { + singleton: true, + requiredVersion: '*', + eager: false, + }, + }, + ]); + + const errors: Error[] = []; + const shared = await loadModuleFederationHostShared({ + onError: err => errors.push(err), + }); + + expect(errors).toHaveLength(2); + expect(errors[0]).toBeInstanceOf(ForwardedError); + expect(errors[0]).toHaveProperty('cause', mockError1); + expect(errors[1]).toBeInstanceOf(ForwardedError); + expect(errors[1]).toHaveProperty('cause', mockError2); + + expect(shared).toEqual({}); + }); +}); diff --git a/packages/module-federation-common/src/loadModuleFederationHostShared.ts b/packages/module-federation-common/src/loadModuleFederationHostShared.ts new file mode 100644 index 0000000000..dd350e583a --- /dev/null +++ b/packages/module-federation-common/src/loadModuleFederationHostShared.ts @@ -0,0 +1,71 @@ +/* + * 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 { + BACKSTAGE_RUNTIME_SHARED_DEPENDENCIES_GLOBAL, + LoadedRuntimeSharedDependency, + RuntimeSharedDependenciesGlobal, +} from './types'; +import { ForwardedError } from '@backstage/errors'; + +/** + * Preloads and builds the list of shared dependencies provided to the module federation runtime. + * + * @public + */ +export async function loadModuleFederationHostShared(options?: { + onError?: (error: Error) => void; +}): Promise> { + const { items = [], version } = + ( + window as { + [BACKSTAGE_RUNTIME_SHARED_DEPENDENCIES_GLOBAL]?: RuntimeSharedDependenciesGlobal; + } + )[BACKSTAGE_RUNTIME_SHARED_DEPENDENCIES_GLOBAL] ?? {}; + if (version !== 'v1') { + throw new Error( + `Unsupported version of the runtime shared dependencies: ${version}`, + ); + } + + const results = await Promise.allSettled(items.map(item => item.lib())); + + const shared: Record = {}; + for (let i = 0; i < results.length; i++) { + const result = results[i]; + if (result.status === 'fulfilled') { + const mod = result.value; + const item = items[i]; + shared[item.name] = { + version: item.version, + lib: () => mod, + shareConfig: item.shareConfig, + }; + } else { + const error = new ForwardedError( + 'Failed to preload module federation shared dependency', + result.reason, + ); + if (options?.onError) { + options.onError(error); + } else { + throw error; + } + } + } + + return shared; +} diff --git a/packages/module-federation-common/src/types.ts b/packages/module-federation-common/src/types.ts new file mode 100644 index 0000000000..ff528d0844 --- /dev/null +++ b/packages/module-federation-common/src/types.ts @@ -0,0 +1,93 @@ +/* + * 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. + */ + +/** + * The name of the global object used to pass shared dependencies from the CLI to the module federation runtime. + * + * @public + */ +export const BACKSTAGE_RUNTIME_SHARED_DEPENDENCIES_GLOBAL = + '__@backstage/module_federation_shared_dependencies__'; + +/** + * Shared dependencies configuration in module federation remote modules. + * + * @public + */ +export type RemoteSharedDependencies = { + [name: string]: { + /** Whether to share this dependency as a singleton */ + singleton: boolean; + /** Whether to load this dependency eagerly */ + eager: boolean; + /** Provided module for fallback. Set to false to not provide a fallback, or a custom import path. */ + import?: false | string; + /** Required version range. */ + requiredVersion: string; + }; +}; + +/** + * Shared dependencies configuration in module federation host modules. + * + * @public + */ +export type HostSharedDependencies = { + [name: string]: { + /** Whether to share this dependency as a singleton */ + singleton: boolean; + /** Whether to load this dependency eagerly */ + eager: boolean; + /** Required version range. */ + requiredVersion: string; + /** Version of the shared dependency. Will be resolved at build time by default but can be overridden, but not completely removed. */ + version?: string; + }; +}; + +/** + * A single shared runtime dependency from the CLI that has been loaded and ready to be used in the module federation runtime. + * + * @public + */ +export type LoadedRuntimeSharedDependency = { + version: string; + lib: () => unknown; + shareConfig: HostSharedDependencies[string]; +}; + +/** + * The global object used to pass shared dependencies from the CLI to the module federation runtime. + * + * @remarks + * + * Stored in {@link BACKSTAGE_RUNTIME_SHARED_DEPENDENCIES_GLOBAL}. + * + * @public + */ +export type RuntimeSharedDependenciesGlobal = { + items: Array<{ + name: string; + version: string; + lib: () => Promise; + shareConfig: { + singleton: boolean; + requiredVersion: string; + eager: boolean; + }; + }>; + version: 'v1'; +}; diff --git a/packages/repo-tools/CHANGELOG.md b/packages/repo-tools/CHANGELOG.md index 80904e4d06..9ef7b91685 100644 --- a/packages/repo-tools/CHANGELOG.md +++ b/packages/repo-tools/CHANGELOG.md @@ -1,5 +1,51 @@ # @backstage/repo-tools +## 0.16.4-next.2 + +### Patch Changes + +- be7ebad: Updated package-docs exclude list to reflect renamed example app packages. +- df59ee6: The `type-deps` command now follows relative imports and re-exports into declaration chunk files, and detects ambient global types such as the `jest` namespace. +- 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/backend-plugin-api@1.7.0-next.1 + - @backstage/cli-node@0.2.18-next.1 + - @backstage/config-loader@1.10.8-next.0 + +## 0.16.4-next.1 + +### Patch Changes + +- 6523040: Support Prettier v3 for api-reports +- Updated dependencies + - @backstage/cli-node@0.2.18-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## 0.16.3-next.0 + +### Patch Changes + +- cd75ed0: Add newline to OpenAPI license template files. +- 7455dae: Use node prefix on native imports +- 4fc7bf0: Bump to tar v7 +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/config-loader@1.10.8-next.0 + - @backstage/cli-common@0.1.18-next.0 + - @backstage/cli-node@0.2.17-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/errors@1.2.7 + +## 0.16.2 + +### Patch Changes + +- 498f9dd: Fixed help text for `backstage-repo-tools package schema openapi generate` command. +- Updated dependencies + - @backstage/backend-plugin-api@1.6.1 + - @backstage/cli-common@0.1.17 + ## 0.16.1 ### Patch Changes diff --git a/packages/repo-tools/bin/backstage-repo-tools b/packages/repo-tools/bin/backstage-repo-tools index b723d215fd..03efd3c13d 100755 --- a/packages/repo-tools/bin/backstage-repo-tools +++ b/packages/repo-tools/bin/backstage-repo-tools @@ -15,11 +15,13 @@ * limitations under the License. */ -const path = require('path'); +const path = require('node:path'); // Figure out whether we're running inside the backstage repo or as an installed dependency /* eslint-disable-next-line no-restricted-syntax */ -const isLocal = require('fs').existsSync(path.resolve(__dirname, '../src')); +const isLocal = require('node:fs').existsSync( + path.resolve(__dirname, '../src'), +); if (!isLocal || process.env.BACKSTAGE_E2E_CLI_TEST) { require('..'); diff --git a/packages/repo-tools/cli-report.md b/packages/repo-tools/cli-report.md index acde92d742..6b6f2ae710 100644 --- a/packages/repo-tools/cli-report.md +++ b/packages/repo-tools/cli-report.md @@ -160,7 +160,11 @@ Options: Usage: backstage-repo-tools package schema openapi generate [options] Options: + --client-additional-properties [properties] --client-package [package] + --server + --server-additional-properties [properties] + --watch -h, --help ``` diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 8cf1b48d06..3180dae9a6 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/repo-tools", - "version": "0.16.1", + "version": "0.16.4-next.2", "description": "CLI for Backstage repo tooling ", "backstage": { "role": "cli" @@ -54,6 +54,7 @@ "@microsoft/api-documenter": "^7.28.1", "@microsoft/api-extractor": "^7.55.1", "@openapitools/openapi-generator-cli": "^2.7.0", + "@prettier/sync": "^0.6.1", "@stoplight/spectral-core": "^1.18.0", "@stoplight/spectral-formatters": "^1.1.0", "@stoplight/spectral-functions": "^1.7.2", @@ -80,10 +81,10 @@ "minimatch": "^9.0.0", "p-limit": "^3.0.2", "portfinder": "^1.0.32", - "tar": "^6.1.12", + "tar": "^7.5.6", "ts-morph": "^24.0.0", "yaml-diff-patch": "^2.0.0", - "zod": "^3.22.4" + "zod": "^3.25.76" }, "devDependencies": { "@backstage/backend-test-utils": "workspace:^", @@ -99,7 +100,7 @@ "@microsoft/tsdoc": "*", "@microsoft/tsdoc-config": "*", "@useoptic/optic": "^1.0.0", - "prettier": "^2.8.1", + "prettier": "^2.8.1 || ^3.8.1", "typedoc": "^0.28.0", "typescript": "> 3.0.0" }, diff --git a/packages/repo-tools/src/commands/api-reports/api-reports/buildDocs.ts b/packages/repo-tools/src/commands/api-reports/api-reports/buildDocs.ts index 42b585818d..797d5375b0 100644 --- a/packages/repo-tools/src/commands/api-reports/api-reports/buildDocs.ts +++ b/packages/repo-tools/src/commands/api-reports/api-reports/buildDocs.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { resolve as resolvePath } from 'path'; +import { resolve as resolvePath } from 'node:path'; import fs from 'fs-extra'; import { DocBlockTag, diff --git a/packages/repo-tools/src/commands/api-reports/api-reports/createTemporaryTsConfig.ts b/packages/repo-tools/src/commands/api-reports/api-reports/createTemporaryTsConfig.ts index 538fdd4ceb..028466dbab 100644 --- a/packages/repo-tools/src/commands/api-reports/api-reports/createTemporaryTsConfig.ts +++ b/packages/repo-tools/src/commands/api-reports/api-reports/createTemporaryTsConfig.ts @@ -15,7 +15,7 @@ */ import fs from 'fs-extra'; -import { join } from 'path'; +import { join } from 'node:path'; import { paths as cliPaths } from '../../../lib/paths'; export async function createTemporaryTsConfig(includedPackageDirs: string[]) { diff --git a/packages/repo-tools/src/commands/api-reports/api-reports/patchApiReportGeneration.ts b/packages/repo-tools/src/commands/api-reports/api-reports/patchApiReportGeneration.ts index 982707e815..40778594ec 100644 --- a/packages/repo-tools/src/commands/api-reports/api-reports/patchApiReportGeneration.ts +++ b/packages/repo-tools/src/commands/api-reports/api-reports/patchApiReportGeneration.ts @@ -18,6 +18,7 @@ import { ExtractorMessage } from '@microsoft/api-extractor'; import { AstDeclaration } from '@microsoft/api-extractor/lib/analyzer/AstDeclaration'; import { Program } from 'typescript'; import { tryRunPrettier } from '../common'; +import { paths as cliPaths } from '../../../lib/paths'; let applied = false; @@ -157,7 +158,11 @@ export function patchApiReportGeneration() { collector, ...moreArgs, ); - - return tryRunPrettier(content); + return tryRunPrettier(content, { + parser: 'markdown', + // We need a real-looking filepath for proper config resolution, not just a directory + // Ideally, the real filepath would be better, but it would require too much patching, for very little gain. + filepath: `${cliPaths.targetRoot}/report.api.md`, + }); }; } diff --git a/packages/repo-tools/src/commands/api-reports/api-reports/runApiExtraction.ts b/packages/repo-tools/src/commands/api-reports/api-reports/runApiExtraction.ts index 1ba8852ed4..da8278f9ad 100644 --- a/packages/repo-tools/src/commands/api-reports/api-reports/runApiExtraction.ts +++ b/packages/repo-tools/src/commands/api-reports/api-reports/runApiExtraction.ts @@ -25,7 +25,11 @@ import { TSDocConfigFile } from '@microsoft/tsdoc-config'; import fs from 'fs-extra'; import { groupBy } from 'lodash'; import { minimatch } from 'minimatch'; -import { join, relative as relativePath, resolve as resolvePath } from 'path'; +import { + join, + relative as relativePath, + resolve as resolvePath, +} from 'node:path'; import { getPackageExportDetails } from '../../../lib/getPackageExportDetails'; import { paths as cliPaths } from '../../../lib/paths'; import { logApiReportInstructions } from '../common'; diff --git a/packages/repo-tools/src/commands/api-reports/buildApiReports.test.ts b/packages/repo-tools/src/commands/api-reports/buildApiReports.test.ts index cbe6fedad6..ab76aec1c1 100644 --- a/packages/repo-tools/src/commands/api-reports/buildApiReports.test.ts +++ b/packages/repo-tools/src/commands/api-reports/buildApiReports.test.ts @@ -15,7 +15,7 @@ */ import { createMockDirectory } from '@backstage/backend-test-utils'; -import { normalize } from 'path'; +import { normalize } from 'node:path'; import * as pathsLib from '../../lib/paths'; import { categorizePackageDirs } from './categorizePackageDirs'; diff --git a/packages/repo-tools/src/commands/api-reports/cli-reports/runCliExtraction.ts b/packages/repo-tools/src/commands/api-reports/cli-reports/runCliExtraction.ts index 6ab72024c8..8aa0eea02c 100644 --- a/packages/repo-tools/src/commands/api-reports/cli-reports/runCliExtraction.ts +++ b/packages/repo-tools/src/commands/api-reports/cli-reports/runCliExtraction.ts @@ -18,7 +18,7 @@ import { basename, resolve as resolvePath, relative as relativePath, -} from 'path'; +} from 'node:path'; import fs from 'fs-extra'; import { createBinRunner } from '../../util'; import { CliHelpPage, CliModel } from './types'; diff --git a/packages/repo-tools/src/commands/api-reports/common/index.ts b/packages/repo-tools/src/commands/api-reports/common/index.ts index 34bd95bfbe..820f18fa54 100644 --- a/packages/repo-tools/src/commands/api-reports/common/index.ts +++ b/packages/repo-tools/src/commands/api-reports/common/index.ts @@ -14,5 +14,5 @@ * limitations under the License. */ -export { tryRunPrettier } from './tryRunPrettier'; +export { tryRunPrettier, tryRunPrettierAsync } from './tryRunPrettier'; export { logApiReportInstructions } from './logApiReportInstructions'; diff --git a/packages/repo-tools/src/commands/api-reports/common/tryRunPrettier.ts b/packages/repo-tools/src/commands/api-reports/common/tryRunPrettier.ts index 020853d726..174b68f499 100644 --- a/packages/repo-tools/src/commands/api-reports/common/tryRunPrettier.ts +++ b/packages/repo-tools/src/commands/api-reports/common/tryRunPrettier.ts @@ -17,19 +17,104 @@ import { paths as cliPaths } from '../../../lib/paths'; import type { Config } from 'prettier'; +/** + * Tries to run prettier asynchronously, with Prettier v2 or v3. + * @param content - The content to format. + * @param extraConfig - Additional prettier config options (defaults to markdown parser). Providing a filepath is recommended for proper config resolution. + * @returns A promise that resolves to the formatted content or the original content if the formatting fails. + * @internal + */ +export async function tryRunPrettierAsync( + content: string, + extraConfig: Config = { parser: 'markdown' }, +): Promise { + try { + const prettier = require('prettier') as typeof import('prettier'); + // Filepath for proper config resolution + const filepath = + extraConfig.filepath ?? + `${cliPaths.targetRoot}/should-not-be-ignored.any`; + const config = + (await prettier.resolveConfig(filepath, { editorconfig: true })) ?? {}; + const formattedContent = prettier.format(content, { + ...config, + ...extraConfig, + }); + // XXX: Remove once only v3 is supported + if (typeof formattedContent === 'string') { + return Promise.resolve(formattedContent); + } + return formattedContent; + } catch (e) { + return Promise.resolve(content); + } +} + +/** + * Creates a synchronous prettier formatter function for v2 or v3 via `@prettier/sync`. + * + * @param prettierSync - The prettier instance, either v2 or v3 via `@prettier/sync`. + * @param extraConfig - Additional prettier config options (defaults to markdown parser) + * @returns A function that formats content using the prettier instance and config + */ +export function createPrettierSyncFormatter( + prettierSync: + | typeof import('prettier') + | typeof import('@prettier/sync').default, + extraConfig: Config = {}, +): (content: string) => string { + return function tryRunPrettierInner(content: string): string { + try { + // We need a filepath for proper config resolution, not just a directory + const filepath = + extraConfig.filepath ?? + `${cliPaths.targetRoot}/should-not-be-ignored.any`; + const resolveConfig = + // @ts-expect-error: v2 requires .sync, @prettier/sync v3 does not + prettierSync.resolveConfig?.sync ?? prettierSync.resolveConfig; + const config = + resolveConfig(filepath, { + editorconfig: true, + }) ?? {}; + return prettierSync.format(content, { + ...config, + ...extraConfig, + }); + } catch (e) { + return content; + } + }; +} + +/** + * Loads the prettier instance, either v2 or v3 via @prettier/sync. + * XXX: Remove once only v3 is supported + * @returns The prettier instance, either v2 or v3 via @prettier/sync. + */ +function loadPrettierSync(): + | typeof import('prettier') + | typeof import('@prettier/sync').default { + const prettier = require('prettier') as typeof import('prettier'); + if (prettier.version.startsWith('2')) { + return prettier; + } + return require('@prettier/sync').default; +} + +/** + * Tries to run prettier synchronously, with Prettier v2 or v3. + * @param content - The content to format. + * @param extraConfig - Additional prettier config options (defaults to markdown parser) + * @returns The formatted content. + * @internal + */ export function tryRunPrettier( content: string, extraConfig: Config = { parser: 'markdown' }, ): string { - try { - const prettier = require('prettier') as typeof import('prettier'); - - const config = prettier.resolveConfig.sync(cliPaths.targetRoot) ?? {}; - return prettier.format(content, { - ...config, - ...extraConfig, - }); - } catch (e) { - return content; - } + const formatter = createPrettierSyncFormatter( + loadPrettierSync(), + extraConfig, + ); + return formatter(content); } diff --git a/packages/repo-tools/src/commands/api-reports/sql-reports/runSqlExtraction.ts b/packages/repo-tools/src/commands/api-reports/sql-reports/runSqlExtraction.ts index 9462412436..6268d0d30d 100644 --- a/packages/repo-tools/src/commands/api-reports/sql-reports/runSqlExtraction.ts +++ b/packages/repo-tools/src/commands/api-reports/sql-reports/runSqlExtraction.ts @@ -15,14 +15,14 @@ */ import fs, { readJson } from 'fs-extra'; -import { relative as relativePath } from 'path'; +import { relative as relativePath } from 'node:path'; import { paths as cliPaths } from '../../../lib/paths'; import { diff as justDiff } from 'just-diff'; import { SchemaInfo } from './types'; import { getPgSchemaInfo } from './getPgSchemaInfo'; import { generateSqlReport } from './generateSqlReport'; import type { Knex } from 'knex'; -import { logApiReportInstructions, tryRunPrettier } from '../common'; +import { logApiReportInstructions, tryRunPrettierAsync } from '../common'; interface SqlExtractionOptions { packageDirs: string[]; @@ -152,19 +152,19 @@ async function runSingleSqlExtraction( break; } } - - const report = tryRunPrettier( + const reportPath = cliPaths.resolveTargetRoot( + targetDir, + `report${migrationTarget === '.' ? '' : `-${migrationTarget}`}.sql.md`, + ); + const report = await tryRunPrettierAsync( generateSqlReport({ reportName, failedDownMigration, schemaInfo, }), + { filepath: reportPath }, ); - const reportPath = cliPaths.resolveTargetRoot( - targetDir, - `report${migrationTarget === '.' ? '' : `-${migrationTarget}`}.sql.md`, - ); const existingReport = await fs.readFile(reportPath, 'utf8').catch(error => { if (error.code === 'ENOENT') { return undefined; diff --git a/packages/repo-tools/src/commands/generate-catalog-info/codeowners.ts b/packages/repo-tools/src/commands/generate-catalog-info/codeowners.ts index 25703e4fc2..dae8506e9b 100644 --- a/packages/repo-tools/src/commands/generate-catalog-info/codeowners.ts +++ b/packages/repo-tools/src/commands/generate-catalog-info/codeowners.ts @@ -19,7 +19,7 @@ import { matchFile as matchCodeowner, parse as parseCodeowners, } from 'codeowners-utils'; -import { relative as relativePath, resolve as resolvePath } from 'path'; +import { relative as relativePath, resolve as resolvePath } from 'node:path'; import { readFile } from './utils'; export async function loadCodeowners(): Promise { diff --git a/packages/repo-tools/src/commands/generate-catalog-info/generate-catalog-info.ts b/packages/repo-tools/src/commands/generate-catalog-info/generate-catalog-info.ts index 1893bd25c8..f2db58b790 100644 --- a/packages/repo-tools/src/commands/generate-catalog-info/generate-catalog-info.ts +++ b/packages/repo-tools/src/commands/generate-catalog-info/generate-catalog-info.ts @@ -16,7 +16,7 @@ import YAML from 'js-yaml'; import pLimit from 'p-limit'; -import { relative as relativePath, resolve as resolvePath } from 'path'; +import { relative as relativePath, resolve as resolvePath } from 'node:path'; import { yamlOverwrite } from 'yaml-diff-patch'; import chalk from 'chalk'; import { PackageGraph, PackageRole } from '@backstage/cli-node'; diff --git a/packages/repo-tools/src/commands/generate-catalog-info/utils.ts b/packages/repo-tools/src/commands/generate-catalog-info/utils.ts index 3f23b35112..80449ae656 100644 --- a/packages/repo-tools/src/commands/generate-catalog-info/utils.ts +++ b/packages/repo-tools/src/commands/generate-catalog-info/utils.ts @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import fs from 'fs'; +import fs from 'node:fs'; import { Package } from '@manypkg/get-packages'; import { BackstagePackageJson as BackstagePackageJsonActual, PackageRole, } from '@backstage/cli-node'; -import { promisify } from 'util'; +import { promisify } from 'node:util'; export const readFile = promisify(fs.readFile); export const writeFile = promisify(fs.writeFile); diff --git a/packages/repo-tools/src/commands/generate-patch/generate-patch.ts b/packages/repo-tools/src/commands/generate-patch/generate-patch.ts index 90cbe7f322..a18d623ab4 100644 --- a/packages/repo-tools/src/commands/generate-patch/generate-patch.ts +++ b/packages/repo-tools/src/commands/generate-patch/generate-patch.ts @@ -15,20 +15,20 @@ */ import { getPackages, Package, Packages } from '@manypkg/get-packages'; -import os from 'os'; +import os from 'node:os'; import fs from 'fs-extra'; import { relative as relativePath, join as joinPath, resolve as resolvePath, posix, -} from 'path'; +} from 'node:path'; import { exec } from '../../lib/exec'; import { ForwardedError } from '@backstage/errors'; -import { Readable } from 'stream'; -import { finished } from 'stream/promises'; -import { ReadableStream } from 'stream/web'; -import tar from 'tar'; +import { Readable } from 'node:stream'; +import { finished } from 'node:stream/promises'; +import { ReadableStream } from 'node:stream/web'; +import * as tar from 'tar'; // TODO: add option for this const DEFAULT_REGISTRY_URL = 'https://registry.npmjs.org'; diff --git a/packages/repo-tools/src/commands/index.ts b/packages/repo-tools/src/commands/index.ts index 01288056c7..dab7d6df0d 100644 --- a/packages/repo-tools/src/commands/index.ts +++ b/packages/repo-tools/src/commands/index.ts @@ -44,24 +44,26 @@ function registerPackageCommand(program: Command) { openApiCommand .command('generate') + .description( + 'Command to generate a client and/or a server stub from an OpenAPI spec.', + ) .option( '--client-package [package]', 'Top-level path to where the client should be generated, ie packages/catalog-client.', ) - .option('--server') - .description( - 'Command to generate a client and/or a server stub from an OpenAPI spec.', - ) - .option('--client-additional-properties [properties]') - .description( + .option('--server', 'Generate server stub') + .option( + '--client-additional-properties [properties]', 'Additional properties that can be passed to @openapitools/openapi-generator-cli', ) - .option('--server-additional-properties [properties]') - .description( + .option( + '--server-additional-properties [properties]', 'Additional properties that can be passed to @openapitools/openapi-generator-cli', ) - .option('--watch') - .description('Watch the OpenAPI spec for changes and regenerate on save.') + .option( + '--watch', + 'Watch the OpenAPI spec for changes and regenerate on save.', + ) .action(lazy(() => import('./package/schema/openapi/generate'), 'command')); openApiCommand diff --git a/packages/repo-tools/src/commands/knip-reports/knip-extractor.ts b/packages/repo-tools/src/commands/knip-reports/knip-extractor.ts index af3e32d2f4..ab5af976bf 100644 --- a/packages/repo-tools/src/commands/knip-reports/knip-extractor.ts +++ b/packages/repo-tools/src/commands/knip-reports/knip-extractor.ts @@ -15,8 +15,8 @@ */ import { paths as cliPaths } from '../../lib/paths'; import pLimit from 'p-limit'; -import os from 'os'; -import { relative as relativePath, resolve as resolvePath } from 'path'; +import os from 'node:os'; +import { relative as relativePath, resolve as resolvePath } from 'node:path'; import fs from 'fs-extra'; import type { KnipConfig } from 'knip'; import { createBinRunner } from '../util'; diff --git a/packages/repo-tools/src/commands/lint-legacy-backend-exports/lint-legacy-backend-exports.ts b/packages/repo-tools/src/commands/lint-legacy-backend-exports/lint-legacy-backend-exports.ts index 29fb4e7b20..3f0424c547 100644 --- a/packages/repo-tools/src/commands/lint-legacy-backend-exports/lint-legacy-backend-exports.ts +++ b/packages/repo-tools/src/commands/lint-legacy-backend-exports/lint-legacy-backend-exports.ts @@ -17,7 +17,7 @@ import { Project } from 'ts-morph'; import { BackstagePackageJson, PackageGraph } from '@backstage/cli-node'; import fs from 'fs-extra'; import { paths as cliPaths } from '../../lib/paths'; -import path from 'path'; +import path from 'node:path'; const project = new Project({ tsConfigFilePath: cliPaths.resolveTargetRoot('tsconfig.json'), diff --git a/packages/repo-tools/src/commands/package-docs/Cache.test.ts b/packages/repo-tools/src/commands/package-docs/Cache.test.ts index 3fe52dcabd..d0293c09b0 100644 --- a/packages/repo-tools/src/commands/package-docs/Cache.test.ts +++ b/packages/repo-tools/src/commands/package-docs/Cache.test.ts @@ -20,8 +20,8 @@ import { createMockDirectory, MockDirectory, } from '@backstage/backend-test-utils'; -import { readFile } from 'fs/promises'; -import { join as joinPath } from 'path'; +import { readFile } from 'node:fs/promises'; +import { join as joinPath } from 'node:path'; jest.mock('crypto', () => { const hash = { diff --git a/packages/repo-tools/src/commands/package-docs/Cache.ts b/packages/repo-tools/src/commands/package-docs/Cache.ts index ec0811b77a..be005ac280 100644 --- a/packages/repo-tools/src/commands/package-docs/Cache.ts +++ b/packages/repo-tools/src/commands/package-docs/Cache.ts @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { readFile, writeFile, cp } from 'fs/promises'; +import { readFile, writeFile, cp } from 'node:fs/promises'; import globby from 'globby'; -import { dirname, join as joinPath, relative } from 'path'; -import crypto from 'crypto'; +import { dirname, join as joinPath, relative } from 'node:path'; +import crypto from 'node:crypto'; import { Lockfile } from '@backstage/cli-node'; import { exists, rm, mkdirp } from 'fs-extra'; import { z } from 'zod'; diff --git a/packages/repo-tools/src/commands/package-docs/command.ts b/packages/repo-tools/src/commands/package-docs/command.ts index 28255193f0..39568e1b00 100644 --- a/packages/repo-tools/src/commands/package-docs/command.ts +++ b/packages/repo-tools/src/commands/package-docs/command.ts @@ -13,17 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { exec } from 'child_process'; -import { promisify } from 'util'; +import { exec } from 'node:child_process'; +import { promisify } from 'node:util'; import { paths as cliPaths, resolvePackagePaths } from '../../lib/paths'; import { createTemporaryTsConfig } from './utils'; -import { readFile, rm, writeFile } from 'fs/promises'; +import { readFile, rm, writeFile } from 'node:fs/promises'; import pLimit from 'p-limit'; import { mkdirp } from 'fs-extra'; import { PackageDocsCache } from './Cache'; import { Lockfile } from '@backstage/cli-node'; import { glob } from 'glob'; -import { existsSync } from 'fs'; +import { existsSync } from 'node:fs'; const limit = pLimit(8); @@ -31,8 +31,8 @@ const execAsync = promisify(exec); const EXCLUDE = [ 'packages/app', - 'packages/app-next', - 'packages/app-next-example-plugin', + 'packages/app-legacy', + 'packages/app-example-plugin', 'packages/cli', 'packages/cli-common', 'packages/cli-node', diff --git a/packages/repo-tools/src/commands/package/schema/openapi/diff.ts b/packages/repo-tools/src/commands/package/schema/openapi/diff.ts index 3cb0baf313..2f0af30881 100644 --- a/packages/repo-tools/src/commands/package/schema/openapi/diff.ts +++ b/packages/repo-tools/src/commands/package/schema/openapi/diff.ts @@ -18,9 +18,9 @@ import { exec } from '../../../../lib/exec'; import { getPathToCurrentOpenApiSpec } from '../../../../lib/openapi/helpers'; import { paths as cliPaths } from '../../../../lib/paths'; import { OptionValues } from 'commander'; -import { env } from 'process'; -import { readFile, rm } from 'fs/promises'; -import { resolve } from 'path'; +import { env } from 'node:process'; +import { readFile, rm } from 'node:fs/promises'; +import { resolve } from 'node:path'; const reduceOpticOutput = (output: string) => { return output diff --git a/packages/repo-tools/src/commands/package/schema/openapi/fuzz.ts b/packages/repo-tools/src/commands/package/schema/openapi/fuzz.ts index 7ff0f30fb0..29b038ac5a 100644 --- a/packages/repo-tools/src/commands/package/schema/openapi/fuzz.ts +++ b/packages/repo-tools/src/commands/package/schema/openapi/fuzz.ts @@ -20,7 +20,7 @@ import { spawn } from '../../../../lib/exec'; import { getPathToCurrentOpenApiSpec } from '../../../../lib/openapi/helpers'; import { ConfigSources } from '@backstage/config-loader'; import YAML from 'js-yaml'; -import { join } from 'path'; +import { join } from 'node:path'; import { OptionValues } from 'commander'; import { sync as existsSync } from 'command-exists'; diff --git a/packages/repo-tools/src/commands/package/schema/openapi/generate/client.ts b/packages/repo-tools/src/commands/package/schema/openapi/generate/client.ts index 7402342607..24f8496a0d 100644 --- a/packages/repo-tools/src/commands/package/schema/openapi/generate/client.ts +++ b/packages/repo-tools/src/commands/package/schema/openapi/generate/client.ts @@ -17,7 +17,7 @@ import { resolvePackagePath } from '@backstage/backend-plugin-api'; import chalk from 'chalk'; import fs from 'fs-extra'; -import { resolve } from 'path'; +import { resolve } from 'node:path'; import { exec } from '../../../../../lib/exec'; import { OPENAPI_IGNORE_FILES, diff --git a/packages/repo-tools/src/commands/package/schema/openapi/generate/index.test.ts b/packages/repo-tools/src/commands/package/schema/openapi/generate/index.test.ts index 20de746b25..65586c6206 100644 --- a/packages/repo-tools/src/commands/package/schema/openapi/generate/index.test.ts +++ b/packages/repo-tools/src/commands/package/schema/openapi/generate/index.test.ts @@ -15,7 +15,7 @@ */ import { createMockDirectory } from '@backstage/backend-test-utils'; -import path from 'path'; +import path from 'node:path'; jest.mock( 'lodash', diff --git a/packages/repo-tools/src/commands/package/schema/openapi/generate/server.ts b/packages/repo-tools/src/commands/package/schema/openapi/generate/server.ts index 130c93cf71..be70ee68c4 100644 --- a/packages/repo-tools/src/commands/package/schema/openapi/generate/server.ts +++ b/packages/repo-tools/src/commands/package/schema/openapi/generate/server.ts @@ -18,7 +18,7 @@ import { resolvePackagePath } from '@backstage/backend-plugin-api'; import chalk from 'chalk'; import fs from 'fs-extra'; import YAML from 'js-yaml'; -import { dirname, join, resolve } from 'path'; +import { dirname, join, resolve } from 'node:path'; import { exec } from '../../../../../lib/exec'; import { OLD_SCHEMA_PATH, diff --git a/packages/repo-tools/src/commands/peer-deps/peer-deps.ts b/packages/repo-tools/src/commands/peer-deps/peer-deps.ts index af89560ff4..b6f73a7d44 100644 --- a/packages/repo-tools/src/commands/peer-deps/peer-deps.ts +++ b/packages/repo-tools/src/commands/peer-deps/peer-deps.ts @@ -14,9 +14,9 @@ * limitations under the License. */ -import { resolve as resolvePath } from 'path'; +import { resolve as resolvePath } from 'node:path'; import { getPackages, Package } from '@manypkg/get-packages'; -import { writeFileSync } from 'fs'; +import { writeFileSync } from 'node:fs'; type ExtendedPackageJSON = Package['packageJson'] & { peerDependenciesMeta?: Record; @@ -29,14 +29,14 @@ const desiredLocalVersionsOfDependencies = { '@types/react': '^18.0.0', react: '^18.0.2', 'react-dom': '^18.0.2', - 'react-router-dom': '^6.3.0', + 'react-router-dom': '^6.30.2', }; const peerDependencies = { '@types/react': '^17.0.0 || ^18.0.0', react: '^17.0.0 || ^18.0.0', 'react-dom': '^17.0.0 || ^18.0.0', - 'react-router-dom': '^6.3.0', + 'react-router-dom': '^6.30.2', }; const groupsOfPeerDependencies = [['@types/react', 'react', 'react-dom']]; diff --git a/packages/repo-tools/src/commands/repo/schema/openapi/test.ts b/packages/repo-tools/src/commands/repo/schema/openapi/test.ts index 833de181e3..233c50a1fa 100644 --- a/packages/repo-tools/src/commands/repo/schema/openapi/test.ts +++ b/packages/repo-tools/src/commands/repo/schema/openapi/test.ts @@ -15,7 +15,7 @@ */ import fs from 'fs-extra'; -import { join } from 'path'; +import { join } from 'node:path'; import chalk from 'chalk'; import { runner } from '../../../../lib/runner'; import { YAML_SCHEMA_PATH } from '../../../../lib/openapi/constants'; diff --git a/packages/repo-tools/src/commands/repo/schema/openapi/verify.ts b/packages/repo-tools/src/commands/repo/schema/openapi/verify.ts index 9eab1c77f5..2aa0392fae 100644 --- a/packages/repo-tools/src/commands/repo/schema/openapi/verify.ts +++ b/packages/repo-tools/src/commands/repo/schema/openapi/verify.ts @@ -16,9 +16,9 @@ import fs from 'fs-extra'; import { isEqual } from 'lodash'; -import { join } from 'path'; +import { join } from 'node:path'; import chalk from 'chalk'; -import { relative as relativePath, resolve as resolvePath } from 'path'; +import { relative as relativePath, resolve as resolvePath } from 'node:path'; import { runner } from '../../../../lib/runner'; import { paths as cliPaths } from '../../../../lib/paths'; import { diff --git a/packages/repo-tools/src/commands/type-deps/type-deps.ts b/packages/repo-tools/src/commands/type-deps/type-deps.ts index 877228a238..46dd0f67c5 100644 --- a/packages/repo-tools/src/commands/type-deps/type-deps.ts +++ b/packages/repo-tools/src/commands/type-deps/type-deps.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import fs from 'fs'; -import { resolve as resolvePath } from 'path'; +import fs from 'node:fs'; +import { resolve as resolvePath } from 'node:path'; // Cba polluting root package.json, we'll have this // eslint-disable-next-line @backstage/no-undeclared-imports import chalk from 'chalk'; @@ -78,6 +78,50 @@ function shouldCheckTypes(pkg: Package & PackageJsonWithTypes) { ); } +/** + * Read a declaration file and recursively follow all relative imports and + * re-exports, collecting the source content of each file encountered. + */ +function collectDeclSources(entryPath: string): string[] { + const visited = new Set(); + const sources: string[] = []; + + function visit(filePath: string) { + const resolved = resolvePath(filePath); + if (visited.has(resolved)) { + return; + } + visited.add(resolved); + + // Handle .js -> .d.ts extension mapping used by declaration chunk files + let actualPath = resolved; + if (!fs.existsSync(actualPath)) { + actualPath = resolved.replace(/\.js$/, '.d.ts'); + } + if (!fs.existsSync(actualPath)) { + return; + } + + const src = fs.readFileSync(actualPath, 'utf8'); + sources.push(src); + + // Follow relative imports and re-exports into chunk files + const relativeRefs = ( + src.match(/^(?:import|export) .* from '\..*';$/gm) || [] + ) + .map(match => match.match(/from '(.*)'/)?.[1] ?? '') + .filter(n => n.startsWith('.')); + + const dir = resolvePath(actualPath, '..'); + for (const ref of relativeRefs) { + visit(resolvePath(dir, ref)); + } + } + + visit(entryPath); + return sources; +} + function findAllDeps(declSrc: string) { const importedDeps = (declSrc.match(/^import .* from '.*';$/gm) || []) .map(match => match.match(/from '(.*)'/)?.[1] ?? '') @@ -89,7 +133,21 @@ function findAllDeps(declSrc: string) { .filter(n => !n.startsWith('.')) // We allow references to these without an explicit dependency. .filter(n => !['node', 'react'].includes(n)); - return Array.from(new Set([...importedDeps, ...referencedDeps])); + + // Detect ambient global type namespaces (e.g. jest.Mocked, jest.MockInstance) + // that are used in type positions but don't appear as explicit imports. + // Strip comments first to avoid false positives from JSDoc examples. + const strippedSrc = declSrc + .replace(/\/\*[\s\S]*?\*\//g, '') + .replace(/\/\/.*$/gm, ''); + const ambientDeps: string[] = []; + if (/\bjest\.\w/.test(strippedSrc)) { + ambientDeps.push('jest'); + } + + return Array.from( + new Set([...importedDeps, ...referencedDeps, ...ambientDeps]), + ); } /** @@ -98,11 +156,8 @@ function findAllDeps(declSrc: string) { */ function checkTypes(pkg: Package) { const allDeps = getPackageExportDetails(pkg.packageJson).flatMap(exp => { - const typeDecl = fs.readFileSync( - resolvePath(pkg.dir, 'dist', exp.distPath), - 'utf8', - ); - return findAllDeps(typeDecl); + const entryPath = resolvePath(pkg.dir, 'dist', exp.distPath); + return collectDeclSources(entryPath).flatMap(src => findAllDeps(src)); }); const deps = Array.from(new Set(allDeps)); diff --git a/packages/repo-tools/src/commands/util.ts b/packages/repo-tools/src/commands/util.ts index c232a8aff2..3ca8fa2f17 100644 --- a/packages/repo-tools/src/commands/util.ts +++ b/packages/repo-tools/src/commands/util.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { spawn } from 'child_process'; -import os from 'os'; +import { spawn } from 'node:child_process'; +import os from 'node:os'; import pLimit from 'p-limit'; // Some commands launch full node processes doing heavy work, which at high diff --git a/packages/repo-tools/src/lib/exec.ts b/packages/repo-tools/src/lib/exec.ts index 248ed34f22..db0ddfb0fe 100644 --- a/packages/repo-tools/src/lib/exec.ts +++ b/packages/repo-tools/src/lib/exec.ts @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { promisify } from 'util'; +import { promisify } from 'node:util'; import { ExecOptions, SpawnOptions, exec as execCb, spawn as spawnOriginal, -} from 'child_process'; +} from 'node:child_process'; const execPromise = promisify(execCb); diff --git a/packages/repo-tools/src/lib/getPackageExportDetails.ts b/packages/repo-tools/src/lib/getPackageExportDetails.ts index 6889bb2e77..926c88b620 100644 --- a/packages/repo-tools/src/lib/getPackageExportDetails.ts +++ b/packages/repo-tools/src/lib/getPackageExportDetails.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { extname } from 'path'; +import { extname } from 'node:path'; import type { JsonObject } from '@backstage/types'; export function getPackageExportDetails(pkg: JsonObject): Array<{ diff --git a/packages/repo-tools/src/lib/openapi/dedupe-imports.ts b/packages/repo-tools/src/lib/openapi/dedupe-imports.ts index c398a43e82..9715b2f015 100644 --- a/packages/repo-tools/src/lib/openapi/dedupe-imports.ts +++ b/packages/repo-tools/src/lib/openapi/dedupe-imports.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import fs from 'fs'; +import fs from 'node:fs'; /** * Removes duplicate import and export statements from TypeScript/JavaScript files. diff --git a/packages/repo-tools/src/lib/openapi/helpers.ts b/packages/repo-tools/src/lib/openapi/helpers.ts index 0eaa090ac4..5d1bcf58c7 100644 --- a/packages/repo-tools/src/lib/openapi/helpers.ts +++ b/packages/repo-tools/src/lib/openapi/helpers.ts @@ -18,7 +18,7 @@ import Parser from '@apidevtools/swagger-parser'; import fs, { pathExists } from 'fs-extra'; import YAML from 'js-yaml'; import { cloneDeep } from 'lodash'; -import { resolve } from 'path'; +import { resolve } from 'node:path'; import { paths } from '../paths'; import { YAML_SCHEMA_PATH } from './constants'; diff --git a/packages/repo-tools/src/lib/paths.test.ts b/packages/repo-tools/src/lib/paths.test.ts index b87502adfc..509861073e 100644 --- a/packages/repo-tools/src/lib/paths.test.ts +++ b/packages/repo-tools/src/lib/paths.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { resolve as resolvePath, sep } from 'path'; +import { resolve as resolvePath, sep } from 'node:path'; import { resolvePackagePaths } from './paths'; describe('resolvePackages', () => { diff --git a/packages/repo-tools/src/lib/paths.ts b/packages/repo-tools/src/lib/paths.ts index 0dcec32ff1..ccca6f09c9 100644 --- a/packages/repo-tools/src/lib/paths.ts +++ b/packages/repo-tools/src/lib/paths.ts @@ -17,7 +17,7 @@ import { findPaths } from '@backstage/cli-common'; import { PackageGraph } from '@backstage/cli-node'; import { Minimatch } from 'minimatch'; -import { isAbsolute, relative as relativePath } from 'path'; +import { isAbsolute, relative as relativePath } from 'node:path'; /* eslint-disable-next-line no-restricted-syntax */ export const paths = findPaths(__dirname); diff --git a/packages/repo-tools/src/lib/runner.ts b/packages/repo-tools/src/lib/runner.ts index 8389caa63a..7061a195ad 100644 --- a/packages/repo-tools/src/lib/runner.ts +++ b/packages/repo-tools/src/lib/runner.ts @@ -16,7 +16,7 @@ import { resolvePackagePaths } from './paths'; import pLimit from 'p-limit'; -import { relative as relativePath } from 'path'; +import { relative as relativePath } from 'node:path'; import { paths as cliPaths } from './paths'; import portFinder from 'portfinder'; diff --git a/packages/repo-tools/templates/typescript-backstage-client/licenseInfo.mustache b/packages/repo-tools/templates/typescript-backstage-client/licenseInfo.mustache index 7a1b10e780..f3855e8015 100644 --- a/packages/repo-tools/templates/typescript-backstage-client/licenseInfo.mustache +++ b/packages/repo-tools/templates/typescript-backstage-client/licenseInfo.mustache @@ -2,4 +2,4 @@ // ****************************************************************** // * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. * -// ****************************************************************** \ No newline at end of file +// ****************************************************************** diff --git a/packages/repo-tools/templates/typescript-backstage-server/licenseInfo.mustache b/packages/repo-tools/templates/typescript-backstage-server/licenseInfo.mustache index 7a1b10e780..f3855e8015 100644 --- a/packages/repo-tools/templates/typescript-backstage-server/licenseInfo.mustache +++ b/packages/repo-tools/templates/typescript-backstage-server/licenseInfo.mustache @@ -2,4 +2,4 @@ // ****************************************************************** // * THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. * -// ****************************************************************** \ No newline at end of file +// ****************************************************************** diff --git a/packages/scaffolder-internal/CHANGELOG.md b/packages/scaffolder-internal/CHANGELOG.md index 35db413d8f..f35d543722 100644 --- a/packages/scaffolder-internal/CHANGELOG.md +++ b/packages/scaffolder-internal/CHANGELOG.md @@ -1,5 +1,29 @@ # @internal/scaffolder +## 0.0.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/plugin-scaffolder-react@1.19.6-next.0 + +## 0.0.17 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/plugin-scaffolder-react@1.19.5 + +## 0.0.17-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-scaffolder-react@1.19.5-next.0 + - @backstage/frontend-plugin-api@0.13.2 + ## 0.0.16 ### Patch Changes diff --git a/packages/scaffolder-internal/package.json b/packages/scaffolder-internal/package.json index 98d76bb84e..2139b6bfc9 100644 --- a/packages/scaffolder-internal/package.json +++ b/packages/scaffolder-internal/package.json @@ -1,6 +1,6 @@ { "name": "@internal/scaffolder", - "version": "0.0.16", + "version": "0.0.18-next.0", "backstage": { "role": "web-library", "inline": true @@ -25,7 +25,7 @@ "dependencies": { "@backstage/frontend-plugin-api": "workspace:^", "@backstage/plugin-scaffolder-react": "workspace:^", - "zod": "^3.22.4" + "zod": "^3.25.76" }, "devDependencies": { "@backstage/cli": "workspace:^" diff --git a/packages/techdocs-cli-embedded-app/CHANGELOG.md b/packages/techdocs-cli-embedded-app/CHANGELOG.md index 6542287948..c5904a1720 100644 --- a/packages/techdocs-cli-embedded-app/CHANGELOG.md +++ b/packages/techdocs-cli-embedded-app/CHANGELOG.md @@ -1,5 +1,98 @@ # techdocs-cli-embedded-app +## 0.2.117-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog@1.33.0-next.1 + - @backstage/ui@0.12.0-next.1 + - @backstage/theme@0.7.2-next.0 + - @backstage/cli@0.35.4-next.1 + - @backstage/plugin-techdocs@1.16.3-next.1 + - @backstage/app-defaults@1.7.5-next.1 + - @backstage/core-components@0.18.7-next.1 + - @backstage/test-utils@1.7.15-next.1 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/integration-react@1.2.15-next.1 + +## 0.2.117-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.35.3-next.0 + - @backstage/ui@0.12.0-next.0 + - @backstage/core-components@0.18.6-next.0 + - @backstage/plugin-techdocs@1.16.3-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/plugin-techdocs-react@1.3.8-next.0 + - @backstage/core-app-api@1.19.4-next.0 + - @backstage/plugin-catalog@1.32.3-next.0 + - @backstage/app-defaults@1.7.5-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/integration-react@1.2.15-next.0 + - @backstage/test-utils@1.7.15-next.0 + - @backstage/theme@0.7.1 + +## 0.2.116 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0 + - @backstage/plugin-catalog@1.32.2 + - @backstage/cli@0.35.2 + - @backstage/core-components@0.18.5 + - @backstage/plugin-techdocs@1.16.2 + - @backstage/app-defaults@1.7.4 + - @backstage/integration-react@1.2.14 + - @backstage/plugin-techdocs-react@1.3.7 + +## 0.2.116-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + - @backstage/app-defaults@1.7.4-next.0 + - @backstage/cli@0.35.2-next.1 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-catalog@1.32.2-next.1 + - @backstage/plugin-techdocs@1.16.2-next.1 + - @backstage/plugin-techdocs-react@1.3.7-next.0 + +## 0.2.116-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/cli@0.35.2-next.1 + - @backstage/integration-react@1.2.14-next.0 + - @backstage/plugin-techdocs@1.16.2-next.0 + - @backstage/plugin-catalog@1.32.2-next.0 + +## 0.2.116-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.11.0-next.0 + - @backstage/cli@0.35.2-next.0 + - @backstage/app-defaults@1.7.3 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/core-app-api@1.19.3 + - @backstage/core-components@0.18.4 + - @backstage/core-plugin-api@1.12.1 + - @backstage/integration-react@1.2.13 + - @backstage/test-utils@1.7.14 + - @backstage/theme@0.7.1 + - @backstage/plugin-catalog@1.32.1 + - @backstage/plugin-techdocs@1.16.1 + - @backstage/plugin-techdocs-react@1.3.6 + ## 0.2.115 ### Patch Changes diff --git a/packages/techdocs-cli-embedded-app/app-config.yaml b/packages/techdocs-cli-embedded-app/app-config.yaml index c8dfa1683c..09553edc8a 100644 --- a/packages/techdocs-cli-embedded-app/app-config.yaml +++ b/packages/techdocs-cli-embedded-app/app-config.yaml @@ -1,6 +1,11 @@ app: title: Techdocs Preview App baseUrl: http://localhost:3000 + extensions: + - sign-in-page:app: false + - page:techdocs/reader: + config: + withoutSearch: true backend: baseUrl: http://localhost:3000 diff --git a/packages/techdocs-cli-embedded-app/knip-report.md b/packages/techdocs-cli-embedded-app/knip-report.md index 3711ac996d..1b6bfe5aaa 100644 --- a/packages/techdocs-cli-embedded-app/knip-report.md +++ b/packages/techdocs-cli-embedded-app/knip-report.md @@ -1,17 +1,9 @@ # Knip report -## Unused dependencies (2) +## Unused devDependencies (2) -| Name | Location | Severity | -| :-------- | :----------- | :------- | -| react-use | packages/techdocs-cli-embedded-app/package.json | error | -| history | packages/techdocs-cli-embedded-app/package.json | error | - -## Unused devDependencies (3) - -| Name | Location | Severity | -| :-------------------------- | :----------- | :------- | -| @testing-library/user-event | packages/techdocs-cli-embedded-app/package.json | error | -| @testing-library/dom | packages/techdocs-cli-embedded-app/package.json | error | -| cross-env | packages/techdocs-cli-embedded-app/package.json | error | +| Name | Location | Severity | +| :-------------------------- | :---------------- | :------- | +| @testing-library/user-event | package.json:61:6 | error | +| cross-env | package.json:64:6 | error | diff --git a/packages/techdocs-cli-embedded-app/package.json b/packages/techdocs-cli-embedded-app/package.json index e8db7e68d5..6dcda2a2fb 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.115", + "version": "0.2.117-next.1", "backstage": { "role": "frontend" }, @@ -32,14 +32,15 @@ }, "prettier": "@backstage/cli/config/prettier", "dependencies": { - "@backstage/app-defaults": "workspace:^", "@backstage/catalog-model": "workspace:^", "@backstage/cli": "workspace:^", "@backstage/config": "workspace:^", "@backstage/core-app-api": "workspace:^", "@backstage/core-components": "workspace:^", - "@backstage/core-plugin-api": "workspace:^", + "@backstage/frontend-defaults": "workspace:^", + "@backstage/frontend-plugin-api": "workspace:^", "@backstage/integration-react": "workspace:^", + "@backstage/plugin-app-react": "workspace:^", "@backstage/plugin-catalog": "workspace:^", "@backstage/plugin-techdocs": "workspace:^", "@backstage/plugin-techdocs-react": "workspace:^", @@ -48,10 +49,9 @@ "@backstage/ui": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", - "history": "^5.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router-dom": "^6.3.0", + "react-router-dom": "^6.30.2", "react-use": "^17.2.4" }, "devDependencies": { @@ -62,7 +62,7 @@ "@testing-library/user-event": "^14.0.0", "@types/react": "*", "@types/react-dom": "*", - "cross-env": "^7.0.0" + "cross-env": "^10.0.0" }, "bundled": true } diff --git a/packages/techdocs-cli-embedded-app/src/App.test.tsx b/packages/techdocs-cli-embedded-app/src/App.test.tsx index ed479e7e75..fc6d25863c 100644 --- a/packages/techdocs-cli-embedded-app/src/App.test.tsx +++ b/packages/techdocs-cli-embedded-app/src/App.test.tsx @@ -15,13 +15,27 @@ */ import { renderWithEffects } from '@backstage/test-utils'; -import App from './App'; +import app from './App'; jest.mock('./config', () => ({ configLoader: async () => [ { data: { - app: { title: 'Test' }, + app: { + title: 'Test', + extensions: [ + { + 'sign-in-page:app': false, + }, + { + 'page:techdocs/reader': { + config: { + withoutSearch: true, + }, + }, + }, + ], + }, backend: { baseUrl: 'http://localhost:7007' }, techdocs: { storageUrl: 'http://localhost:7007/api/techdocs/static/docs', @@ -34,7 +48,7 @@ jest.mock('./config', () => ({ describe('App', () => { it('should render', async () => { - const rendered = await renderWithEffects(); + const rendered = await renderWithEffects(app); expect(rendered.getByText('Docs Preview')).toBeInTheDocument(); }); }); diff --git a/packages/techdocs-cli-embedded-app/src/App.tsx b/packages/techdocs-cli-embedded-app/src/App.tsx index 13d5b925f0..229db3142d 100644 --- a/packages/techdocs-cli-embedded-app/src/App.tsx +++ b/packages/techdocs-cli-embedded-app/src/App.tsx @@ -14,85 +14,43 @@ * limitations under the License. */ -import { Navigate, Route } from 'react-router-dom'; +import techdocsPlugin from '@backstage/plugin-techdocs/alpha'; -import { - DefaultTechDocsHome, - TechDocsIndexPage, - TechDocsReaderPage, - techdocsPlugin, -} from '@backstage/plugin-techdocs'; -import { - createTechDocsAddonExtension, - TechDocsAddons, - TechDocsAddonLocations, -} from '@backstage/plugin-techdocs-react'; -import { createApp } from '@backstage/app-defaults'; -import { FlatRoutes } from '@backstage/core-app-api'; -import { CatalogEntityPage } from '@backstage/plugin-catalog'; +import { createApp } from '@backstage/frontend-defaults'; +import { ConfigReader } from '@backstage/core-app-api'; +import catalogPlugin from '@backstage/plugin-catalog/alpha'; -import { apis } from './apis'; -import * as plugins from './plugins'; +import { appApis, techdocsPluginApis } from './apis'; import { configLoader } from './config'; -import { Root } from './components/Root'; -import { techDocsPage, TechDocsThemeToggle } from './components/TechDocsPage'; -import { TechDocsLiveReload } from './LiveReloadAddon'; -const app = createApp({ - apis, - configLoader, - plugins: Object.values(plugins), +import { createFrontendModule } from '@backstage/frontend-plugin-api'; +import { SidebarContent } from './components/Sidebar'; +import { + techDocsThemeToggleAddonModule, + techdocsLiveReloadAddonModule, +} from './addons'; + +const appPlugin = createFrontendModule({ + pluginId: 'app', + extensions: [...appApis, SidebarContent], }); -const AppProvider = app.getProvider(); -const AppRouter = app.getRouter(); +const app = createApp({ + features: [ + appPlugin, + techdocsPlugin.withOverrides({ + extensions: [...techdocsPluginApis], + }), + catalogPlugin, + techDocsThemeToggleAddonModule, + techdocsLiveReloadAddonModule, + ], + advanced: { + async configLoader() { + const appConfigs = await configLoader(); + return { config: ConfigReader.fromConfigs(appConfigs) }; + }, + }, +}); -const ThemeToggleAddon = techdocsPlugin.provide( - createTechDocsAddonExtension({ - name: 'ThemeToggleAddon', - component: TechDocsThemeToggle, - location: TechDocsAddonLocations.Header, - }), -); - -const LiveReloadAddon = techdocsPlugin.provide( - createTechDocsAddonExtension({ - name: 'LiveReloadAddon', - component: TechDocsLiveReload, - location: TechDocsAddonLocations.Content, - }), -); - -const routes = ( - - - {/* we need this route as TechDocs header links relies on it */} - } - /> - }> - - - } - > - {techDocsPage} - - - - - - -); - -const App = () => ( - - - {routes} - - -); - -export default App; +export default app.createRoot(); diff --git a/packages/techdocs-cli-embedded-app/src/addons.tsx b/packages/techdocs-cli-embedded-app/src/addons.tsx new file mode 100644 index 0000000000..26ead00959 --- /dev/null +++ b/packages/techdocs-cli-embedded-app/src/addons.tsx @@ -0,0 +1,48 @@ +/* + * 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 { AddonBlueprint } from '@backstage/plugin-techdocs-react/alpha'; +import { TechDocsAddonLocations } from '@backstage/plugin-techdocs-react'; +import { createFrontendModule } from '@backstage/frontend-plugin-api'; +import { TechDocsThemeToggle } from './components/TechDocsPage'; +import { TechDocsLiveReload } from './components/LiveReload/LiveReloadAddon'; + +const techDocsThemeToggleAddonExtension = AddonBlueprint.make({ + name: 'techdocs-theme-toggle-addon', + params: { + name: 'ThemeToggleAddon', + component: TechDocsThemeToggle, + location: TechDocsAddonLocations.Header, + }, +}); + +export const techDocsThemeToggleAddonModule = createFrontendModule({ + pluginId: 'techdocs', + extensions: [techDocsThemeToggleAddonExtension], +}); + +const techdocsLiveReloadAddonExtension = AddonBlueprint.make({ + name: 'techdocs-live-reload-addon', + params: { + name: 'LiveReloadAddon', + component: TechDocsLiveReload, + location: TechDocsAddonLocations.Content, + }, +}); + +export const techdocsLiveReloadAddonModule = createFrontendModule({ + pluginId: 'techdocs', + extensions: [techdocsLiveReloadAddonExtension], +}); diff --git a/packages/techdocs-cli-embedded-app/src/apis.ts b/packages/techdocs-cli-embedded-app/src/apis.ts index 5bb19a563d..d6f7a2df41 100644 --- a/packages/techdocs-cli-embedded-app/src/apis.ts +++ b/packages/techdocs-cli-embedded-app/src/apis.ts @@ -13,6 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { + ApiBlueprint, + configApiRef, + DiscoveryApi, + discoveryApiRef, + IdentityApi, + identityApiRef, +} from '@backstage/frontend-plugin-api'; import { CompoundEntityRef } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; @@ -20,15 +28,6 @@ import { scmIntegrationsApiRef, ScmIntegrationsApi, } from '@backstage/integration-react'; -import { - AnyApiFactory, - configApiRef, - createApiFactory, - DiscoveryApi, - discoveryApiRef, - IdentityApi, - identityApiRef, -} from '@backstage/core-plugin-api'; import { SyncResult, TechDocsApi, @@ -158,38 +157,53 @@ class TechDocsDevApi implements TechDocsApi { } } -export const apis: AnyApiFactory[] = [ - createApiFactory({ - api: techdocsStorageApiRef, - deps: { - configApi: configApiRef, - discoveryApi: discoveryApiRef, - identityApi: identityApiRef, - }, - factory: ({ configApi, discoveryApi, identityApi }) => - new TechDocsDevStorageApi({ - configApi, - discoveryApi, - identityApi, +export const techdocsPluginApis = [ + ApiBlueprint.make({ + name: 'techdocs-dev-storage', + params: defineParams => + defineParams({ + api: techdocsStorageApiRef, + deps: { + configApi: configApiRef, + discoveryApi: discoveryApiRef, + identityApi: identityApiRef, + }, + factory: ({ configApi, discoveryApi, identityApi }) => + new TechDocsDevStorageApi({ + configApi, + discoveryApi, + identityApi, + }), }), }), - createApiFactory({ - api: techdocsApiRef, - deps: { - configApi: configApiRef, - discoveryApi: discoveryApiRef, - identityApi: identityApiRef, - }, - factory: ({ configApi, discoveryApi, identityApi }) => - new TechDocsDevApi({ - configApi, - discoveryApi, - identityApi, + ApiBlueprint.make({ + name: 'techdocs-dev', + params: defineParams => + defineParams({ + api: techdocsApiRef, + deps: { + configApi: configApiRef, + discoveryApi: discoveryApiRef, + identityApi: identityApiRef, + }, + factory: ({ configApi, discoveryApi, identityApi }) => + new TechDocsDevApi({ + configApi, + discoveryApi, + identityApi, + }), + }), + }), +]; + +export const appApis = [ + ApiBlueprint.make({ + name: 'scm-integrations', + params: defineParams => + defineParams({ + api: scmIntegrationsApiRef, + deps: { configApi: configApiRef }, + factory: ({ configApi }) => ScmIntegrationsApi.fromConfig(configApi), }), }), - createApiFactory({ - api: scmIntegrationsApiRef, - deps: { configApi: configApiRef }, - factory: ({ configApi }) => ScmIntegrationsApi.fromConfig(configApi), - }), ]; diff --git a/packages/techdocs-cli-embedded-app/src/LiveReloadAddon.test.tsx b/packages/techdocs-cli-embedded-app/src/components/LiveReload/LiveReloadAddon.test.tsx similarity index 100% rename from packages/techdocs-cli-embedded-app/src/LiveReloadAddon.test.tsx rename to packages/techdocs-cli-embedded-app/src/components/LiveReload/LiveReloadAddon.test.tsx diff --git a/packages/techdocs-cli-embedded-app/src/LiveReloadAddon.tsx b/packages/techdocs-cli-embedded-app/src/components/LiveReload/LiveReloadAddon.tsx similarity index 100% rename from packages/techdocs-cli-embedded-app/src/LiveReloadAddon.tsx rename to packages/techdocs-cli-embedded-app/src/components/LiveReload/LiveReloadAddon.tsx diff --git a/packages/techdocs-cli-embedded-app/src/components/Root/LogoFull.tsx b/packages/techdocs-cli-embedded-app/src/components/Sidebar/LogoFull.tsx similarity index 100% rename from packages/techdocs-cli-embedded-app/src/components/Root/LogoFull.tsx rename to packages/techdocs-cli-embedded-app/src/components/Sidebar/LogoFull.tsx diff --git a/packages/techdocs-cli-embedded-app/src/components/Root/LogoIcon.tsx b/packages/techdocs-cli-embedded-app/src/components/Sidebar/LogoIcon.tsx similarity index 100% rename from packages/techdocs-cli-embedded-app/src/components/Root/LogoIcon.tsx rename to packages/techdocs-cli-embedded-app/src/components/Sidebar/LogoIcon.tsx diff --git a/packages/techdocs-cli-embedded-app/src/components/Root/Root.tsx b/packages/techdocs-cli-embedded-app/src/components/Sidebar/Sidebar.tsx similarity index 89% rename from packages/techdocs-cli-embedded-app/src/components/Root/Root.tsx rename to packages/techdocs-cli-embedded-app/src/components/Sidebar/Sidebar.tsx index 6a00fc78cf..fed1f0f36d 100644 --- a/packages/techdocs-cli-embedded-app/src/components/Root/Root.tsx +++ b/packages/techdocs-cli-embedded-app/src/components/Sidebar/Sidebar.tsx @@ -13,9 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import { PropsWithChildren } from 'react'; - import { makeStyles } from '@material-ui/core/styles'; import LibraryBooks from '@material-ui/icons/LibraryBooks'; import LogoFull from './LogoFull'; @@ -30,6 +27,7 @@ import { useSidebarOpenState, Link, } from '@backstage/core-components'; +import { NavContentBlueprint } from '@backstage/plugin-app-react'; const useSidebarLogoStyles = makeStyles({ root: { @@ -63,7 +61,7 @@ const SidebarLogo = () => { ); }; -export const Root = ({ children }: PropsWithChildren<{}>) => ( +export const SidebarNav = (): React.ReactElement => ( @@ -76,6 +74,11 @@ export const Root = ({ children }: PropsWithChildren<{}>) => ( /> {/* End global nav */} - {children} ); + +export const SidebarContent = NavContentBlueprint.make({ + params: { + component: () => , + }, +}); diff --git a/packages/techdocs-cli-embedded-app/src/components/Root/index.ts b/packages/techdocs-cli-embedded-app/src/components/Sidebar/index.ts similarity index 93% rename from packages/techdocs-cli-embedded-app/src/components/Root/index.ts rename to packages/techdocs-cli-embedded-app/src/components/Sidebar/index.ts index dff706f08f..485e09a70c 100644 --- a/packages/techdocs-cli-embedded-app/src/components/Root/index.ts +++ b/packages/techdocs-cli-embedded-app/src/components/Sidebar/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { Root } from './Root'; +export { SidebarContent } from './Sidebar'; diff --git a/packages/techdocs-cli-embedded-app/src/components/TechDocsPage/TechDocsPage.tsx b/packages/techdocs-cli-embedded-app/src/components/TechDocsPage/TechDocsPage.tsx index dfe728da86..eae55d3424 100644 --- a/packages/techdocs-cli-embedded-app/src/components/TechDocsPage/TechDocsPage.tsx +++ b/packages/techdocs-cli-embedded-app/src/components/TechDocsPage/TechDocsPage.tsx @@ -25,7 +25,7 @@ import IconButton from '@material-ui/core/IconButton'; import LightIcon from '@material-ui/icons/Brightness7'; import DarkIcon from '@material-ui/icons/Brightness4'; -import { appThemeApiRef, useApi } from '@backstage/core-plugin-api'; +import { appThemeApiRef, useApi } from '@backstage/frontend-plugin-api'; import { TechDocsReaderPage, @@ -93,7 +93,7 @@ export const TechDocsThemeToggle = () => { ); }; -const DefaultTechDocsPage = () => { +export const DefaultTechDocsPage = () => { return ( diff --git a/packages/techdocs-cli-embedded-app/src/index.tsx b/packages/techdocs-cli-embedded-app/src/index.tsx index f50db079b0..84d77cc7e1 100644 --- a/packages/techdocs-cli-embedded-app/src/index.tsx +++ b/packages/techdocs-cli-embedded-app/src/index.tsx @@ -19,4 +19,4 @@ import ReactDOM from 'react-dom/client'; import '@backstage/ui/css/styles.css'; import App from './App'; -ReactDOM.createRoot(document.getElementById('root')!).render(); +ReactDOM.createRoot(document.getElementById('root')!).render(App); diff --git a/packages/techdocs-cli/CHANGELOG.md b/packages/techdocs-cli/CHANGELOG.md index 5295128a8b..10ebdbdf99 100644 --- a/packages/techdocs-cli/CHANGELOG.md +++ b/packages/techdocs-cli/CHANGELOG.md @@ -1,5 +1,61 @@ # @techdocs/cli +## 1.10.5-next.1 + +### Patch Changes + +- 508d127: Updated dependency `find-process` to `^2.0.0`. +- Updated dependencies + - @backstage/backend-defaults@0.15.2-next.1 + - @backstage/plugin-techdocs-node@1.14.2-next.1 + +## 1.10.5-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/plugin-techdocs-node@1.14.1-next.0 + - @backstage/cli-common@0.1.18-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + +## 1.10.4 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/cli-common@0.1.17 + - @backstage/plugin-techdocs-node@1.14.0 + +## 1.10.4-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + +## 1.10.4-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.1 + - @backstage/plugin-techdocs-node@1.13.11-next.0 + +## 1.10.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/cli-common@0.1.16 + - @backstage/config@1.3.6 + - @backstage/plugin-techdocs-node@1.13.10 + ## 1.10.3 ### Patch Changes diff --git a/packages/techdocs-cli/bin/techdocs-cli b/packages/techdocs-cli/bin/techdocs-cli index a43ae6324b..d6e0ef6df5 100755 --- a/packages/techdocs-cli/bin/techdocs-cli +++ b/packages/techdocs-cli/bin/techdocs-cli @@ -15,11 +15,13 @@ * limitations under the License. */ -const path = require('path'); +const path = require('node:path'); // Figure out whether we're running inside the backstage repo or as an installed dependency /* eslint-disable-next-line no-restricted-syntax */ -const isLocal = require('fs').existsSync(path.resolve(__dirname, '../src')); +const isLocal = require('node:fs').existsSync( + path.resolve(__dirname, '../src'), +); if (!isLocal) { require('..'); diff --git a/packages/techdocs-cli/cli-e2e-test.config.js b/packages/techdocs-cli/cli-e2e-test.config.js index b2e6e53918..6695dcbbd1 100644 --- a/packages/techdocs-cli/cli-e2e-test.config.js +++ b/packages/techdocs-cli/cli-e2e-test.config.js @@ -14,7 +14,7 @@ * limitations under the License. */ -const path = require('path'); +const path = require('node:path'); module.exports = require('@backstage/cli/config/jest').then(baseConfig => ({ ...baseConfig, 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 dbbc219ab6..a2720c934e 100644 --- a/packages/techdocs-cli/cli-e2e-tests/techdocs-cli.test.ts +++ b/packages/techdocs-cli/cli-e2e-tests/techdocs-cli.test.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { execSync, spawn, SpawnOptionsWithoutStdio } from 'child_process'; -import path from 'path'; +import { execSync, spawn, SpawnOptionsWithoutStdio } from 'node:child_process'; +import path from 'node:path'; import findProcess from 'find-process'; diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index c27d829fe7..fb33677b45 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -1,6 +1,6 @@ { "name": "@techdocs/cli", - "version": "1.10.3", + "version": "1.10.5-next.1", "description": "Utility CLI for managing TechDocs sites in Backstage.", "backstage": { "role": "cli" @@ -65,7 +65,7 @@ "@types/node": "^22.13.14", "@types/serve-handler": "^6.1.0", "@types/webpack-env": "^1.15.3", - "find-process": "^1.4.5", + "find-process": "^2.0.0", "nodemon": "^3.0.1", "techdocs-cli-embedded-app": "link:../techdocs-cli-embedded-app" } diff --git a/packages/techdocs-cli/src/commands/generate/generate.ts b/packages/techdocs-cli/src/commands/generate/generate.ts index 4553c18810..9a009aff00 100644 --- a/packages/techdocs-cli/src/commands/generate/generate.ts +++ b/packages/techdocs-cli/src/commands/generate/generate.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { resolve } from 'path'; +import { resolve } from 'node:path'; import { OptionValues } from 'commander'; import fs from 'fs-extra'; import { diff --git a/packages/techdocs-cli/src/commands/publish/publish.ts b/packages/techdocs-cli/src/commands/publish/publish.ts index ded578546a..1da91adb3a 100644 --- a/packages/techdocs-cli/src/commands/publish/publish.ts +++ b/packages/techdocs-cli/src/commands/publish/publish.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { resolve } from 'path'; +import { resolve } from 'node:path'; import { OptionValues } from 'commander'; import { createLogger } from '../../lib/utility'; import { HostDiscovery } from '@backstage/backend-defaults/discovery'; diff --git a/packages/techdocs-cli/src/commands/serve/serve.ts b/packages/techdocs-cli/src/commands/serve/serve.ts index a0d0030c6b..864861828b 100644 --- a/packages/techdocs-cli/src/commands/serve/serve.ts +++ b/packages/techdocs-cli/src/commands/serve/serve.ts @@ -15,7 +15,7 @@ */ import { OptionValues } from 'commander'; -import path from 'path'; +import path from 'node:path'; import openBrowser from 'react-dev-utils/openBrowser'; import { findPaths, RunOnOutput } from '@backstage/cli-common'; import HTTPServer from '../../lib/httpServer'; diff --git a/packages/techdocs-cli/src/lib/httpServer.ts b/packages/techdocs-cli/src/lib/httpServer.ts index d7e8f62ea0..8ce38330b5 100644 --- a/packages/techdocs-cli/src/lib/httpServer.ts +++ b/packages/techdocs-cli/src/lib/httpServer.ts @@ -15,7 +15,7 @@ */ import serveHandler from 'serve-handler'; -import http from 'http'; +import http from 'node:http'; import httpProxy from 'http-proxy'; import { createLogger } from './utility'; import { diff --git a/packages/techdocs-cli/src/lib/livereload.test.ts b/packages/techdocs-cli/src/lib/livereload.test.ts index b21251c45a..aaf4ef7dfd 100644 --- a/packages/techdocs-cli/src/lib/livereload.test.ts +++ b/packages/techdocs-cli/src/lib/livereload.test.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import http from 'http'; +import http from 'node:http'; import { injectLivereloadParameters, proxyHtmlWithLivereloadInjection, diff --git a/packages/techdocs-cli/src/lib/livereload.ts b/packages/techdocs-cli/src/lib/livereload.ts index c108971b82..90814d413a 100644 --- a/packages/techdocs-cli/src/lib/livereload.ts +++ b/packages/techdocs-cli/src/lib/livereload.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import http from 'http'; +import http from 'node:http'; import httpProxy from 'http-proxy'; /** diff --git a/packages/techdocs-cli/src/lib/utility.ts b/packages/techdocs-cli/src/lib/utility.ts index 00927fd1df..173815df08 100644 --- a/packages/techdocs-cli/src/lib/utility.ts +++ b/packages/techdocs-cli/src/lib/utility.ts @@ -18,8 +18,8 @@ import { ParsedLocationAnnotation, } from '@backstage/plugin-techdocs-node'; import * as winston from 'winston'; -import { Writable } from 'stream'; -import { stdout } from 'process'; +import { Writable } from 'node:stream'; +import { stdout } from 'node:process'; export const convertTechDocsRefToLocationAnnotation = ( techdocsRef: string, diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md index 71c5aca50a..06d257696c 100644 --- a/packages/test-utils/CHANGELOG.md +++ b/packages/test-utils/CHANGELOG.md @@ -1,5 +1,37 @@ # @backstage/test-utils +## 1.7.15-next.2 + +### 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. +- 68eb322: Added `@types/jest` as an optional peer dependency, since jest types are exposed in the public API surface. +- Updated dependencies + - @backstage/core-app-api@1.19.5-next.1 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-permission-react@0.4.40-next.1 + - @backstage/theme@0.7.2-next.1 + +## 1.7.15-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/theme@0.7.2-next.0 + +## 1.7.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/plugin-permission-common@0.9.5-next.0 + - @backstage/core-app-api@1.19.4-next.0 + - @backstage/config@1.3.6 + - @backstage/theme@0.7.1 + - @backstage/types@1.2.2 + - @backstage/plugin-permission-react@0.4.40-next.0 + ## 1.7.14 ### Patch Changes diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 2e12255bd0..73ca74570c 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/test-utils", - "version": "1.7.14", + "version": "1.7.15-next.2", "description": "Utilities to test Backstage plugins and apps.", "backstage": { "role": "web-library" @@ -70,16 +70,20 @@ "msw": "^1.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependencies": { "@testing-library/react": "^16.0.0", + "@types/jest": "*", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { + "@types/jest": { + "optional": true + }, "@types/react": { "optional": true } diff --git a/packages/theme/CHANGELOG.md b/packages/theme/CHANGELOG.md index bbe9ae3fc9..405b9ae6fc 100644 --- a/packages/theme/CHANGELOG.md +++ b/packages/theme/CHANGELOG.md @@ -1,5 +1,17 @@ # @backstage/theme +## 0.7.2-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. + +## 0.7.2-next.0 + +### Patch Changes + +- 1c52dcc: add square shape + ## 0.7.1 ### Patch Changes diff --git a/packages/theme/package.json b/packages/theme/package.json index 645255d601..9ddb38d52f 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/theme", - "version": "0.7.1", + "version": "0.7.2-next.1", "description": "material-ui theme for use with Backstage.", "backstage": { "role": "web-library" @@ -48,14 +48,14 @@ "@types/react": "^18.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependencies": { "@material-ui/core": "^4.12.2", "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { "@types/react": { diff --git a/packages/theme/src/base/pageTheme.ts b/packages/theme/src/base/pageTheme.ts index 3e1e8641fc..8bbd270f5f 100644 --- a/packages/theme/src/base/pageTheme.ts +++ b/packages/theme/src/base/pageTheme.ts @@ -36,6 +36,7 @@ export const shapes: Record = { wave: `url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='1368' height='400' fill='none'%3e%3cmask id='a' width='1368' height='401' x='0' y='0' maskUnits='userSpaceOnUse'%3e%3cpath fill='url(%23paint0_linear)' d='M437 116C223 116 112 0 112 0h1256v400c-82 0-225-21-282-109-112-175-436-175-649-175z'/%3e%3cpath fill='url(%23paint1_linear)' d='M1368 400V282C891-29 788 40 711 161 608 324 121 372 0 361v39h1368z'/%3e%3cpath fill='url(%23paint2_linear)' d='M1368 244v156H0V94c92-24 198-46 375 0l135 41c176 51 195 109 858 109z'/%3e%3cpath fill='url(%23paint3_linear)' d='M1252 400h116c-14-7-35-14-116-16-663-14-837-128-1013-258l-85-61C98 28 46 8 0 0v400h1252z'/%3e%3c/mask%3e%3cg mask='url(%23a)'%3e%3cpath fill='white' d='M-172-98h1671v601H-172z'/%3e%3c/g%3e%3cdefs%3e%3clinearGradient id='paint0_linear' x1='602' x2='1093.5' y1='-960.5' y2='272' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3clinearGradient id='paint1_linear' x1='482' x2='480' y1='1058.5' y2='70.5' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3clinearGradient id='paint2_linear' x1='424' x2='446.1' y1='-587.5' y2='274.6' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3clinearGradient id='paint3_linear' x1='587' x2='349' y1='-1120.5' y2='341' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e")`, wave2: `url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='1368' height='400' fill='none'%3e%3cmask id='a' width='1764' height='479' x='-229' y='-6' maskUnits='userSpaceOnUse'%3e%3cpath fill='url(%23paint0_linear)' d='M0 400h1350C1321 336 525 33 179-2c-345-34-395 236-408 402H0z'/%3e%3cpath fill='url(%23paint1_linear)' d='M1378 177v223H0V217s219 75 327 52C436 246 717-35 965 45s254 144 413 132z'/%3e%3cpath fill='url(%23paint2_linear)' d='M26 400l-78-16c-170 205-44-6-137-30l-4-1 4 1 137 30c37-45 89-110 159-201 399-514-45 238 1176-50 275-65 354-39 91 267H26z'/%3e%3c/mask%3e%3cg mask='url(%23a)'%3e%3cpath fill='white' d='M0 0h1368v400H0z'/%3e%3c/g%3e%3cdefs%3e%3clinearGradient id='paint0_linear' x1='431' x2='397.3' y1='-599' y2='372.8' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3clinearGradient id='paint1_linear' x1='236.5' x2='446.6' y1='-586' y2='381.5' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3clinearGradient id='paint2_linear' x1='851.8' x2='640.4' y1='-867.2' y2='363.7' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e")`, round: `url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='1368' height='400' fill='none'%3e%3cmask id='a' width='2269' height='1408' x='-610' y='-509' maskUnits='userSpaceOnUse'%3e%3ccircle cx='1212.8' cy='74.8' r='317.5' fill='url(%23paint0_linear)' transform='rotate(-52 1213 75)'/%3e%3ccircle cx='737.8' cy='445.8' r='317.5' fill='url(%23paint1_linear)' transform='rotate(-116 738 446)'/%3e%3ccircle cx='601.8' cy='52.8' r='418.6' fill='url(%23paint2_linear)' transform='rotate(-117 602 53)'/%3e%3ccircle cx='999.8' cy='364' r='389.1' fill='url(%23paint3_linear)' transform='rotate(31 1000 364)'/%3e%3cellipse cx='-109.2' cy='263.5' fill='url(%23paint4_linear)' rx='429.2' ry='465.8' transform='rotate(-85 -109 264)'/%3e%3c/mask%3e%3cg mask='url(%23a)'%3e%3cpath fill='white' d='M0 0h1368v400H0z'/%3e%3c/g%3e%3cdefs%3e%3clinearGradient id='paint0_linear' x1='1301.2' x2='161.4' y1='-1879.7' y2='-969.6' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3clinearGradient id='paint1_linear' x1='826.2' x2='-313.6' y1='-1508.7' y2='-598.6' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3clinearGradient id='paint2_linear' x1='718.4' x2='-784.3' y1='-2524' y2='-1324.2' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3clinearGradient id='paint3_linear' x1='1108.2' x2='-288.6' y1='-2031.1' y2='-915.9' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3clinearGradient id='paint4_linear' x1='10.4' x2='-1626.5' y1='-2603.8' y2='-1399.5' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e")`, + square: `url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='1368' height='400' fill='none' viewBox='0 0 1368 400'%3e%3cmask id='e' width='1744' height='984' x='-179' y='-215' maskUnits='userSpaceOnUse' style='mask-type:alpha'%3e%3cpath fill='url(%23a)' d='M707 334.693h801v322H707z' transform='rotate(-28.703 707 334.693)'/%3e%3cpath fill='url(%23b)' d='M781.853 570.341h583.106v370.945H781.853z' transform='rotate(-117.346 781.853 570.341)'/%3e%3cpath fill='url(%23c)' d='M-131 685.309h583.106v370.945H-131z' transform='rotate(-77.064 -131 685.309)'/%3e%3cpath fill='url(%23d)' d='M-53.026-214.551h1151.06v322H-53.026z' transform='rotate(22.904 -53.026 -214.551)'/%3e%3c/mask%3e%3cg mask='url(%23e)'%3e%3cpath fill='white' d='M0 0h1368v400H0z'/%3e%3c/g%3e%3cdefs%3e%3clinearGradient id='a' x1='1219.07' x2='742.968' y1='-495.388' y2='450.243' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3clinearGradient id='b' x1='1154.63' x2='489.125' y1='-385.914' y2='449.365' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3clinearGradient id='c' x1='241.773' x2='-423.728' y1='-270.947' y2='564.332' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3clinearGradient id='d' x1='682.837' x2='312.949' y1='-1044.63' y2='11.113' gradientUnits='userSpaceOnUse'%3e%3cstop stop-color='white'/%3e%3cstop offset='1' stop-color='white' stop-opacity='0'/%3e%3c/linearGradient%3e%3c/defs%3e%3c/svg%3e")`, }; /** diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index c3c0ffb38f..7b42996707 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -1,12 +1,423 @@ # @backstage/ui +## 0.12.0-next.2 + +### Minor Changes + +- b63c25b: **BREAKING**: Removed gray scale tokens and renamed background surface tokens to neutral tokens + + The `--bui-gray-1` through `--bui-gray-8` tokens have been removed. The `--bui-bg-surface-*` and `--bui-bg-neutral-on-surface-*` tokens have been replaced by a unified `--bui-bg-neutral-*` scale. + + **Migration:** + + Replace surface tokens directly: + + ```diff + - background: var(--bui-bg-surface-0); + + background: var(--bui-bg-app); + ``` + + Replace on-surface tokens shifted by +1: + + ```diff + - background: var(--bui-bg-neutral-on-surface-0); + + background: var(--bui-bg-neutral-1); + ``` + + Replace gray tokens 1-4 with neutral equivalents (`--bui-gray-5` through `--bui-gray-8` have no direct replacement): + + ```diff + - background: var(--bui-gray-1); + + background: var(--bui-bg-neutral-1); + ``` + +### Patch Changes + +- c8ae765: Fixed nested Accordion icon state issue where the inner accordion's arrow icon would incorrectly show as expanded when only the outer accordion was expanded. The CSS selector now uses a direct parent selector to ensure the icon only responds to its own accordion's expanded state. + + Affected components: Accordion + +- 5c76d13: Allow `ref` as a prop on the `Tag` component + + Affected components: Tag + +- 741a98d: Allow data to be passed directly to the `useTable` hook using the property `data` instead of `getData()` for mode `"complete"`. + + This simplifies usage as data changes, rather than having to perform a `useEffect` when data changes, and then reloading the data. It also happens immediately, so stale data won't remain until a rerender (with an internal async state change), so less flickering. + + Affected components: Table + +- a0fe1b2: Fixed changing columns after first render from crashing. It now renders the table with the new column layout as columns change. + + Affected components: Table + +- becf851: export PasswordField component +- 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. +- 8c39412: The Table component now wraps the react-aria-components `Table` with a `ResizableTableContainer` only if any column has a width property set. This means that column widths can adapt to the content otherwise (if no width is explicitly set). + + Affected components: Table + +- 20131c5: Migrated to use the standard `backstage-cli package build` for CSS bundling instead of a custom build script. +- Updated dependencies + - @backstage/version-bridge@1.0.12-next.0 + +## 0.12.0-next.1 + +### Minor Changes + +- 058ffd9: **BREAKING**: Removed `large` size variant from Button component as it was never implemented. + + **Migration:** + + ```diff + - + + + ``` + + **Affected components:** Button + +- 110fec0: **BREAKING**: Removed link and tint color tokens, added new status foreground tokens, and improved Link component styling + + The following color tokens have been removed: + + - `--bui-fg-link` (and all related tokens: `-hover`, `-pressed`, `-disabled`) + - `--bui-fg-tint` (and all related tokens: `-hover`, `-pressed`, `-disabled`) + - `--bui-bg-tint` (and all related tokens: `-hover`, `-pressed`, `-disabled`) + - `--bui-border-tint` (and all related tokens) + + **New Status Tokens:** + + Added dedicated tokens for status colors that distinguish between usage on status backgrounds vs. standalone usage: + + - `--bui-fg-danger-on-bg` / `--bui-fg-danger` + - `--bui-fg-warning-on-bg` / `--bui-fg-warning` + - `--bui-fg-success-on-bg` / `--bui-fg-success` + - `--bui-fg-info-on-bg` / `--bui-fg-info` + + The `-on-bg` variants are designed for text on colored backgrounds, while the base variants are for standalone status indicators with improved visibility and contrast. + + **Migration:** + + For link colors, migrate to one of the following alternatives: + + ```diff + .custom-link { + - color: var(--bui-fg-link); + + color: var(--bui-fg-info); /* For informational links */ + + /* or */ + + color: var(--bui-fg-primary); /* For standard text links */ + } + ``` + + For tint colors (backgrounds, foregrounds, borders), migrate to appropriate status or neutral colors: + + ```diff + .info-section { + - background: var(--bui-bg-tint); + + background: var(--bui-bg-info); /* For informational sections */ + + /* or */ + + background: var(--bui-bg-neutral-on-surface-0); /* For neutral emphasis */ + } + ``` + + If you're using status foreground colors on colored backgrounds, update to the new `-on-bg` tokens: + + ```diff + .error-badge { + - color: var(--bui-fg-danger); + + color: var(--bui-fg-danger-on-bg); + background: var(--bui-bg-danger); + } + ``` + + **Affected components:** Link + +### Patch Changes + +- 4d1b7f4: Fixed CSS Module syntax to comply with Next.js 16 Turbopack validation by flattening nested dark theme selectors. + + **Affected components:** Popover, Tooltip + +- 2c219b9: Added `destructive` prop to Button for dangerous actions like delete or remove. Works with all variants (primary, secondary, tertiary). + + **Affected components:** Button + +- 5af9e14: Fixed `useDefinition` hook adding literal "undefined" class name when no className prop was passed. +- 74c5a76: Fixed Switch component disabled state styling to show `not-allowed` cursor and disabled text color. + + **Affected components:** Switch + +## 0.12.0-next.0 + +### Minor Changes + +- b1f723b: **BREAKING**: Changed CSS selectors for `ButtonIcon` and `ButtonLink` components. Custom styles targeting `.bui-Button` to style these components must be updated to use `.bui-ButtonIcon` or `.bui-ButtonLink` respectively. + + ```diff + -/* This no longer styles ButtonIcon or ButtonLink */ + -.bui-Button[data-variant="primary"] { ... } + +/* Use component-specific selectors */ + +.bui-ButtonIcon[data-variant="primary"] { ... } + +.bui-ButtonLink[data-variant="primary"] { ... } + ``` + + Affected components: ButtonIcon, ButtonLink + +- caeb9ad: **BREAKING**: The `cell` and `header` properties in `ColumnConfig` now return `ReactElement` instead of `ReactNode`. + + This fixes an issue where React Aria's Collection component would inject an `id` prop into Fragment wrappers, causing "Invalid prop `id` supplied to `React.Fragment`" errors on render. + + Migration: + + ```diff + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + - cell: (item) => item.name, + + cell: (item) => , + - header: () => 'Name', + + header: () => Name, + }, + ]; + ``` + +### Patch Changes + +- 350c948: Fixed Box component to forward HTML attributes to the underlying div element. + + **Affected components:** Box + +- 7455dae: Use node prefix on native imports +- 508bd1a: Added new `Alert` component with support for status variants (info, success, warning, danger), icons, loading states, and custom actions. + + Updated status color tokens for improved contrast and consistency across light and dark themes: + + - Added new `--bui-bg-info` and `--bui-fg-info` tokens for info status + - Updated `--bui-bg-danger`, `--bui-fg-danger` tokens + - Updated `--bui-bg-warning`, `--bui-fg-warning` tokens + - Updated `--bui-bg-success`, `--bui-fg-success` tokens + + **Affected components**: Alert + +- da30862: Fixed client-side navigation for container components by wrapping the container (not individual items) in RouterProvider. Components now conditionally provide routing context only when children have internal links, removing the Router context requirement when not needed. This also removes the need to wrap these components in MemoryRouter during tests when they are not using the `href` prop. + + Additionally, when multiple tabs match the current URL via prefix matching, the tab with the most specific path (highest segment count) is now selected. For example, with URL `/catalog/users/john`, a tab with path `/catalog/users` is now selected over a tab with path `/catalog`. + + Affected components: Tabs, Tab, TagGroup, Tag, Menu, MenuItem, MenuAutocomplete + +- 092c453: Fixed an infinite render loop in Tabs when navigating to a URL that doesn't match any tab `href`. +- 5320aa8: Fixed components to not require a Router context when rendering without internal links. + + Affected components: Link, ButtonLink, Row + +- cb090b4: Bump react-aria-components to v1.14.0 +- c429101: Fixed React 17 compatibility by using `useId` from `react-aria` instead of the built-in React hook which is only available in React 18+. +- Updated dependencies + - @backstage/version-bridge@1.0.11 + +## 0.11.0 + +### Minor Changes + +- 243e5e7: **BREAKING**: Redesigned Table component with new `useTable` hook API. + + - The `Table` component (React Aria wrapper) is renamed to `TableRoot` + - New high-level `Table` component that handles data display, pagination, sorting, and selection + - The `useTable` hook is completely redesigned with a new API supporting three pagination modes (complete, offset, cursor) + - New types: `ColumnConfig`, `TableProps`, `TableItem`, `UseTableOptions`, `UseTableResult` + + New features include unified pagination modes, debounced query changes, stale data preservation during reloads, and row selection with toggle/replace behaviors. + + **Migration:** + + 1. Update imports and use the new `useTable` hook: + + ```diff + -import { Table, useTable } from '@backstage/ui'; + -const { data, paginationProps } = useTable({ data: items, pagination: {...} }); + +import { Table, useTable, type ColumnConfig } from '@backstage/ui'; + +const { tableProps } = useTable({ + + mode: 'complete', + + getData: () => items, + +}); + ``` + + 2. Define columns and render with the new Table API: + + ```diff + -
    + - ... + - ... + -
    + - + +const columns: ColumnConfig[] = [ + + { id: 'name', label: 'Name', isRowHeader: true, cell: item => }, + + { id: 'type', label: 'Type', cell: item => }, + +]; + + + + + ``` + + **Affected components:** Table, TableRoot, TablePagination + +- 95246eb: **BREAKING**: Updating color tokens to match the new neutral style on different surfaces. + + **Migration:** + + There's no direct replacement for the old tint tokens but you can use the new neutral set of color tokens on surface 0 or 1 as a replacement. + + - `--bui-bg-tint` can be replaced by `--bui-bg-neutral-on-surface-0` + - `--bui-bg-tint-hover` can be replaced by `--bui-bg-neutral-on-surface-0-hover` + - `--bui-bg-tint-pressed` can be replaced by `--bui-bg-neutral-on-surface-0-pressed` + - `--bui-bg-tint-disabled` can be replaced by `--bui-bg-neutral-on-surface-0-disabled` + +- ea0c6d8: **BREAKING**: Introduce new `ToggleButton` & `ToggleButtonGroup` components in Backstage UI + + **Affected components:** ToggleButton, ToggleButtonGroup + +- 4ea1d15: **BREAKING**: Renamed CSS variable `--bui-bg` to `--bui-bg-surface-0` for consistency. + +### Patch Changes + +- 1880402: Fixes app background color on dark mode. + + **Affected components:** Box + +- d2fdded: Added indeterminate state support to the Checkbox component for handling partial selection scenarios like table header checkboxes. + + **Affected components:** Checkbox + +- 4fb15d2: Added missing `aria-label` attributes to `SearchField` components in `Select`, `MenuAutocomplete`, and `MenuAutocompleteListbox` to fix accessibility warnings. + + **Affected components:** Select, MenuAutocomplete, MenuAutocompleteListbox + +- 21c87cc: Fixes disabled state in primary and secondary buttons in Backstage UI. + + **Affected components:** Button + +- 9c76682: build(deps-dev): bump `storybook` from 10.1.9 to 10.1.10 +- de80336: Fixed disabled tertiary buttons incorrectly showing hover effects on surfaces. + + **Affected components:** Button + +- 133d5c6: Added new Popover component for Backstage UI with automatic overflow handling, and full placement support. Also introduced `--bui-shadow` token for consistent elevation styling across overlay components (Popover, Tooltip, Menu). + + **Affected components:** Popover + +- 973c839: Fixed Table sorting indicator not being visible when a column is actively sorted. + + **Affected components:** Table, Column + +- df40cfc: Fixed Menu component trigger button not toggling correctly. Removed custom click-outside handler that was interfering with React Aria's built-in state management, allowing the menu to properly open and close when clicking the trigger button. + + **Affected components:** Menu + +- b01ab96: Added support for column width configuration in Table component. Columns now accept `width`, `defaultWidth`, `minWidth`, and `maxWidth` props for responsive layout control. + + **Affected components:** Table, Column + +- b4a4911: Fixed SearchField `startCollapsed` prop not working correctly in Backstage UI. The field now properly starts in a collapsed state, expands when clicked and focused, and collapses back when unfocused with no input. Also fixed CSS logic to work correctly in all layout contexts (flex row, flex column, and regular containers). + + **Affected components:** SearchField + +- b3253b6: Fixed `Link` component causing hard page refreshes for internal routes. The component now properly uses React Router's navigation instead of full page reloads. +- fe7fe69: Added support for custom pagination options in `useTable` hook and `Table` component. You can now configure `pageSizeOptions` to customize the page size dropdown, and hook into pagination events via `onPageSizeChange`, `onNextPage`, and `onPreviousPage` callbacks. When `pageSize` doesn't match any option, the first option is used and a warning is logged. + + **Affected components:** Table, TablePagination + +- cfac8a4: Fixed missing border styles on table selection cells in multi-select mode. + + **Affected components:** Table + +- 2532d2a: Added `className` and `style` props to the `Table` component. + + **Affected components:** Table + +## 0.11.0-next.1 + +### Minor Changes + +- 243e5e7: **BREAKING**: Redesigned Table component with new `useTable` hook API. + + - The `Table` component (React Aria wrapper) is renamed to `TableRoot` + - New high-level `Table` component that handles data display, pagination, sorting, and selection + - The `useTable` hook is completely redesigned with a new API supporting three pagination modes (complete, offset, cursor) + - New types: `ColumnConfig`, `TableProps`, `TableItem`, `UseTableOptions`, `UseTableResult` + + New features include unified pagination modes, debounced query changes, stale data preservation during reloads, and row selection with toggle/replace behaviors. + + **Migration:** + + 1. Update imports and use the new `useTable` hook: + + ```diff + -import { Table, useTable } from '@backstage/ui'; + -const { data, paginationProps } = useTable({ data: items, pagination: {...} }); + +import { Table, useTable, type ColumnConfig } from '@backstage/ui'; + +const { tableProps } = useTable({ + + mode: 'complete', + + getData: () => items, + +}); + ``` + + 2. Define columns and render with the new Table API: + + ```diff + -
    + - ... + - ... + -
    + - + +const columns: ColumnConfig[] = [ + + { id: 'name', label: 'Name', isRowHeader: true, cell: item => }, + + { id: 'type', label: 'Type', cell: item => }, + +]; + + + + + ``` + + **Affected components:** Table, TableRoot, TablePagination + +- 95246eb: **BREAKING**: Updating color tokens to match the new neutral style on different surfaces. + + **Migration:** + + There's no direct replacement for the old tint tokens but you can use the new neutral set of color tokens on surface 0 or 1 as a replacement. + + - `--bui-bg-tint` can be replaced by `--bui-bg-neutral-on-surface-0` + - `--bui-bg-tint-hover` can be replaced by `--bui-bg-neutral-on-surface-0-hover` + - `--bui-bg-tint-pressed` can be replaced by `--bui-bg-neutral-on-surface-0-pressed` + - `--bui-bg-tint-disabled` can be replaced by `--bui-bg-neutral-on-surface-0-disabled` + +- ea0c6d8: Introduce new `ToggleButton` & `ToggleButtonGroup` components in Backstage UI + +### Patch Changes + +- 21c87cc: Fixes disabled state in primary and secondary buttons in Backstage UI. +- b3253b6: Fixed `Link` component causing hard page refreshes for internal routes. The component now properly uses React Router's navigation instead of full page reloads. + +## 0.11.0-next.0 + +### Minor Changes + +- 4ea1d15: **BREAKING**: Renamed CSS variable `--bui-bg` to `--bui-bg-surface-0` for consistency. + +### Patch Changes + +- 1880402: Fixes app background color on dark mode. +- 9c76682: build(deps-dev): bump `storybook` from 10.1.9 to 10.1.10 +- b4a4911: Fixed SearchField `startCollapsed` prop not working correctly in Backstage UI. The field now properly starts in a collapsed state, expands when clicked and focused, and collapses back when unfocused with no input. Also fixed CSS logic to work correctly in all layout contexts (flex row, flex column, and regular containers). + + **Affected components:** SearchField + ## 0.10.0 ### Minor Changes -- 16543fa: **Breaking change** The `Cell` component has been refactored to be a generic wrapper component that accepts `children` for custom cell content. The text-specific functionality (previously part of `Cell`) has been moved to a new `CellText` component. +- 16543fa: **BREAKING**: The `Cell` component has been refactored to be a generic wrapper component that accepts `children` for custom cell content. The text-specific functionality (previously part of `Cell`) has been moved to a new `CellText` component. - ### Migration Guide + **Migration:** If you were using `Cell` with text-specific props (`title`, `description`, `leadingIcon`, `href`), you need to update your code to use `CellText` instead: @@ -42,32 +453,32 @@ - 50b7927: Fixed Checkbox indicator showing checkmark color when unchecked. - Affected components: Checkbox + **Affected components:** Checkbox - 5bacf55: Fixed `ButtonIcon` incorrectly applying `className` to inner elements instead of only the root element. - Affected components: ButtonIcon + **Affected components:** ButtonIcon - b3ad928: Fixed Table Row component to correctly handle cases where no `href` is provided, preventing unnecessary router provider wrapping and fixing the cursor incorrectly showing as a pointer despite the element not being a link. - Affected components: Row + **Affected components:** Row - a20d317: Added row selection support with visual state styling for hover, selected, and pressed states. Fixed checkbox rendering to only show for multi-select toggle mode. - Affected components: Table, TableHeader, Row, Column + **Affected components:** Table, TableHeader, Row, Column - fe7c751: Fixed `useTable` hook to prioritize `providedRowCount` over data length for accurate row count in server-side pagination scenarios. - c145031: Fixed Table column sorting indicator to show up arrow when no sort is active, correctly indicating that clicking will sort ascending. - Affected components: Column + **Affected components:** Column ## 0.10.0-next.1 ### Minor Changes -- 16543fa: **Breaking change** The `Cell` component has been refactored to be a generic wrapper component that accepts `children` for custom cell content. The text-specific functionality (previously part of `Cell`) has been moved to a new `CellText` component. +- 16543fa: **BREAKING**: The `Cell` component has been refactored to be a generic wrapper component that accepts `children` for custom cell content. The text-specific functionality (previously part of `Cell`) has been moved to a new `CellText` component. - ### Migration Guide + **Migration:** If you were using `Cell` with text-specific props (`title`, `description`, `leadingIcon`, `href`), you need to update your code to use `CellText` instead: @@ -103,15 +514,15 @@ - 50b7927: Fixed Checkbox indicator showing checkmark color when unchecked. - Affected components: Checkbox + **Affected components:** Checkbox - 5bacf55: Fixed `ButtonIcon` incorrectly applying `className` to inner elements instead of only the root element. - Affected components: ButtonIcon + **Affected components:** ButtonIcon - a20d317: Added row selection support with visual state styling for hover, selected, and pressed states. Fixed checkbox rendering to only show for multi-select toggle mode. - Affected components: Table, TableHeader, Row, Column + **Affected components:** Table, TableHeader, Row, Column ## 0.9.1-next.0 @@ -119,12 +530,12 @@ - b3ad928: Fixed Table Row component to correctly handle cases where no `href` is provided, preventing unnecessary router provider wrapping and fixing the cursor incorrectly showing as a pointer despite the element not being a link. - Affected components: Row + **Affected components:** Row - fe7c751: Fixed `useTable` hook to prioritize `providedRowCount` over data length for accurate row count in server-side pagination scenarios. - c145031: Fixed Table column sorting indicator to show up arrow when no sort is active, correctly indicating that clicking will sort ascending. - Affected components: Column + **Affected components:** Column ## 0.9.0 @@ -140,7 +551,7 @@ - `large` size **changed from 3rem to 2.5rem** (40px) - New `x-large` size added (3rem / 48px) - Migration: + **Migration:** ```diff # Remove Base UI-specific props @@ -154,6 +565,8 @@ Added `purpose` prop for accessibility control (`'informative'` or `'decoration'`). + **Affected components:** Avatar + - 5c614ff: **BREAKING**: Migrated Checkbox component from Base UI to React Aria Components. API changes required: @@ -167,7 +580,7 @@ - Data attribute: `data-checked` → `data-selected` - Use without label is no longer supported - Migration examples: + **Migration:** Before: @@ -209,12 +622,12 @@ ``` -- 134151f: Fixing styles on SearchField in Backstage UI after migration to CSS modules. `SearchField` has now its own set of class names. We previously used class names from `TextField` but this approach was creating some confusion so going forward in your theme you'll be able to theme `TextField` and `SearchField` separately. +- 134151f: **BREAKING**: Fixing styles on SearchField in Backstage UI after migration to CSS modules. `SearchField` has now its own set of class names. We previously used class names from `TextField` but this approach was creating some confusion so going forward in your theme you'll be able to theme `TextField` and `SearchField` separately. - a67670d: **BREAKING**: Removed central `componentDefinitions` object and related type utilities (`ComponentDefinitionName`, `ComponentClassNames`). Component definitions are primarily intended for documenting the CSS class API for theming purposes, not for programmatic use in JavaScript/TypeScript. - **Migration Guide:** + **Migration:** If you were using component definitions or class names to build custom components, we recommend migrating to either: @@ -223,21 +636,15 @@ - b78fc45: **BREAKING**: Changed className prop behavior to augment default styles instead of being ignored or overriding them. - Affected components: - - - Menu, MenuListBox, MenuAutocomplete, MenuAutocompleteListbox, MenuItem, MenuListBoxItem, MenuSection, MenuSeparator - - Switch - - Skeleton - - FieldLabel - - Header, HeaderToolbar - - HeaderPage - - Tabs, TabList, Tab, TabPanel - If you were passing custom className values to any of these components that relied on the previous behavior, you may need to adjust your styles to account for the default classes now being applied alongside your custom classes. + **Affected components:** Menu, MenuListBox, MenuAutocomplete, MenuAutocompleteListbox, MenuItem, MenuListBoxItem, MenuSection, MenuSeparator, Switch, Skeleton, FieldLabel, Header, HeaderToolbar, HeaderPage, Tabs, TabList, Tab, TabPanel + - 83c100e: **BREAKING**: Removed `Collapsible` component. Migrate to `Accordion` or use React Aria `Disclosure`. - ## Migration Path 1: Accordion (Opinionated Styled Component) + **Migration:** + + **Path 1: Accordion (Opinionated Styled Component)** Accordion provides preset styling with a similar component structure. @@ -258,7 +665,7 @@ CSS classes: `.bui-CollapsibleRoot` → `.bui-Accordion`, `.bui-CollapsibleTrigger` → `.bui-AccordionTrigger` (now on heading element), `.bui-CollapsiblePanel` → `.bui-AccordionPanel` - ## Migration Path 2: React Aria Disclosure (Full Customization) + **Path 2: React Aria Disclosure (Full Customization)** For custom styling without preset styles: @@ -275,30 +682,73 @@ Added searchable and multiple selection support to Select component. The component now accepts `searchable`, `selectionMode`, and `searchPlaceholder` props to enable filtering and multi-selection modes. - Migration: If you're using `SelectProps` type directly, update from `SelectProps` to `SelectProps<'single' | 'multiple'>`. Component usage remains backward compatible. + **Migration:** + + If you're using `SelectProps` type directly, update from `SelectProps` to `SelectProps<'single' | 'multiple'>`. Component usage remains backward compatible. + + **Affected components:** Select ### Patch Changes - d01de00: Fix broken external links in Backstage UI Header component. + + **Affected components:** Header + - 35a3614: Fixed CSS issues in Select component including popover width constraints, focus outline behavior, and overflow handling. + + **Affected components:** Select + - 01476f0: Improved visual consistency of PasswordField, SearchField, and MenuAutocomplete components. + + **Affected components:** PasswordField, SearchField, MenuAutocomplete + - 26c6a78: Fix default text color in Backstage UI + + **Affected components:** Text + - deaa427: Fixed Text component to prevent `truncate` prop from being spread to the underlying DOM element. + + **Affected components:** Text + - 1059f95: Improved the Link component structure in Backstage UI. + + **Affected components:** Link + - 836b0c7: Fixed dialog backdrop appearance in dark mode. + + **Affected components:** Dialog + - 6874094: Migrated CellProfile component from Base UI Avatar to Backstage UI Avatar component. + + **Affected components:** Avatar + - 719d772: Avatar components in x-small and small sizes now display only one initial instead of two, improving readability at smaller dimensions. + + **Affected components:** Avatar + - 6d35a6b: Removed `@base-ui-components/react` dependency as all components now use React Aria Components. - dac851f: Fix the default font size in Backstage UI. - 3c0ea67: Fix CSS layer ordering in Backstage UI to make sure component styles are loaded after tokens and base declarations. - 3b18d80: Fixed RadioGroup radio button ellipse distortion by preventing flex shrink and grow. + + **Affected components:** RadioGroup + - 4eb455c: Fix font smoothing as default in Backstage UI. - ff9f0c3: Enable tree-shaking of imports other than `*.css`. - 7839e7b: Added `loading` prop to Button and ButtonIcon components for displaying spinner during async operations. + + **Affected components:** Button, ButtonIcon + - a00fb88: Fixed Table Row component to properly support opening links in new tabs via right-click or Cmd+Click when using the `href` prop. + + **Affected components:** Table + - e16ece5: Set the color-scheme property depending on theme - 1ef3ca4: Added new VisuallyHidden component for hiding content visually while keeping it accessible to screen readers. -- 00bfb83: Fix default font wight and font family in Backstage UI. + + **Affected components:** VisuallyHidden + +- 00bfb83: Fix default font weight and font family in Backstage UI. ## 0.9.0-next.3 @@ -306,7 +756,9 @@ - 83c100e: **BREAKING**: Removed `Collapsible` component. Migrate to `Accordion` or use React Aria `Disclosure`. - ## Migration Path 1: Accordion (Opinionated Styled Component) + **Migration:** + + **Path 1: Accordion (Opinionated Styled Component)** Accordion provides preset styling with a similar component structure. @@ -327,7 +779,7 @@ CSS classes: `.bui-CollapsibleRoot` → `.bui-Accordion`, `.bui-CollapsibleTrigger` → `.bui-AccordionTrigger` (now on heading element), `.bui-CollapsiblePanel` → `.bui-AccordionPanel` - ## Migration Path 2: React Aria Disclosure (Full Customization) + **Path 2: React Aria Disclosure (Full Customization)** For custom styling without preset styles: @@ -344,7 +796,9 @@ Added searchable and multiple selection support to Select component. The component now accepts `searchable`, `selectionMode`, and `searchPlaceholder` props to enable filtering and multi-selection modes. - Migration: If you're using `SelectProps` type directly, update from `SelectProps` to `SelectProps<'single' | 'multiple'>`. Component usage remains backward compatible. + **Migration:** + + If you're using `SelectProps` type directly, update from `SelectProps` to `SelectProps<'single' | 'multiple'>`. Component usage remains backward compatible. ### Patch Changes @@ -369,7 +823,7 @@ - `large` size **changed from 3rem to 2.5rem** (40px) - New `x-large` size added (3rem / 48px) - Migration: + **Migration:** ```diff # Remove Base UI-specific props @@ -383,7 +837,7 @@ Added `purpose` prop for accessibility control (`'informative'` or `'decoration'`). -- 134151f: Fixing styles on SearchField in Backstage UI after migration to CSS modules. `SearchField` has now its own set of class names. We previously used class names from `TextField` but this approach was creating some confusion so going forward in your theme you'll be able to theme `TextField` and `SearchField` separately. +- 134151f: **BREAKING**: Fixing styles on SearchField in Backstage UI after migration to CSS modules. `SearchField` has now its own set of class names. We previously used class names from `TextField` but this approach was creating some confusion so going forward in your theme you'll be able to theme `TextField` and `SearchField` separately. ### Patch Changes @@ -412,7 +866,7 @@ - Data attribute: `data-checked` → `data-selected` - Use without label is no longer supported - Migration examples: + **Migration:** Before: @@ -456,18 +910,10 @@ - b78fc45: **BREAKING**: Changed className prop behavior to augment default styles instead of being ignored or overriding them. - Affected components: - - - Menu, MenuListBox, MenuAutocomplete, MenuAutocompleteListbox, MenuItem, MenuListBoxItem, MenuSection, MenuSeparator - - Switch - - Skeleton - - FieldLabel - - Header, HeaderToolbar - - HeaderPage - - Tabs, TabList, Tab, TabPanel - If you were passing custom className values to any of these components that relied on the previous behavior, you may need to adjust your styles to account for the default classes now being applied alongside your custom classes. + **Affected components:** Menu, MenuListBox, MenuAutocomplete, MenuAutocompleteListbox, MenuItem, MenuListBoxItem, MenuSection, MenuSeparator, Switch, Skeleton, FieldLabel, Header, HeaderToolbar, HeaderPage, Tabs, TabList, Tab, TabPanel + ### Patch Changes - ff9f0c3: Enable tree-shaking of imports other than `*.css`. @@ -481,7 +927,7 @@ - dac851f: Fix the default font size in Backstage UI. - 3c0ea67: Fix CSS layer ordering in Backstage UI to make sure component styles are loaded after tokens and base declarations. - 4eb455c: Fix font smoothing as default in Backstage UI. -- 00bfb83: Fix default font wight and font family in Backstage UI. +- 00bfb83: Fix default font weight and font family in Backstage UI. ## 0.8.0 @@ -554,10 +1000,10 @@ ### Minor Changes -- 0615e54: We are moving our DataTable component to React Aria. We removed our DataTable to only use Table as a single and opinionated option for tables. This new structure is made possible by using React Aria under the hood. -- b245c9d: Backstage UI - HeaderPage - We are updating the breadcrumb to be more visible and accessible. -- 800f593: **Breaking change** We are updating the Menu component to use React Aria under the hood. The structure and all props are changing to follow React Aria's guidance. -- b0e47f3: **Breaking** We are upgrading our `Text` component to support all font sizes making the `Heading` component redundant. The new `Text` component introduces 4 sizes for title and 4 sizes for body text. All of these work in multiple colors and font weights. We improved the `as` prop to include all possible values. The `Link` component has also been updated to match the new `Text` component. +- 0615e54: **BREAKING**: We are moving our DataTable component to React Aria. We removed our DataTable to only use Table as a single and opinionated option for tables. This new structure is made possible by using React Aria under the hood. +- b245c9d: **BREAKING**: Backstage UI - HeaderPage - We are updating the breadcrumb to be more visible and accessible. +- 800f593: **BREAKING**: We are updating the Menu component to use React Aria under the hood. The structure and all props are changing to follow React Aria's guidance. +- b0e47f3: **BREAKING**: We are upgrading our `Text` component to support all font sizes making the `Heading` component redundant. The new `Text` component introduces 4 sizes for title and 4 sizes for body text. All of these work in multiple colors and font weights. We improved the `as` prop to include all possible values. The `Link` component has also been updated to match the new `Text` component. ### Patch Changes @@ -566,7 +1012,7 @@ - f761306: Add new TagGroup component to Backstage UI. - 75fead9: Fixes a couple of small bugs in BUI including setting H1 and H2 correctly on the Header and HeaderPage. - e7ff178: Update styling of Tooltip element -- 230b410: **Breaking change** Move breadcrumb to fit in the `HeaderPage` instead of the `Header` in Backstage UI. +- 230b410: **BREAKING**: Move breadcrumb to fit in the `HeaderPage` instead of the `Header` in Backstage UI. - 2f9a084: We are motion away from `motion` to use `gsap` instead to make Backstage UI backward compatible with React 17. - d4e603e: Updated Menu component in Backstage UI to use useId() from React Aria instead of React to support React 17. - 8bdc491: Remove stylesheet import from Select component. @@ -577,11 +1023,11 @@ ### Minor Changes -- 0615e54: We are moving our DataTable component to React Aria. We removed our DataTable to only use Table as a single and opinionated option for tables. This new structure is made possible by using React Aria under the hood. +- 0615e54: **BREAKING**: We are moving our DataTable component to React Aria. We removed our DataTable to only use Table as a single and opinionated option for tables. This new structure is made possible by using React Aria under the hood. ### Patch Changes -- 230b410: **Breaking change** Move breadcrumb to fit in the `HeaderPage` instead of the `Header` in Backstage UI. +- 230b410: **BREAKING**: Move breadcrumb to fit in the `HeaderPage` instead of the `Header` in Backstage UI. - 8bdc491: Remove stylesheet import from Select component. - 404b426: Add `startCollapsed` prop on the `SearchField` component in BUI. @@ -603,7 +1049,7 @@ ### Minor Changes -- b0e47f3: **Breaking** We are upgrading our `Text` component to support all font sizes making the `Heading` component redundant. The new `Text` component introduces 4 sizes for title and 4 sizes for body text. All of these work in multiple colors and font weights. We improved the `as` prop to include all possible values. The `Link` component has also been updated to match the new `Text` component. +- b0e47f3: **BREAKING**: We are upgrading our `Text` component to support all font sizes making the `Heading` component redundant. The new `Text` component introduces 4 sizes for title and 4 sizes for body text. All of these work in multiple colors and font weights. We improved the `as` prop to include all possible values. The `Link` component has also been updated to match the new `Text` component. ### Patch Changes @@ -614,13 +1060,13 @@ ### Minor Changes -- e92bb9b: Canon has been renamed to Backstage UI. This means that `@backstage/canon` has been deprecated and replaced by `@backstage/ui`. +- e92bb9b: **BREAKING**: Canon has been renamed to Backstage UI. This means that `@backstage/canon` has been deprecated and replaced by `@backstage/ui`. ## 0.6.0-next.1 ### Minor Changes -- 2e30459: We are moving our Tooltip component to use React Aria under the hood. In doing so, the structure of the component and its prop are changing to follow the new underlying structure. +- 2e30459: **BREAKING**: We are moving our Tooltip component to use React Aria under the hood. In doing so, the structure of the component and its prop are changing to follow the new underlying structure. ### Patch Changes @@ -635,7 +1081,7 @@ ### Minor Changes -- 4c6d891: **BREAKING CHANGES** +- 4c6d891: **BREAKING**: We’re updating our Button component to provide better support for button links. @@ -658,12 +1104,12 @@ ### Minor Changes -- 621fac9: We are updating the default size of the Button component in Canon to be small instead of medium. -- a842554: We set the default size for IconButton in Canon to be small instead of medium. -- 35fd51d: Move TextField component to use react Aria under the hood. Introducing a new FieldLabel component to help build custom fields. -- 78204a2: **Breaking** We are adding a new as prop on the Heading and Text component to make it easier to change the component tag. We are removing the render prop in favour of the as prop. -- c49e335: TextField in Canon now has multiple label sizes as well as the capacity to hide label and description but still make them available for screen readers. -- 24b45ef: Fixes spacing props on layout components and aligned on naming for the Grid component. You should now call the Grid root component using instead of just . +- 621fac9: **BREAKING**: We are updating the default size of the Button component in Canon to be small instead of medium. +- a842554: **BREAKING**: We set the default size for IconButton in Canon to be small instead of medium. +- 35fd51d: **BREAKING**: Move TextField component to use react Aria under the hood. Introducing a new FieldLabel component to help build custom fields. +- 78204a2: **BREAKING**: We are adding a new as prop on the Heading and Text component to make it easier to change the component tag. We are removing the render prop in favour of the as prop. +- c49e335: **BREAKING**: TextField in Canon now has multiple label sizes as well as the capacity to hide label and description but still make them available for screen readers. +- 24b45ef: **BREAKING**: Fixes spacing props on layout components and aligned on naming for the Grid component. You should now call the Grid root component using `` instead of just ``. ### Patch Changes @@ -693,7 +1139,7 @@ ### Minor Changes -- 24b45ef: Fixes spacing props on layout components and aligned on naming for the Grid component. You should now call the Grid root component using instead of just . +- 24b45ef: Fixes spacing props on layout components and aligned on naming for the Grid component. You should now call the Grid root component using `` instead of just ``. ### Patch Changes @@ -703,9 +1149,9 @@ ### Minor Changes -- ea36f74: **Breaking Change** Icons on Button and IconButton now need to be imported and placed like this:
    - - Name - Owner - Type - Lifecycle - - - {data1.map(item => ( - - } - description={item.description} - /> - - - - - ))} - -
    - ); - }, -}; - -export const WithPaginationUncontrolled: Story = { - render: () => { - const { data, paginationProps } = useTable({ data: data1 }); - - return ( - <> - - - Name - Owner - Type - Lifecycle - - - {data?.map(item => ( - - } - description={item.description} - /> - - - - - ))} - -
    - - - ); - }, -}; - -export const WithPaginationControlled: Story = { - render: () => { - const [offset, setOffset] = useState(0); - const [pageSize, setPageSize] = useState(5); - - const { data, paginationProps } = useTable({ - data: data4, - pagination: { - offset, - pageSize, - onOffsetChange: setOffset, - onPageSizeChange: setPageSize, - onNextPage: () => console.log('Next page analytics'), - onPreviousPage: () => console.log('Previous page analytics'), - }, - }); - - return ( - <> - - - Band name - Genre - Year formed - Albums - - - {data?.map(item => ( - - - - - - - ))} - -
    - -
    - Current state: offset={offset}, pageSize={pageSize} -
    - - ); - }, -}; - -export const Sorting: Story = { - render: () => { - return ( - - - - Name - - Owner - Type - Lifecycle - - - {data1.map(item => ( - - } - description={item.description} - /> - - - - - ))} - -
    - ); - }, -}; - -export const TableRockBand: Story = { - render: () => { - const { data, paginationProps } = useTable({ - data: data4, - pagination: { - defaultPageSize: 5, - }, - }); - - return ( - <> - - - Band name - Genre - Year formed - Albums - - - {data?.map(item => ( - - - - - - - ))} - -
    - - - ); - }, -}; - -export const RowClick: Story = { - render: () => { - const { data, paginationProps } = useTable({ - data: data4, - pagination: { - defaultPageSize: 5, - }, - }); - - return ( - <> - - - Band name - Genre - Year formed - Albums - - - {data?.map(item => ( - alert('Row clicked')}> - - - - - - ))} - -
    - - - ); - }, -}; - -export const RowLink: Story = { - render: () => { - const { data, paginationProps } = useTable({ - data: data4, - pagination: { - defaultPageSize: 5, - }, - }); - - return ( - <> - - - Band name - Genre - Year formed - Albums - - - {data?.map(item => ( - - - - - - - ))} - -
    - - - ); - }, -}; - -export const CellComponent: Story = { - name: 'Cell', - render: () => { - return ( - - - Name - - - - Hello world - - - - This is a very long text that demonstrates how the Cell component - handles lengthy content. It should wrap appropriately and maintain - proper styling even when the text extends beyond the normal cell - width. This helps ensure that the table remains readable and - visually consistent regardless of the content length. - - - - Hello world - - -
    - ); - }, -}; - -export const CellTextComponent: Story = { - name: 'CellText', - render: () => { - return ( - - - Name - - - {data2.map(item => ( - - - - ))} - -
    - ); - }, -}; - -export const CellProfileComponent: Story = { - name: 'CellProfile', - render: () => { - return ( - - - Name - - - {data3.map(item => ( - - - - ))} - -
    - ); - }, -}; - -export const SelectionSingleToggle: Story = { - render: () => { - const [selectedKeys, setSelectedKeys] = useState(new Set([])); - - return ( - - - Name - Owner - Type - - - - - - - - - - - - - - - - - - -
    - ); - }, -}; - -export const SelectionMultiToggle: Story = { - render: () => { - const [selectedKeys, setSelectedKeys] = useState(new Set([])); - - return ( - - - Name - Owner - Type - - - - - - - - - - - - - - - - - - -
    - ); - }, -}; - -export const SelectionSingleReplace: Story = { - render: () => { - const [selectedKeys, setSelectedKeys] = useState(new Set([])); - - return ( - - - Name - Owner - Type - - - - - - - - - - - - - - - - - - -
    - ); - }, -}; - -export const SelectionMultiReplace: Story = { - render: () => { - const [selectedKeys, setSelectedKeys] = useState(new Set([])); - - return ( - - - Name - Owner - Type - - - - - - - - - - - - - - - - - - -
    - ); - }, -}; - -export const SelectionToggleWithActions: Story = { - render: () => { - const [selectedKeys, setSelectedKeys] = useState(new Set([])); - - return ( - alert(`Opening ${key}`)} - > - - Name - Owner - Type - - - - - - - - - - - - - - - - - - -
    - ); - }, -}; - -export const SelectionReplaceWithActions: Story = { - render: () => { - const [selectedKeys, setSelectedKeys] = useState(new Set([])); - - return ( - alert(`Opening ${key}`)} - > - - Name - Owner - Type - - - - - - - - - - - - - - - - - - -
    - ); - }, -}; - -export const SelectionToggleWithLinks: Story = { - render: () => { - const [selectedKeys, setSelectedKeys] = useState(new Set([])); - - return ( - - - Name - Owner - Type - - - - - - - - - - - - - - - - - - -
    - ); - }, -}; - -export const SelectionReplaceWithLinks: Story = { - render: () => { - const [selectedKeys, setSelectedKeys] = useState(new Set([])); - - return ( - - - Name - Owner - Type - - - - - - - - - - - - - - - - - - -
    - ); - }, -}; - -export const SelectionWithDisabledRows: Story = { - render: () => { - const [selectedKeys, setSelectedKeys] = useState(new Set([])); - - return ( - - - Name - Owner - Type - - - - - - - - - - - - - - - - - - -
    - ); - }, -}; - -export const SelectionWithPagination: Story = { - render: () => { - const [selectedKeys, setSelectedKeys] = useState(new Set([])); - - const { data, paginationProps } = useTable({ - data: data1, - pagination: { - defaultPageSize: 5, - }, - }); - - return ( - <> - - - Name - Owner - Type - - - {data?.map(item => ( - - - - - - ))} - -
    - - - ); - }, -}; - -export const SelectionModePlayground: Story = { - render: () => { - const [selectionMode, setSelectionMode] = useState<'single' | 'multiple'>( - 'multiple', - ); - const [selectedKeys, setSelectedKeys] = useState(new Set([])); - - return ( - - - - Name - Owner - Type - - - - - - - - - - - - - - - - - - -
    -
    - - Selection mode: - - { - setSelectionMode(value as 'single' | 'multiple'); - setSelectedKeys(new Set([])); - }} - > - single - multiple - -
    -
    - ); - }, -}; - -export const SelectionBehaviorPlayground: Story = { - render: () => { - const [selectionBehavior, setSelectionBehavior] = useState< - 'toggle' | 'replace' - >('toggle'); - const [selectedKeys, setSelectedKeys] = useState(new Set([])); - - return ( - - - - Name - Owner - Type - - - - - - - - - - - - - - - - - - -
    -
    - - Selection behavior: - - { - setSelectionBehavior(value as 'toggle' | 'replace'); - setSelectedKeys(new Set([])); - }} - > - toggle - replace - -
    -
    - ); - }, -}; diff --git a/packages/ui/src/components/Table/components/Column.tsx b/packages/ui/src/components/Table/components/Column.tsx index 9076ec8557..473f95a40e 100644 --- a/packages/ui/src/components/Table/components/Column.tsx +++ b/packages/ui/src/components/Table/components/Column.tsx @@ -20,7 +20,7 @@ import { TableDefinition } from '../definition'; import styles from '../Table.module.css'; import clsx from 'clsx'; import { ColumnProps } from '../types'; -import { RiArrowUpLine, RiArrowDownLine } from '@remixicon/react'; +import { RiArrowUpLine } from '@remixicon/react'; /** @public */ export const Column = (props: ColumnProps) => { @@ -32,7 +32,7 @@ export const Column = (props: ColumnProps) => { className={clsx(classNames.head, styles[classNames.head], className)} {...rest} > - {({ allowsSorting, sortDirection }) => ( + {({ allowsSorting }) => (
    { styles[classNames.headSortButton], )} > - {sortDirection === 'descending' ? ( - - ) : ( - - )} + )}
    diff --git a/packages/ui/src/components/Table/components/Row.tsx b/packages/ui/src/components/Table/components/Row.tsx index e08649c63b..df07e5ead2 100644 --- a/packages/ui/src/components/Table/components/Row.tsx +++ b/packages/ui/src/components/Table/components/Row.tsx @@ -20,14 +20,12 @@ import { useTableOptions, Cell as ReactAriaCell, Collection, - RouterProvider, } from 'react-aria-components'; import { Checkbox } from '../../Checkbox'; import { useStyles } from '../../../hooks/useStyles'; import { TableDefinition } from '../definition'; -import { useNavigate } from 'react-router-dom'; -import { useHref } from 'react-router-dom'; import { isExternalLink } from '../../../utils/isExternalLink'; +import { InternalLinkProvider } from '../../InternalLinkProvider'; import styles from '../Table.module.css'; import clsx from 'clsx'; import { Flex } from '../../Flex'; @@ -36,8 +34,7 @@ import { Flex } from '../../Flex'; export function Row(props: RowProps) { const { classNames, cleanedProps } = useStyles(TableDefinition, props); const { id, columns, children, href, ...rest } = cleanedProps; - const navigate = useNavigate(); - const isExternal = isExternalLink(href); + const hasInternalHref = !!href && !isExternalLink(href); let { selectionBehavior, selectionMode } = useTableOptions(); @@ -47,6 +44,7 @@ export function Row(props: RowProps) { @@ -61,30 +59,17 @@ export function Row(props: RowProps) { ); - if (!href || isExternal) { - return ( - - {content} - - ); - } - return ( - + {content} - + ); } diff --git a/packages/ui/src/components/Table/components/Table.tsx b/packages/ui/src/components/Table/components/Table.tsx index ffd0ab231d..523e5bd6c3 100644 --- a/packages/ui/src/components/Table/components/Table.tsx +++ b/packages/ui/src/components/Table/components/Table.tsx @@ -14,24 +14,229 @@ * limitations under the License. */ -import { useStyles } from '../../../hooks/useStyles'; -import { TableDefinition } from '../definition'; -import { - Table as ReactAriaTable, - type TableProps, -} from 'react-aria-components'; -import styles from '../Table.module.css'; -import clsx from 'clsx'; +import { useId } from 'react-aria'; +import { type Key, ResizableTableContainer } from 'react-aria-components'; +import { TableRoot } from './TableRoot'; +import { TableHeader } from './TableHeader'; +import { TableBody } from './TableBody'; +import { Row } from './Row'; +import { Column } from './Column'; +import { TablePagination } from '../../TablePagination'; +import type { + TableProps, + TableItem, + RowConfig, + RowRenderFn, + TablePaginationType, +} from '../types'; +import { useMemo } from 'react'; +import { VisuallyHidden } from '../../VisuallyHidden'; +import { Flex } from '../../Flex'; + +function isRowRenderFn( + rowConfig: RowConfig | RowRenderFn | undefined, +): rowConfig is RowRenderFn { + return typeof rowConfig === 'function'; +} + +function useDisabledRows({ + data, + rowConfig, +}: Pick, 'data' | 'rowConfig'>): Set | undefined { + return useMemo(() => { + if (!data || typeof rowConfig === 'function' || !rowConfig?.getIsDisabled) { + return; + } + + return data.reduce>((set, item) => { + const isDisabled = rowConfig.getIsDisabled?.(item); + if (isDisabled) { + set.add(String(item.id)); + } + return set; + }, new Set()); + }, [data, rowConfig]); +} + +function useLiveRegionLabel( + pagination: TablePaginationType, + isStale: boolean, + hasData: boolean, +): string { + if (!hasData || pagination.type === 'none') { + return ''; + } + + const { pageSize, offset, totalCount, getLabel } = pagination; + + if (isStale) { + return 'Loading table data.'; + } + + let liveRegionLabel = 'Table page loaded. '; + + if (getLabel) { + liveRegionLabel += getLabel({ pageSize, offset, totalCount }); + } else if (offset !== undefined) { + const fromCount = offset + 1; + const toCount = Math.min(offset + pageSize, totalCount ?? 0); + liveRegionLabel += `Showing ${fromCount} to ${toCount} of ${totalCount}`; + } + return liveRegionLabel; +} /** @public */ -export const Table = (props: TableProps) => { - const { classNames, cleanedProps } = useStyles(TableDefinition, props); +export function Table({ + columnConfig, + data, + loading = false, + isStale = false, + error, + pagination, + sort, + rowConfig, + selection, + emptyState, + className, + style, +}: TableProps) { + const liveRegionId = useId(); + + const visibleColumns = useMemo( + () => columnConfig.filter(col => !col.isHidden), + [columnConfig], + ); + const disabledRows = useDisabledRows({ data, rowConfig }); + + const { + mode: selectionMode, + selected: selectedKeys, + behavior: selectionBehavior, + onSelectionChange, + } = selection || {}; + + if (loading && !data) { + return ( +
    + Loading... +
    + ); + } + + if (error) { + return ( +
    + Error: {error.message} +
    + ); + } + + const liveRegionLabel = useLiveRegionLabel( + pagination, + isStale, + data !== undefined, + ); + + const manualColumnSizing = columnConfig.some( + col => + col.width != null || + col.minWidth != null || + col.maxWidth != null || + col.defaultWidth != null, + ); + + const wrapResizable = manualColumnSizing + ? (elem: React.ReactNode) => ( + {elem} + ) + : (elem: React.ReactNode) => <>{elem}; return ( - +
    + + {liveRegionLabel} + + {wrapResizable( + + + {column => + column.header ? ( + column.header() + ) : ( + + {column.label} + + ) + } + + {emptyState} : undefined + } + > + {item => { + const itemIndex = data?.indexOf(item) ?? -1; + + if (isRowRenderFn(rowConfig)) { + return rowConfig({ + item, + index: itemIndex, + }); + } + + return ( + rowConfig?.onClick?.(item) + : undefined + } + > + {column => column.cell(item)} + + ); + }} + + , + )} + {pagination.type === 'page' && ( + + )} +
    ); -}; +} diff --git a/plugins/catalog-react/src/alpha/predicates/types.ts b/packages/ui/src/components/Table/components/TableRoot.tsx similarity index 50% rename from plugins/catalog-react/src/alpha/predicates/types.ts rename to packages/ui/src/components/Table/components/TableRoot.tsx index f19026c01b..95e80dcf51 100644 --- a/plugins/catalog-react/src/alpha/predicates/types.ts +++ b/packages/ui/src/components/Table/components/TableRoot.tsx @@ -14,27 +14,27 @@ * limitations under the License. */ -/** @alpha */ -export type EntityPredicate = - | EntityPredicateExpression - | EntityPredicatePrimitive - | { $all: EntityPredicate[] } - | { $any: EntityPredicate[] } - | { $not: EntityPredicate }; +import { useStyles } from '../../../hooks/useStyles'; +import { TableDefinition } from '../definition'; +import { Table as ReactAriaTable } from 'react-aria-components'; +import styles from '../Table.module.css'; +import clsx from 'clsx'; +import { TableRootProps } from '../types'; -/** @alpha */ -export type EntityPredicateExpression = { - [KPath in string]: EntityPredicateValue; -} & { - [KPath in `$${string}`]: never; +/** @public */ +export const TableRoot = (props: TableRootProps) => { + const { classNames, dataAttributes, cleanedProps } = useStyles( + TableDefinition, + props, + ); + + return ( + + ); }; - -/** @alpha */ -export type EntityPredicateValue = - | EntityPredicatePrimitive - | { $exists: boolean } - | { $in: EntityPredicatePrimitive[] } - | { $contains: EntityPredicate }; - -/** @alpha */ -export type EntityPredicatePrimitive = string | number | boolean; diff --git a/packages/ui/src/components/Table/definition.ts b/packages/ui/src/components/Table/definition.ts index 313604902c..ca4fca999a 100644 --- a/packages/ui/src/components/Table/definition.ts +++ b/packages/ui/src/components/Table/definition.ts @@ -42,4 +42,7 @@ export const TableDefinition = { headSelection: 'bui-TableHeadSelection', cellSelection: 'bui-TableCellSelection', }, + dataAttributes: { + stale: [true, false] as const, + }, } as const satisfies ComponentDefinition; diff --git a/packages/ui/src/components/Table/hooks/getEffectivePageSize.ts b/packages/ui/src/components/Table/hooks/getEffectivePageSize.ts new file mode 100644 index 0000000000..41b246da9f --- /dev/null +++ b/packages/ui/src/components/Table/hooks/getEffectivePageSize.ts @@ -0,0 +1,52 @@ +/* + * 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 type { PageSizeOption } from '../../TablePagination/types'; +import type { PaginationOptions } from './types'; + +const DEFAULT_PAGE_SIZE = 20; + +function getOptionValue(option: number | PageSizeOption): number { + return typeof option === 'number' ? option : option.value; +} + +/** @internal */ +export function getEffectivePageSize( + paginationOptions: PaginationOptions, +): number { + const { pageSize, pageSizeOptions } = paginationOptions; + + if (!pageSizeOptions) { + return pageSize ?? DEFAULT_PAGE_SIZE; + } + + const firstValue = getOptionValue(pageSizeOptions[0]); + + if (pageSize === undefined) { + return firstValue; + } + + const isValid = pageSizeOptions.some(opt => getOptionValue(opt) === pageSize); + + if (isValid) { + return pageSize; + } + + console.warn( + `useTable: pageSize ${pageSize} is not in pageSizeOptions, using ${firstValue} instead`, + ); + return firstValue; +} diff --git a/packages/ui/src/components/Table/hooks/types.ts b/packages/ui/src/components/Table/hooks/types.ts index 8c93d678fc..163ec7741f 100644 --- a/packages/ui/src/components/Table/hooks/types.ts +++ b/packages/ui/src/components/Table/hooks/types.ts @@ -15,73 +15,163 @@ */ import type { TablePaginationProps } from '../../TablePagination/types'; +import type { SortDescriptor, TableItem, TableProps } from '../types'; /** @public */ -export interface UseTablePaginationConfig { - /** Total number of rows in the dataset - only needed when data is not provided at the top level */ - rowCount?: number; - - // Controlled pagination with offset/pageSize (Backstage style) - /** Current offset. When provided, pagination is controlled */ - offset?: number; - /** Current page size. When provided, pagination is controlled */ - pageSize?: number; - /** Callback when offset changes */ - onOffsetChange?: (offset: number) => void; - /** Callback when page size changes */ - onPageSizeChange?: (pageSize: number) => void; - - // Uncontrolled pagination defaults - /** Default page size for uncontrolled mode */ - defaultPageSize?: number; - /** Default offset for uncontrolled mode */ - defaultOffset?: number; - - // Analytics callbacks - /** Callback when next page is clicked */ - onNextPage?: () => void; - /** Callback when previous page is clicked */ - onPreviousPage?: () => void; - - // UI options - /** Whether to show page size options */ - showPageSizeOptions?: boolean; +export interface FilterState { + value: TFilter | undefined; + onChange: (value: TFilter) => void; } /** @public */ -export interface UseTablePagination { - /** Props to pass to TablePagination component */ - paginationProps: TablePaginationProps; - /** Current offset */ +export interface SearchState { + value: string; + onChange: (value: string) => void; +} + +/** @public */ +export interface QueryOptions { + initialSort?: SortDescriptor; + sort?: SortDescriptor | null; + onSortChange?: (sort: SortDescriptor) => void; + + initialFilter?: TFilter; + filter?: TFilter; + onFilterChange?: (filter: TFilter) => void; + + initialSearch?: string; + search?: string; + onSearchChange?: (search: string) => void; +} + +/** @public */ +export interface PaginationOptions + extends Partial< + Pick< + TablePaginationProps, + | 'pageSize' + | 'pageSizeOptions' + | 'onPageSizeChange' + | 'onNextPage' + | 'onPreviousPage' + | 'showPageSizeOptions' + | 'getLabel' + > + > { + initialOffset?: number; +} + +/** @public */ +export interface OffsetParams { offset: number; - /** Current page size */ pageSize: number; - /** Sliced data for current page - only available when data is provided to useTable */ - data?: T[]; - /** Go to next page */ - nextPage: () => void; - /** Go to previous page */ - previousPage: () => void; - /** Set specific offset */ - setOffset: (offset: number) => void; - /** Set page size */ - setPageSize: (pageSize: number) => void; + sort: SortDescriptor | null; + filter: TFilter | undefined; + search: string; + signal: AbortSignal; } /** @public */ -export interface UseTableConfig { - /** Full dataset - when provided, rowCount is calculated automatically and sliced data is returned */ - data?: T[]; - /** Pagination configuration */ - pagination?: UseTablePaginationConfig; +export interface CursorParams { + cursor: string | undefined; + pageSize: number; + sort: SortDescriptor | null; + filter: TFilter | undefined; + search: string; + signal: AbortSignal; } /** @public */ -export interface UseTableResult { - /** Sliced data for current page */ - data?: T[]; - /** Props to pass to TablePagination component */ - paginationProps: TablePaginationProps; - /** Pagination utilities */ - pagination: UseTablePagination; +export interface OffsetResponse { + data: T[]; + totalCount: number; +} + +/** @public */ +export interface CursorResponse { + data: T[]; + nextCursor?: string; + prevCursor?: string; + totalCount?: number; +} + +/** @public */ +export type UseTableCompleteOptions< + T extends TableItem, + TFilter = unknown, +> = QueryOptions & { + mode: 'complete'; + paginationOptions?: PaginationOptions; + sortFn?: (data: T[], sort: SortDescriptor) => T[]; + filterFn?: (data: T[], filter: TFilter) => T[]; + searchFn?: (data: T[], search: string) => T[]; +} & ( + | { + data: T[] | undefined; + getData?: never; + } + | { + data?: never; + getData: () => T[] | Promise; + } + ); + +/** @public */ +export interface UseTableOffsetOptions + extends QueryOptions { + mode: 'offset'; + getData: (params: OffsetParams) => Promise>; + paginationOptions?: PaginationOptions; +} + +/** @public */ +export interface UseTableCursorOptions + extends QueryOptions { + mode: 'cursor'; + getData: (params: CursorParams) => Promise>; + paginationOptions?: Omit; +} + +/** @public */ +export type UseTableOptions = + | UseTableCompleteOptions + | UseTableOffsetOptions + | UseTableCursorOptions; + +/** @public */ +export interface UseTableResult { + tableProps: Omit< + TableProps, + 'columnConfig' | 'rowConfig' | 'selection' | 'emptyState' + >; + reload: () => void; + filter: FilterState; + search: SearchState; +} + +/** @internal */ +export interface PaginationResult { + data: T[] | undefined; + loading: boolean; + error: Error | undefined; + totalCount: number | undefined; + offset?: number; + pageSize: number; + hasNextPage: boolean; + hasPreviousPage: boolean; + onNextPage: () => void; + onPreviousPage: () => void; + onPageSizeChange: (size: number) => void; +} + +/** @internal */ +export interface QueryState { + sort: SortDescriptor | null; + setSort: (sort: SortDescriptor) => void; + + filter: TFilter | undefined; + setFilter: (filter: TFilter) => void; + + search: string; + setSearch: (search: string) => void; } diff --git a/packages/ui/src/components/Table/hooks/useCompletePagination.ts b/packages/ui/src/components/Table/hooks/useCompletePagination.ts new file mode 100644 index 0000000000..5aae9a36c1 --- /dev/null +++ b/packages/ui/src/components/Table/hooks/useCompletePagination.ts @@ -0,0 +1,158 @@ +/* + * 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 { useState, useCallback, useMemo, useEffect, useRef } from 'react'; +import type { TableItem } from '../types'; +import type { + PaginationResult, + QueryState, + UseTableCompleteOptions, +} from './types'; +import { useStableCallback } from './useStableCallback'; +import { getEffectivePageSize } from './getEffectivePageSize'; + +/** @internal */ +export function useCompletePagination( + options: UseTableCompleteOptions, + query: QueryState, +): PaginationResult & { reload: () => void } { + const { + data, + getData: getDataProp = () => [], + paginationOptions = {}, + sortFn, + filterFn, + searchFn, + } = options; + const { initialOffset = 0 } = paginationOptions; + const defaultPageSize = getEffectivePageSize(paginationOptions); + + const getData = useStableCallback(getDataProp); + const { sort, filter, search } = query; + + const [items, setItems] = useState([]); + const [isLoading, setIsLoading] = useState(!data); + const [error, setError] = useState(undefined); + const [loadCount, setLoadCount] = useState(0); + + const [offset, setOffset] = useState(initialOffset); + const [pageSize, setPageSize] = useState(defaultPageSize); + + // Load data on mount and when loadCount changes (reload trigger) + useEffect(() => { + if (data) { + return; + } + + let cancelled = false; + setIsLoading(true); + setError(undefined); + + (async () => { + try { + const result = getData(); + const data = result instanceof Promise ? await result : result; + if (!cancelled) { + setItems(data); + setIsLoading(false); + } + } catch (err) { + if (!cancelled) { + setError(err instanceof Error ? err : new Error(String(err))); + setIsLoading(false); + } + } + })(); + + return () => { + cancelled = true; + }; + }, [data, getData, loadCount]); + + // Reset offset when query changes (query object is memoized) + const prevQueryRef = useRef(query); + useEffect(() => { + if (prevQueryRef.current !== query) { + prevQueryRef.current = query; + setOffset(0); + } + }, [query]); + + const resolvedItems = useMemo(() => data ?? items, [data, items]); + + // Process data client-side (filter, search, sort) + const processedData = useMemo(() => { + let result = [...resolvedItems]; + if (filter !== undefined && filterFn) { + result = filterFn(result, filter); + } + if (search && searchFn) { + result = searchFn(result, search); + } + if (sort && sortFn) { + result = sortFn(result, sort); + } + return result; + }, [resolvedItems, sort, filter, search, filterFn, searchFn, sortFn]); + + const totalCount = processedData.length; + + // Paginate the processed data + const paginatedData = useMemo( + () => processedData.slice(offset, offset + pageSize), + [processedData, offset, pageSize], + ); + + const hasNextPage = offset + pageSize < totalCount; + const hasPreviousPage = offset > 0; + + const onNextPage = useCallback(() => { + if (offset + pageSize < totalCount) { + setOffset(offset + pageSize); + } + }, [offset, pageSize, totalCount]); + + const onPreviousPage = useCallback(() => { + if (offset > 0) { + setOffset(Math.max(0, offset - pageSize)); + } + }, [offset, pageSize]); + + const onPageSizeChange = useCallback((newSize: number) => { + setPageSize(newSize); + setOffset(0); + }, []); + + const reload = useCallback(() => { + setOffset(0); + setLoadCount(c => c + 1); + }, []); + + return { + data: paginatedData, + loading: isLoading, + error, + totalCount, + offset, + pageSize, + hasNextPage, + hasPreviousPage, + onNextPage, + onPreviousPage, + onPageSizeChange, + reload, + }; +} diff --git a/packages/ui/src/components/Table/hooks/useCursorPagination.ts b/packages/ui/src/components/Table/hooks/useCursorPagination.ts new file mode 100644 index 0000000000..5da56b3ce4 --- /dev/null +++ b/packages/ui/src/components/Table/hooks/useCursorPagination.ts @@ -0,0 +1,93 @@ +/* + * 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 { useState, useCallback } from 'react'; +import type { TableItem } from '../types'; +import type { + UseTableCursorOptions, + CursorParams, + QueryState, + PaginationResult, +} from './types'; +import { usePageCache } from './usePageCache'; +import { useStableCallback } from './useStableCallback'; +import { useDebouncedReload } from './useDebouncedReload'; +import { getEffectivePageSize } from './getEffectivePageSize'; + +export function useCursorPagination( + options: UseTableCursorOptions, + query: QueryState, +): PaginationResult & { reload: () => void } { + const { getData: getDataProp, paginationOptions = {} } = options; + const defaultPageSize = getEffectivePageSize(paginationOptions); + + const getData = useStableCallback(getDataProp); + const { sort, filter, search } = query; + + const [pageSize, setPageSize] = useState(defaultPageSize); + + const wrappedGetData = useCallback( + async ({ + cursor, + signal, + }: { + cursor: string | undefined; + signal: AbortSignal; + }) => { + const params: CursorParams = { + cursor, + pageSize, + sort, + filter, + search, + signal, + }; + + const response = await getData(params); + + return { + data: response.data, + prevCursor: response.prevCursor, + nextCursor: response.nextCursor, + totalCount: response.totalCount, + }; + }, + [getData, pageSize, sort, filter, search], + ); + + const cache = usePageCache({ getData: wrappedGetData }); + + useDebouncedReload(query, pageSize, cache.reload); + + const onPageSizeChange = useCallback( + (newSize: number) => setPageSize(newSize), + [], + ); + + return { + data: cache.data, + loading: cache.loading, + error: cache.error, + totalCount: cache.totalCount, + offset: undefined, + pageSize, + hasNextPage: cache.hasNextPage, + hasPreviousPage: cache.hasPreviousPage, + onNextPage: cache.onNextPage, + onPreviousPage: cache.onPreviousPage, + onPageSizeChange, + reload: cache.reload, + }; +} diff --git a/packages/ui/src/components/Table/hooks/useDebouncedReload.ts b/packages/ui/src/components/Table/hooks/useDebouncedReload.ts new file mode 100644 index 0000000000..d90afa8861 --- /dev/null +++ b/packages/ui/src/components/Table/hooks/useDebouncedReload.ts @@ -0,0 +1,42 @@ +/* + * 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 { useEffect, useRef } from 'react'; +import type { QueryState } from './types'; + +/** + * Triggers a debounced reload when query or pageSize changes. + * Debouncing reduces backend load during rapid changes (e.g., typing in search). + */ +/** @internal */ +export function useDebouncedReload( + query: QueryState, + pageSize: number, + reload: () => void, + delay: number = 200, +): void { + const prevDepsRef = useRef({ query, pageSize }); + + useEffect(() => { + const prev = prevDepsRef.current; + if (prev.query !== query || prev.pageSize !== pageSize) { + prevDepsRef.current = { query, pageSize }; + const timer = setTimeout(reload, delay); + return () => clearTimeout(timer); + } + return undefined; + }, [query, pageSize, reload, delay]); +} diff --git a/packages/ui/src/components/Table/hooks/useOffsetPagination.ts b/packages/ui/src/components/Table/hooks/useOffsetPagination.ts new file mode 100644 index 0000000000..b34dbe8a6c --- /dev/null +++ b/packages/ui/src/components/Table/hooks/useOffsetPagination.ts @@ -0,0 +1,106 @@ +/* + * 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 { useState, useCallback } from 'react'; +import type { TableItem } from '../types'; +import type { + UseTableOffsetOptions, + OffsetParams, + QueryState, + PaginationResult, +} from './types'; +import { usePageCache } from './usePageCache'; +import { useStableCallback } from './useStableCallback'; +import { useDebouncedReload } from './useDebouncedReload'; +import { getEffectivePageSize } from './getEffectivePageSize'; + +export function useOffsetPagination( + options: UseTableOffsetOptions, + query: QueryState, +): PaginationResult & { reload: () => void } { + const { getData: getDataProp, paginationOptions = {} } = options; + const { initialOffset = 0 } = paginationOptions; + const defaultPageSize = getEffectivePageSize(paginationOptions); + + const getData = useStableCallback(getDataProp); + const { sort, filter, search } = query; + + const [pageSize, setPageSize] = useState(defaultPageSize); + + const wrappedGetData = useCallback( + async ({ + cursor, + signal, + }: { + cursor: number | undefined; + signal: AbortSignal; + }) => { + const currentOffset = cursor ?? 0; + + const params: OffsetParams = { + offset: currentOffset, + pageSize, + sort, + filter, + search, + signal, + }; + + const response = await getData(params); + + const prevCursor = + currentOffset > 0 ? Math.max(0, currentOffset - pageSize) : undefined; + const nextCursor = + currentOffset + pageSize < response.totalCount + ? currentOffset + pageSize + : undefined; + + return { + data: response.data, + prevCursor, + nextCursor, + totalCount: response.totalCount, + }; + }, + [getData, pageSize, sort, filter, search], + ); + + const cache = usePageCache({ + getData: wrappedGetData, + initialCurrentCursor: initialOffset > 0 ? initialOffset : undefined, + }); + + useDebouncedReload(query, pageSize, cache.reload); + + const onPageSizeChange = useCallback( + (newSize: number) => setPageSize(newSize), + [], + ); + + return { + data: cache.data, + loading: cache.loading, + error: cache.error, + totalCount: cache.totalCount, + offset: cache.currentCursor ?? 0, + pageSize, + hasNextPage: cache.hasNextPage, + hasPreviousPage: cache.hasPreviousPage, + onNextPage: cache.onNextPage, + onPreviousPage: cache.onPreviousPage, + onPageSizeChange, + reload: cache.reload, + }; +} diff --git a/packages/ui/src/components/Table/hooks/usePageCache.ts b/packages/ui/src/components/Table/hooks/usePageCache.ts new file mode 100644 index 0000000000..9bf864749b --- /dev/null +++ b/packages/ui/src/components/Table/hooks/usePageCache.ts @@ -0,0 +1,280 @@ +/* + * 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 { useState, useCallback, useRef, useEffect } from 'react'; + +const FIRST_PAGE_CURSOR = Symbol('firstPage'); + +type CursorType = string | number; + +type InternalCursor = + | TCursor + | typeof FIRST_PAGE_CURSOR; + +interface PageEntry { + data: T[] | undefined; + nextCursor: InternalCursor | undefined; + prevCursor: InternalCursor | undefined; +} + +interface GetDataResult { + data: T[]; + nextCursor?: TCursor; + prevCursor?: TCursor; + totalCount?: number; +} + +/** @internal */ +export interface UsePageCacheOptions { + getData: (params: { + cursor: TCursor | undefined; + signal: AbortSignal; + }) => Promise>; + initialCurrentCursor?: TCursor; +} + +/** @internal */ +export interface UsePageCacheResult { + loading: boolean; + error: Error | undefined; + data: T[] | undefined; + totalCount: number | undefined; + currentCursor: TCursor | undefined; + hasPreviousPage: boolean; + onPreviousPage: () => void; + hasNextPage: boolean; + onNextPage: () => void; + reload: (options?: { keepCurrentCursor?: boolean }) => void; +} + +type Direction = 'mount' | 'reset' | 'refresh' | 'next' | 'prev'; + +class PageCacheStore { + private cache = new Map, PageEntry>(); + + get(cursor: InternalCursor): PageEntry | undefined { + return this.cache.get(cursor); + } + + getOrCreate(cursor: InternalCursor): PageEntry { + const existing = this.cache.get(cursor); + if (existing) { + return existing; + } + const entry: PageEntry = { + data: undefined, + nextCursor: undefined, + prevCursor: undefined, + }; + this.cache.set(cursor, entry); + return entry; + } + + clear() { + this.cache.clear(); + } + + getTargetCursor( + direction: Direction, + currentCursor: InternalCursor, + initialCurrentCursor: TCursor | undefined, + ): InternalCursor | undefined { + if (direction === 'mount') { + return toInternalCursor(initialCurrentCursor); + } + if (direction === 'reset') { + return FIRST_PAGE_CURSOR; + } + if (direction === 'refresh') { + return currentCursor; + } + const currentEntry = this.cache.get(currentCursor); + + if (!currentEntry) { + return; + } + + return direction === 'next' + ? currentEntry.nextCursor + : currentEntry.prevCursor; + } + + linkEntryToSource( + entry: PageEntry, + direction: Direction, + currentCursor: InternalCursor, + ) { + if (direction === 'next') { + entry.prevCursor = currentCursor; + } else if (direction === 'prev') { + entry.nextCursor = currentCursor; + } + } +} + +function toInternalCursor( + cursor: TCursor | undefined, +): InternalCursor { + return cursor === undefined ? FIRST_PAGE_CURSOR : cursor; +} + +function toExternalCursor( + cursor: InternalCursor, +): TCursor | undefined { + return cursor === FIRST_PAGE_CURSOR ? undefined : cursor; +} + +/** @internal */ +export function usePageCache( + options: UsePageCacheOptions, +): UsePageCacheResult { + const { getData, initialCurrentCursor } = options; + + const [currentCursor, setCurrentCursor] = useState>( + () => toInternalCursor(initialCurrentCursor), + ); + + const cacheStore = useRef(new PageCacheStore()).current; + + const [loading, setLoading] = useState(true); + const [error, setError] = useState(undefined); + const [totalCount, setTotalCount] = useState(undefined); + + const abortControllerRef = useRef(null); + + const currentPage = cacheStore.get(currentCursor); + const data = currentPage?.data; + const hasNextPage = currentPage?.nextCursor !== undefined; + const hasPreviousPage = currentPage?.prevCursor !== undefined; + + const goToPage = useCallback( + async (direction: Direction) => { + const targetCursor = cacheStore.getTargetCursor( + direction, + currentCursor, + initialCurrentCursor, + ); + + if (!targetCursor) { + return; + } + + const existingEntry = cacheStore.get(targetCursor); + if (existingEntry?.data !== undefined) { + setCurrentCursor(targetCursor); + return; + } + + const entry = cacheStore.getOrCreate(targetCursor); + cacheStore.linkEntryToSource(entry, direction, currentCursor); + setCurrentCursor(targetCursor); + + if (abortControllerRef.current) { + abortControllerRef.current.abort(); + } + + const abortController = new AbortController(); + abortControllerRef.current = abortController; + + setLoading(true); + setError(undefined); + + try { + const result = await getData({ + cursor: toExternalCursor(targetCursor), + signal: abortController.signal, + }); + + if (abortController.signal.aborted) { + return; + } + + entry.data = result.data; + + if (entry.nextCursor === undefined && result.nextCursor !== undefined) { + entry.nextCursor = result.nextCursor; + } + if (entry.prevCursor === undefined && result.prevCursor !== undefined) { + entry.prevCursor = result.prevCursor; + } + + if (result.totalCount !== undefined) { + setTotalCount(result.totalCount); + } + + setLoading(false); + } catch (err) { + if (abortController.signal.aborted) { + return; + } + + setError(err instanceof Error ? err : new Error(String(err))); + setLoading(false); + } + }, + [getData, initialCurrentCursor, currentCursor, cacheStore], + ); + + useEffect(() => { + goToPage('mount'); + + return () => { + if (abortControllerRef.current) { + abortControllerRef.current.abort(); + } + }; + }, []); + + const onNextPage = useCallback(() => { + if (loading) return; + const page = cacheStore.get(currentCursor); + if (!page?.nextCursor) return; + goToPage('next'); + }, [loading, currentCursor, goToPage, cacheStore]); + + const onPreviousPage = useCallback(() => { + if (loading) return; + const page = cacheStore.get(currentCursor); + if (!page?.prevCursor) return; + goToPage('prev'); + }, [loading, currentCursor, goToPage, cacheStore]); + + const reload = useCallback( + (reloadOptions?: { keepCurrentCursor?: boolean }) => { + if (abortControllerRef.current) { + abortControllerRef.current.abort(); + } + + cacheStore.clear(); + + goToPage(reloadOptions?.keepCurrentCursor ? 'refresh' : 'reset'); + }, + [goToPage, cacheStore], + ); + + return { + loading, + error, + data, + totalCount, + currentCursor: toExternalCursor(currentCursor), + hasPreviousPage, + onPreviousPage, + hasNextPage, + onNextPage, + reload, + }; +} diff --git a/packages/ui/src/components/Table/hooks/useQueryState.ts b/packages/ui/src/components/Table/hooks/useQueryState.ts new file mode 100644 index 0000000000..308d9fd385 --- /dev/null +++ b/packages/ui/src/components/Table/hooks/useQueryState.ts @@ -0,0 +1,68 @@ +/* + * 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 { useMemo, useState, useCallback } from 'react'; +import type { QueryOptions, QueryState } from './types'; + +function useControlledStateHelper( + initialValue: TInitial, + controlledValue: TControlled | undefined, + onChange: ((value: T) => void) | undefined, +) { + const [internalValue, setInternalValue] = useState(initialValue); + + const value = controlledValue !== undefined ? controlledValue : internalValue; + + const setValue = useCallback( + (newValue: T) => { + if (controlledValue === undefined) { + setInternalValue(newValue as unknown as TInitial); + } + if (onChange) { + onChange(newValue); + } + }, + [controlledValue, onChange], + ); + + return [value, setValue] as const; +} + +/** @internal */ +export function useQueryState( + options: QueryOptions, +): QueryState { + const [sort, setSort] = useControlledStateHelper( + options.initialSort ?? null, + options.sort, + options.onSortChange, + ); + const [filter, setFilter] = useControlledStateHelper( + options.initialFilter, + options.filter, + options.onFilterChange, + ); + const [search, setSearch] = useControlledStateHelper( + options.initialSearch ?? '', + options.search, + options.onSearchChange, + ); + + return useMemo( + () => ({ sort, setSort, filter, setFilter, search, setSearch }), + [sort, setSort, filter, setFilter, search, setSearch], + ); +} diff --git a/packages/ui/src/components/Table/hooks/useStableCallback.ts b/packages/ui/src/components/Table/hooks/useStableCallback.ts new file mode 100644 index 0000000000..1764e07dd0 --- /dev/null +++ b/packages/ui/src/components/Table/hooks/useStableCallback.ts @@ -0,0 +1,31 @@ +/* + * 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 { useRef, useCallback } from 'react'; + +/** + * Returns a stable callback reference that always calls the latest version + * of the provided function. Useful for callbacks passed as props that may + * change on every render but shouldn't trigger effect re-runs. + * + * @internal + */ +export function useStableCallback any>(fn: T): T { + const ref = useRef(fn); + ref.current = fn; + + return useCallback((...args: Parameters) => ref.current(...args), []) as T; +} diff --git a/packages/ui/src/components/Table/hooks/useTable.ts b/packages/ui/src/components/Table/hooks/useTable.ts index cd1ddd5c9c..b8f5b8bd13 100644 --- a/packages/ui/src/components/Table/hooks/useTable.ts +++ b/packages/ui/src/components/Table/hooks/useTable.ts @@ -13,154 +13,147 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import { useState, useMemo, useCallback } from 'react'; -import type { TablePaginationProps } from '../../TablePagination/types'; +import { useMemo, useRef } from 'react'; +import type { SortState, TableItem, TableProps } from '../types'; import type { - UseTableConfig, + PaginationOptions, + PaginationResult, + UseTableOptions, UseTableResult, - UseTablePagination, } from './types'; +import { useQueryState } from './useQueryState'; +import { useCompletePagination } from './useCompletePagination'; +import { useCursorPagination } from './useCursorPagination'; +import { useOffsetPagination } from './useOffsetPagination'; -/** - * Hook for managing table state including pagination and future features like sorting. - * Supports both controlled and uncontrolled modes using offset/pageSize pattern (Backstage style). - * - * @public - */ -export function useTable( - config: UseTableConfig = {}, -): UseTableResult { - const { data, pagination: paginationConfig = {} } = config; - +function useTableProps( + paginationResult: PaginationResult, + sortState: SortState, + paginationOptions: PaginationOptions = {}, +): Omit< + TableProps, + 'columnConfig' | 'rowConfig' | 'selection' | 'emptyState' +> { const { - rowCount: providedRowCount, - offset: controlledOffset, - pageSize: controlledPageSize, - onOffsetChange, - onPageSizeChange, - defaultPageSize = 10, - defaultOffset = 0, - onNextPage, - onPreviousPage, showPageSizeOptions = true, - } = paginationConfig; + pageSizeOptions, + onPageSizeChange: onPageSizeChangeCallback, + onNextPage: onNextPageCallback, + onPreviousPage: onPreviousPageCallback, + getLabel, + } = paginationOptions; - // Determine if we're in controlled mode - const isControlled = - controlledOffset !== undefined || controlledPageSize !== undefined; + const previousDataRef = useRef(paginationResult.data); + if (paginationResult.data) { + previousDataRef.current = paginationResult.data; + } - // Use providedRowCount if passed, otherwise fallback to data length - const rowCount = providedRowCount ?? data?.length ?? 0; + const displayData = paginationResult.data ?? previousDataRef.current; + const isStale = paginationResult.loading && displayData !== undefined; - // Internal state for uncontrolled mode - const [internalOffset, setInternalOffset] = useState(defaultOffset); - const [internalPageSize, setInternalPageSize] = useState(defaultPageSize); - - // Calculate current values - const currentOffset = controlledOffset ?? internalOffset; - const currentPageSize = controlledPageSize ?? internalPageSize; - - // Calculate sliced data if data array is provided - const currentData = useMemo(() => { - if (!data) return undefined; - return data.slice(currentOffset, currentOffset + currentPageSize); - }, [data, currentOffset, currentPageSize]); - - // Update functions - const setOffset = useCallback( - (newOffset: number) => { - if (isControlled) { - onOffsetChange?.(newOffset); - } else { - setInternalOffset(newOffset); - } - }, - [isControlled, onOffsetChange], - ); - - const setPageSize = useCallback( - (newPageSize: number) => { - // When changing page size, reset to first page to avoid showing empty results - const newOffset = 0; - - if (isControlled) { - onPageSizeChange?.(newPageSize); - onOffsetChange?.(newOffset); - } else { - setInternalPageSize(newPageSize); - setInternalOffset(newOffset); - } - }, - [isControlled, onPageSizeChange, onOffsetChange], - ); - - const nextPage = useCallback(() => { - const nextOffset = currentOffset + currentPageSize; - if (nextOffset < rowCount) { - onNextPage?.(); - setOffset(nextOffset); - } - }, [currentOffset, currentPageSize, rowCount, onNextPage, setOffset]); - - const previousPage = useCallback(() => { - if (currentOffset > 0) { - onPreviousPage?.(); - const prevOffset = Math.max(0, currentOffset - currentPageSize); - setOffset(prevOffset); - } - }, [currentOffset, currentPageSize, onPreviousPage, setOffset]); - - // Pagination props for TablePagination component - const paginationProps: TablePaginationProps = useMemo( + const pagination = useMemo( () => ({ - offset: currentOffset, - pageSize: currentPageSize, - rowCount, - setOffset, - setPageSize, - onNextPage, - onPreviousPage, + type: 'page' as const, + pageSize: paginationResult.pageSize, + pageSizeOptions, + offset: paginationResult.offset, + totalCount: paginationResult.totalCount, + hasNextPage: paginationResult.hasNextPage, + hasPreviousPage: paginationResult.hasPreviousPage, + onNextPage: () => { + paginationResult.onNextPage(); + onNextPageCallback?.(); + }, + onPreviousPage: () => { + paginationResult.onPreviousPage(); + onPreviousPageCallback?.(); + }, + onPageSizeChange: (size: number) => { + paginationResult.onPageSizeChange(size); + onPageSizeChangeCallback?.(size); + }, showPageSizeOptions, + getLabel, }), [ - currentOffset, - currentPageSize, - rowCount, - setOffset, - setPageSize, - onNextPage, - onPreviousPage, - showPageSizeOptions, + paginationResult.pageSize, + pageSizeOptions, + paginationResult.offset, + paginationResult.totalCount, + paginationResult.hasNextPage, + paginationResult.hasPreviousPage, + paginationResult.onNextPage, + paginationResult.onPreviousPage, + paginationResult.onPageSizeChange, + onNextPageCallback, + onPreviousPageCallback, + onPageSizeChangeCallback, ], ); - const pagination: UseTablePagination = useMemo( + return useMemo( () => ({ - paginationProps, - offset: currentOffset, - pageSize: currentPageSize, - data: currentData, - nextPage, - previousPage, - setOffset, - setPageSize, + data: displayData, + loading: paginationResult.loading, + isStale, + error: paginationResult.error, + pagination, + sort: sortState, }), [ - paginationProps, - currentOffset, - currentPageSize, - currentData, - nextPage, - previousPage, - setOffset, - setPageSize, + displayData, + paginationResult.loading, + isStale, + paginationResult.error, + pagination, + showPageSizeOptions, + getLabel, + sortState, ], ); +} + +/** @public */ +export function useTable( + options: UseTableOptions, +): UseTableResult { + const query = useQueryState(options); + + const initialModeRef = useRef(options.mode); + if (initialModeRef.current !== options.mode) { + throw new Error( + `useTable mode cannot change from '${initialModeRef.current}' to '${options.mode}'. ` + + `The mode must remain stable for the lifetime of the component.`, + ); + } + + let pagination: PaginationResult & { reload: () => void }; + + if (options.mode === 'complete') { + pagination = useCompletePagination(options, query); + } else if (options.mode === 'offset') { + pagination = useOffsetPagination(options, query); + } else if (options.mode === 'cursor') { + pagination = useCursorPagination(options, query); + } else { + throw new Error('Invalid mode'); + } + + const sortState: SortState = useMemo( + () => ({ descriptor: query.sort, onSortChange: query.setSort }), + [query.sort, query.setSort], + ); + + const tableProps = useTableProps( + pagination, + sortState, + options.paginationOptions ?? {}, + ); return { - data: currentData, - paginationProps, - pagination, + tableProps, + reload: pagination.reload, + filter: { value: query.filter, onChange: query.setFilter }, + search: { value: query.search, onChange: query.setSearch }, }; } diff --git a/packages/ui/src/components/Table/index.ts b/packages/ui/src/components/Table/index.ts index 42ba6ff9c9..0d3d5ff8eb 100644 --- a/packages/ui/src/components/Table/index.ts +++ b/packages/ui/src/components/Table/index.ts @@ -15,6 +15,7 @@ */ export { Table } from './components/Table'; +export { TableRoot } from './components/TableRoot'; export { TableHeader } from './components/TableHeader'; export { TableBody } from './components/TableBody'; export { Column } from './components/Column'; @@ -29,12 +30,33 @@ export type { CellTextProps, CellProfileProps, ColumnProps, + TableProps, + TableRootProps, + TableItem, + ColumnConfig, + RowConfig, + RowRenderFn, + TableSelection, + SortState, + SortDescriptor, + NoPagination, + PagePagination, + TablePaginationType, } from './types'; export type { - UseTableConfig, + UseTableOptions, UseTableResult, - UseTablePagination, - UseTablePaginationConfig, + UseTableCompleteOptions, + UseTableOffsetOptions, + UseTableCursorOptions, + OffsetParams, + OffsetResponse, + CursorParams, + CursorResponse, + FilterState, + SearchState, + QueryOptions, + PaginationOptions, } from './hooks/types'; export { TableDefinition } from './definition'; diff --git a/packages/ui/src/components/Table/stories/Table.dev.stories.tsx b/packages/ui/src/components/Table/stories/Table.dev.stories.tsx new file mode 100644 index 0000000000..503665ffed --- /dev/null +++ b/packages/ui/src/components/Table/stories/Table.dev.stories.tsx @@ -0,0 +1,967 @@ +/* eslint-disable no-restricted-syntax */ +/* + * 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 { useState, Fragment } from 'react'; +import type { Meta, StoryObj } from '@storybook/react-vite'; +import { + Table, + TableRoot, + TableHeader, + TableBody, + Column, + Row, + CellText, + CellProfile, + useTable, + type ColumnConfig, +} from '..'; +import { Button } from '../../Button'; +import { Select } from '../../Select'; +import { Flex } from '../../Flex'; +import { data as data1 } from './mocked-data1'; +import { data as data4 } from './mocked-data4'; +import { selectionData, selectionColumns, tableStoriesMeta } from './utils'; +import { SearchField } from '../../SearchField'; + +const meta = { + title: 'Backstage UI/Table/dev', + ...tableStoriesMeta, +} satisfies Meta; + +export default meta; +type Story = StoryObj; +type Data1Item = (typeof data1)[0]; +type Data4Item = (typeof data4)[0]; + +export const BasicLocalData: Story = { + render: () => { + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + defaultWidth: '4fr', + cell: item => ( + + ), + }, + { + id: 'owner', + label: 'Owner', + defaultWidth: '1fr', + cell: item => , + }, + { + id: 'type', + label: 'Type', + defaultWidth: '1fr', + cell: item => , + }, + { + id: 'lifecycle', + label: 'Lifecycle', + defaultWidth: '1fr', + cell: item => , + }, + ]; + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => data1, + paginationOptions: { pageSize: 5 }, + }); + + return ; + }, +}; + +export const Sorting: Story = { + render: () => { + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + cell: item => , + isSortable: true, + }, + { + id: 'owner', + label: 'Owner', + cell: item => , + isSortable: true, + }, + { + id: 'type', + label: 'Type', + cell: item => , + isSortable: true, + }, + { + id: 'lifecycle', + label: 'Lifecycle', + cell: item => , + isSortable: true, + }, + ]; + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => data1, + paginationOptions: { pageSize: 5 }, + initialSort: { column: 'name', direction: 'ascending' }, + sortFn: (items, { column, direction }) => { + return [...items].sort((a, b) => { + let aVal: string; + let bVal: string; + if (column === 'name') { + aVal = a.name; + bVal = b.name; + } else if (column === 'owner') { + aVal = a.owner.name; + bVal = b.owner.name; + } else if (column === 'type') { + aVal = a.type; + bVal = b.type; + } else { + aVal = a.lifecycle; + bVal = b.lifecycle; + } + const cmp = aVal.localeCompare(bVal); + return direction === 'descending' ? -cmp : cmp; + }); + }, + }); + + return
    ; + }, +}; + +export const Search: Story = { + render: () => { + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + cell: item => , + isSortable: true, + }, + { + id: 'owner', + label: 'Owner', + cell: item => , + }, + { + id: 'type', + label: 'Type', + cell: item => , + }, + ]; + + const { tableProps, search } = useTable({ + mode: 'complete', + getData: () => data1, + paginationOptions: { pageSize: 5 }, + searchFn: (items, query) => { + const lowerQuery = query.toLowerCase(); + return items.filter( + item => + item.name.toLowerCase().includes(lowerQuery) || + item.owner.name.toLowerCase().includes(lowerQuery) || + item.type.toLowerCase().includes(lowerQuery), + ); + }, + }); + + return ( +
    + +
    No results found + ) : ( +
    No data available
    + ) + } + {...tableProps} + /> + + ); + }, +}; + +export const Selection: Story = { + render: () => { + const [selected, setSelected] = useState | 'all'>( + new Set(), + ); + + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + cell: item => , + }, + { + id: 'owner', + label: 'Owner', + cell: item => , + }, + { + id: 'type', + label: 'Type', + cell: item => , + }, + ]; + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => data1, + paginationOptions: { pageSize: 5 }, + }); + + return ( +
    + ); + }, +}; + +export const RowLinks: Story = { + render: () => { + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Band name', + isRowHeader: true, + cell: item => , + }, + { + id: 'genre', + label: 'Genre', + cell: item => , + }, + { + id: 'yearFormed', + label: 'Year formed', + cell: item => , + }, + ]; + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => data4, + paginationOptions: { pageSize: 5 }, + }); + + return ( +
    `/bands/${item.id}` }} + /> + ); + }, +}; + +export const Reload: Story = { + render: () => { + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + cell: item => , + }, + { + id: 'type', + label: 'Type', + cell: item => , + }, + ]; + + const { tableProps, reload } = useTable({ + mode: 'complete', + getData: () => data1, + paginationOptions: { pageSize: 5 }, + }); + + return ( +
    + +
    + + ); + }, +}; + +export const ServerSidePaginationOffset: Story = { + render: () => { + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + cell: item => , + }, + { + id: 'owner', + label: 'Owner', + cell: item => , + }, + { + id: 'type', + label: 'Type', + cell: item => , + }, + ]; + + const { tableProps } = useTable({ + mode: 'offset', + getData: async ({ offset, pageSize }) => { + await new Promise(resolve => setTimeout(resolve, 500)); + return { + data: data1.slice(offset, offset + pageSize), + totalCount: data1.length, + }; + }, + paginationOptions: { pageSize: 5 }, + }); + + return
    ; + }, +}; + +export const ServerSidePaginationCursor: Story = { + render: () => { + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Band name', + isRowHeader: true, + cell: item => , + }, + { + id: 'genre', + label: 'Genre', + cell: item => , + }, + ]; + + const { tableProps } = useTable({ + mode: 'cursor', + getData: async ({ cursor, pageSize }) => { + await new Promise(resolve => setTimeout(resolve, 500)); + const startIndex = cursor ? parseInt(cursor, 10) : 0; + const nextIndex = startIndex + pageSize; + return { + data: data4.slice(startIndex, nextIndex), + totalCount: data4.length, + nextCursor: nextIndex < data4.length ? String(nextIndex) : undefined, + prevCursor: + startIndex > 0 + ? String(Math.max(0, startIndex - pageSize)) + : undefined, + }; + }, + paginationOptions: { pageSize: 5 }, + }); + + return
    ; + }, +}; + +export const CustomRowRender: Story = { + render: () => { + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + cell: item => , + }, + { + id: 'type', + label: 'Type', + cell: item => , + }, + { + id: 'lifecycle', + label: 'Lifecycle', + cell: item => , + }, + ]; + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => data1, + paginationOptions: { pageSize: 5 }, + }); + + return ( +
    ( + + {column => ( + + {column.id === 'name' ? ( + + ) : ( + column.cell(item) + )} + + )} + + )} + /> + ); + }, +}; + +export const AtomicComponents: Story = { + render: () => { + const displayData = data1.slice(0, 5); + + return ( + + + Name + Owner + Type + + + {displayData.map(item => ( + + + + + + ))} + + + ); + }, +}; + +export const RowClick: Story = { + render: () => { + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Band name', + isRowHeader: true, + cell: item => ( + + ), + }, + { + id: 'genre', + label: 'Genre', + cell: item => , + }, + { + id: 'yearFormed', + label: 'Year formed', + cell: item => , + }, + { + id: 'albums', + label: 'Albums', + cell: item => , + }, + ]; + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => data4, + paginationOptions: { pageSize: 5 }, + }); + + return ( +
    alert(`Clicked: ${item.name}`) }} + /> + ); + }, +}; + +export const SelectionSingleToggle: Story = { + render: () => { + const [selected, setSelected] = useState | 'all'>( + new Set(), + ); + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => selectionData, + paginationOptions: { pageSize: 10 }, + }); + + return ( +
    + ); + }, +}; + +export const SelectionMultiToggle: Story = { + render: () => { + const [selected, setSelected] = useState | 'all'>( + new Set(), + ); + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => selectionData, + paginationOptions: { pageSize: 10 }, + }); + + return ( +
    + ); + }, +}; + +export const SelectionWithRowClick: Story = { + render: () => { + const [selected, setSelected] = useState | 'all'>( + new Set(), + ); + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => selectionData, + paginationOptions: { pageSize: 10 }, + }); + + return ( +
    alert(`Clicked: ${item.name}`) }} + /> + ); + }, +}; + +export const SelectionWithRowLinks: Story = { + render: () => { + const [selected, setSelected] = useState | 'all'>( + new Set(), + ); + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => selectionData, + paginationOptions: { pageSize: 10 }, + }); + + return ( +
    `/items/${item.id}` }} + /> + ); + }, +}; + +export const SelectionWithPagination: Story = { + render: () => { + const [selected, setSelected] = useState | 'all'>( + new Set(), + ); + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => data1, + paginationOptions: { pageSize: 5 }, + }); + + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + cell: item => , + }, + { + id: 'owner', + label: 'Owner', + cell: item => , + }, + { + id: 'type', + label: 'Type', + cell: item => , + }, + ]; + + return ( +
    + ); + }, +}; + +export const SelectionSingleReplace: Story = { + render: () => { + const [selected, setSelected] = useState | 'all'>( + new Set(), + ); + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => selectionData, + paginationOptions: { pageSize: 10 }, + }); + + return ( +
    + ); + }, +}; + +export const SelectionMultiReplace: Story = { + render: () => { + const [selected, setSelected] = useState | 'all'>( + new Set(), + ); + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => selectionData, + paginationOptions: { pageSize: 10 }, + }); + + return ( +
    + ); + }, +}; + +export const SelectionReplaceWithRowClick: Story = { + render: () => { + const [selected, setSelected] = useState | 'all'>( + new Set(), + ); + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => selectionData, + paginationOptions: { pageSize: 10 }, + }); + + return ( +
    alert(`Opening ${item.name}`) }} + /> + ); + }, +}; + +export const SelectionReplaceWithRowLinks: Story = { + render: () => { + const [selected, setSelected] = useState | 'all'>( + new Set(), + ); + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => selectionData, + paginationOptions: { pageSize: 10 }, + }); + + return ( +
    `/items/${item.id}` }} + /> + ); + }, +}; + +// Type filter interface for ComprehensiveServerSide story +interface TypeFilter { + type: string | null; +} + +/** + * Comprehensive example showcasing a common complex use case: + * - Server-side offset pagination + * - Search/filtering + * - Sorting + * - Multi-selection + * - Type filter dropdown + */ +export const ComprehensiveServerSide: Story = { + render: () => { + const [selected, setSelected] = useState | 'all'>( + new Set(), + ); + + const typeOptions = [ + { value: '', label: 'All types' }, + { value: 'service', label: 'Service' }, + { value: 'website', label: 'Website' }, + { value: 'library', label: 'Library' }, + { value: 'documentation', label: 'Documentation' }, + { value: 'other', label: 'Other' }, + ]; + + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + isSortable: true, + cell: item => ( + + ), + }, + { + id: 'owner', + label: 'Owner', + isSortable: true, + cell: item => , + }, + { + id: 'type', + label: 'Type', + isSortable: true, + cell: item => , + }, + { + id: 'lifecycle', + label: 'Lifecycle', + isSortable: true, + cell: item => , + }, + ]; + + const { tableProps, search, filter } = useTable({ + mode: 'offset', + initialSort: { column: 'name', direction: 'ascending' }, + getData: async ({ + offset, + pageSize, + sort, + filter: typeFilter, + search: searchQuery, + }) => { + // Simulate server-side filtering, sorting, and pagination + // with slower and slower responses + const page = Math.floor(offset / pageSize) + 1; + await new Promise(resolve => setTimeout(resolve, 300 * page)); + + let filtered = [...data1]; + + // Apply search filter + if (searchQuery) { + const query = searchQuery.toLowerCase(); + filtered = filtered.filter( + item => + item.name.toLowerCase().includes(query) || + item.owner.name.toLowerCase().includes(query) || + item.description?.toLowerCase().includes(query), + ); + } + + // Apply type filter + if (typeFilter?.type) { + filtered = filtered.filter(item => item.type === typeFilter.type); + } + + // Apply sorting + if (sort) { + filtered.sort((a, b) => { + let aVal: string; + let bVal: string; + switch (sort.column) { + case 'owner': + aVal = a.owner.name; + bVal = b.owner.name; + break; + case 'type': + aVal = a.type; + bVal = b.type; + break; + case 'lifecycle': + aVal = a.lifecycle; + bVal = b.lifecycle; + break; + default: + aVal = a.name; + bVal = b.name; + } + const cmp = aVal.localeCompare(bVal); + return sort.direction === 'descending' ? -cmp : cmp; + }); + } + + return { + data: filtered.slice(offset, offset + pageSize), + totalCount: filtered.length, + }; + }, + paginationOptions: { pageSize: 10 }, + }); + + return ( + + + +
    No results match your filters + ) : ( +
    No data available
    + ) + } + /> + + ); + }, +}; diff --git a/packages/ui/src/components/Table/stories/Table.docs.stories.tsx b/packages/ui/src/components/Table/stories/Table.docs.stories.tsx new file mode 100644 index 0000000000..aff656b083 --- /dev/null +++ b/packages/ui/src/components/Table/stories/Table.docs.stories.tsx @@ -0,0 +1,202 @@ +/* eslint-disable no-restricted-syntax */ +/* + * 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 { useState } from 'react'; +import type { Meta, StoryObj } from '@storybook/react-vite'; +import { Table, CellText, CellProfile, useTable, type ColumnConfig } from '..'; +import { Flex } from '../../Flex'; +import { Text } from '../../Text'; +import { RadioGroup, Radio } from '../../RadioGroup'; +import { data as data4 } from './mocked-data4'; +import { selectionData, selectionColumns, tableStoriesMeta } from './utils'; + +const meta = { + title: 'Backstage UI/Table/docs', + ...tableStoriesMeta, +} satisfies Meta; + +export default meta; +type Story = StoryObj; +type Data4Item = (typeof data4)[0]; + +export const TableRockBand: Story = { + render: () => { + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Band name', + isRowHeader: true, + defaultWidth: '4fr', + cell: item => ( + + ), + }, + { + id: 'genre', + label: 'Genre', + defaultWidth: '4fr', + cell: item => , + }, + { + id: 'yearFormed', + label: 'Year formed', + defaultWidth: '1fr', + cell: item => , + }, + { + id: 'albums', + label: 'Albums', + defaultWidth: '1fr', + cell: item => , + }, + ]; + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => data4, + paginationOptions: { pageSize: 5 }, + }); + + return
    ; + }, +}; + +export const SelectionToggleWithActions: Story = { + render: () => { + const [selected, setSelected] = useState | 'all'>( + new Set(), + ); + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => selectionData, + paginationOptions: { pageSize: 10 }, + }); + + return ( +
    alert(`Clicked: ${item.name}`) }} + /> + ); + }, +}; + +export const SelectionModePlayground: Story = { + render: () => { + const [selectionMode, setSelectionMode] = useState<'single' | 'multiple'>( + 'multiple', + ); + const [selected, setSelected] = useState | 'all'>( + new Set(), + ); + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => selectionData, + paginationOptions: { pageSize: 10 }, + }); + + return ( + +
    +
    + + Selection mode: + + { + setSelectionMode(value as 'single' | 'multiple'); + setSelected(new Set()); + }} + > + single + multiple + +
    + + ); + }, +}; + +export const SelectionBehaviorPlayground: Story = { + render: () => { + const [selectionBehavior, setSelectionBehavior] = useState< + 'toggle' | 'replace' + >('toggle'); + const [selected, setSelected] = useState | 'all'>( + new Set(), + ); + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => selectionData, + paginationOptions: { pageSize: 10 }, + }); + + return ( + +
    +
    + + Selection behavior: + + { + setSelectionBehavior(value as 'toggle' | 'replace'); + setSelected(new Set()); + }} + > + toggle + replace + +
    + + ); + }, +}; diff --git a/packages/ui/src/components/Table/stories/Table.visual.stories.tsx b/packages/ui/src/components/Table/stories/Table.visual.stories.tsx new file mode 100644 index 0000000000..3ec6af5789 --- /dev/null +++ b/packages/ui/src/components/Table/stories/Table.visual.stories.tsx @@ -0,0 +1,388 @@ +/* eslint-disable no-restricted-syntax */ +/* + * 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 { useState } from 'react'; +import type { Meta, StoryObj } from '@storybook/react-vite'; +import { Table, CellText, CellProfile, useTable, type ColumnConfig } from '..'; +import { data as data1 } from './mocked-data1'; +import { data as data4 } from './mocked-data4'; +import { selectionData, selectionColumns, tableStoriesMeta } from './utils'; + +const meta = { + title: 'Backstage UI/Table/visual', + ...tableStoriesMeta, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +type Data1Item = (typeof data1)[0]; +type Data4Item = (typeof data4)[0]; +type CellTextVariantsItem = (typeof cellTextVariantsData)[0]; + +export const ProfileCells: Story = { + render: () => { + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Band name', + isRowHeader: true, + cell: item => ( + + ), + }, + { + id: 'genre', + label: 'Genre', + cell: item => , + }, + { + id: 'yearFormed', + label: 'Year formed', + cell: item => , + }, + { + id: 'albums', + label: 'Albums', + cell: item => , + }, + ]; + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => data4, + paginationOptions: { pageSize: 5 }, + }); + + return
    ; + }, +}; + +export const EmptyState: Story = { + render: () => { + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + cell: item => , + }, + { + id: 'type', + label: 'Type', + cell: item => , + }, + ]; + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => [], + paginationOptions: { pageSize: 5 }, + }); + + return ( +
    No data available} + /> + ); + }, +}; + +export const NoPagination: Story = { + render: () => { + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + cell: item => , + }, + { + id: 'owner', + label: 'Owner', + cell: item => , + }, + { + id: 'type', + label: 'Type', + cell: item => , + }, + ]; + + return ( +
    + ); + }, +}; + +export const SelectionWithDisabledRows: Story = { + render: () => { + const [selected, setSelected] = useState | 'all'>( + new Set(), + ); + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => selectionData, + paginationOptions: { pageSize: 10 }, + }); + + return ( +
    item.id === 2, + }} + /> + ); + }, +}; + +// Data for CellTextVariants story showcasing multiple features +const cellTextVariantsData = [ + { + id: 1, + name: 'Authentication Service', + description: 'Handles user login and session management', + type: 'service', + owner: 'Platform Team', + }, + { + id: 2, + name: 'A very long component name that should be truncated when it exceeds the available column width', + description: + 'This is also a very long description that demonstrates text truncation behavior in the table cells', + type: 'library', + owner: 'Frontend Team', + }, + { + id: 3, + name: 'API Gateway', + description: 'Routes and validates API requests', + type: 'service', + owner: 'Backend Team', + }, +]; + +export const CellTextVariants: Story = { + render: () => { + const [selected, setSelected] = useState | 'all'>( + new Set(['1', '3']), + ); + const [sortDescriptor, setSortDescriptor] = useState<{ + column: string; + direction: 'ascending' | 'descending'; + }>({ column: 'name', direction: 'ascending' }); + + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + isSortable: true, + cell: item => ( + + ), + }, + { + id: 'type', + label: 'Type', + isSortable: true, + cell: item => ( + 📦} + /> + ), + }, + { + id: 'owner', + label: 'Owner', + cell: item => , + }, + ]; + + return ( +
    + setSortDescriptor({ + column: String(descriptor.column), + direction: descriptor.direction, + }), + }} + /> + ); + }, +}; + +export const LoadingState: Story = { + render: () => { + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + cell: item => , + }, + { + id: 'type', + label: 'Type', + cell: item => , + }, + ]; + + return ( +
    + ); + }, +}; + +export const ErrorState: Story = { + render: () => { + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + cell: item => , + }, + { + id: 'type', + label: 'Type', + cell: item => , + }, + ]; + + return ( +
    + ); + }, +}; + +export const StaleState: Story = { + render: () => { + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + cell: item => , + }, + { + id: 'owner', + label: 'Owner', + cell: item => , + }, + { + id: 'type', + label: 'Type', + cell: item => , + }, + ]; + + return ( +
    + ); + }, +}; + +export const CustomPageSizeOptions: Story = { + render: () => { + const columns: ColumnConfig[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + cell: item => , + }, + { + id: 'owner', + label: 'Owner', + cell: item => , + }, + { + id: 'type', + label: 'Type', + cell: item => , + }, + ]; + + const { tableProps } = useTable({ + mode: 'complete', + getData: () => data1, + paginationOptions: { + pageSize: 3, + pageSizeOptions: [ + { label: '2 per page', value: 2 }, + { label: '3 per page', value: 3 }, + { label: '5 per page', value: 5 }, + { label: '7 per page', value: 7 }, + ], + onPageSizeChange: size => { + console.log('Page size changed to:', size); + }, + onNextPage: () => { + console.log('Navigated to next page'); + }, + onPreviousPage: () => { + console.log('Navigated to previous page'); + }, + }, + }); + + return
    ; + }, +}; diff --git a/packages/ui/src/components/Table/mocked-data1.ts b/packages/ui/src/components/Table/stories/mocked-data1.ts similarity index 93% rename from packages/ui/src/components/Table/mocked-data1.ts rename to packages/ui/src/components/Table/stories/mocked-data1.ts index ea5a9f2db8..b508bce387 100644 --- a/packages/ui/src/components/Table/mocked-data1.ts +++ b/packages/ui/src/components/Table/stories/mocked-data1.ts @@ -15,6 +15,7 @@ */ export interface DataProps { + id: string; name: string; owner: { name: string; @@ -29,6 +30,7 @@ export interface DataProps { export const data: DataProps[] = [ { + id: 'authentication-and-authorization-service', name: 'authentication-and-authorization-service', owner: { name: 'security-team', @@ -42,6 +44,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'user-interface-dashboard-and-analytics-platform', name: 'user-interface-dashboard-and-analytics-platform', owner: { name: 'frontend-team', @@ -55,6 +58,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'payment-gateway', name: 'payment-gateway', owner: { name: 'finance-team', @@ -68,6 +72,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'real-time-analytics-processing-and-visualization-engine', name: 'real-time-analytics-processing-and-visualization-engine', owner: { name: 'data-team', @@ -81,6 +86,7 @@ export const data: DataProps[] = [ lifecycle: 'experimental', }, { + id: 'notification-center', name: 'notification-center', owner: { name: 'platform-team', @@ -94,6 +100,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'administrative-control-panel-and-user-management-interface', name: 'administrative-control-panel-and-user-management-interface', owner: { name: 'frontend-team', @@ -107,6 +114,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'search-indexer', name: 'search-indexer', owner: { name: 'search-team', @@ -120,6 +128,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'cross-platform-mobile-application-framework', name: 'cross-platform-mobile-application-framework', owner: { name: 'mobile-team', @@ -133,6 +142,7 @@ export const data: DataProps[] = [ lifecycle: 'experimental', }, { + id: 'database-migration', name: 'database-migration', owner: { name: 'devops-team', @@ -146,6 +156,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'api-gateway', name: 'api-gateway', owner: { name: 'platform-team', @@ -159,6 +170,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'content-management', name: 'content-management', owner: { name: 'content-team', @@ -172,6 +184,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'enterprise-reporting-and-analytics-dashboard', name: 'enterprise-reporting-and-analytics-dashboard', owner: { name: 'analytics-team', @@ -185,6 +198,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'image-processing-and-optimization-service', name: 'image-processing-and-optimization-service', owner: { name: 'media-team', @@ -198,6 +212,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'customer-portal', name: 'customer-portal', owner: { name: 'frontend-team', @@ -211,6 +226,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'log-aggregator', name: 'log-aggregator', owner: { name: 'devops-team', @@ -224,6 +240,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'identity-provider', name: 'identity-provider', owner: { name: 'security-team', @@ -237,6 +254,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'document-storage', name: 'document-storage', owner: { name: 'storage-team', @@ -250,6 +268,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'workflow-engine', name: 'workflow-engine', owner: { name: 'platform-team', @@ -263,6 +282,7 @@ export const data: DataProps[] = [ lifecycle: 'experimental', }, { + id: 'mobile-backend', name: 'mobile-backend', owner: { name: 'mobile-team', @@ -276,6 +296,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'system-monitoring-and-alerting-dashboard', name: 'system-monitoring-and-alerting-dashboard', owner: { name: 'devops-team', @@ -289,6 +310,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'email-service', name: 'email-service', owner: { name: 'communication-team', @@ -302,6 +324,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'data-pipeline', name: 'data-pipeline', owner: { name: 'data-team', @@ -315,6 +338,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'configuration-manager', name: 'configuration-manager', owner: { name: 'platform-team', @@ -328,6 +352,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'testing-framework', name: 'testing-framework', owner: { name: 'qa-team', @@ -341,6 +366,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'cache-service', name: 'cache-service', owner: { name: 'platform-team', @@ -354,6 +380,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'billing-system', name: 'billing-system', owner: { name: 'finance-team', @@ -367,6 +394,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'comprehensive-product-documentation-and-api-reference', name: 'comprehensive-product-documentation-and-api-reference', owner: { name: 'docs-team', @@ -380,6 +408,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'queue-manager', name: 'queue-manager', owner: { name: 'platform-team', @@ -393,6 +422,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'security-scanner', name: 'security-scanner', owner: { name: 'security-team', @@ -406,6 +436,7 @@ export const data: DataProps[] = [ lifecycle: 'experimental', }, { + id: 'user-profile', name: 'user-profile', owner: { name: 'frontend-team', @@ -419,6 +450,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'data-warehouse', name: 'data-warehouse', owner: { name: 'data-team', @@ -432,6 +464,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'deployment-automation', name: 'deployment-automation', owner: { name: 'devops-team', @@ -445,6 +478,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'chat-service', name: 'chat-service', owner: { name: 'communication-team', @@ -458,6 +492,7 @@ export const data: DataProps[] = [ lifecycle: 'experimental', }, { + id: 'analytics-dashboard', name: 'analytics-dashboard', owner: { name: 'analytics-team', @@ -471,6 +506,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'file-uploader', name: 'file-uploader', owner: { name: 'storage-team', @@ -484,6 +520,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'search-service', name: 'search-service', owner: { name: 'search-team', @@ -497,6 +534,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'mobile-sdk', name: 'mobile-sdk', owner: { name: 'mobile-team', @@ -510,6 +548,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'performance-monitor', name: 'performance-monitor', owner: { name: 'devops-team', @@ -523,6 +562,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'content-delivery', name: 'content-delivery', owner: { name: 'media-team', @@ -536,6 +576,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'user-authentication', name: 'user-authentication', owner: { name: 'security-team', @@ -549,6 +590,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'data-export', name: 'data-export', owner: { name: 'data-team', @@ -562,6 +604,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'admin-api', name: 'admin-api', owner: { name: 'platform-team', @@ -575,6 +618,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'testing-dashboard', name: 'testing-dashboard', owner: { name: 'qa-team', @@ -587,6 +631,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'message-broker', name: 'message-broker', owner: { name: 'platform-team', @@ -600,6 +645,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'payment-processor', name: 'payment-processor', owner: { name: 'finance-team', @@ -613,6 +659,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'document-viewer', name: 'document-viewer', owner: { name: 'frontend-team', @@ -625,6 +672,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'load-balancer', name: 'load-balancer', owner: { name: 'devops-team', @@ -638,6 +686,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'security-audit', name: 'security-audit', owner: { name: 'security-team', @@ -651,6 +700,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'user-settings', name: 'user-settings', owner: { name: 'frontend-team', @@ -664,6 +714,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'data-import', name: 'data-import', owner: { name: 'data-team', @@ -677,6 +728,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'infrastructure-monitor', name: 'infrastructure-monitor', owner: { name: 'devops-team', @@ -690,6 +742,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'notification-manager', name: 'notification-manager', owner: { name: 'communication-team', @@ -703,6 +756,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'analytics-processor', name: 'analytics-processor', owner: { name: 'analytics-team', @@ -716,6 +770,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'file-manager', name: 'file-manager', owner: { name: 'storage-team', @@ -728,6 +783,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'search-index', name: 'search-index', owner: { name: 'search-team', @@ -740,6 +796,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'mobile-authentication', name: 'mobile-authentication', owner: { name: 'mobile-team', @@ -753,6 +810,7 @@ export const data: DataProps[] = [ lifecycle: 'experimental', }, { + id: 'system-monitor', name: 'system-monitor', owner: { name: 'devops-team', @@ -766,6 +824,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'media-processor', name: 'media-processor', owner: { name: 'media-team', @@ -778,6 +837,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'user-management', name: 'user-management', owner: { name: 'security-team', @@ -790,6 +850,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'data-transformer', name: 'data-transformer', owner: { name: 'data-team', @@ -803,6 +864,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'admin-dashboard', name: 'admin-dashboard', owner: { name: 'platform-team', @@ -816,6 +878,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'test-automation', name: 'test-automation', owner: { name: 'qa-team', @@ -828,6 +891,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'event-bus', name: 'event-bus', owner: { name: 'platform-team', @@ -840,6 +904,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'invoice-generator', name: 'invoice-generator', owner: { name: 'finance-team', @@ -852,6 +917,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'document-editor', name: 'document-editor', owner: { name: 'frontend-team', @@ -864,6 +930,7 @@ export const data: DataProps[] = [ lifecycle: 'experimental', }, { + id: 'service-discovery', name: 'service-discovery', owner: { name: 'devops-team', @@ -876,6 +943,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'security-monitor', name: 'security-monitor', owner: { name: 'security-team', @@ -888,6 +956,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'user-preferences', name: 'user-preferences', owner: { name: 'frontend-team', @@ -900,6 +969,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'data-validator', name: 'data-validator', owner: { name: 'data-team', @@ -912,6 +982,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'infrastructure-automation', name: 'infrastructure-automation', owner: { name: 'devops-team', @@ -925,6 +996,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'notification-dispatcher', name: 'notification-dispatcher', owner: { name: 'communication-team', @@ -938,6 +1010,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'analytics-collector', name: 'analytics-collector', owner: { name: 'analytics-team', @@ -950,6 +1023,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'file-processor', name: 'file-processor', owner: { name: 'storage-team', @@ -962,6 +1036,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'search-analyzer', name: 'search-analyzer', owner: { name: 'search-team', @@ -974,6 +1049,7 @@ export const data: DataProps[] = [ lifecycle: 'experimental', }, { + id: 'mobile-notifications', name: 'mobile-notifications', owner: { name: 'mobile-team', @@ -986,6 +1062,7 @@ export const data: DataProps[] = [ lifecycle: 'experimental', }, { + id: 'system-alerts', name: 'system-alerts', owner: { name: 'devops-team', @@ -998,6 +1075,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'media-encoder', name: 'media-encoder', owner: { name: 'media-team', @@ -1010,6 +1088,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'user-authorization', name: 'user-authorization', owner: { name: 'security-team', @@ -1022,6 +1101,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'data-aggregator', name: 'data-aggregator', owner: { name: 'data-team', @@ -1034,6 +1114,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'admin-authentication', name: 'admin-authentication', owner: { name: 'platform-team', @@ -1046,6 +1127,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'test-coverage', name: 'test-coverage', owner: { name: 'qa-team', @@ -1058,6 +1140,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'event-processor', name: 'event-processor', owner: { name: 'platform-team', @@ -1070,6 +1153,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'payment-validator', name: 'payment-validator', owner: { name: 'finance-team', @@ -1082,6 +1166,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'document-converter', name: 'document-converter', owner: { name: 'frontend-team', @@ -1094,6 +1179,7 @@ export const data: DataProps[] = [ lifecycle: 'experimental', }, { + id: 'service-health', name: 'service-health', owner: { name: 'devops-team', @@ -1106,6 +1192,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'security-logger', name: 'security-logger', owner: { name: 'security-team', @@ -1118,6 +1205,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'user-analytics', name: 'user-analytics', owner: { name: 'frontend-team', @@ -1131,6 +1219,7 @@ export const data: DataProps[] = [ lifecycle: 'experimental', }, { + id: 'data-cleaner', name: 'data-cleaner', owner: { name: 'data-team', @@ -1143,6 +1232,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'infrastructure-deployer', name: 'infrastructure-deployer', owner: { name: 'devops-team', @@ -1155,6 +1245,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'notification-queue', name: 'notification-queue', owner: { name: 'communication-team', @@ -1167,6 +1258,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'analytics-exporter', name: 'analytics-exporter', owner: { name: 'analytics-team', @@ -1179,6 +1271,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'file-validator', name: 'file-validator', owner: { name: 'storage-team', @@ -1191,6 +1284,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'search-optimizer', name: 'search-optimizer', owner: { name: 'search-team', @@ -1203,6 +1297,7 @@ export const data: DataProps[] = [ lifecycle: 'experimental', }, { + id: 'mobile-analytics', name: 'mobile-analytics', owner: { name: 'mobile-team', @@ -1215,6 +1310,7 @@ export const data: DataProps[] = [ lifecycle: 'experimental', }, { + id: 'system-logger', name: 'system-logger', owner: { name: 'devops-team', @@ -1227,6 +1323,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'media-validator', name: 'media-validator', owner: { name: 'media-team', @@ -1239,6 +1336,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'user-audit', name: 'user-audit', owner: { name: 'security-team', @@ -1251,6 +1349,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'data-normalizer', name: 'data-normalizer', owner: { name: 'data-team', @@ -1263,6 +1362,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'admin-authorization', name: 'admin-authorization', owner: { name: 'platform-team', @@ -1275,6 +1375,7 @@ export const data: DataProps[] = [ lifecycle: 'production', }, { + id: 'test-reporting', name: 'test-reporting', owner: { name: 'qa-team', diff --git a/packages/ui/src/components/Table/mocked-data2.ts b/packages/ui/src/components/Table/stories/mocked-data2.ts similarity index 100% rename from packages/ui/src/components/Table/mocked-data2.ts rename to packages/ui/src/components/Table/stories/mocked-data2.ts diff --git a/packages/ui/src/components/Table/mocked-data3.ts b/packages/ui/src/components/Table/stories/mocked-data3.ts similarity index 100% rename from packages/ui/src/components/Table/mocked-data3.ts rename to packages/ui/src/components/Table/stories/mocked-data3.ts diff --git a/packages/ui/src/components/Table/mocked-data4.ts b/packages/ui/src/components/Table/stories/mocked-data4.ts similarity index 99% rename from packages/ui/src/components/Table/mocked-data4.ts rename to packages/ui/src/components/Table/stories/mocked-data4.ts index b86d4c903f..5cedd2cbae 100644 --- a/packages/ui/src/components/Table/mocked-data4.ts +++ b/packages/ui/src/components/Table/stories/mocked-data4.ts @@ -15,6 +15,7 @@ */ export interface RockBandDataProps { + id: string; name: string; image: string; description: string; @@ -31,6 +32,7 @@ export interface RockBandDataProps { export const data: RockBandDataProps[] = [ { + id: 'The Beatles', name: 'The Beatles', image: 'https://upload.wikimedia.org/wikipedia/en/thumb/4/42/Beatles_-_Abbey_Road.jpg/250px-Beatles_-_Abbey_Road.jpg', @@ -57,6 +59,7 @@ export const data: RockBandDataProps[] = [ website: 'https://www.thebeatles.com', }, { + id: 'Led Zeppelin', name: 'Led Zeppelin', image: 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxMTEhUSExMWFRUXGBcYFxgYGBcXGBgXGBUYFhgYFhgYHSggGBolHRcXITEhJSkrLi4uGB8zODMtNygtLysBCgoKBQUFDgUFDisZExkrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrK//AABEIALwBDAMBIgACEQEDEQH/xAAcAAABBQEBAQAAAAAAAAAAAAAGAQIEBQcAAwj/xABCEAACAQIEBAQDBQYFBAEFAQABAhEAAwQSITEFBkFREyJhcTKBkQdCobHwFCNScsHRM2KC4fEkg5KiQxdTc6OyFf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwDZzS0gpaBK6urqDq6urqDq6krqBa6krqDjSVxrqDprqSuoFmuFJSigWaWkFdQdS0grqBa411JQcaQmuNV/FMVlUgHUg/Kg8+Kcat2d5J7Dt3J6CgXiX2nFLoVbQKGAGLFNZgk5htU7ia3C9uyozggEkgEmQRm1I2jodMwq24fyxYyL41pHYDqJGpkmDufU0HYTnFAiteAAZgilD4gk6DNG1FStQVxjhdq0gVhlsh1dGk/unVsyySdLZOnpMbHS14HxwXGyaHyzI1HyNARUtMFOoOpaSloENIwp1IaBa6urqDjSV1dQdSV1NJoFmummzXTQOmups0s0C00murzuXANaB80mas/5u+0uxhly2Ct+6egMqv8AOR19KAb/ANquPZgQ1tB/CEBB9y0mg37NSg1mvLP2rWLxS3iVNm4YGfQ2idt5lJ9RA71ottwdZoJE11eeanTQPpKQGloFrqSaaTQI7UL8UZ7twqNEUEluuYEZQo7DUyav8ZdgGgbGY4XRdt+IbfSREn/bSJ9aCnt8cvJde5cVFbNaQKznKLbZir5gCczHy6CdYANGvBOLXWA8ZbYVhKFPEB9mW4oI+cH0FZ7wJ7jYgC4ZHiIkn7xV7t4R1O2Yeh13FaPjQ0L4YUkEEyxUR1JIU9KCvxXBXvNcLvnVwR+8NwhQWMqltWVAMvWJmJmq7lu0bd5VyeGgQrl3lywOYHqIHyJb3orw+IUyuZSd8oIJH4z86EP2/NiblvT93d9hHhp17h80j1HpIaHhrkivcVU8KxIIg79R2q0BoHUtJS0HUhNdXRQLXV1JQcaSuNJNB01E4jjUs22uOYVRJqSxrNPtI4mbpOHRiAozN2LfdX8Z+QoKHmT7QMRec28OSqzpl/239++3QlmBw3GLdv8AaPGugAzkZ2JIjcqdI9Pwq0+zfhVhE8a5ke6zsqgssrl8p8p3Myd9BEAdT3H4lVGp37KWj1IUGB6nSgqeR+cRjEyuAt5PiXoY0zL/AG6UVrdFfN9jibYTGi6mkPJH+Q7r66Vu3D+IB1V1MhhI9qC7a7WZfbJx69ZtW7Vpiq3S6uwMGAF8oO+snUfwx1oz4zjclm4wmcpC5d8x0UCeskV8+80cZxN5hYxDqxsMy+UAeYHKSdPT060FITVry/y/fxj5LKgxGZmMKs9+p9gDUPhPD2xF1bKQGadTsIE6kdK2HlfhRwFpxoSVYkobgBI+9lZ2Ab1AG3yoM85v5QuYEW2JLo2jMBoH3AjoCJj2o1+yfm27cP7JdYMESbbHeAYyk9YG3tULnzh998O7sXyIM+t5rgYSCcyPOQjUgqemwnTPeFYtrbhlYqRsRvPSg+pUea9laqPgGJL2LRZgWKISRtmKifxq2VqCQDTpryBp4NA4mvN2pSa8bjUFNzFfXIVZsoI1PaszFyzbwl5XuFyZJZN7h+6oIGg9Onzo15o4rZC3EuifKTHcCAfzrL8JxbC2UvhJAurGQnNqCCGXSFKwdTQQsFxh7dxbuY5sNcLNaJMOpyWXZT/EoCAg9NRs1azwfjWExoUAqxWDkY6g9MyHSR3rEOJ4sXGzARmMvMeZtQDp6GfcmtK5G4Vh71pWa3bdlGudA2nY5pmgM+N8wYfBWWZmWVHltrGZmOygD5a9BrWT8Hxd/wAR7l7zLdJuFQ0f4p302AD9egoo+0kWksC2iKh3VUXKJJCzCiOtBXBsViLcMqgquYCQJYspABPWPK3+kUG38HxS5c/whjOu8DQfgKIsPckVlvK9u81xrjHLaMMqGSdAAzDspaSAe4o54NxIMPhI1iOo96C/paYhp1AtLSUtAlJTqaaBDTTSk01jQeOJuQpPpWScxXApu3mbLmMDX7ijOzR10P4VovM3EVs2WdjA0/E/2k/KsB5y4hcuuB/8YUZOxDksD81y/IUG2YLFWLGFth3ChUtlpkwzgHUDqSfxqEDbxGIuqtycqqDkdkZT7qQw9CPX51+C5lwYwqXFJ8RUgbBx8OYHMIIOVTqCDAPrVBzBxixaU4y04OIYgJoiEZRqGVAM0yJMaiKAU5ow+W9clizJedGY7nyZhPcwN+5o/wCQOJZsKoJ1Qlfl0/Csrs4trmdn8zPdLn1LW7gY6fzfhV9yZxXwwyk/rSPzP0oNS5lxwTC3LhjyZW120YHUQfbbrWB8Rv8AiXXeZzOzTrrLEzrrrWkcx4hsVhGtoTPlYgSZykHLHWdNO461l7CgJ/s+41awuJL3pylSJABg7++u3zo1v8Y4hfQ3USzYRklA5ctcRirL5x5dVn/MCdgNayKp1ji99MgW84Fv4BmJC+gU6R6UGhcyc3h8A9l7fhYhv3TWt4UqDnkwYKnqJk1m1kjMJMCRJ3gTrp1pL99nZndizMSWYmSSdyaaKD6Q5XwapbDKB5gDIEAyN46TqT6zRAKoOVOIW79hHtHywAPSAJHrG3uCOlXyig9lp001a4mgVjUTFv5TUkmvC+ukUGRcxcRuG4ywrqJbKfhJGaJH3ogwD1A3ql4lwSzcRbiIUzDMf4VAEkKOu/6g1ofE+XrbM8j4o/D/AJqoxfALp8NSwyJoCB5gNDrB1EjWgyhbAZoE5Zj1rUOTeEPaRWtvBI+8Mw19ARTuD8nAXCWiFJmRM6LB+ep9oo4wmECwBsAP+KAC5l5fvMRca9cueYEjKoVR3CqJb5k1R30gPbRXuWoU6+RkZSTIEHTzEQd962XwxXi/DbRbNkE9436UATyxZNxQrMdRAEnYAkAmNxP5UYcPwnhBQO+skknytqSfap+HwqJqqKvcgAflXnxHEpbALsFB2nqQCx/AGgn4a6c0dI1+pA/XpU8GqPB3wxLDbQT7CfrJP0qzw9/7p+VBLpaQUooENNNKahcQx6WhLddgN/8Aig9cTfVFLMYA/WnrWe89c1ObFy1ZDKWAh1kMokE6g+U6HbvTeZOPNdMAwBMDoNvqaEb1wtMmd567bigGuM8wYm6uW7ddx/mZm2/mPtVH4jvCST2BO3TSdhRRisJsQBG4Y/D6T2Hrt6jerLlTB4ZHS5i8Oly1cOXPJYI3lynytEHMfYQdtSE//wClmI8PTEoJE5HQ6EjUSGP1HahDm/lq5gjbF24rs+YgKDoBEyT7ivodro1Pb8omsa+0HjFrFOCFHh22Kh9nfMN0/wAmgMddD6AAKziisQBoSfckR+U/WiH7PeFjE4ko2qpbZwpJAd5CorEahTmO3b3oev213EgSAJ1O25rT/so4Kf2S9fH+JcaLZ9LJlZ7TczA+goJ3OGFY4VXwwVMmVskBf3Z006AqdwR/FWR47Ctbco4hhBOs7iRr863TjjCEuR+6ulAw/h8WEefQqxP8yetCHE+UlxNws1xrbrC3AFBnIsErJ0mBrrQD/LuHstaS04Du7m6Vg/4eUI6M3RjlFwAa/uukiZXFfs+a0j3hfTw1BMFWzR0Gkyx0FGvC+UbNi2PDktoczHWYIEwBpJmKUXmYxeAW3bcC2Bq125EiFHRJPzE6BaDJOKcKewLef4nWSNfKdDlPrDA/OvPhuDa7cW2ilmYwACB0k6nTp1rQMZyi2JutcuO6eKxcqCDlAGVIkQDGUewjoCLDgfKdvC3ZR2ZyCudoELoXygCJlrag+re1AW8gcMfD4S3auMrMC5OWcozOzZRIG0xtGlFKmqDgjhRk7Ex7EkwPQaiOgirpHoPeaQmmFq82ujvQSAaj3moM419p2DsFkXNeYaeQDLP87aH5UM437XJPkw5y9Qza/Uf2oD+83nPy96W0vUQR+torOcL9pSFpuW2UekGPfXX5UacL4vavIHQyDtoQfnIoLGw2VmUiIiNtQVGv1DD5VNtvVLxe9HhOBtcAY7EK3liBvLFNNuvSrOxcmgmA0tu2SNyD+u4pgbpUix8I+v1oFt2QNdSfUz9BsPkKoua+XmxeSLuQIHhcshmYAAsZkACR/qNEIr0VaCl4RFqbLCHXUn+Kdc49CZPvI6VazpTMfgM4BU5XX4W/NT/lOn0mq4cTCSt3yMIkN6mBB6gnqKC+wt/7p+R71KmqA4odNatcNiQV8xg0DOL4s2rRuCNCszsAWAJPsDWecZ4sWlmJnY+laXiEBBBEgiCKyzifKn/VpZGIdLNzNAgMysAWCI3Y6xmBiPWgE8fjiWCICWPQDMdTGw9qm4fl/FqGuXFyWlU5VkTJZYZguh6mSe2laZwXgdmwMiWwon1M+rMSSx96sOK4fPZuIBup/vQYoWI9+2leZJXJcRRNu5mgroWIUgHTY+F+fep2PtQxgfnXjgbIuP4Wvn3iSVyqWzDuQAw101Oo3AWHH+actj9ntMzZoMEzFsqDldt41mNzMHy7gWKZmMsZP5egHQVPvBDDAtJALkx8XULH3YiJqDiWiggXDr7VvnI2F8HAYdNj4Ydvd5uN+LGsDW0W8o3chV9zoPxNfR6IEXINguUR0gQKCm4tbDW72HJjOjZD2YhmUj1Dbfy164i0M5uxAdDmHYxp+cfKq3nS6bdpbw+4wk+nQ/WfrVt+0BrfplH6ig9cJflOxA27VEt4YZ5gljmAmNM2rR6Qv/se9ehgFSN9BvpBIG20yRSJdVrwUhlORmWZX7+Vtj6CPT50Eu6AuwkxHX8e1QMEQ965AMWYtz0Nxl8R8vsH19Y7VPuXcsNAIGrSYhRqW13jtSYDD5LQB+M5nf8Ancl217AmB6KKBtsw5jsP1+NW9m9pNDpvnNU3D4oxFBa3MVWd/anxe7+5wdtsgvSbjElQVBChWP8ABuW9FHSiC/j4eJqk5j4et+/Zus8KiXBllwWlkIAKCQIDT6DtNAG8d5VWzZzC4ouIMxBYnOvUrplX0HpQjW3eHcZllZQKRaAKxbYiCSFBDfX86yvm/g5w19hkyIxJQTsOqj0BP5UFLNHX2a8UIZrBOnxL/UfrvQGKteWcUbeJtttrB+Yj84oNyxFkXLTITGZSPaRuPak4FeLWkLfEVBb001+h0qFhsf5O57VX8vcSRQ6vcUXrl14QkSqZyEUD2gn1mgOMPqJ7n8NhUpRUSy20bDb5VLWgeKkrUW3UpTQegoV57u22W1YKhrjuGXuioQWYdp0X1k9qJr95UVnc5VUFmJ2AAkk/IVnPCL7Yu/cxTA+YwojRbY0VTrv39Se9AUcNtwoM9KtbdhmEgabVEwNjMwXtq39vc1foABA2oEcUIc3JkC3hvadX+SsCY+Q/GjA1W8Yso1tg4kEHTqfQTQOuoD5h/wAivPEN5GMxode2m9VnKuM/d/szyLlpRAYam1sp7Er8BjsN5BM7iVwKjMSIg77GdAPmYHzoMr42hBPlOpJ9Iih5mIIMAnTcAjfsdJoq4phgAcp8saDeOunYabUL4xhqDp7dNd9qCDxTOrZXQIQF8oED4QQTGkkEEnuTVFibpqfiXWYTMVAGrKFMkCdNes1W4jvQX3I2A8XG4VYkK3it7W5uL/7BB863PF4dyv7sqG7MCQT7g6fjQ1ynyxbwqC/ZJN65Ztgi4QVBgMwQgArJjedhVxhuKJcIBORx8SMYdT2I6jsRoaAb5gxrXMPibN63lZbbbSRKjMNx6Aio3J2PN20M2oWBPcif9q9uc7muIU7tbOU9SCka99QfrVHy3jLduyqsSInodaA3fzPbj4VbMfWFOWfnB+QpLd/96zCJACDtMlj77ih/D4+9fRzZT92cyhsxVmOxKkfDBkT71ZcKRrazeBL6gAGQxmZAn9RQSOLYoJ4aEy967bTX+Gc7COgKIwqxv4omVUZmjpsB3YnT+tZXzNzIRi7RGosXA7dZOgYD5SPnWg47iioMudA5+6WURP3m13oPRrMCZk9fWa8bWKAJBNQcLxBQ+UMGVo2OYZge47iqLmDjARzlNBacUx4FwQfpVNxdP2m9ZSFcKGm2zZVbMVElsrBTEicp3NDmN4z9ajcG4qqXc10ZgdJ1OX101oNV5P4TdwwuBiPCIXJbztc8JhOYB2UEqZ/Cs9+03F+JjIj4EUfUlv60V43m8WcNmQrcJ0GUkiTPxem1ZljMU1241xzLMZP9PlQRJp6XCCCNxB+lNakoNW5Yxy3kzZoYgSp6mIJXvVqeB2bhlhmPykf71mvL3EnSESJkkT+IPejfC4nEnzeGI7qcw3/h+L6A0Fth+H4qwf3Fw5f4XOZfoduuxq2tcw31Ui5hiXAMZSAGMaDXQCfXSqvD8ZdIDqf7+mVgG/Cp1njNljBgbbgr89aCVY5sRR+9VlMAkBLmk6aGIb3U1f3uMWLaq73VCsQqkSxYnYAKCT9NOtVOCxdh9FZT6ZlP9amXcGhGqj5/regHuYuLjG3v2Oy/7pSPFZTOdgZyAj7gMT3PoNb7h/DxaRURdf1rUSzwayrZwvm/i1zD2JP5UQcGuFlJKt/MVKzBjYgdtxoaCZgsPkWOu5Pc1JFNFOFA014XbQJn0j+ule9NNAKcewFwMl+wVW7bn4vhZW0ZHjUqdPYgHpQxzXzOL9r9ju2GtX7jaqScpFuX8SxeAhiHW3uARJMaVomLAkA9dB79qDeab4Ft2bDftFq2Zu29r9ob+JabZl0kQRsdZUgBn+H4xIZWYGNCSMreoddg3quhImBVbj7hzSNuka+tTeN4SyQuLw19bttWUFbhW3fTNMI4YDOp6HrG53qpxOLcg6BgeogkfIRH5UEfHsxbzlZhdEyx8Ag+TSYj51U4oyrH0NWN/DlSpKlAVBOYr3IJ8vwiR8JEiK8+E4fxL9q2R5bl60nuGuqp/A0H0Fh3EJMLKiAYGpAge/SKj8XQBczKDGxYAr7E6ZT06b1D5yN39lveCoa5kbKuXNM6EBCCGOWYWNag8ENq9ZS7YvX7OYee0HNwI+zoVuq+WCCIEdO9BT8YdMQz21bwrqrlyOPKc2iFLm2p+6SD6daDcFgrpmXYDqBbBIiZHmmKvudsO9gm/afK4QL5ZTyscpyptImTBj4TAgznpxVyCPEcf6m/vrQaxwu02HtW5IS2tsl80A52hsxYbQSwiOtQ+K8yeIMti9YCkHPd8VAyjsoIOXfeZ30FZ3juKXLpYFmCEyLZdmUdgMxqCaC8CWXxCIhlA652118wDHMd+uvWtQXjZtOoCqLTkgHKUYPuBkgZs2sHrH1x7hX+JHcR9WFbHcw7C35VAYZIYk9GElvlOg9utBR8538gDoCs9IykEkT5TrHyoMym55p0kLPqWA/rNXnNElGOUAMyLmGn3gIK/d2JionA+GFrQIOp1K+qkH2BgR7xQQOKctvbGYNmMarB/A9a9eXeXS48e8wt2l18w0ZYIMmfIPU1od7l13BZLmXPuGGYHSOhBG3eq+3hLuHBXEAtaMDOsshHZ7cSu280HpwLCgZ7NxRnt/ECBDp9y4NNZGhjqCKEOdb9lCMPaQAhizkAAeYaARvp9KPsfbDWwRJYwEZIzjNoHTTza6lOonfQUNpyTce8t7GMi5iGKWzmBiBlZtInbT11oM+t4VmRnAkIRm7jNMGO2kV4CtVvco2lvM6TbUrlKiChkRAUqc07mZk7a1T8L5HW7b8VmNt80ZEYELBgyTJB30n6bUAzwqwqkG4vlJgHNlAPow2NaVy5j7RK2i03DOVxKh4EkEbZgO41iYr34RwFLByICzvvOuW3J8zNuFkNoIzEr0oT5vt3sFiB4eUWn89s5ElG6qGiQQdQR0PoaDVrFto/xCB7LPygVHx3B7V8BbigrmkLAInKwlgZDfFOs6gHpQZytzsjEJigoOwuiQv/AHF+5/MNN9q0PxBAA+Ua/QDegjjhFtVCqqBRoPux7RpUjAcHWSVZ0jQLmlCO5ToZnYiq/H8zYa02Rjnuf/btjxHB7NlkJ00Jq65cx4voXCZCDlKkox9zkJjrQe2G4Y33yInZZ1Gu50irW2gAAGgFItPFAopRXV00CUhpTSGgrOMt5MobI7SLbdnymD9YrMsFzDcFlTdn9osrCNBPjps1i9HUxpc1WQGncMVc+JduRbt2ncASSpUan+fRumlZRxzCXrJzMGtj/Pbu2lJPa4pNon3oIXFbai9dOHz27JabaSMyAqJUrJGXMWgTERVa7SZZbbR3UK31iKk3MYQAXUr6nzIf9S7H2+lNbFr8TCR7Bh/5D8jBoK+86tAyqkD7uxMnU9zrv6CrTk+yf2/CCZ/fI3/ic5/AGqq54ZmJHbWf6Cin7L8Nnx6tEi1bd56AkC2J9YdvpQH/ANofF2w+Hz22y3AylTvqD1HUdx1E1L5c5js4q012VtOCBfGgAuEAAhj8QIWAd/LHShH7Vmnwl9SxGuwHShfk3jxwuLV2I8N/JcBgLrORj0GVoM9AWoNE554X4tpoOuUjrvuP171ih37enat05lxRQEZz77bjQSABuND3rF+MpF5zr5jOoAJneY/PrQQq6kmumgtOWMH4uLsW+9wE+yec/gpra8VoNfnWP8kqfHLzGVY9yxA+QAzE+3rV9f4ybRdkuTAZo1ALAEgMDowMD110jegg8531d0tjKWUElh1DEZR9BPzFXPAmTJroGk5p0Vog6ERBgn9CgLx8zl2GZmM5RIHsOsDaOwo74Jg3Nk3CwZ2AK2wIVcuqqC2k+u0/WgLeEYksqq7DMqgDXoPKD5T1I9fep37RnMDKwjbQgjudCIrNOXOYbKljiGImR8LEwWkCVGnQfKi/C80cNyx4oUdQVuSffMutBGSw9vH4dLfltXc+mwR1RmJXfLIG1EvEHa3GYMVgyQczLtqVHxjfuaruGY3D3bymxiEbKjnLmMgmF2LCNGI0irl8ShcI28DUnfU9PlQVVu95wzEKg+F2IysIBkdI1ivcWlS6riDbYy8fdfUAj0J0PqR3q1S0sELlB2BjT9fPWqXm3ia4WwxUKb7EIgEAs9xsoJURmiZIO8dJoLZ8WgkrqWbKoG7kDX5AddhQp9o3DmOEe8TNxWtkxstsMVKL6AvmJ3JXoAALngOANm0nimWVAvsBv8ydT/sKkcSxVl7bWXZIug2wJEnMMug3nWgxe20Ixyroh7nXfXT9RU/B8ZusoVrz5AAIZ2VIHSJiPeK8cFoSjbjMp94yn8jVFhrpEake29AcW8cq+W1Zb/8AJkuZT/IAskesijj7NeJE3Gtk6Ms6oysSNRqzsYAJ0rKsClsnMwYt3PmJ95o25RxS271sgtow3002PptIoNoBp4piU+gUUtJSg0CGmk0401qCr4hbknb5iRt1HUUD8awNsEz5AetsujAeuVoiY0MjTUUd4vrQrxskLMaid9ent60Ge4LhNv8AaTh2cHOha2UhVuATqogqriDmUAqdxl2PhxTljww2UoxbLAYm0SCwOWDpOkzp023qHxPHvbZWQDyP4ls75X3bSIIOxH9aJuAYq/cwoOQNdA3V0W6UMshOaQBBgFtTQZ9//k3GIAVC7GFtrcVrjR2RSSev0q+4KcXgfFZMLdD3cmyXCqLmbKolWnUxq0wBrua0Dk7h4F97jtfZ0QALejyZpkrlRVaQsZhOxqy5r4g1i290jyJbcnWMzQFVfQksevT1oMd49x67iro8VAhthhABBBmCGzHp8qo7zRJ7U/CJDQR0b/8AkkfiKseFcJN65Blbaea68E5VB/AnYToN+lAV4zH30wdvDXgQ9u1DkDPlEzbz6GCoyg/6tdKCOJl2MtLHvoflI3/OjrG8Ww902ma0pN1ibjSVJzMQkDqWEnXuO9DGMSzN1AgkO+SGaAF8pOp69qAbrqm4+woVHUyGmfQiOn1qCaA05J4OWttegmTAWYBVeraTvOlJxu0c5WJnYBSPcep9KXifM13DpYsWMqZbQz+QEydANdNhO3Wm8O422MC4e4AL/wD8VwHKHYfdcbAnXUb7dpCtwWHyz+7QGZzvnBXplAVlI1nr32qdhbruHsWXzEgzlRzkzGCVIJIEe5B1BGteJtXTeew4HjDMSJ8rjLJjuf7V78OsXiuUFcPZBIJGjXCNCZ/rQVa8LuI2S5bKMIkaEazGqkjodJ6HtRPwzgKtAIzMw20ED85qwTh+GdALhe6qmQpJVc38RC6t7tNPxGENwHwQtjI0LkAUlhIIjqP7Ggfwjkq0fF8S2D5lC66iFJMHf7w+lJj+Rbk/usSUGkA5jEfMn8qtOW+MeGht33BcMSzBWKZYABLCQug1n366E9vFoVDBlIOxDAg+x0mgBOA8uYlC4vY24iD4QsSx7+eY9ory45ytiPEt3rd5rz22DLbuwAxUz5GELP8AlMe9aEgDCRHsYrksINCqiewAP4b0AVg8ab8HF4V0EwSXvFAe7WvLlH1/rRbwjhlm2ueylqDrKAa+s71YG0GETI9fpt+B+deNjBhI8MkbyCSRPqTrQY3ibYTE31P3b11f/wBjChG2aL+ZGUYzFZdvGef5p8//ALzQgtBcYI7UV8Dchh39PX9fjQfg3os4K5kGO1BvODuZkVu6g/UVIqt4DcnD2j/lH9qsgaBRSikpaBDTGp9Nagrr4kGhXmMgKZOnf301oqudaFebbOa2wzZWYeQn4c28HtO1BjvHD5nAWHBIyjXXpA9f61peD4euRPKSEUIrKzB1CjLKsPPGgMTQbyuhvYsK6k+Cl9ySfgi2UUEAeaLjWyNf99H4YhyggevlH4Mh1B9s1BEuWrtpCA7XbWXVkAGJtiZlQBF0AdIzRPxbVU8x8T8SxZsu63/EFwhlUhbiCCGJ+FXA0K99QANiHHsVUsIEbGTIPp+ulZtxbEtcxgNoQVDXbgB8sqpDXAOkggGN/nQDF+wbT6yTbYBvVdCD/qX+tGdjhrJg7OEtmLmOuN4pGpGGtEgwegIBIn+IivS9wYYpPESBdC5WUiQ6jUabyJ0ZQTqQQdCKvCX72GuECBcS2FMqSApGylgG6yRA1JoPTjHEFxHFMNbRAtuzetLlABkrcUsNNCAFCj2NRuI3VfigDWpBDKV7kq7A9iNqr1z4a6l9RLo4cFpKsZJObUb6zHeop45c/bBjSFNwPnywcm2XLEzGXTegh4xAouJEEXjodwIaNPlUKP11r3xl43He4d3ZmMbDMZgemteMUEniOL8W61yIBPlG+VQIUT10Ak9TJrwXTUaEagjQgjUEHoQfypy+kep/XvTxFBa8R4utxbV4ZkxaMM5gZHAHxzM5iYkerdKkPxOSr5wQybZvhM+ZSJ0GbbuINUfh5tqjssGgNsBx62qw9wDp5QTA3MiDP161Z4XmnDAGbgMzodJG2ummnoeu9Z3YidSB7/8ANXdviVlFg5WP8K2RqfV7jkAeuU+1AXNxFcSviJcsnLmNu2TbzSDoBbd1CtI+Jg/QiJp2FLElmLh2AkwtxWO0NlzJ0qmwWMZbOuDs3s5Z8hZDdRAgljbW2PLFsnTXXUCdUwVzCuQYGHYnLleHtZu2aM6n309qA04fx1hAcT0BXbt7qfeiTCcQVhv9dJ+Y0P4UM4Hl0AA6LOxVio36DUfQ1Kfgt2ZRzPWMqMfU6FWPyFAV2o3HXf1ry4hiVso91jCopdvZVk/lQviMfewuXPDzBMeVgCSNwSJAj3g0Bc0c93sXbNkILNsnzAMXZ4MgFoELIGgGsbxpQUj4gsWdviclj7sSx/E1Cx+E8Mp2e1auA/z21LfR84/00oOmhqbxd1fDYNwIZVvWG/7d3xVP/jiKCPgjRVwYyV66x+VCGFOtFXBr3wqoJYmPruaDdOVz/wBNb9AR9GNW4qk5SYeAFBnIxQ+4AJ/EmrxaBaWkNcKBaa1OppoK27pNDvNGHDWXAGaekwdp8poljpQhxrEMl1rI1QoXg65SI+E9BQBXIKBr+MJWX8NLfbRrozA++QT7Vo2Ew4AAnXaT+TAdaCfsqsgvinMyWtr8hnI+fmNHVyRcIBgEA9N5igGua8ettXMhX0BBMGAJGn3hrv6Gqj7N+EB0v4t1kXSbSTrNtf8AEPsWhf8Atmon2nEhh1IBUE75dNPxP1rR+C4JLWGs20EKttI76rJJ9SSSfegAcLhmtm5a/hMAkTtsY9oPzoc4+5GJDMCZAE+cht9s066jqRptNaLxrDqLuYDVlE/JoH4flQVzi2V7QG2RjHSQU1oInHnlIkEgCR2nXTvpQdiySS3ei61YBw9tjqXzM099dvpQhNB4FKTLXvFNig8gKeq16RXCgl2oUZj9P1+tar7gJJNXPD7Cu1tG1GW4x1OpRCwB9NOlRsSgg+8foUFYVpakuIpjLrQIl1pBk6TGvff61Iu4u41vwyZXNm1EmYjft/Ydq8Ipy0Htw3iN6ySbN17ZJk5WgE92U6N8waKcDz7jFGVstyNSYFt49CAVX/woSRAQTXuEgAjTWg1XDXbWOti9bus8KFZHyhrZBJ1CiCddxoRFZbxnBCzfu29wrmPY+YD5Ax8qNPsiuE4m8k+VrBYjpmW7bUH6O31ql+0jCqnELuWfOttz7lADHp5Z+ZoBWKsywOByx5kxRM9ku2BofdrOnsag5KmYCwGTEzP7uyLiwYGYYmxa1HXy3X+tBBsrrRDwXFZGU9R/Yg1Q2jrU/COZFBvn2cD/AKJZ3LuT7sZ/rRUKEfs1cnCx2On0ouoOFOpBXUH/2Q==', @@ -74,6 +77,7 @@ export const data: RockBandDataProps[] = [ website: 'https://www.ledzeppelin.com', }, { + id: 'Pink Floyd', name: 'Pink Floyd', image: 'https://upload.wikimedia.org/wikipedia/en/d/d6/Pink_Floyd_-_all_members.jpg', @@ -97,6 +101,7 @@ export const data: RockBandDataProps[] = [ website: 'https://www.pinkfloyd.com', }, { + id: 'The Rolling Stones', name: 'The Rolling Stones', image: 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxMTEhUTExIWFhUXGBgXGBcYFx0YHhoYHRgXFxgdFxcdHSggGBolHhcWIjEhJSkrLi4uGB8zODMtNygtLisBCgoKDg0OGhAQGy0lICUtLS0tLS0tLS0tNS0tLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLf/AABEIAL8BCAMBIgACEQEDEQH/xAAbAAACAwEBAQAAAAAAAAAAAAAEBQIDBgEAB//EAEMQAAIBAgQDBgMGBAUCBQUAAAECEQADBBIhMQVBUQYTImFxgTKRoSNCscHR8BRSYuEHcoKS8SRTFTNDstIWc5Oiw//EABoBAAIDAQEAAAAAAAAAAAAAAAIDAAEEBQb/xAAvEQACAgIBAwIEBQQDAAAAAAAAAQIRAyESBDFBIlETMmFxBRSBkbHB0eHwQmKh/9oADAMBAAIRAxEAPwDN8F7GqozYskSoZVTlqPj+e1aO5igAEUqAsADKBpoBVV6+S0TJKk/Dpz2PXSgsRYklo1yxofXlXNnmcjZGHuF2nm6AygTppGs/jXLzBEvWQd7V0AHmCjfnSjE44LoWhgQQJj9ipcZxYa2l5GHeIYj+ZGEEHqKLEnotrwaS9jCpytBDKCp1112nrpUQ5zaBgOupjSkOG4qLyZHEaGD57j0qdvieZe6RjnOk7/8AJ0rTGDboF6Qn7QIBeeDOv150lY1o73DV1LP1mevnSvH4S2oOViSACJ59Yrb2VGenYLhsQVMjpFWWVkgdaEtbxTq1w0qM+YGIO1VzS7lqEpK0LcTaIOoijuHYoW7YZVAuK4KtGscweoq3FOtx1zSBzqvH4busoncaj3qOW0icNN+Bl20wqzh8Qog4i0HYaRmAUGBy3rR9m8f3tgLmhlABB8tOlYVLgIhszQIHkJnToN6YcGx4s3QwBA2InlRNWqE1oY9ucH4bd0AfDlYjryn61h7tfUOK2hdtXEEHMDl33BkV8zxFhhqVIExtzpaeqGRKVorD0KtE2KKJbGto6VReFW2DpVd6m+AUX4a73im0xHVSeumlLbikEg7ipFoM0Vi1FxO8HxD4h+dKemGLLgqmKvaqiKplFls0ysNIpYlH4VqOILF2PXelZFPMetJnQztS59wolRrhq4WDUhYFLsYkyqydaINdW1pIGg5+sxr7H5VwtQtjYQ3TOg1yog612qcku4+OGb+Vn1dDopMRrrp5Ug47x/u0HdDUyuYkQD5Dek/F+0DGVUnQmByH6n6Uhe4WJLamsmLpm3chE5JKhlxC0fC5JbOAZP1prxvD23weHvI3iSLdwE6zGkD96GgsPdzYcSPgPTkfyqItd8MqkCNdRG1bIypbM8LnryDYMkxqd6Y4S/kYMpggyD6VT/Cd1IZgdjpRGDVOk+9PxtPaLmmtMbcSxFu6BdLAXGJDrEDbQge31oNbqRBAOnQV5sIh1Jj0il2ItsDCmRNXNJ6JCTiWXrxYgC2qwdxzkVYhuvCDUnz3q/hQP3kVtjqaeYVkS6GFhUIDAEsSM0aT06+1LSSLc23RS/C7YAFxwptmGZfEpOUtAI32I051dj+zs2+9tXluECWA1gbiDOp5nSB1Ok5Tity8JlwZMkAjnIB3mCBty08q7wniF22YVo011OvrVcnZNdg5EM76iaji38Rjy/Ciu5B8QgBoMA7TIMTrQmJSDWiIuWkDXcfdH/qN86XX8Qx3Ynnvzom/QN2hkSJ5WphwvCPduLbQSzEAClqV9Q4Hg7WAyXLsm+yjL90IzbAjeADqQPKOqpT4oYo2Hp2NsYayWuMLrD4yzFUXSSEC+InbUz6Cdc3xfhVgoLli6Mx1a0fuzsAenrzonG9qc7MFhVk+OCSeh1JgkzzPLUxSW3h2N/MskMCzdCJhiRsBJny0pKyzvYzhES3gQSDuKlg8TlbXY6H0q/iFhpDkEBxmUnmJKz8waDNoVptNC62WY+wEbQyp1BoQqavZ6iTVE4kVSi8OtULV9s0SKo5jBzpZcOtMsQJpXfSgmMiRJFWWSJ2oYOf+akt2OVIlFtG7DnxRabQVecxHImflIH4mg7lWrczMq7SQJOwkxJ+c0x4rwwW2IXvsqgS3dhuUkhgwAXlrEQd6uEGkL6jPGeXkuwnAjU16r8VhQsyWzCNGABMx0c8jXqtr3FfFfgrNdAp3iuy+IU+Be8UiQysNR6EivWOzGIPxKEG8swH4Gg+Pjq+SM/Bg3B7oDFJgOCp6a7H51PDXjZYwQTqNRPlRtjs/4ot4iy1wa5Ad/Q0v4th2S54lgnWOh2NSM4ylQCUoStE8Ri2uEFgNBGmlWWEoG29GWLla8aS0iTbbthF2QKEa8w50Y9zSg7rijkgERt49h5/uaNGOzq4EhspYD0gnX0B+VLHIo3AYG45DIhiQAzeFZOkZjoSZ+ESTOgNAsbk6SDslhcA7IhMHMYRZ1MgmSJ2gR70fc4Y4t3IScoJMfdgyd9fhnT5itFjOErZZEdQQoDITrlBGYToJIEbxFOuNXUFm/csqi95bZs4XKWYwozSIaWI16b9azyUlLiaYwi1Z85tAwJ/etWttV13COhAdSsiRI3B5qdmHmNK8V0rdFUjG9sV36CuIelNb4oC6elJmMigdE9Px/wCa2uL4r3uGs96+YnRm3KEGJb1kGB1rN4vg92zBv/ZEx4WnPHUoASo9YpzwO9YCXVyFityzLsAQbcqXhdQpBB6/CNSJBVODaDjNJ0aHCdn07nPeDu7eLwyW8oXWZ31FRxvAFto7v3oQoXXPACnVBmI2Mx4RJ0GlObeMCAg6soP+316ab+RpN2u44HtW7AaWMOw8Pw65JymCCTI/y+dIXqeja4JaMrj7i5VRSSqAhTqNSQSYPL5a0rd6IvN9NBQbGtCVIV1PBZKx9lr7/X/fBwmpKarJrqmrEF6VcgqhDRVsUSKqz13alN5efXb0p06yPWluMXWpIIXGo1NqiaSQ5FdR9QST0mdYrwUmvMuk1CNEWGpivV5n6aV6oFQTYxlxNEuOo6BiB8gYrl3Eu/xu7f5mJ/E1TR/C+EXLpEDKv8zTHt1qS4x2xKth/Z3xvbRbYzK2c3JM5eYI2pn23uKxBG+/tEGiLeJs4NMttgWM5jzJ18tKzOJ4q7OXLQxEDXYVlheTLz7JDJqo0C2zRVg1EYm42uaZ3NXWieZroRYlotY6ULcBphIih2WTqYHM9ABJPsJNG7ekSMS/A/YqHyg3HErInKs/d6O0aHcCI3Na7sqq3Li3GLMxkh7hDFVEZ4ERbX7sKCWZgNjFYji2Jm6xGgBIA/lVdIHlAplwbFOshWIJIVY5Rvz5ZgR5zXchwx43Apxsf9pOI5MVcuSVW4FClgcgdfjDKCzK3jU+UwRKmVXEePX8SoQ5AoXN4J8XiCSZAJ1YQIFHYrEEL3EHuTowYCGAzLM7r4iTMg6b6zSvCOllhIJ7t7ZCwG+zXvM4M6Ez3fkZO0VyJRcZPL+x0/yuTFhk5rSSr9WbfsdxX+Cs/wAPjjbe1cV2t2rkO1pwCQGQghUePYxpLGF/aq7gQB3CEXCTBQnJEKQWV5OoOhWAd4qj/EazatFQloLcyoCytoIUBbYta5IUA6nYjfllBi2uubjtmYkSfRQo0Hko+VM/CoLqMHxJ+TnqPGVojiDNG9nQLbPimH/kwUkTN1pyH/TBb1y0HdplxDCm3grQaFDsbkE+JyYAKrvkCwCx0zCBOsKjG3sVOWgG/wAUuYhwbzG42sFtY/cUBfwgMgTBO06eU1LhyeNj0Ee53/L50aLf79qU9go1/AMTgjZQ38UGuIB4bhyFSBqsEw8HSdZrHYuwLmKu3bbZlYk5uk6ZYO4EASNOm1LL25PUk/WnXBhAEckWfrM/Ks6xqLtGueZzSTAMRbOpIjU8+UkaeVCNVrYrOTz8/wB/6vpVT00XF2VmvVIWya9EUNjVjlV1ovw5otaX2m1p/wBn+FNiby2gYG7NEwo3PTmPnV2asLXFwfZgy0BilrdrZwVgtbyC9Hha5ccLrromoWfTXz5Uk43wMLb7+202y5XKRDLzGsnMOU6fpfKzGlsxjprVgsACalid/Kp3fhH75f3rPkbTSOjgwQ+HKcvC0V3BoPQH8aouLIorEb+w/OqbR3/ysPmpqsbtWL6yPDI4+yBGrlTG3nA19thXqYZr0aD/AMZRJ7rD216EiTpVGN41iH+JoBAMKI05UoNw1diCwySDqgIkcpMR5b0CwxW6FczjsTrua+5dk7mGs2baKMv2eaVUksQpLsSoObY6n9K+Fo06RvX1zhnGLy2U7xhba7DAagSdCFhWEmTKbieVH2G44pq7M326wFkXzdtEBWVGIUQDcLXATHIlVDbanN1rOExp+5pv2o4ybx7yQS7vB/pXwj6s8eUCkCGihb2NzTxxx8EvV5f9AwGajeEo58go9WP/AMQ1dtmq8WYQeZJ/AD5eL51t6aPLIvoZI6QPfxcXg6/dZXHrIfbpPKn3DnyvaKgkC8yqJjVRcKknqSfoKzmFXPdQciyz0ALAT6ain3B0DHDo40d7jFddf/MCg+R19prU53yZUPmVjfjNi+hzEBckEHMRo0tBOUCQdI31jWBVWCD4lyzKbrF8hMBfs1A+NgugIbVmGgUU+7V4q2uGcZSAzhI2kBcylIMFZiZ6AaVT/h3dJu20Ughg6lSYbKc0uvUrIEdLk/d0wdTPjBtHU6jM3iS/t9/5Be0VlsRjLeHZcjMWLgNm1VCJk8zlby0nnWOwtwwpHRZ+k0/7SY//AKvE3gTKq6CdCGKm3I10IZyfYUiUj7uo29q6nRRccaX/AFX7vZzZPbDrFnO6p/MQNNdzBgCmfaQozlst57oHiZyiqqjRVtWlJZEAEAN4uoBmruxrqMUpIJhLhGUEtmCMRlA1J00iD5jcbPtl/h5duYf+IDs95VBe2TnOUfEEfcsBy5xv15raSMeRtM+UYIwp89fnqPpFGYlgqMeiyPXYfWKL4FgA16GEgSxHLoPaSKH7V5VJAjV4AGmm506SBVSVQsqM05UZ43SBrH78qc8Fb7F25nNH/tH50jxbbCKZ4K6ww+UCTmI9pJNINDZTgkGQGNf3v5n8q61FWcA6KqlWzMfDzzbDwxuZIEfnVtrgmIuXGtLabMrFXnQKQdQxOgPlv0mqbSVsfgVuNeQGyYk0Xwbgd7EsBbU5Jhrh0VRz1OjH+ka1sMF2Vw9i33mJdWjfN4bYPSN31+fSl/Ge3MfZ4RcsQBcYRH/27ewHmem1ZPiubaxr9fB1OqnFqMU9Jf8ArG9jsph7S+IZiIksdyAy6HQiQ0kTEqDyqLcVw9q4LFtMxbQhdQCQqw25Ywig7/CJ2rA3r97EXBndrj6wWO3XfRR8hTHh2FVMtw3/ABgyq21zfDqCzkgKNOQOlFHppS+eTZil1EIPtRteGfZwVVZ0Bk8idYP719SaV9s7xOVSArHUhWzAgSFJ01Op18/lRwnjiG2JuKG5gnJB1JgkRloPGu+Jz4hYKLA1ZQQOXhJBJMToDvT4RfK2DKcVHRmr6eIVC/uP3z/SjLieIaVVxTA3LeVmWAdB8p8XTTl7bg0vJ86OpFpdMn7tfyDYjcegoXPXmbz9/wB7CoVIR4qjB1WZZcjkiA2Ferw2r1GZl2Clwo5t8qsu2AYAY6CNfn5da4t1SN6IvNPT28hEAbxp0qxdIf8AALtlUVABmjxSACTuSCTr5Aa6Vo8FhA0MWZbKXEZzOg1AkTpmg6/XSK+eWbbNoqk+g/E8q244kxs2rTQcigMBsxA+9G7fvc1LvQp41CXxG3RHjvAbN0zbAtZAU8LZ1JDHxEQILbmOdYkKQSDuDB9RvWvxnEgEheZA/T22pAmEFzEtbL5CzeE5S0sxBA01G++tGlRUcjnJv9ihDpRl2wDh1aBJLaxyGgk8hvRvGeAGy6LaLXg6kyEIMgw3g1gQVO533qg4fLZUZpJcyFZTAhdG10g8v7Gt/QNfE/QfJNKjOJKsx8tD55hz9dacYbiBV7VyDNsxvuCH05QfE306VYOFG6C4OVFILMxAgaDbdtWG3PnQzYIyFyuoBJLMCARAjKCAxnWNIMjbWmZZY4SlFNWSFKSb7DHtLxlb3dqilAsswJBl23Og8hTvs7xdLVpXj7REfI0CCzLcTxGZGXMToDMLqvMHhOVSFgMihmcQBnRQXfOefhBAkwOVKcLdN2zbs2Q/fbZSwKlswK5RplmNSx5Vzs0Fl0/ua3nWV8IKlvv7A2IAZVOYlmuuW13ACEfUsCec/O+5hTAYBvlptyIFNMVwu1bTvs7F0dw6BGKJqTla4wA7wZGmAdfYnlh2W6t62pTIwPe5oWQ7owBchTECVEnQ/Fz6X5+EZNRjf1MUnQHgsRcS4r2yy3FIKldweVfYeznbG42GVkwzPcU90QLiqmZQp3MsPCy7yZr5RgUe+6Wgc9y4fuSgLZi2Yu2wCyT4ObanSvomP7NLawjW7Fy6tyRccq7KGYKFbKAZjKAACSPDsK5OfqseN1N1YMsLyepLsI8bjpxV0d3ZwrAkXG+4RLFRIYhLhBXQblD5gr73Zu3i7qpbvlshY3XyBcoDQFXQatJAmQYLTuKL7JpYTEnvrQcIveOGQPLeNcpmdSSpExrOmmuut27F3D3bah8Ozs1xb9lUgTJUHKBAG2UmehE1WbJKUHHG9lYMUV6uOgGz2dw6J3a2EyRBlQ2b/Mx1J86+dLgblvFXsPYQtl7xQdws+K2WY7QG1k60fwfhf26m9fuOe8e2PtGEXbZkLcaZhkAYaiZjyOk41x2zYBGly4ToshQWmOerxpMSND6HmYcWXpsjXLk3/Jvm4ZsdtUkT4fwO2zW7txyWRgVYHdhlCZyfFPgzDkSxoPtR2l/hW7pUzXSAxZtFGadYBlj5GPWg8D2wVLTlkY3c3hUGEykAROvwlQdROvqRjuK425fuNcuGWbpoAOQUclA/ZMmt/wADlTyeBMJKEVDEU8T4ldvtnuuXPKdgP6VGij0oFevyqbVFqbSWkXdL6kht60wvrCe0fgKXMeXtTDFnw+4H50+Gos52d3OKADTjhVzImh1aZMD0IncHKfeTSnLtp++lOuE2hlZn+DU67GAc3sBE/wDNDGajtl5ccpxqIZwqyEtC/e0n4JE6bgjqZ5aaQdjNIuPcTa8/MIPhXptJMcz/AGqeO4ibrjeIMA8h1PKTp+xS++KzrHvnLv8AwdBZLjxXZA5rhrxqJNWUcr1RZ69UoBSVEmSKua2cobkDE+Zkj8D8qnYwdx2CKjMSYAAmT5fMfOjF4deYLbW2xbMZWD8X3RG2xO/nR0KKbTuLcqSoBIJBiZ/MGfmae8Nuwm0j5dDp+NVjABbSrcDyAQwEmMzGJ5D9aEGJy+HKQRuW0nptP6VdCZXLQysd3dxNlG2Z4bWNgSNj1jnzNazE8IT+ON7CLItkIzOZRHCrDKJLOYMa6Ag76RkcPwMXmX/qbFtiVgfasdRpGVGBPQA/pWt4Bg+4GW5eRiULKwDAMMxGXxAHMMv3gOUTSc03GLce5r6eCtKRscVwwMtm8FTMgacqSzfzAsxMzAOw1iZGlfIOO2Yu3O7T7JcsH4cxMCYUeew6edfTuI9prFvCd2rZnZu7G4gsDJk81UMY8h1rCX5ZlCiJgAbzv5+dN6aWRJtvx9vuVmcU6RruzuGt2cP3VxB3h7tLxMwzP4IgaZJOXXeTsIAy/HrVk3fCSIL2wNxNtipHXUaj1A56WYziuK+MIiozspJ2B5A+LMxkM20grI3qHch7lxngq5FwGMniCiT7meQmTQQg07DnKMo8UD2mJBFu3q66hgNnQiOQClWInprSfC8TXD4m3mIGUsDlGYKGOWSdiAJ1UGRtyq/jvGblh2bDTZzaAosRbA2B2YEzy0IaSTtlWVjJ1LHUkmST1JO9NkZk3Z9e4dxrBtbc3rlp2gHKCLhBAKAgqGJYA5RcMGIB51iePcS7y8dz8KJmLHwgBiQ5EvsonoBzpDwuywJJ5a++9HTz/t9Nh6VMcVFqXsMcnLuaj/Dq8q4szEm04X/NKkx/oFz619WVywBHyr4bwFj/ABNmHCfaL4iYgTrr5iR719m4XxFLltWQhhtKmRI0aD0ma8/+NY5KccnjsbelapxBMHg0GJ7q6p7thKkNlHPQneBty3XU5oGT43irlhbjQGFu81vVmtkMAACwXw3ATPhIBiYI3G944gWwbjwI1SZJZgJhANS0AxHODWE4pcxmLAtraUWnAYsTrGYghjPgbw7AMYYSRMVo6PO4YovhS8yel/lg5I8pP1X9O5hMfxW6S/j0uFGYQIJT4JEbid+fOajcxlvEX85t3mvXGDQjqdZB8EoWAHJTMARm50xxmHw+D8Fy2uIxB1YM027QOy/1tH7HOlO091QRZSzYB/7VsKfnrXQeR5PVCP2bdf5oyUo6k/0J8bwfc3Xtfy5eYMEqrFSRoSpJE84mlF0miQ5YSSSdZJ1J5yTzOtDXq0pPirBvegZmNQza1J6qNCXYTaWWUjXX1+VOMNw67fRzatlwvQgagTAkiT5DWlvBe8NwC0md9SFAn/j1Omtb3h2Im7ctBvHbPiCtoOba7GIjTmI30oZZJRVR7lRwRySTbqjJYPBLcdVkhFA7xx1LGAojeI9IbpFbfBYBMhBFthlKeCYyERDToTvtB1rPdqMSchAYK1xpaB8QgAkECJgLLedJcLdvOcvf3SVAyjOYgHaCY08/Khgnk2MnkjhTvZbxTgZw5kNmWSAdjOpgjYmAdRppy2pPdNN+LY5rrAsIyjKANhrJgcvx6k0puim062UmvAMxqoirWqpqCi3IjdWD7da9UsRbKmCNYB+YBH0NeqwDe8JbCqVLXh4CMoa4RoSQ2QBtNYaN/wAaYDAIMViLasfuOoDEfcBktMzOb6e1vZqxZt3GhF+FYlSTJA5mSOf0q8OqYq82YDwWhr/KEf8AetcaWZuUuLfby/sdJY6Suu/9wDiGCzuqIHNx9PiY6jUliW2G+um+ort3smpH2l4kR4WtiCSZ0GaZkQY684ElxhGtWLZysAsS5mSCxzAEiTAmff8App92bwwuxcM5RooPyPMzJBJPpWzpZTfoV/Vv/e4jOor1MR4Ts41yFSzbtyJkpM+ZLBh00j8zV2J7H4gFYuIx1ISFykCJzAW1EbDnuvtrcVh7puyjBRAhoJy8oC5gDILHUGIHU0WLXhAukXCDMlAPkOXOugsaRjeRnyzjFxmy9+pW6jTbIA7twQEhdIGksCJiI1kwtlRJHxArrJ05llPPzG40r6zxnCpftlLgkH5g8iDyYbzXyDtBh/4dij+JlOkeGRyJnaRBgTuKOqBbsqxllgZdiZ8QLGRyBJM7gQPlVnEcfaFle6vsb4OiKqukRqXLSOe2s+0hDxzEG4QM5ygDMsZfGJB2+LSNTVdhQBsNP0FC5eCkrGWH46yW7lt0W4WXwkwkNJIYhRFzX7p00HSkFm6DvvTS+nhWRzGVhsdfErf1Azr09QaUmyAY13oWWN+HgSAZgnX05xT3FYXAZT3dy+H+6XKFdxuAgJ0nY7xWfwY1AqR2ol2GRVk72HgE50MdDr8orSf4f9oRYdrdwgWm8WY/caQs+hkA+x61kLhq2yn2N1+htp/uLP8A/wAvrSs2GGaDhNaCU3B2j7jxK/buFGNwMNMqkiJH3kHMx+FZrtT2ot2Qbdhs93bqE828+i1l+wBJN204hL9oqhOmnwsU9S6CRoSI1jTOKCJBEEGCPMaGsS/C/leSTkl2X2Gfm9NRVAnEmJOYkkk6k8ydST5zVdtTRF8SSPT8qHUwYro0ZBhhwctVXhV+GOhqGIWi8BJC96ngcKbt1LYMF2Cz011MeQk+1cuCp8PxRtXUuDdGDQefUHpIke9KldOgl3Pq/D8DZwtrwAIvMndjsCx5knQeukV8+4hh2wd1mtz8UHMc28kBiIzAgEz5V9HVbWLw4PxW3HuD+TA/uKXXcIMSf4eT3KZRdcjW4wUBArNOw1Jjp1153T5VHk5d/Jrywuq/QyPDb9xhYuYllSzb+AlQblxQZyW15rpGYgCOZoK7iwb5uqgQFmIUbAGYHTpVfaLG95ibjgeFT3aDYBV8IA8pk+9ApePSK34lXq7GOdNOL7BbtMk7nWhbtWBqquU5lWDPVRq1xUCKAlkLvL0r1ducvSvVRZ9I4TehoQeMqiidiSM2Y9FUMJ/Uiq+K3Ft4y4rZmW4EnXlladDMaqI5gA76g08dweLsZrtlXSwsKrrdMxoBnIadWMCeQUbjXOX+JXbrG47sWA3LMTGukknQFzp/Uazx6bhK78b0aZZuWqNh/GIDc8BU5kj7sAKogrHpzERX0Dsef+ksnmUE+vP618jNxLq+BiWQA7eJrQnNKzq6jXciBE7Ct72F4qP4e2pZgrXntpK/EzMXAkE5NWO/tTOnxcJyfuBmnyijVccxDrYud2ftMukbjUSR0IWTWE7D47FG46/FpmZS5yfENc2pV4mNNdZ202tjEgmJJB8Y0A8M6CefLfWqeI3GttmRSQZJUQJjc+ZitdCEzq3MUTrasqvQ3GJPXUJA/tXz/t5YL3lF1MjFdMjhpiAZLKP6YOn6fR8LjFcSD5+28+lfMe1nE0v4hgpAAcAsdRAEctQBzAG6g8hVS8IiMxxcpP2awM7TJDEyF57ldDGgG/nVNs/Leu8StqhyhpIIaI11AOhBII5htjOlSsXcqloBjkRIOvMHcUsgItw7GfizR0MdPf6VS4+E+X4afpRBtlmJUEzsAJJ9I3OoNVusIP8AM3yhajKDsGdZqeIWPQ6g+X68varuF2SLffEjKGiOe0gxERy60fxPDIbdtldSLubKNAVdSAcyyYB0EzroaB5OM1Frv5+vsbceKLwSyKStP5fNe/7mcuNU8Jjrlok23KkiDGxG8EHQiQDrzAPKqrggkHccqqJphhex92UxDtjEcu5bLcliHuHS04XQAsYbKfKKu7SWl743UIKXibiwZgk+IHQQQZkVb2URrNt8SrWhcIy2kd7amJ8T5bhgrIKiASfF8OjUHj+I3cQ695llcwAUBR4nZzoNPiY/SnV6Ng/8tEreGUqCVExvr+tLuJYfKwIGhH12pyqbD2qnjljwIehj5ifyrMpbNMo+kC4ZcAdcwBEwZ6HStKcJbCv9khIAYSOQMN+M+xrLYO3LAdSB9YrS3L7C6ioJMiZjUE5SJOmoJ1OlTInQfTZVDurAHNv/ALFr/bNUME/7Vv8A2ivXpUkHlVDPSuHsbfzEWNuE8ffDnwomQ/EgBWY0BBkwfOP7E43tlmsMti33RJy6kSMwZiygaciJnQkdazmbXXUdKAShjgg3bRkz5m+xWN4HpFSTeoXSAxI21I9/Pn6+VeQ1oRlkX1FqKwqoT4yQP6QD+JFRvEchp5ijBAXWo5KMt2C85RtvVBoLV0O+FKMVOS0+z9wa5XqZcJwK3XYMSIA29wfy+depU80YumSONtWiWDu6fOrWtlw2VZIjNCCMo1ktGjSQJ3jTWlNtz1q9S/Ikct4pzBSfsOcHYSy6kvcS6JbLkETIyycw0OpkbaRtTjC8RCW5shlNprt5JUBBchWQATp8MZTM1jW7z+Y/7jXZcAnOfTMaFJ33D8dj6ta7WIhDNbYE27awxAGoLl5I+DaNZMHQVb/9UPcjIbdsoGYLdB9J0YAL6718jF1v5j86tVz1PzqTi5O02gFJLwfTOLcTfuvs7tlpCyEBBkkA6i4cv3jMiNuhrInBLqSQCQfCrLAbWNt1/X5p0arre4+fy1o4xpbdlOdvsDYtJunY68gI9v39KNt3MqkNa7wGNSSIg8iOeny9aBsakmvYxvF7D9fzqeCgjC4wWyJtAwP5iJPXQ6eggVDGXbbCVQJEaTMzO3U6fvSgwaItEhSRpqBsPM8/T8KhTbGXCwVBYgHQ6Osj4TGeNtJgGhjYU73AD7n0JgE/KfSieGAHrMHXQaRJlYg+tBsoo/BS7kMYASDmBMDNvv8ALpFD4fDZ7iJPxMFkcgTBOvQa+1XMBRfCbYktzAyjyLTt7Bh71SVui3pWH9ocWrlURQEtjKvkAIAB6aD5VXwi0Ac52B/5oJ9d/ei7mPAtLljMQdOmsEmrzyb7eSsSXkaDCkOTQfaKQqCBqzHzlQNuX3/w6Uk74jUk/sURefMlv0Y+5Yj8FFKhDdjZ5LVFvCVm4nWfw1rR3kncCPUVlbBiTVrXfWjlGwIT4odYjBNdVGWMwlHHmvwn0ykfKqTwJ+b2x6t/alN8+Genn5afKgHcdKU4P3GLKvYf4vg5RGY3bfhVjAaSYBMDqdKz1pajm8ql91vSrjGgZysqcADeTP0rtqqUoixuZPI1aBYbhADM6jLcOvUWnK//ALBaruj9iooPCfb8YqSmjKSK+8YfDInQxOvr1qplNEmq7209KEO3VN6Qy7NLDuP6V/P9a9XezgIusDvkn6j9a9XM6m/iM14vlM1YuUfaelCtRdq/XRsVhyKL2MiK4mh/GgzjfKojFE8qqx8s2Nl7W4MV1a53kivTRJmOaV6CLZr1y9FV54FCX2Jq3IBIMwtzlVd1pJPUk0NbJFWW2mqTIyYoiwdI8/y6/Oq0sFtAQTyExPpPOmNmwq4Yl7b53uwrZdAttSGAmJlrmsbd2vpRIFhnDhlRyInI+5ifCSY/D1IoF1B22onCXyisJEZGBJOokEDKp5zGup9KATEsohTFMe0ik6ONbrQ47hRw1vCq3x3M11x0ByhF9QBr5saV8I729etpmYguM0NrlGrx55QxojieLdnZndmaTowzRrPxNJgSRvVwpbJJ3oX4q5lB1A5Cfr9KFDA7H+1V4u6GM/ONvYVSL0bGKTKVsbF1DjQRiGAG/wC4oC5j3010GgHQSTp7mrOJ3yzfEWACgE+QH0Bml1DYLG2F4mPhfqDmHvuPenC2xGkmsjNaDgZd7ZADHKY0nY68vejjL3Kqwx15a6yPoI+v40I+H8j8qZXcIxtgd22bMTm12gaRGhkbz5VTh+Ggkm65tAbHuw8nplLL+dRsP4ckrpi42Y5VW48Jp1fwtnwzigR4RHdMDAAXSHbWBVvFr2FKFbCQ4y5WyuJMjNO8+U9POqRHFVoy6mrbGrCTAJirLOEc7Lz3On4xpUwvcurvlOVlbJM5oYGDGwMRQpkcHV0E2rYyP1An5EflNV2W8vkK7a7SZHlcLYynQo6s+ZSZILFs0HbSKs4XfS7cCIvduxyqC2YEnZQxAIPITM6a0y0ArI3GjcH5VSXB0E6+lau92Jx7CP4W9/8Aiaq7fYnGpr/C3uf/AKftzFC37B8ZCbs8x78zzRv/AHJXqMHDb1vEhSrq5ttoQJgFBtG23KvVizYnKVo0Y3oxIqxGqqpA1qMiZcgk1bmiqbVyK7cuzUoKy23LGBTG3wx+elL8DizbbMpIPlROK4zdfe45/wBRoklWyWcxS5TlqzC5R8e1LTcJOprly4aolhuOxCT4Nuh/WgQ9Vk14GqKsIV61XY60MXiLeHv3LgBBVGXUyJYKJ0UHxa8idtax4anfZ7Gi3dR+asDzEwZiRqKuPcvlqj6d2l7DrZw9w2cSMhIYrc0OVZMWyCFdyYjQEhSBOtYM8LH85/2f3r7HwHtXZxVt2vYeQBsWDSdAI8AKnz69KwHGeI4dLjNlIUk5RqZHKOnSneAYuN0xZ2f4cq3JZtAGMFd9MsDXeGJ/00o49iwzQp0Gg+ZOp5nX8Ko4rxkufAMg9daSNcPWgc9UE0rtFzETvrUe6HWqFbnXWuUsll6kVXdtgnSqWapLdqUS0Ra0aKwXEblkEJpJk7+nI0OLprszUInW0Gnj97+YfX9aqbi94/eoJhXKspyb7sL/APE7v/cP0/SotxG6fvn6fpQteqWUXnF3P52+dSvXGgAkk+etDTVl061CJkM1dDVGvVCWb7sJxPE4lzh+8zEIWUvcC6AgEZmMHfbfStbjMDetAlzbaNTF4NAG5LAECPWvlnZO3mxKAgEQxIIkHwkbe9P+1lu1bsgpZtqxcDMEAIEM2h9hV/cOMqQTf44TfS6tsHIjJBaJkgztIGm34V6sX/GHrXqlILmf/9k=', @@ -119,6 +124,7 @@ export const data: RockBandDataProps[] = [ website: 'https://www.rollingstones.com', }, { + id: 'Queen', name: 'Queen', image: 'https://i.scdn.co/image/af2b8e57f6d7b5d43a616bd1e27ba552cd8bfd42', description: @@ -134,6 +140,7 @@ export const data: RockBandDataProps[] = [ website: 'https://www.queenonline.com', }, { + id: 'The Who', name: 'The Who', image: 'https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcQoKRCDsHx1DyrnXBxOgpPUHZZIwebCq91Ge8oQylUJXlWzlOwtzQtepNBzfbT_497Ymm1sU1Oq2OV0qGmxa6igziOxHJX4Eo8oyk088RpF', @@ -155,6 +162,7 @@ export const data: RockBandDataProps[] = [ website: 'https://www.thewho.com', }, { + id: 'Black Sabbath', name: 'Black Sabbath', image: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ8qFdD0l8GNdMw30NkViSV7BNfUab-7wZXWs1jC3qYIt6llh-WVpJ9MLmgv4QKo9Gq-FOOYJ3-aOr9jQjDhcToYWj2VO9LbBIh7MO6e34PNw', @@ -171,6 +179,7 @@ export const data: RockBandDataProps[] = [ website: 'https://www.blacksabbath.com', }, { + id: 'The Doors', name: 'The Doors', image: 'https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcQVPqssHHK-u-EaYkVo8YuiCBINkJYVsAkqIlhojm2swhdc1Xn9lWkzokObi1_lAcr1CZ_dEbKnBTD9hfkUcPJ9vrwg-ARlgurH2rA5I4iwXQ', @@ -188,6 +197,7 @@ export const data: RockBandDataProps[] = [ website: 'https://www.thedoors.com', }, { + id: 'Jimi Hendrix Experience', name: 'Jimi Hendrix Experience', image: 'https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcQkDuNxy0xKisGP4lUk7N0QqrOQpyHNy9U2lpQhKBH5BqnRn6drBm8HYWVwcFfea1brVTxs7jSSVH1hjyrwTlzGRZCgfC91C-YgEStSzuvMwg', @@ -205,6 +215,7 @@ export const data: RockBandDataProps[] = [ website: 'https://www.jimihendrix.com', }, { + id: 'Cream', name: 'Cream', image: 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxMTEhUTExMWFhUXGBoYGRgYGB0XGhodGhcXFxcdGRgaHiggGB0lGxgYITEhJSkrLi4uGh8zODMtNygtLisBCgoKBQUFDgUFDisZExkrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrK//AABEIALcBFAMBIgACEQEDEQH/xAAcAAACAgMBAQAAAAAAAAAAAAAFBgQHAAIDAQj/xAA/EAABAgQEAwYDCAIBAgcBAAABAhEAAwQhBRIxQQZRYRMicYGRoQcysRRCUsHR4fDxI2IWU6IkMzRDRHKyF//EABQBAQAAAAAAAAAAAAAAAAAAAAD/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwAlV4xnUSm3m0Da7EUgEG5Hh7mF2uxm7JBvYk6wOTVAuTb3JeAMzq9GUlS7GwEB62uCu7cjkLDzJ3iPPmJFspcX2AjlUZiB3SX0/m8AawbGJKRkVLSQOjnreDdQUyimdKPcUWKf1hew2SmnR2kwZpig6U/h5ExGm4kpZbMEOfSAaqnGJcwORtfn4QCk4gEqBJAJ1HK/9RlM5Uy2J1CxorxjtW4P94A9QesA0UdehUrurS/59YZcIrzkZmPTSKuoxlLeGjw6YPiSUsSG2LwDZRYktKmNwPKGCmr0qhORVJV8uvS39x2TPIuGcHzgHlJj2I1Gt0JPSO5MB7AzFsYlyR3jfYCMxLEMoISxV9PGEWtnqWs951M6l8nfSAnV3FExRZNuQH7XjlT1izeYoWDtqRyd4Bzq2XKLJLqOj8yHBJiCawiWpzc3J8NYA9WY8EghLliz8yenK0c1YqEh1Eg+Jt06mE04mElg5O5015fzSOdXWTVDMyUpGj+zB2/uAdRxRMT8pLdf3gvhfFhXqb8jb05xTypyz8xUU/6gv/POJuH4jKll0yVK2da+WjszeDmAupePlIfUfvE2nxkHlFXorMycyWlga5SWIF9FCJUviGUkOFt0LsfNoCxp2JKN0B9j/UBq6tn5TuL7NAPBsd7RJVpcszN5h4PU9ao6F+adx4c4ABPrZirAMrx1bl16Rzn4mUtmNyQD0P8AcHauUlQKmuDe1x1DQicQzFSyQrKS/e6/hPQ6QB//AJHmsSwFucdp2P8AduoDVyduUVlIxElTA/UfnHWZXldlajQtYwDyeIjnzBbhtIKYdjqlr12ZoqgVRK+6bDfaGnBavIkXuq4L9d4C2sIW6nd7fxoPIhBwfEcqQxDn7x/mkPFGXSLuYCUBGR6IyA+PRiBdhBjC6JayCx56c7RC4OwwzqlKWcC5i78K4fSlLsHf6QCdR4B3MygM2ge+XrGtTgqmD947bCLLGGjlbwj1dAlrjSApDEXSshYN7+HhEOmuoMwP3XZvAvDzxhhySoM1x/PeEcpax2MATRLUpRSUhChe3yny2g3h1aFDKb2b02eA+G1+ZJlqdx3knfqI6005KFlOxVmv1gN59NmXmQSPxAlm8+UF5FQMrZhb8Jf9jEZS0JfQuN9NN4DqqkhVgBfbT94BwpArLmChby9oKS6gljv1DGFg1qclrkjb9YlYbiCkkA94PaAtCgq2QATEPEeIUpdKWJvp0+g6wl1+OFMs5DdlEnYAa/31hGreJZjlKH6nc+PIdIB2xTiJrFQCXc9Tf+NtCzUY7MWciDlBNxqb8+sA5BUogrJMxVgCLIG5bnyiSqYJScsvvLIueT7DrAZWVOU8iLku5c6frHGdPWoJcs4MdZGHZiQW0zKJ2Yf2Yj4nND2By6DZ20YbCA3TMALAFh6nwjAlc0upVh6AX9TtHGikqX31gJCdBt19PrE6oKUnIksEgW5kh/eA0OQCwZPM6n8z9Ik0NOlQKilkjSzdXflA5EkrWl+g6XIAgjjWIFLpT3QLWGwtbrADsVrVqOUem9+mwt5xF7FYQUvYEC+gJd/pEnDmSRMNyo2HU8+Z0iUkBQPJ2bmdz5WgC/DeaUBd0bjn5cxrDpQpCklctRUBs7keI/OEbDVlMzIN7j1D225wYw2pXJmKUjQEFtilQdj4G3lAH5NW5UEuCLF/HrrCLxiDmJmF1E7eFriLBNOiekTZasr+j8i3X6QkcVYbNQFKUXBfKAXfSzne8Ah9oXygteJilrSDd1EX5geEQ1ylJAWNXLHw+t40plrzBg5J994DvTKWo5QCx1tDGiYJZCQrYWO0RKOpQGBUytLAfWNKlAzOltXfk3WAaqLEFuGudRsB67Q+8O8QKAaZc6vpFQ0lQc1j69fHrB2gxYhkJJcfNs+2vKAuVHEErctGRXdNjCcrZQW1L/tHsAk/CSQ9Qo/6xedMkBLRR3whm99Y3tF6UibB4D1IMaVEtTW1ialIjZSAYCr+N6dQUCE23OvWECdSla+4Rn3SSz72P5ReOP4N2oZ2in+KMCMqbADqrD5iUpUzKTqG28IhKrDnzaGCCMWUhGVaiWte9uTmB85KVkqTz/ggJ8mqz2OsbJlqfvDu+/7RGprDkfaJPapBIU/XrAczMIUQLX0P5QbpVZXubByoNZ7nzv7wuqSkHMlyH8Wjeoqj2YB0J7zWzAaOfGAl1tbnJN8pYeQ0/WIktGdQRJSMx3Op5noBHCjSZyr+XIf1DHRolUcszFEKWQyR01PqW9IDmvD+zGVJdTDMd9DYeNzHOXQ9jMJJCrP0FiSSfLXpHKXXqKHUe8pbq8wH9BaOGO4iCpSU/Kf+5mYeFoDtV16CjKPl15FXU/68h1iGkpSDMVfpoE+fP3iIqaAHd1FPu+p5ty0jgqYZhAJZKTpzO56k84Av9oBT2irJDMNi10j19hETDZKlrJPzKc6aPqY3z5hpYBkp2H6mJ0hIQQ5Ys55trARUz8qybMOnLSI2KLClBWymP89faMxioGgIcjTlENNS6HVZiwP1gJBUUpBF7FmO5LP0tEmVUgBIGrW8SdW8oHSKoKdO5unx6RIoLKc/sGgGCnAlhKn75UD4XEF8PqUqm9mVauB4Akp87n0hTm1Lrz3azHYc7xCRiikzlLBuF5h5O/8AOsBZ2F1/YrKVOxJH9/UGOuLze4op7yVbgsfMFwqFWRjaZlwNRpyYXHhHcYiycuo5A3G501gBfEElAloAIHfUSAlKctkhrWOhPnCzWU5llKg/MFm6xNr67/IVEnVgCHy32JjnVTjMsolntz9ICBLSp7wWo0FnUH5dYhrpTLPe0EETNeUCMxI2a0B0ky+85Ntn+jx0lYhkLgMef0jSZWyuzSnIQvUqBP0iGs9HHv5wB6kkKWnNn16tHsc6KvyoACj6CMgJHwhXLliZNmFgC1/aLFmcdSA4Cgw3e0Uhh8qZ9jJQ7FZdojqw6cQe6pwCo2sB1PPpAXPM+JNOC2d35CC+D8ZSpxYKHrHzgmSo6A89ILcPT5iJ0tnZSgm3UtAfRC8cQV5X2eEri6dKmKJUpiNImcRcMLlyFTpSzmSl2PQXilKvFJi1OVEwBqsmIch3jhQlKFH8JgGuoUdY2RUQDWlaD/Nf3iHiOVixci46iB0ueSloiT56nDwE/D68BTH5SbvEmslJKmQ7E2bTz/SBtPhkyYnPLGcD5kpupN906t1EMWEUKyHSgSkjVawSfU/SA1lICVJALZUuS25P9RErJ5nLB2+VI5AQQx0oQCkKuWJV0Y5f50iHgi0JSFki2nkXP5QG2LzwhfZJ0QkAn/fU/wD6gMqcTdt7eH9GOVZXFUxbksSfcvHKXO0G+0BNIJOUcmj2T3bk/rEZM0gO+8b0ySSnxgDmFd8uBYecT1U65s05Q+UeF+UdsEwwsTnygn84cMKn00hDWJ5loCt8cwlaSCxJe5ZmtAyokpTTkk9/MwHT7xizMZxymynMgN/NIXpdbhs0FClFJVa4sPPaAV8IwRc1IXte/hEqTQzJa2mS1EHkHB6iH/hnC5MpJyTgtB2sb8x5Qco6NOZSkkMn6wCDW4SpclMyWkswDMWfTSEOaopUQdQbx9NSJSFIuxilvidgYlT+1lhkqd+TwADCKllDlBmbUM5HL+4U6dZEF6Sozam7f1AR61ehs/Qfy8e0s5h3nJOh5RrOlEnxFvWO0qRoHHnAd5s0lICi42iZhGICWCDe9v0jmqjOU3fe0bYRhqllmJ8BARq6YVqUo78oyjngHvaQWxfCMic0Ly1DSAMrSglwsgGPIHInBt4yAtL4Z4QldAhwLkn3iRjvDc8LzyDlJFwdD4coj/CrFAKVCH6e5EPa57nlAV9K4bqG/wAqpbaMkFzBzD+GJacuZKQ12YawzLCUubPEGmrHU2rmAKYtLenUDplL+kUP/wATCyoJbciPoCvDylDofpFSYROH2lSQ+pgEmvwLs0uZaj1Fx7aQKp6HMe6CIveZhKVaecDZmDyU6pD+EBWNNg5QCoi0AK9LFotPH1y0y2AiqsTX3z4wBDApYzBRmZALsLk+ABt5wUrMTzqUVOUBXdD2ADDQed4V6MnMAPOOsyeQL/zlASa3EjNzHcq9gGHtEIzlANsIm8M0nbLUj73zN9Y1x2hMpYS2odoAdMuXjwRsmUoaiNkJfm8Bsg2hh4cw5SyFAWGkDsMoysgNvFtcLYQkBL2GmkApVtYZQZaSBC7V8RqLhILmL2qOHpE0ATJaVeIhfxbg6UhQmS5CVAfdTY+VoCk66qUq6kt0e+m4/OIqG5RYfEGEyJy85lTUqZiEpZ25hjfqGjrwzwUmbMKjKmBHJbAdG3gF/hGimrmASyT4GLRxaWulpMrFzdSuu94KcPcIy6UhSR3oNcW4aqoop8lFlqlqCfFnHvAUwr4iLR3UhwOcZM4qTXS1yZqAFEd1Q2O0JeK0C5KglTuUhWnP67jyjKCc12uICMzEjcWghIAa+kQAoqUTzL+8EKmeyAlhd3/L6+0B0RNzKH86QVpsORnuXhbppzG4eD+H1jkWvANuG4alSFvytEnA8MXKfKM3QEC3R7RArcQXKQlWUsQ1x6QJHFtQn5CAOTPAPVdgvbSy6QjxIcluloq7GaIyZhSfKCqOJqgllzG8Rb0jTiNKpktMwsoP8w6wC7n6R7GmSMgCfC2OKkJYHQn3ixsK4uzh1RSlPN2EPXA+E/aDZTAG8BaIxRcwMgOG1ELdb8R5NMUyEoUVILLJG738YcaJMillncgX3cxVvFNAiqnrmS0Mo3tv+sA4V/xQp+ytctpCpgONionBSUsoEk+B0hEnYVND9xTDW0PfwwTKlqUJllK3P0gH6XigGsDcTxYMb+cSMbwsqSVSSH1MV5iQmpPeJgOWO1xUVQl1CnVB6rXaF2ZMZUBMw+U2ZXIN6t+TxGqJo19OggpKrAJKgwc2SwZzufIfy8CpySBdiYDpgmJmnnonC+U3HMGyh6RalVw3LxFMuokzBla25G5SRzEUyowX4b4hqKReaSsgH5km6VeI59YBgx7AjImKcqb/AGFz6QDopZVMCQLkwYxvi9VSO8gAnzuwFoH8NozT5Y5qHteAsTAMDSlAIF936w34cgjKwsI8oqU9mGETqSjKS5Pj+cAXpakGJoIMBZCSNb9YJUyoDFUgVqPbWOolpQLMI2XMYPC/i2JjOkFQSh79fOAPy5gVpHdOkBFY5SywM05A6Zh9Iky8epzpNT6wFW8UYHMRNUJkjt0Z1FKg2ZIJJAO8V5xFh5p1BLNnct0BsI+jqkIWokKBsHa/80ijvi4B9uCRomUn3Kj+kAqUaXvyiZNpsyCp77DnE7BsMURobsPUtDQOFVEM9vCAryVTqfQwy8JUSu3Q4cOHhooOEkgZlAmDuCYOEmw3gD/FfDaZ9IlKAAUlJty0MIkvhNMlYK8x6ZXA8TFyyEPLSOgjqqmSRcCAqb/iNNPmZk5iSPkTYPzPIRLxPgXsaOakKe2YdGvFny5aRoAPKIGPqAkTH/CfpAfMpjIxZubbxkAuyjeLBwCpVSALSf8AzEuR4Qgy5Z1a3OH+skhciVMQzBLH+bQHSdxhVKCwmQVDmAbRAwzF8RzPKkqLl+6kGJmHSqoI/wALH94GVUvEUKzCXMSf9d/IQBfEOI8SWCn7EUAjvf4TfqXEA5OMTELBVJUC2gG72LR0VVYspwpNQedjG2E0dYpdpKgdyoX94BmwPjVQIStJCSWL2Ie0dsflCY5S2kBMdw6ZLAz6n2grS0p7EqUdt4BExNTEsekBQrvc4n4grvEdYidhcMYArhaAsh02HUt6aeUQ8TcqOw5RKkVRCcocP7RGqkn2gBZESKGSVKCRqbRqUwzfD6g7WqAIskPAR8UwUyUJUX73tZ4I8ASQupS+wLRY/F+AImSfldhy03tCHwfJMmqUDbx8YC6KFACRE9AG0BsPqwUi8FJU02Zm3/m0B2cuwTyvtHfM2unOPZXgGiQpDwEQoMw2cJ+sRMe4el1EkylOncKGoPPrHTE8YlyRdQHmIHHi2nSM02ehA6m/kNYCq8e+G8ySFzDMC23Yv5wCwCjnz1iQlRSAHcubPtFqYjx/QLHZd9SFd0zAGA6sbn0jlQYhhypwRTTAZiQ4swIGoB3IF2gCWFyBTUwQFE/iUrUneKXxuu+1VsyYbgqYf/VPdHqz+cWj8SMSEikmKGqmSm+6rW8A58opXC5zLBPOAsvh+nKlJUQGSzDqLOYdqOnKr7Qm4FNsG35Q9YWhw0BNVSJCLQJoFoSQtawkBZs+sMiZGYMYqrjnhiaZylJmHIS4F7c4C5qatlEAhaWOlxEiRNBfKoEdC8fOWHS5+dMoqWz5dTF7cF4MimpwlJJKu8okuSTAF52kJ3GdaRTzsp0QfpDlOTYxXfH8zJTTE7qtAUsEmMjuERkAQrqCXLp0y8veK1F/VvpAOTWlA7Mu3KLF4jwQqkpWLKSSfQl4Q8bw4gBY3gLH4QxqQmSHZ0/WDtXxPJ+UMTbyeKFkVakGxIjFYosFwoudYC8qnjCVLcaveJMniWnUAqzNc8niglYksi5JjpLxRaQADblAWZxfj0orAQoEa87wrY1xUVS+zQIWBPJudTGqZTmAlYbh8yepkpKlE7QRpEopzNRUSiZjd0HY84tX4ZYJKRTImBlKU5UdweXSDHE3CFPVsZiWUNFCx/eAoCUXUw3P5xPxaiUQWD5ACttnFreRPlFtYD8L6aWsLUpayDZyw/eGap4XlZ86EgBUvs1pYd4Bwk31IClC/OA+YFGLP+CuGuZ048wgeQc/WBmLfDmb2j04JSqbMQAoMU5FZb9LEv4Ra/BnDwo5CZQ1F1HmTrAFKimduW4bWK641wnslJmoDNYt1i1UyrQF4koBNllJG0BXWEY6zObi0NmHYySRsOTi8VTjFIqSop22idg2NZWCngLnpcQsCD5R4cWKiUuB53hRwbHkqDD00PW0MaKRM4XAt6uPCAhV/C9PUOZ+db6d4oI8MrPC9P4EwlbgTZwUP9ySOjHUw8DD5jd1rDkxH6whcV8JVSiZkqWSrcg38oAPXfClSnNLVoWNkrsfAlP6QoLoavD6hHaSyFJLpI7yTqLEW5xInUtdIUX7VHqH84YpOJLXTkVC3LedruTAAuPscXORTSj91HaEdVWT6JH/AHQrUyrx0xSr7aapexskckgMn2Eb0aQ+kA78IYkQoJMWlhM0BtYqXAZyEkKa4h5w/FXcPaAbarHQh7gAWeF/EMfpSHnTkjoLn0EC5OFJmzM09ZUl7JdvpePKnD8MlFzJY9XUPeAk0/EGFA9o68ydm16w04dx7QlLIm5T+FQI9IR5OO4clX/okE88oMPHDlbSTQCmnQnqUAeloBqoq5E5AUgggxTvxMxN5ikDQFv1i06dcuWshAYHYaRUHH8xE2rMuUB3dW3UdYAJhYlZP8iXL82sw/eMi7eCeHBJo5aJ0qUpd1EsFFlFw5I1vHsBFThHaJWldg5b6veEDiPAhJzIJzC5SdPERatNOJJBhe43w4zJRUgXTfx5wHzzXU2VZfR4jECGDGKcOS0CFoHKAgTCI8SmJhljlG6ZUByRLjqnu3jqmXHtNQTahWSTLUshnYWD2BUo2SOpIgLU+CtcVS50vUJIUOjxZE1BMVRwLKOGzFdqtKysBxKOYDRhmIAPzDp1i2J2KSkmShTpVPAyAAm5G/IdYDemtEHiLFZskyEyhLzTZmR5j5QMpVtuWtBaUZYmdmT32zNzHMDk5gdxVhqZ0q6M+QlWQ6KsXHjuOoEARRKGpYnm0a9neAfANb2lMEEKGRsuZnKDdBLE3A7p6pMMi0QGZbRHqKdwYmoTHikwFWcZ4JmJIDxWFbSZFaNH0NjVGFQgY9w2lb7QFbU09aC6SYb+HeNFSy0z1hcxTClyj0gQqbeAvjDuNJZ19Xhgk8QSVJfMI+cKacQQyiIdsK4LxGakLHdBDgrVlcG4tqIC1Z1VT1CSnuqG/SKW+LEyTJUKeTqrvL/1D2A5Al7dI6Y7VV1AQicCl/lIuFeChY/WEKumzJ8xcxRKlG5JgIcrWCqKcgAwMpqdS1hCElSibAaw4UVDMSOzmoKFgOx3EAIp55SYKUuJKcMq8Qq+jymIiC0BaGAI7axUz9YcKThWQR3zm8YpfCsbmSS6TDJI46nNAWhSYBSJLCUjxa8G0YNJbuhvCKY/5fN1zGC+GcW1MyySYB+rqaYcyKcAr0zEsEPuf2hJ/wD53WypnaDJNcuSlTG5vZTRY3CkkiTmV8yy5P8APODiRAQ6NU1SASgS9spOY2G5FoyJ4EZAKeG1ecJUxAWkEOGfy25x0xWR2iCgFs1oCY5xOino/tKxcMAgG+c6J6X9o84H4iVWSkzJiAklRZtxqk+n0gK242wE083K7hQcH6iEqfKaL8+JeFCdSlYHelHN5fe9r+UUtIwybUTOzkIVMUT90aPzOiR1MAGTLiZTUylqCEJUpR0ADk+QiyuH/hCsgKq5uQf9OWxPms2Hk8WVgnDlNSJaRKSl2dWqi3NRvAVbwx8KZk1l1ilSkf8ATS2c+JuEj1PhB/i6gpqSmTR08sIStQdjctclRJzLLPryiyMsIXxKpWVJnEsgKyENpmSpObUaPvs/OARqanM2clCZikhSkJY2IcgDzPd03i5ZtbJE1Ehjn0T3VMGD2WzAsNHG0VdhakyKwKKgpl5iLF0HL3ksByQphtpFiq4iRL7k0BBKVLlqBdEwAP3Dza7HrrACOJKycVidJkTCZLtODHdlJMpwpSbEP7wz4diCZ0tMxNgpKVB/9khX5t5QCqcRM+np6qVYqUApOZu6p0zGcOopDlmctChxbNrO0lmhkTkokgZTkUm4GV8pHecOCGe8A210gUdSmpDiTMOSYHOVBUfmyizFTEk6X5mG6WoEAguIR8K4iFdTrp5yTT1SkKGRaSl3Hzywsd4dLke8bcB41/8ADVKyTJIZd99Ab3Vm1fqOcA9iNFxpnjhMqdWBtAcK7rCxi6mL7QdqVKOunjCvjgUxvaATuIpgUDziu6uT3rQ14ytTnUwDkyCtWkAb+HuA9vUS83ygufK5j6JQLMNIrr4W0ASlc1uSQfc/l6xYIWWtAV78bMdTKpRTAArn3vfKlJDkdSbDzikAsiWWbvW1v6RYfxwlNUylkuVSyG5ZVbesJNTgcxFMKhQDKUAL3DuzpaAMfDaZSS5kxdRNEs5WSSPVrawa4u4rpJhlIp0qOU3mqDODsBrrCDJw6cqWqamWrs0h1KawGmsNHBnAy65ImdoEIz5TZyANTrYvYCA6VNJnBPOF2ppikxZGKcMLo2Tmzo0CyGPgRzhexSgcPAKiBHeU8brkMYkU0l4DtQ0ylG0WDgeHZAkAX3hdwqUEM9yYeaCYEyzMVokE+0B0oeNewrTImEdgwS/4F7nw5iLKlLBuI+WZ1Ypc1SzqpRV6mLm+H/GKFy5cib3VJAQlWx2D8uUBYjxkax5AfPPG2KSp1AQgkE1JN9CA+VudiDG3wvx9CP8AEtQSQoW5gnukeCrEcjAXjFXaCVKTlupSzlYXygOw08OkTOCeA500pnTGSM3+JKrdo3zKO4QPc+4XvUBCwQohlJLjpu/6wJwSpoZSuwkKloJZkggFXg91GEnG+IDKlfZUKzF3mrQfnUSxSlTfKlgH3ZrR3wOX9hNNOrEjtJ6iAVf+ylhtsouH5CAs949eNEKSwIIY3BdwX0bnrHQCAyAnF1B21NMTuzjy19oO5Y0WgHaAoudMQqnC1ghScwKmICW+ZGYfdUoWewdW7GJ9FP8At1IKW+cf5KZRUxP45b82Nn1tpaJfE9OKWtXLPdlVSQAcrhKg+UhLMSCwOtrb3FTqg9lLWJYSUn5kM0sgAyyAL5goKYfhcXIDBvwcaxK0qBqBSyipKjLSFEH5lAoUCSHLmxIdosTFlTKiSj7JPl9qRmGeyZiWILM5DP8Ad0Ni0cuEMaTMQtBZFR86wLAkgDtUjkbO2hvvHLDa5NTTzZapGdcmapMwIZMwXOWcgczckDcKZ9CHvEc6mT2AqUlKc4SibtLmAuO+C6C6WfTV44cS0cn7TKVLnS0VZy9zNlVOQ+njYsYTKmlVU/8AhlVCxlX3O2KgklTsm93N73D8nu3pwtCpkmZX0k4TacJCJiM01ByF0k9m6tbsp/HWAdKGqExL5SkiyknUFn2sbEaRtNQ8K+MzZlNVy6tz9lWgJWLpY97vKSdCxs4GhGrQ3SVhSQpOhAI216HSAEVyikQkY5XAlosTE5Kciio5QASTyADkxUNLiCKpauzCgzOFi7HQ2MAOr0BR0jlJw5g7Q4UfD6iXYARrWUffypGnpAZwridTTz0UypYVTzAFJUBdJUNSdxmBB5RZVLdA8IrHAElWLyWKyg0aZmUEhKSXBJDsXLXD6iG3hzG/80yjmghUtaky1nRaQXSH/Fl9WgFj444ZmppU8B+zmMfBX7gRWvEvE6KiVLky5SpSEsVjM4UQBbwF2i/eOMGNVRTpKSApQBBOgIUCPpHz9xZwpMo8hUUqSpxmT+IXNjpYwHPEOJVLkimlJySgGN7qALjN+kMXw444lUEqbLnS1rzKC05G1ZiC5HIR0+HvCUtaDU1DFLEoSbC2/XTSAODYBUYlUTOxQhOqlFsktPIWBYnl4wBvij4lTaoIQmUmUhK8x72YqZwASwYXjaXUiagKTofWFHHsJXS1EyRMYqQWcaGzgh9oe6niOlqZcmVTSJiFy5YCiyWYAA6F1X36wC7V0/KOCJagQwgpNN7xIpcgLmAIYNQrIClQQ4xxDsqXsx8y7eW8dqesGUFmAhN4mqzMXrYbQEXh+iE6oRLP3vXy6xcdJwnLk1EifLITLSwWFaWFj0JPPdopPDp65cxMxBZSSFA9RpFkzOPJ66YpMi0wFJmXyuR3sobXo9oCz5+PU6FFKpoBGo5RkUxSz1FO56xkBy4C4cNZMNbNAElDS5aHvMVYd4jRLm51P1ZeOcZ+yp7FNpi0s6bdnLe+U81nlpblGRkAK4WwiWhMysnB5FOSoJFytYygOCdE+6i8NOP05xCTQ5XTLnHOpRCSUvLJ8XYqZt2J0jIyAYcGwpVORJCiuUzpKiMySGGVmuLghuRgvLSrMrMzfdI16gjxjyMgO2WPCiMjICrfjfKKZUiaNQsj2zD6H1gJSkz6chBexVMb7ic2d0hYAV3nOr2trGRkBDwqonWnBf8AmlHMk6Ol150qGjES1H152tHhyQmZUKq5bhFVToPIhUtRSoePfF+kZGQEHE+FpyqCaifPM9ctRmyln5wlL91SjYkpcbXMMHBlaZ9JKWp8zFJe5OUlIJO5IAPnHkZAFK+gROQqXMSFJVqD6g+IN4HYGhaQuRMY9mQEEaqQQMpVyLghukZGQHnFtCZlHUpT8ypKwL2+UmKi+FuEzlVSlobsRaY5vldg3XMPQHnGRkBbWNzkU9PNmAfIhSgG5BxAXAuHZiM6ps0ThMAWhWXIRmBdOVywulrmMjIDhw/gBkVkuZMvM7Jco5VdwBIlGWkDe2cu2vlC/wAdSlSa3tEFjMSJqCCRdLi7cmfxjIyAeeG8cFVTBSwywEpmACzqsCOhPpFMfE/E5cyYinlgnsMwUo/eV0HRtYyMgBcniucJPZZU2RkQoWKbMot94kekS+CuMV4fLnJRKStcwghSiQAwa4HzD0j2MgAWN1kyomKnzGzKN2DD0jng8+ZLmpmSlZVpuOvMEbg8oyMgDCsYE6YSpCZebZD5Qd2G14J0WHFREZGQB+tpChIRuYVsVpCkttGRkAyUvC0nsaGao3mzMq03ZQdxcacofOK/s9PTdgadIlLSoJIA7q2sw1HjGRkAg4T2aUNMzu7hm0YNGRkZAf/Z', diff --git a/packages/ui/src/components/Table/stories/utils.tsx b/packages/ui/src/components/Table/stories/utils.tsx new file mode 100644 index 0000000000..45bc6341ad --- /dev/null +++ b/packages/ui/src/components/Table/stories/utils.tsx @@ -0,0 +1,54 @@ +/* eslint-disable no-restricted-syntax */ +/* + * 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 type { Meta } from '@storybook/react-vite'; +import { MemoryRouter } from 'react-router-dom'; +import { CellText, type ColumnConfig } from '..'; + +// Selection demo data +export const selectionData = [ + { id: 1, name: 'Component Library', owner: 'Design System', type: 'library' }, + { id: 2, name: 'API Gateway', owner: 'Platform', type: 'service' }, + { id: 3, name: 'Documentation Site', owner: 'DevEx', type: 'website' }, +]; + +// Selection demo columns +export const selectionColumns: ColumnConfig<(typeof selectionData)[0]>[] = [ + { + id: 'name', + label: 'Name', + isRowHeader: true, + cell: item => , + }, + { + id: 'owner', + label: 'Owner', + cell: item => , + }, + { id: 'type', label: 'Type', cell: item => }, +]; + +// Shared meta config for Table stories +export const tableStoriesMeta = { + decorators: [ + (Story: () => JSX.Element) => ( + + + + ), + ], +} satisfies Partial; diff --git a/packages/ui/src/components/Table/types.ts b/packages/ui/src/components/Table/types.ts index 1ac477e3ff..6d94d58fe6 100644 --- a/packages/ui/src/components/Table/types.ts +++ b/packages/ui/src/components/Table/types.ts @@ -16,9 +16,25 @@ import { CellProps as ReactAriaCellProps, - ColumnProps as AriaColumnProps, + ColumnProps as ReactAriaColumnProps, + TableProps as ReactAriaTableProps, } from 'react-aria-components'; +import type { ReactElement, ReactNode } from 'react'; +import type { SortDescriptor as ReactStatelySortDescriptor } from 'react-stately'; +import type { ColumnSize, ColumnStaticSize } from '@react-types/table'; import type { TextColors } from '../../types'; +import { TablePaginationProps } from '../TablePagination'; + +/** + * @public + */ +export type SortDescriptor = ReactStatelySortDescriptor; + +/** @public */ +export interface SortState { + descriptor: SortDescriptor | null; + onSortChange: (descriptor: SortDescriptor) => void; +} /** @public */ export interface CellProps extends ReactAriaCellProps {} @@ -42,6 +58,81 @@ export interface CellProfileProps extends ReactAriaCellProps { } /** @public */ -export interface ColumnProps extends Omit { +export interface ColumnProps extends Omit { children?: React.ReactNode; } + +/** @public */ +export interface TableRootProps extends ReactAriaTableProps { + stale?: boolean; +} + +/** @public */ +export interface TableItem { + id: string | number; +} + +/** @public */ +export interface NoPagination { + type: 'none'; +} + +/** @public */ +export interface PagePagination extends TablePaginationProps { + type: 'page'; +} + +/** @public */ +export type TablePaginationType = NoPagination | PagePagination; + +/** @public */ +export interface ColumnConfig { + id: string; + label: string; + cell: (item: T) => ReactElement; + header?: () => ReactElement; + isSortable?: boolean; + isHidden?: boolean; + width?: ColumnSize | null; + defaultWidth?: ColumnSize | null; + minWidth?: ColumnStaticSize | null; + maxWidth?: ColumnStaticSize | null; + isRowHeader?: boolean; +} + +/** @public */ +export interface RowConfig { + getHref?: (item: T) => string | undefined; + onClick?: (item: T) => void; + getIsDisabled?: (item: T) => boolean; +} + +/** @public */ +export type RowRenderFn = (params: { + item: T; + index: number; +}) => ReactNode; + +/** @public */ +export interface TableSelection { + mode?: ReactAriaTableProps['selectionMode']; + behavior?: ReactAriaTableProps['selectionBehavior']; + selected?: ReactAriaTableProps['selectedKeys']; + onSelectionChange?: ReactAriaTableProps['onSelectionChange']; +} + +/** @public */ +export interface TableProps { + columnConfig: readonly ColumnConfig[]; + data: T[] | undefined; + loading?: boolean; + isStale?: boolean; + error?: Error; + pagination: TablePaginationType; + sort?: SortState; + rowConfig?: RowConfig | RowRenderFn; + selection?: TableSelection; + emptyState?: ReactNode; + className?: string; + style?: React.CSSProperties; +} diff --git a/packages/ui/src/components/TablePagination/TablePagination.stories.tsx b/packages/ui/src/components/TablePagination/TablePagination.stories.tsx index 4550d00abb..dd76f7c55a 100644 --- a/packages/ui/src/components/TablePagination/TablePagination.stories.tsx +++ b/packages/ui/src/components/TablePagination/TablePagination.stories.tsx @@ -14,21 +14,21 @@ * limitations under the License. */ -// TODO: Bring useArgs() back when we update Storybook to 9 -// import { useArgs } from 'storybook/preview-api'; import type { Meta, StoryObj } from '@storybook/react-vite'; import { TablePagination } from './TablePagination'; +const noop = () => {}; + const meta = { title: 'Backstage UI/TablePagination', component: TablePagination, argTypes: { offset: { control: 'number' }, pageSize: { control: 'radio', options: [5, 10, 20, 30, 40, 50] }, - rowCount: { control: 'number' }, - showPageSizeOptions: { control: 'boolean', defaultValue: true }, - setOffset: { action: 'setOffset' }, - setPageSize: { action: 'setPageSize' }, + totalCount: { control: 'number' }, + hasNextPage: { control: 'boolean' }, + hasPreviousPage: { control: 'boolean' }, + showPageSizeOptions: { control: 'boolean' }, }, } satisfies Meta; @@ -39,21 +39,70 @@ export const Default: Story = { args: { offset: 0, pageSize: 10, - rowCount: 100, - }, - render: args => { - // const [{}, updateArgs] = useArgs(); - - return ( - { - // updateArgs({ offset: value }); - // }} - // setPageSize={value => { - // updateArgs({ pageSize: value }); - // }} - /> - ); + totalCount: 100, + hasNextPage: true, + hasPreviousPage: false, + onNextPage: noop, + onPreviousPage: noop, + onPageSizeChange: noop, + showPageSizeOptions: true, + }, +}; + +export const FirstPage: Story = { + args: { + ...Default.args, + }, +}; + +export const LastPage: Story = { + args: { + ...Default.args, + offset: 90, + hasNextPage: false, + hasPreviousPage: true, + }, +}; + +export const MiddlePage: Story = { + args: { + ...Default.args, + offset: 40, + hasPreviousPage: true, + }, +}; + +export const WithoutPageSizeOptions: Story = { + args: { + ...Default.args, + showPageSizeOptions: false, + }, +}; + +export const CursorPagination: Story = { + args: { + ...Default.args, + offset: undefined, + }, +}; + +export const CustomLabel: Story = { + args: { + ...Default.args, + offset: 20, + hasPreviousPage: true, + getLabel: ({ offset, pageSize, totalCount }) => { + const page = Math.floor((offset ?? 0) / pageSize) + 1; + const totalPages = Math.ceil((totalCount ?? 0) / pageSize); + return `Page ${page} of ${totalPages}`; + }, + }, +}; + +export const EmptyState: Story = { + args: { + ...Default.args, + totalCount: 0, + hasNextPage: false, }, }; diff --git a/packages/ui/src/components/TablePagination/TablePagination.tsx b/packages/ui/src/components/TablePagination/TablePagination.tsx index fd891be073..93ba1e0ef0 100644 --- a/packages/ui/src/components/TablePagination/TablePagination.tsx +++ b/packages/ui/src/components/TablePagination/TablePagination.tsx @@ -15,86 +15,113 @@ */ import clsx from 'clsx'; -import { Text, ButtonIcon, Select } from '../..'; -import type { TablePaginationProps } from './types'; +import { useId } from 'react-aria'; +import { Text } from '../Text'; +import { ButtonIcon } from '../ButtonIcon'; +import { Select } from '../Select'; +import type { TablePaginationProps, PageSizeOption } from './types'; import { useStyles } from '../../hooks/useStyles'; import { TablePaginationDefinition } from './definition'; import styles from './TablePagination.module.css'; import { RiArrowLeftSLine, RiArrowRightSLine } from '@remixicon/react'; +import { useMemo } from 'react'; + +const DEFAULT_PAGE_SIZE_OPTIONS: PageSizeOption[] = [ + { label: 'Show 5 results', value: 5 }, + { label: 'Show 10 results', value: 10 }, + { label: 'Show 20 results', value: 20 }, + { label: 'Show 30 results', value: 30 }, + { label: 'Show 40 results', value: 40 }, + { label: 'Show 50 results', value: 50 }, +]; + +function getOptionValue(option: number | PageSizeOption): number { + return typeof option === 'number' ? option : option.value; +} + +function isNumberArray( + options: number[] | PageSizeOption[], +): options is number[] { + return options.length > 0 && typeof options[0] === 'number'; +} + +function normalizePageSizeOptions( + options: number[] | PageSizeOption[], +): PageSizeOption[] { + if (isNumberArray(options)) { + return options.map(value => ({ + label: `Show ${value} results`, + value, + })); + } + return options; +} /** * Pagination controls for Table components with page navigation and size selection. * * @public */ -export function TablePagination(props: TablePaginationProps) { - const { classNames, cleanedProps } = useStyles(TablePaginationDefinition, { - showPageSizeOptions: true, - ...props, - }); - const { - className, - offset, - pageSize, - rowCount, - onNextPage, - onPreviousPage, - onPageSizeChange, - setOffset, - setPageSize, - showPageSizeOptions, - ...rest - } = cleanedProps; +export function TablePagination({ + pageSize, + pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS, + offset, + totalCount, + hasNextPage, + hasPreviousPage, + onNextPage, + onPreviousPage, + onPageSizeChange, + showPageSizeOptions = true, + getLabel, +}: TablePaginationProps) { + const { classNames } = useStyles(TablePaginationDefinition, {}); + const labelId = useId(); + const normalizedOptions = useMemo( + () => normalizePageSizeOptions(pageSizeOptions), + [pageSizeOptions], + ); - const currentOffset = offset ?? 0; - const currentPageSize = pageSize ?? 10; - - const fromCount = currentOffset + 1; - const toCount = Math.min(currentOffset + currentPageSize, rowCount ?? 0); - - const nextPage = () => { - const totalRows = rowCount ?? 0; - const nextOffset = currentOffset + currentPageSize; - - // Check if there are more items to navigate to - if (nextOffset < totalRows) { - onNextPage?.(); // Analytics tracking - setOffset?.(nextOffset); // Navigate to next page + const effectivePageSize = useMemo(() => { + const isValid = pageSizeOptions.some( + opt => getOptionValue(opt) === pageSize, + ); + if (isValid) { + return pageSize; } - }; + const firstValue = getOptionValue(pageSizeOptions[0]); + console.warn( + `TablePagination: pageSize ${pageSize} is not in pageSizeOptions, using ${firstValue} instead`, + ); + return firstValue; + }, [pageSize, pageSizeOptions]); - const previousPage = () => { - // Check if we can go to previous page - if (currentOffset > 0) { - onPreviousPage?.(); // Analytics tracking - const prevOffset = Math.max(0, currentOffset - currentPageSize); - setOffset?.(prevOffset); // Navigate to previous page - } - }; + const hasItems = totalCount !== undefined && totalCount !== 0; + + let label = `${totalCount} items`; + if (getLabel) { + label = getLabel({ pageSize: effectivePageSize, offset, totalCount }); + } else if (offset !== undefined) { + const fromCount = offset + 1; + const toCount = Math.min(offset + effectivePageSize, totalCount ?? 0); + label = `${fromCount} - ${toCount} of ${totalCount}`; + } return ( -
    +
    {showPageSizeOptions && (
    ({ + ...pv, + id: pv?.metadata?.uid, + })) as any as V1PersistentVolume[] + } + columns={columns} + /> + + ); +}; diff --git a/plugins/kubernetes-react/src/components/PersistentVolumesAccordions/index.ts b/plugins/kubernetes-react/src/components/PersistentVolumesAccordions/index.ts new file mode 100644 index 0000000000..29123cc6fc --- /dev/null +++ b/plugins/kubernetes-react/src/components/PersistentVolumesAccordions/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright 2021 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 './PersistentVolumesAccordions'; +export * from './PersistentVolumesTable'; +export * from './PersistentVolumesDrawer'; diff --git a/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/PersistentVolumeClaimsAccordions.test.tsx b/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/PersistentVolumeClaimsAccordions.test.tsx new file mode 100644 index 0000000000..2497b2fa04 --- /dev/null +++ b/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/PersistentVolumeClaimsAccordions.test.tsx @@ -0,0 +1,51 @@ +/* + * Copyright 2021 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 { screen } from '@testing-library/react'; +import { PersistentVolumeClaimsAccordions } from './PersistentVolumeClaimsAccordions'; +import * as onePersistentVolumeClaimsFixture from '../../__fixtures__/1-persistentvolumeclaims.json'; +import * as twoPersistentVolumeClaimsFixture from '../../__fixtures__/2-persistentvolumeclaims.json'; +import { renderInTestApp } from '@backstage/test-utils'; +import { kubernetesProviders } from '../../hooks/test-utils'; + +describe('PersistentVolumeClaimsAccordions', () => { + it('should render 1 persistent volume claim with summary', async () => { + const wrapper = kubernetesProviders( + onePersistentVolumeClaimsFixture, + new Set(), + ); + + await renderInTestApp(wrapper()); + + expect(screen.getByText('PersistentVolumeClaims')).toBeInTheDocument(); + expect(screen.getByText('1 claims')).toBeInTheDocument(); + expect(screen.getByText('1 bound')).toBeInTheDocument(); + }); + + it('should render multiple persistent volume claims with summary', async () => { + const wrapper = kubernetesProviders( + twoPersistentVolumeClaimsFixture, + new Set(), + ); + + await renderInTestApp(wrapper()); + + expect(screen.getByText('PersistentVolumeClaims')).toBeInTheDocument(); + expect(screen.getByText('5 claims')).toBeInTheDocument(); + expect(screen.getByText('3 bound')).toBeInTheDocument(); + expect(screen.getByText('1 claim lost')).toBeInTheDocument(); + }); +}); diff --git a/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/PersistentVolumeClaimsAccordions.tsx b/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/PersistentVolumeClaimsAccordions.tsx new file mode 100644 index 0000000000..c16b1399f1 --- /dev/null +++ b/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/PersistentVolumeClaimsAccordions.tsx @@ -0,0 +1,139 @@ +/* + * Copyright 2021 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, useContext } from 'react'; +import Accordion from '@material-ui/core/Accordion'; +import AccordionDetails from '@material-ui/core/AccordionDetails'; +import AccordionSummary from '@material-ui/core/AccordionSummary'; +import Grid from '@material-ui/core/Grid'; +import Typography from '@material-ui/core/Typography'; +import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; +import type { V1PersistentVolumeClaim } from '@kubernetes/client-node'; +import { PersistentVolumeClaimsTable } from './PersistentVolumeClaimsTable'; +import { GroupedResponsesContext } from '../../hooks'; +import { StatusOK, StatusError } from '@backstage/core-components'; + +type PersistentVolumeClaimsAccordionsProps = { + children?: ReactNode; +}; + +type PersistentVolumeClaimsAccordionProps = { + persistentVolumeClaims: V1PersistentVolumeClaim[]; + children?: ReactNode; +}; + +type PersistentVolumeClaimsSummaryProps = { + numberOfPersistentVolumeClaims: number; + numberOfBoundClaims: number; + numberOfLostClaims: number; + children?: ReactNode; +}; + +const PersistentVolumeClaimsSummary = ({ + numberOfPersistentVolumeClaims, + numberOfBoundClaims, + numberOfLostClaims, +}: PersistentVolumeClaimsSummaryProps) => { + return ( + + + + PersistentVolumeClaims + + + + + {numberOfPersistentVolumeClaims} claims + + + {numberOfBoundClaims} bound + + {numberOfLostClaims > 0 && ( + + + {numberOfLostClaims} claim + {numberOfLostClaims > 1 ? 's' : ''} lost + + + )} + + + ); +}; + +const PersistentVolumeClaimsAccordion = ({ + persistentVolumeClaims, +}: PersistentVolumeClaimsAccordionProps) => { + const boundClaims = persistentVolumeClaims.filter( + pvc => pvc.status?.phase === 'Bound', + ); + const lostClaims = persistentVolumeClaims.filter( + pvc => pvc.status?.phase === 'Lost', + ); + + return ( + + }> + + + + + + + ); +}; + +export const PersistentVolumeClaimsAccordions = + ({}: PersistentVolumeClaimsAccordionsProps) => { + const groupedResponses = useContext(GroupedResponsesContext); + + return ( + + + + + + + + ); + }; diff --git a/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/PersistentVolumeClaimsDrawer.test.tsx b/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/PersistentVolumeClaimsDrawer.test.tsx new file mode 100644 index 0000000000..1340a176b5 --- /dev/null +++ b/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/PersistentVolumeClaimsDrawer.test.tsx @@ -0,0 +1,39 @@ +/* + * Copyright 2021 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 * as onePersistentVolumeClaimsFixture from '../../__fixtures__/1-persistentvolumeclaims.json'; +import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; +import { PersistentVolumeClaimsDrawer } from './PersistentVolumeClaimsDrawer'; +import { kubernetesClusterLinkFormatterApiRef } from '../../api'; + +describe('PersistentVolumeClaimsDrawer', () => { + it('should render persistent volume claim drawer', async () => { + const { getByText, getAllByText } = await renderInTestApp( + + + , + ); + + expect(getAllByText('pvc-web-storage')).toHaveLength(3); + expect(getAllByText('PersistentVolumeClaim')).toHaveLength(3); + expect(getByText('YAML')).toBeInTheDocument(); + expect(getByText('namespace: default')).toBeInTheDocument(); + }); +}); diff --git a/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/PersistentVolumeClaimsDrawer.tsx b/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/PersistentVolumeClaimsDrawer.tsx new file mode 100644 index 0000000000..d0af9caf48 --- /dev/null +++ b/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/PersistentVolumeClaimsDrawer.tsx @@ -0,0 +1,64 @@ +/* + * Copyright 2021 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 type { V1PersistentVolumeClaim } from '@kubernetes/client-node'; +import { KubernetesStructuredMetadataTableDrawer } from '../KubernetesDrawer'; +import Typography from '@material-ui/core/Typography'; +import Grid from '@material-ui/core/Grid'; +import Chip from '@material-ui/core/Chip'; + +export const PersistentVolumeClaimsDrawer = ({ + persistentVolumeClaim, + expanded, +}: { + persistentVolumeClaim: V1PersistentVolumeClaim; + expanded?: boolean; +}) => { + const namespace = persistentVolumeClaim.metadata?.namespace; + return ( + { + return persistentVolumeClaimObject || {}; + }} + > + + + + {persistentVolumeClaim.metadata?.name ?? 'unknown object'} + + + + + PersistentVolumeClaim + + + {namespace && ( + + + + )} + + + ); +}; diff --git a/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/PersistentVolumeClaimsTable.test.tsx b/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/PersistentVolumeClaimsTable.test.tsx new file mode 100644 index 0000000000..06230a85b7 --- /dev/null +++ b/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/PersistentVolumeClaimsTable.test.tsx @@ -0,0 +1,68 @@ +/* + * Copyright 2021 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 { screen } from '@testing-library/react'; +import * as onePersistentVolumeClaimsFixture from '../../__fixtures__/1-persistentvolumeclaims.json'; +import * as twoPersistentVolumeClaimsFixture from '../../__fixtures__/2-persistentvolumeclaims.json'; +import { renderInTestApp } from '@backstage/test-utils'; +import { PersistentVolumeClaimsTable } from './PersistentVolumeClaimsTable'; + +describe('PersistentVolumeClaimsTable', () => { + it('should render persistent volume claim table with columns', async () => { + await renderInTestApp( + , + ); + + expect(screen.getByText('name')).toBeInTheDocument(); + expect(screen.getByText('phase')).toBeInTheDocument(); + expect(screen.getByText('status')).toBeInTheDocument(); + expect(screen.getByText('capacity')).toBeInTheDocument(); + expect(screen.getByText('volume')).toBeInTheDocument(); + + expect(screen.getByText('pvc-web-storage')).toBeInTheDocument(); + expect(screen.getAllByText('Bound').length).toBeGreaterThanOrEqual(1); + expect(screen.getByText('10Gi')).toBeInTheDocument(); + }); + + it('should render multiple persistent volume claims', async () => { + await renderInTestApp( + , + ); + + expect(screen.getByText('name')).toBeInTheDocument(); + expect(screen.getByText('phase')).toBeInTheDocument(); + expect(screen.getByText('status')).toBeInTheDocument(); + expect(screen.getByText('capacity')).toBeInTheDocument(); + expect(screen.getByText('volume')).toBeInTheDocument(); + + expect(screen.getByText('pvc-web-storage')).toBeInTheDocument(); + expect(screen.getByText('pvc-database-storage')).toBeInTheDocument(); + + expect(screen.getAllByText('Bound').length).toBeGreaterThanOrEqual(1); + expect(screen.getAllByText('Pending').length).toBeGreaterThanOrEqual(1); + + expect(screen.getByText('10Gi')).toBeInTheDocument(); + expect(screen.getByText('50Gi')).toBeInTheDocument(); + }); +}); diff --git a/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/PersistentVolumeClaimsTable.tsx b/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/PersistentVolumeClaimsTable.tsx new file mode 100644 index 0000000000..eb801fc1b8 --- /dev/null +++ b/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/PersistentVolumeClaimsTable.tsx @@ -0,0 +1,136 @@ +/* + * Copyright 2021 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 { PersistentVolumeClaimsDrawer } from './PersistentVolumeClaimsDrawer'; +import { Table, TableColumn } from '@backstage/core-components'; +import type { V1PersistentVolumeClaim } from '@kubernetes/client-node'; +import { + StatusError, + StatusOK, + StatusPending, +} from '@backstage/core-components'; + +export type PersistentVolumeClaimsTableProps = { + persistentVolumeClaims: V1PersistentVolumeClaim[]; + children?: ReactNode; +}; + +const PersistentVolumeClaimDrawerTrigger = ({ + persistentVolumeClaim, +}: { + persistentVolumeClaim: V1PersistentVolumeClaim; +}) => { + return ( + + ); +}; + +const renderPhaseStatus = (persistentVolumeClaim: V1PersistentVolumeClaim) => { + const phase = persistentVolumeClaim.status?.phase; + + if (phase === 'Bound') { + return Bound; + } + if (phase === 'Pending') { + return Pending; + } + if (phase === 'Lost') { + return Lost; + } + return <>{phase ?? 'Unknown'}; +}; + +export const PersistentVolumeClaimsTable = ({ + persistentVolumeClaims, +}: PersistentVolumeClaimsTableProps) => { + const defaultColumns: TableColumn[] = [ + { + title: 'ID', + field: 'metadata.uid', + hidden: true, + }, + { + title: 'name', + highlight: true, + render: (persistentVolumeClaim: V1PersistentVolumeClaim) => { + return ( + + ); + }, + cellStyle: { + width: '25%', + }, + }, + { + title: 'phase', + render: renderPhaseStatus, + cellStyle: { + width: '10%', + }, + }, + { + title: 'status', + render: (persistentVolumeClaim: V1PersistentVolumeClaim) => + persistentVolumeClaim.status?.phase ?? 'Unknown', + cellStyle: { + width: '10%', + }, + }, + { + title: 'capacity', + render: (persistentVolumeClaim: V1PersistentVolumeClaim) => + persistentVolumeClaim.status?.capacity?.storage ?? 'N/A', + cellStyle: { + width: '10%', + }, + }, + { + title: 'volume', + render: (persistentVolumeClaim: V1PersistentVolumeClaim) => + persistentVolumeClaim.spec?.volumeName ?? 'N/A', + cellStyle: { + width: '45%', + }, + }, + ]; + + const columns: TableColumn[] = [...defaultColumns]; + + const tableStyle = { + minWidth: '0', + width: '100%', + }; + + return ( +
    +
    ({ + ...pvc, + id: pvc?.metadata?.uid, + })) as any as V1PersistentVolumeClaim[] + } + columns={columns} + /> + + ); +}; diff --git a/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/index.ts b/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/index.ts new file mode 100644 index 0000000000..63308960fe --- /dev/null +++ b/plugins/kubernetes-react/src/components/PersistentVolumesClaimsAccordions/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright 2021 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 './PersistentVolumeClaimsAccordions'; +export * from './PersistentVolumeClaimsTable'; +export * from './PersistentVolumeClaimsDrawer'; diff --git a/plugins/kubernetes-react/src/components/PodExecTerminal/PodExecTerminal.test.tsx b/plugins/kubernetes-react/src/components/PodExecTerminal/PodExecTerminal.test.tsx index 5830043042..46a226e601 100644 --- a/plugins/kubernetes-react/src/components/PodExecTerminal/PodExecTerminal.test.tsx +++ b/plugins/kubernetes-react/src/components/PodExecTerminal/PodExecTerminal.test.tsx @@ -27,7 +27,7 @@ import WS from 'jest-websocket-mock'; import './matchMedia.mock'; import { PodExecTerminal } from './PodExecTerminal'; -global.TextEncoder = require('util').TextEncoder; +global.TextEncoder = require('node:util').TextEncoder; const textEncoder = new TextEncoder(); diff --git a/plugins/kubernetes-react/src/hooks/GroupedResponses.ts b/plugins/kubernetes-react/src/hooks/GroupedResponses.ts index 750ee58846..81ad9af048 100644 --- a/plugins/kubernetes-react/src/hooks/GroupedResponses.ts +++ b/plugins/kubernetes-react/src/hooks/GroupedResponses.ts @@ -35,4 +35,6 @@ export const GroupedResponsesContext = createContext({ cronJobs: [], customResources: [], statefulsets: [], + persistentVolumes: [], + persistentVolumeClaims: [], }); diff --git a/plugins/kubernetes-react/src/utils/persistentVolumes.test.ts b/plugins/kubernetes-react/src/utils/persistentVolumes.test.ts new file mode 100644 index 0000000000..ab583b7c9d --- /dev/null +++ b/plugins/kubernetes-react/src/utils/persistentVolumes.test.ts @@ -0,0 +1,83 @@ +/* + * Copyright 2021 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 { getPersistentVolumeType } from './persistentVolumes'; + +describe('getPersistentVolumeType', () => { + it('should return null for undefined driver', () => { + expect(getPersistentVolumeType(undefined)).toBeNull(); + }); + + it('should return null for empty driver', () => { + expect(getPersistentVolumeType('')).toBeNull(); + }); + + describe('AWS drivers', () => { + it('should return AWS EBS Volume for aws ebs driver', () => { + expect(getPersistentVolumeType('ebs.csi.aws.com')).toBe('AWS EBS Volume'); + }); + + it('should return AWS EFS for aws efs driver', () => { + expect(getPersistentVolumeType('efs.csi.aws.com')).toBe('AWS EFS'); + }); + + it('should return S3 Bucket for aws s3 driver', () => { + expect(getPersistentVolumeType('s3.csi.aws.com')).toBe('S3 Bucket'); + }); + }); + + describe('GCP drivers', () => { + it('should return GCP Persistent Disk for gcp pd driver', () => { + expect(getPersistentVolumeType('pd.csi.storage.gke.io')).toBe( + 'GCP Persistent Disk', + ); + }); + + it('should return GCP Filestore for gcp filestore driver', () => { + expect(getPersistentVolumeType('filestore.csi.storage.gke.io')).toBe( + 'GCP Filestore', + ); + }); + + it('should return GCS Fuse for gcp gcsfuse driver', () => { + expect(getPersistentVolumeType('gcsfuse.csi.storage.gke.io')).toBe( + 'GCS Fuse', + ); + }); + }); + + describe('Azure drivers', () => { + it('should return Azure Disk for azure disk driver', () => { + expect(getPersistentVolumeType('disk.csi.azure.com')).toBe('Azure Disk'); + }); + + it('should return Azure File for azure file driver', () => { + expect(getPersistentVolumeType('file.csi.azure.com')).toBe('Azure File'); + }); + + it('should return Azure Blob for azure blob driver', () => { + expect(getPersistentVolumeType('blob.csi.azure.com')).toBe('Azure Blob'); + }); + }); + + it('should return the original driver for unknown drivers', () => { + expect(getPersistentVolumeType('unknown.driver.com')).toBe( + 'unknown.driver.com', + ); + expect(getPersistentVolumeType('local-storage')).toBe('local-storage'); + expect(getPersistentVolumeType('nfs')).toBe('nfs'); + }); +}); diff --git a/plugins/kubernetes-react/src/utils/persistentVolumes.ts b/plugins/kubernetes-react/src/utils/persistentVolumes.ts new file mode 100644 index 0000000000..348e442cb1 --- /dev/null +++ b/plugins/kubernetes-react/src/utils/persistentVolumes.ts @@ -0,0 +1,39 @@ +/* + * Copyright 2021 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 getPersistentVolumeType = (driver?: string): string | null => { + if (!driver) return null; + + if (driver.includes('aws')) { + if (driver.includes('ebs')) return `AWS EBS Volume`; + if (driver.includes('efs')) return `AWS EFS`; + if (driver.includes('s3')) return `S3 Bucket`; + } + + if (driver.includes('gke')) { + if (driver.includes('gcsfuse')) return `GCS Fuse`; + if (driver.includes('filestore')) return `GCP Filestore`; + if (driver.includes('pd')) return `GCP Persistent Disk`; + } + + if (driver.includes('azure')) { + if (driver.includes('disk')) return `Azure Disk`; + if (driver.includes('file')) return `Azure File`; + if (driver.includes('blob')) return `Azure Blob`; + } + + return driver; +}; diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index 3aeaa369fa..7b9fb95c7d 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,73 @@ # @backstage/plugin-kubernetes +## 0.12.16-next.2 + +### Patch Changes + +- 7feb83b: Adjusted to use the new `@backstage/filter-predicates` types for predicate expressions. +- 491a06c: Add the ability to show icons for the tabs on the entity page (new frontend) +- 4183614: Updated usage of deprecated APIs in the new frontend system. +- 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/plugin-kubernetes-react@0.5.16-next.2 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-permission-react@0.4.40-next.1 + +## 0.12.16-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.22.0-next.1 + - @backstage/plugin-kubernetes-common@0.9.10-next.1 + - @backstage/plugin-kubernetes-react@0.5.16-next.1 + - @backstage/frontend-plugin-api@0.14.0-next.1 + - @backstage/core-components@0.18.7-next.1 + +## 0.12.16-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.6-next.0 + - @backstage/core-components@0.18.6-next.0 + - @backstage/plugin-kubernetes-react@0.5.16-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-kubernetes-common@0.9.10-next.0 + - @backstage/plugin-permission-react@0.4.40-next.0 + +## 0.12.15 + +### Patch Changes + +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + - @backstage/plugin-catalog-react@1.21.5 + - @backstage/plugin-kubernetes-react@0.5.15 + +## 0.12.15-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-kubernetes-react@0.5.15-next.0 + +## 0.12.15-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-react@1.21.5-next.0 + - @backstage/frontend-plugin-api@0.13.2 + ## 0.12.14 ### Patch Changes diff --git a/plugins/kubernetes/README.md b/plugins/kubernetes/README.md index 380c1dffbd..e2c967902b 100644 --- a/plugins/kubernetes/README.md +++ b/plugins/kubernetes/README.md @@ -69,5 +69,11 @@ app: extensions: - entity-content:kubernetes/kubernetes: config: - filter: kind:component,api,resource,system + filter: + kind: + $in: + - component + - api + - resource + - system ``` diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 33692f5886..f2c051cd8f 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-kubernetes", - "version": "0.12.14", + "version": "0.12.16-next.2", "description": "A Backstage plugin that integrates towards Kubernetes", "backstage": { "role": "frontend-plugin", @@ -78,13 +78,13 @@ "@types/react": "^18.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { "@types/react": { diff --git a/plugins/kubernetes/report-alpha.api.md b/plugins/kubernetes/report-alpha.api.md index 9b847b862a..46a576191f 100644 --- a/plugins/kubernetes/report-alpha.api.md +++ b/plugins/kubernetes/report-alpha.api.md @@ -8,12 +8,14 @@ import { AnyRouteRefParams } from '@backstage/frontend-plugin-api'; import { ApiFactory } from '@backstage/frontend-plugin-api'; import { defaultEntityContentGroups } from '@backstage/plugin-catalog-react/alpha'; import { Entity } from '@backstage/catalog-model'; -import { EntityPredicate } from '@backstage/plugin-catalog-react/alpha'; import { ExtensionBlueprintParams } from '@backstage/frontend-plugin-api'; import { ExtensionDataRef } from '@backstage/frontend-plugin-api'; +import { FilterPredicate } from '@backstage/filter-predicates'; import { JSX as JSX_2 } from 'react'; +import { JSXElementConstructor } from 'react'; import { OverridableExtensionDefinition } from '@backstage/frontend-plugin-api'; import { OverridableFrontendPlugin } from '@backstage/frontend-plugin-api'; +import { ReactElement } from 'react'; import { RouteRef } from '@backstage/core-plugin-api'; import { RouteRef as RouteRef_2 } from '@backstage/frontend-plugin-api'; import { TranslationRef } from '@backstage/frontend-plugin-api'; @@ -91,14 +93,16 @@ const _default: OverridableFrontendPlugin< config: { path: string | undefined; title: string | undefined; - filter: EntityPredicate | undefined; + filter: FilterPredicate | undefined; group: string | false | undefined; + icon: string | undefined; }; configInput: { - filter?: EntityPredicate | undefined; + filter?: FilterPredicate | undefined; title?: string | undefined; path?: string | undefined; group?: string | false | undefined; + icon?: string | undefined; }; output: | ExtensionDataRef @@ -131,6 +135,13 @@ const _default: OverridableFrontendPlugin< { optional: true; } + > + | ExtensionDataRef< + string | ReactElement>, + 'catalog.entity-content-icon', + { + optional: true; + } >; inputs: {}; params: { @@ -140,9 +151,10 @@ const _default: OverridableFrontendPlugin< title: string; defaultGroup?: [Error: `Use the 'group' param instead`]; group?: keyof defaultEntityContentGroups | (string & {}); + icon?: string | ReactElement; loader: () => Promise; routeRef?: RouteRef_2; - filter?: string | EntityPredicate | ((entity: Entity) => boolean); + filter?: string | FilterPredicate | ((entity: Entity) => boolean); }; }>; 'page:kubernetes': OverridableExtensionDefinition<{ diff --git a/plugins/mcp-actions-backend/CHANGELOG.md b/plugins/mcp-actions-backend/CHANGELOG.md index 49fba49ade..be0a2cfbf0 100644 --- a/plugins/mcp-actions-backend/CHANGELOG.md +++ b/plugins/mcp-actions-backend/CHANGELOG.md @@ -1,5 +1,57 @@ # @backstage/plugin-mcp-actions-backend +## 0.1.9-next.1 + +### Patch Changes + +- 8148621: Moved `@backstage/backend-defaults` from `dependencies` to `devDependencies`. +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## 0.1.8-next.0 + +### Patch Changes + +- 69d880e: Bump to latest zod to ensure it has the latest features +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/backend-defaults@0.15.1-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + +## 0.1.7 + +### Patch Changes + +- 4d82a35: build(deps): bump `@modelcontextprotocol/sdk` from 1.24.3 to 1.25.2 +- Updated dependencies + - @backstage/backend-defaults@0.15.0 + - @backstage/backend-plugin-api@1.6.1 + +## 0.1.7-next.1 + +### Patch Changes + +- 4d82a35: build(deps): bump `@modelcontextprotocol/sdk` from 1.24.3 to 1.25.2 +- Updated dependencies + - @backstage/backend-defaults@0.15.0-next.2 + +## 0.1.7-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-defaults@0.14.1-next.0 + - @backstage/backend-plugin-api@1.6.0 + - @backstage/catalog-client@1.12.1 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-catalog-node@1.20.1 + ## 0.1.6 ### Patch Changes diff --git a/plugins/mcp-actions-backend/README.md b/plugins/mcp-actions-backend/README.md index 39ec169dec..c2eba60c80 100644 --- a/plugins/mcp-actions-backend/README.md +++ b/plugins/mcp-actions-backend/README.md @@ -75,7 +75,7 @@ export const myPlugin = createBackendPlugin({ When errors are thrown from MCP actions, the backend will handle and surface error message for any error from `@backstage/errors`. Unknown errors will be handled by `@modelcontextprotocol/sdk`'s default error handling, which may result in a generic `500 Server Error` being returned. As a result, we recommend using errors from `@backstage/errors` when applicable. -See https://backstage.io/docs/reference/errors/ for a full list of supported errors. +See https://backstage.io/api/stable/modules/_backstage_errors.html for a full list of supported errors. When writing MCP tools, use the appropriate error from `@backstage/errors` when applicable: diff --git a/plugins/mcp-actions-backend/package.json b/plugins/mcp-actions-backend/package.json index 327e308d8e..501a1d09e5 100644 --- a/plugins/mcp-actions-backend/package.json +++ b/plugins/mcp-actions-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-mcp-actions-backend", - "version": "0.1.6", + "version": "0.1.9-next.1", "backstage": { "role": "backend-plugin", "pluginId": "mcp-actions", @@ -34,19 +34,19 @@ "test": "backstage-cli package test" }, "dependencies": { - "@backstage/backend-defaults": "workspace:^", "@backstage/backend-plugin-api": "workspace:^", "@backstage/catalog-client": "workspace:^", "@backstage/errors": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/types": "workspace:^", "@cfworker/json-schema": "^4.1.1", - "@modelcontextprotocol/sdk": "^1.24.3", + "@modelcontextprotocol/sdk": "^1.25.2", "express": "^4.22.0", "express-promise-router": "^4.1.0", - "zod": "^3.22.4" + "zod": "^3.25.76" }, "devDependencies": { + "@backstage/backend-defaults": "workspace:^", "@backstage/backend-test-utils": "workspace:^", "@backstage/cli": "workspace:^", "@types/express": "^4.17.6" diff --git a/plugins/mui-to-bui/CHANGELOG.md b/plugins/mui-to-bui/CHANGELOG.md index 330f9edbf6..2c7a57d3ef 100644 --- a/plugins/mui-to-bui/CHANGELOG.md +++ b/plugins/mui-to-bui/CHANGELOG.md @@ -1,5 +1,67 @@ # @backstage/plugin-mui-to-bui +## 0.2.4-next.2 + +### 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/ui@0.12.0-next.2 + - @backstage/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/theme@0.7.2-next.1 + +## 0.2.4-next.1 + +### Patch Changes + +- a88c437: Updated MUI to BUI theme converter to align with latest token changes + + **Changes:** + + - Removed generation of deprecated tokens: `--bui-fg-link`, `--bui-fg-link-hover`, `--bui-fg-tint`, `--bui-fg-tint-disabled`, `--bui-bg-tint` and all its variants + - Added generation of new `info` status tokens: `--bui-fg-info`, `--bui-fg-info-on-bg`, `--bui-bg-info`, `--bui-border-info` + - Updated status color mapping to generate both standalone and `-on-bg` variants for danger, warning, success, and info + - Status colors now use `.main` for standalone variants and `.dark` for `-on-bg` variants, providing better visual hierarchy + + The converter now generates tokens that match the updated BUI design system structure, with clear distinction between status colors for standalone use vs. use on colored backgrounds. + +- Updated dependencies + - @backstage/ui@0.12.0-next.1 + - @backstage/theme@0.7.2-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.1 + +## 0.2.4-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/ui@0.12.0-next.0 + - @backstage/frontend-plugin-api@0.14.0-next.0 + - @backstage/core-plugin-api@1.12.2-next.0 + - @backstage/theme@0.7.1 + +## 0.2.3 + +### Patch Changes + +- f157f43: Fix installation command +- e4a1180: Updated tokens from `--bui-bg` to `--bui-bg-surface-0` +- Updated dependencies + - @backstage/ui@0.11.0 + - @backstage/frontend-plugin-api@0.13.3 + +## 0.2.3-next.0 + +### Patch Changes + +- e4a1180: Updated tokens from `--bui-bg` to `--bui-bg-surface-0` +- Updated dependencies + - @backstage/ui@0.11.0-next.0 + - @backstage/core-plugin-api@1.12.1 + - @backstage/frontend-plugin-api@0.13.2 + - @backstage/theme@0.7.1 + ## 0.2.2 ### Patch Changes diff --git a/plugins/mui-to-bui/README.md b/plugins/mui-to-bui/README.md index 4e11db20b6..d964b4827f 100644 --- a/plugins/mui-to-bui/README.md +++ b/plugins/mui-to-bui/README.md @@ -11,7 +11,7 @@ The Backstage UI Themer helps you convert an existing MUI v5 theme into Backstag Run this from your Backstage repo root: ```bash -yarn add --cwd packages/app @backstage/plugin-mui-to-bui +yarn --cwd packages/app add @backstage/plugin-mui-to-bui ``` ### 2) Wire it up depending on your frontend system diff --git a/plugins/mui-to-bui/package.json b/plugins/mui-to-bui/package.json index c40afd4283..de43742c20 100644 --- a/plugins/mui-to-bui/package.json +++ b/plugins/mui-to-bui/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-mui-to-bui", - "version": "0.2.2", + "version": "0.2.4-next.2", "backstage": { "role": "frontend-plugin", "pluginId": "mui-to-bui", @@ -51,13 +51,13 @@ "@types/react": "^18.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { "@types/react": { diff --git a/plugins/mui-to-bui/src/components/BuiThemerPage/BuiThemePreview.test.tsx b/plugins/mui-to-bui/src/components/BuiThemerPage/BuiThemePreview.test.tsx index 375f9411a7..4b6024885b 100644 --- a/plugins/mui-to-bui/src/components/BuiThemerPage/BuiThemePreview.test.tsx +++ b/plugins/mui-to-bui/src/components/BuiThemerPage/BuiThemePreview.test.tsx @@ -25,15 +25,15 @@ describe('BuiThemePreview', () => { , ); diff --git a/plugins/mui-to-bui/src/components/BuiThemerPage/BuiThemePreview.tsx b/plugins/mui-to-bui/src/components/BuiThemerPage/BuiThemePreview.tsx index 0b62134178..2f1edbff9f 100644 --- a/plugins/mui-to-bui/src/components/BuiThemerPage/BuiThemePreview.tsx +++ b/plugins/mui-to-bui/src/components/BuiThemerPage/BuiThemePreview.tsx @@ -46,10 +46,10 @@ export function BuiThemePreview({ mode, styleObject }: IsolatedPreviewProps) { // This creates a scoped context where the variables take precedence ...styleObject, width: '100%', - backgroundColor: 'var(--bui-bg-surface-2)', + backgroundColor: 'var(--bui-bg-neutral-2)', padding: 'var(--bui-space-3)', borderRadius: 'var(--bui-radius-2)', - border: '1px solid var(--bui-border)', + border: '1px solid var(--bui-border-2)', }} > diff --git a/plugins/mui-to-bui/src/components/BuiThemerPage/ThemeContent.tsx b/plugins/mui-to-bui/src/components/BuiThemerPage/ThemeContent.tsx index 0974b8f15d..6341348862 100644 --- a/plugins/mui-to-bui/src/components/BuiThemerPage/ThemeContent.tsx +++ b/plugins/mui-to-bui/src/components/BuiThemerPage/ThemeContent.tsx @@ -98,8 +98,8 @@ export function ThemeContent({ { // Border radius tokens are only generated when radius is 0 expect(result.css).not.toContain('--bui-radius-3:'); // Background default maps to surface-2 - expect(result.css).toContain('--bui-bg: #f5f5f5;'); - expect(result.css).toContain('--bui-bg-surface-2: #f5f5f5;'); - expect(result.css).toContain('--bui-bg-surface-1: #ffffff;'); + expect(result.css).toContain('--bui-bg-app: #f5f5f5;'); + expect(result.css).toContain('--bui-bg-neutral-2: #f5f5f5;'); + expect(result.css).toContain('--bui-bg-neutral-1: #ffffff;'); expect(result.css).toContain('--bui-fg-primary: #000000;'); // Secondary may not be present without Backstage additions, so don't assert it expect(result.css).toContain('--bui-bg-solid: #1976d2;'); @@ -98,13 +98,13 @@ describe('convertMuiToBuiTheme', () => { expect(result.css).toContain("[data-theme-mode='dark'] {"); // Background default maps to surface-2 in dark mode as well - expect(result.css).toContain('--bui-bg: #121212;'); - expect(result.css).toContain('--bui-bg-surface-2: #121212;'); - expect(result.css).toContain('--bui-bg-surface-1: #1e1e1e;'); + expect(result.css).toContain('--bui-bg-app: #121212;'); + expect(result.css).toContain('--bui-bg-neutral-2: #121212;'); + expect(result.css).toContain('--bui-bg-neutral-1: #1e1e1e;'); expect(result.css).toContain('--bui-fg-primary: #ffffff;'); // Test style object - expect(result.styleObject).toHaveProperty('--bui-bg-surface-1', '#1e1e1e'); + expect(result.styleObject).toHaveProperty('--bui-bg-neutral-1', '#1e1e1e'); expect(result.styleObject).toHaveProperty('--bui-fg-primary', '#ffffff'); }); @@ -151,6 +151,10 @@ describe('convertMuiToBuiTheme', () => { expect(result.css).toContain('--bui-bg-danger: #ffcdd2;'); expect(result.css).toContain('--bui-bg-warning: #ffe0b2;'); expect(result.css).toContain('--bui-bg-success: #c8e6c9;'); + // Info background may be hex or rgba depending on theme + expect(result.css).toMatch( + /--bui-bg-info:\s*(#[0-9a-f]{6}|rgba?\([^)]*\));/i, + ); }); it('should generate foreground colors correctly', () => { @@ -178,10 +182,8 @@ describe('convertMuiToBuiTheme', () => { const result = convertMuiToBuiTheme(theme); - expect(result.css).toContain('--bui-fg-link: #1976d2;'); - expect(result.css).toContain('--bui-fg-link-hover: #115293;'); expect(result.css).toContain('--bui-fg-disabled: #cccccc;'); - // Foreground danger/warning/success may be hex or rgb depending on theme + // Foreground status colors (standalone) expect(result.css).toMatch( /--bui-fg-danger:\s*(#[0-9a-f]{6}|rgb\([^)]*\));/i, ); @@ -191,6 +193,22 @@ describe('convertMuiToBuiTheme', () => { expect(result.css).toMatch( /--bui-fg-success:\s*(#[0-9a-f]{6}|rgb\([^)]*\));/i, ); + expect(result.css).toMatch( + /--bui-fg-info:\s*(#[0-9a-f]{6}|rgb\([^)]*\));/i, + ); + // Foreground status colors (on background) + expect(result.css).toMatch( + /--bui-fg-danger-on-bg:\s*(#[0-9a-f]{6}|rgb\([^)]*\));/i, + ); + expect(result.css).toMatch( + /--bui-fg-warning-on-bg:\s*(#[0-9a-f]{6}|rgb\([^)]*\));/i, + ); + expect(result.css).toMatch( + /--bui-fg-success-on-bg:\s*(#[0-9a-f]{6}|rgb\([^)]*\));/i, + ); + expect(result.css).toMatch( + /--bui-fg-info-on-bg:\s*(#[0-9a-f]{6}|rgb\([^)]*\));/i, + ); }); it('should generate border colors correctly', () => { @@ -215,6 +233,10 @@ describe('convertMuiToBuiTheme', () => { expect(result.css).toContain('--bui-border-danger: #f44336;'); expect(result.css).toContain('--bui-border-warning: #ff9800;'); expect(result.css).toContain('--bui-border-success: #4caf50;'); + // Info border may be hex or rgb depending on theme + expect(result.css).toMatch( + /--bui-border-info:\s*(#[0-9a-f]{6}|rgb\([^)]*\));/i, + ); }); it('should handle function-based spacing', () => { diff --git a/plugins/mui-to-bui/src/components/BuiThemerPage/convertMuiToBuiTheme.ts b/plugins/mui-to-bui/src/components/BuiThemerPage/convertMuiToBuiTheme.ts index 1b8528922b..7f32621dd2 100644 --- a/plugins/mui-to-bui/src/components/BuiThemerPage/convertMuiToBuiTheme.ts +++ b/plugins/mui-to-bui/src/components/BuiThemerPage/convertMuiToBuiTheme.ts @@ -94,38 +94,37 @@ function generateBuiVariables(theme: Mui5Theme): Record { Object.entries({ primary: palette.text.primary, secondary: palette.textSubtle, - link: palette.link ?? palette.primary.main, - 'link-hover': palette.linkHover ?? palette.primary.dark, disabled: palette.text.disabled, solid: palette.primary.contrastText, 'solid-disabled': palette.text.disabled, - tint: palette.textSubtle, - 'tint-disabled': palette.textVerySubtle, - danger: palette.error.dark, - warning: palette.warning.dark, - success: palette.success.dark, + danger: palette.error.main, + warning: palette.warning.main, + success: palette.success.main, + info: palette.info?.main ?? palette.primary.main, + 'danger-on-bg': palette.error.dark, + 'warning-on-bg': palette.warning.dark, + 'success-on-bg': palette.success.dark, + 'info-on-bg': palette.info?.dark ?? palette.primary.dark, }).forEach(([key, value]) => { styleObject[`--bui-fg-${key}`] = value; }); - // Generate surface colors + // Generate neutral background colors + styleObject['--bui-bg-app'] = palette.background.default; Object.entries({ - '': palette.background.default, - 'surface-1': palette.background.paper, - 'surface-2': palette.background.default, + 'neutral-1': palette.background.paper, + 'neutral-2': palette.background.default, + 'neutral-3': palette.background.default, solid: palette.primary.main, 'solid-hover': blend(palette.primary.main, palette.primary.dark, 0.5), 'solid-pressed': palette.primary.dark, 'solid-disabled': palette.action.disabledBackground, - tint: 'transparent', - 'tint-hover': alpha(palette.primary.main, 0.4), - 'tint-pressed': alpha(palette.primary.main, 0.6), - 'tint-disabled': palette.action.disabledBackground, danger: palette.error.light, warning: palette.warning.light, success: palette.success.light, + info: palette.info?.light ?? alpha(palette.primary.main, 0.1), }).forEach(([key, value]) => { - styleObject[`--bui-bg${key ? `-${key}` : ''}`] = value; + styleObject[`--bui-bg-${key}`] = value; }); // Border colors @@ -133,12 +132,13 @@ function generateBuiVariables(theme: Mui5Theme): Record { danger: palette.error.main, warning: palette.warning.main, success: palette.success.main, + info: palette.info?.main ?? palette.primary.main, }).forEach(([key, value]) => { styleObject[`--bui-border-${key}`] = value; }); // Base border color if available - styleObject['--bui-border'] = palette.border || palette.divider; + styleObject['--bui-border-2'] = palette.border || palette.divider; styleObject['--bui-border-danger'] = palette.error.main; styleObject['--bui-border-warning'] = palette.warning.main; styleObject['--bui-border-success'] = palette.success.main; diff --git a/plugins/notifications-backend-module-email/CHANGELOG.md b/plugins/notifications-backend-module-email/CHANGELOG.md index 21cb61c4c4..32fdc6839e 100644 --- a/plugins/notifications-backend-module-email/CHANGELOG.md +++ b/plugins/notifications-backend-module-email/CHANGELOG.md @@ -1,5 +1,30 @@ # @backstage/plugin-notifications-backend-module-email +## 0.3.18-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-notifications-node@0.2.23-next.1 + +## 0.3.18-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/integration-aws-node@0.1.20-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-notifications-node@0.2.23-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/types@1.2.2 + - @backstage/plugin-notifications-common@0.2.0 + ## 0.3.17 ### Patch Changes diff --git a/plugins/notifications-backend-module-email/package.json b/plugins/notifications-backend-module-email/package.json index b1f2831758..fd6a957072 100644 --- a/plugins/notifications-backend-module-email/package.json +++ b/plugins/notifications-backend-module-email/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend-module-email", - "version": "0.3.17", + "version": "0.3.18-next.1", "description": "The email backend module for the notifications plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/notifications-backend-module-slack/CHANGELOG.md b/plugins/notifications-backend-module-slack/CHANGELOG.md index 4d9c711297..2456a92cea 100644 --- a/plugins/notifications-backend-module-slack/CHANGELOG.md +++ b/plugins/notifications-backend-module-slack/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-notifications-backend-module-slack +## 0.3.1-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-notifications-node@0.2.23-next.1 + +## 0.3.1-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-notifications-node@0.2.23-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-notifications-common@0.2.0 + ## 0.3.0 ### Minor Changes diff --git a/plugins/notifications-backend-module-slack/package.json b/plugins/notifications-backend-module-slack/package.json index 0e35577006..7d4a9f244b 100644 --- a/plugins/notifications-backend-module-slack/package.json +++ b/plugins/notifications-backend-module-slack/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend-module-slack", - "version": "0.3.0", + "version": "0.3.1-next.1", "description": "The slack backend module for the notifications plugin.", "backstage": { "role": "backend-plugin-module", diff --git a/plugins/notifications-backend/CHANGELOG.md b/plugins/notifications-backend/CHANGELOG.md index 91da5468ca..8cd9046777 100644 --- a/plugins/notifications-backend/CHANGELOG.md +++ b/plugins/notifications-backend/CHANGELOG.md @@ -1,5 +1,38 @@ # @backstage/plugin-notifications-backend +## 0.6.2-next.2 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-node@2.0.0-next.1 + - @backstage/backend-plugin-api@1.7.0-next.1 + - @backstage/plugin-notifications-node@0.2.23-next.1 + +## 0.6.2-next.1 + +### Patch Changes + +- 5e3ef57: Added `peerModules` metadata declaring recommended modules for cross-plugin integrations. +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.1 + +## 0.6.2-next.0 + +### Patch Changes + +- 7455dae: Use node prefix on native imports +- Updated dependencies + - @backstage/plugin-catalog-node@1.21.0-next.0 + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/plugin-notifications-node@0.2.23-next.0 + - @backstage/catalog-model@1.7.6 + - @backstage/config@1.3.6 + - @backstage/errors@1.2.7 + - @backstage/types@1.2.2 + - @backstage/plugin-notifications-common@0.2.0 + - @backstage/plugin-signals-node@0.1.28-next.0 + ## 0.6.1 ### Patch Changes diff --git a/plugins/notifications-backend/migrations/20250317_addTopic.js b/plugins/notifications-backend/migrations/20250317_addTopic.js index c2d4d7b10e..13085d5b1c 100644 --- a/plugins/notifications-backend/migrations/20250317_addTopic.js +++ b/plugins/notifications-backend/migrations/20250317_addTopic.js @@ -16,7 +16,7 @@ // @ts-check -const crypto = require('crypto'); +const crypto = require('node:crypto'); /** * @param {import('knex').Knex} knex diff --git a/plugins/notifications-backend/package.json b/plugins/notifications-backend/package.json index 7262b65d38..7ccc715589 100644 --- a/plugins/notifications-backend/package.json +++ b/plugins/notifications-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-backend", - "version": "0.6.1", + "version": "0.6.2-next.2", "backstage": { "role": "backend-plugin", "pluginId": "notifications", @@ -9,6 +9,9 @@ "@backstage/plugin-notifications-backend", "@backstage/plugin-notifications-common", "@backstage/plugin-notifications-node" + ], + "peerModules": [ + "@backstage/plugin-scaffolder-backend-module-notifications" ] }, "publishConfig": { diff --git a/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts b/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts index 9e49b1b0cd..5bed0c7674 100644 --- a/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts +++ b/plugins/notifications-backend/src/database/DatabaseNotificationsStore.ts @@ -30,7 +30,7 @@ import { NotificationSeverity, } from '@backstage/plugin-notifications-common'; import { Knex } from 'knex'; -import crypto from 'crypto'; +import crypto from 'node:crypto'; import { durationToMilliseconds, HumanDuration } from '@backstage/types'; const migrationsDir = resolvePackagePath( diff --git a/plugins/notifications-backend/src/tests/migrations.test.ts b/plugins/notifications-backend/src/tests/migrations.test.ts index aa3ba7ae9a..65d8285e7f 100644 --- a/plugins/notifications-backend/src/tests/migrations.test.ts +++ b/plugins/notifications-backend/src/tests/migrations.test.ts @@ -16,7 +16,7 @@ import { Knex } from 'knex'; import { TestDatabases } from '@backstage/backend-test-utils'; -import fs from 'fs'; +import fs from 'node:fs'; const migrationsDir = `${__dirname}/../../migrations`; const migrationsFiles = fs.readdirSync(migrationsDir).sort(); diff --git a/plugins/notifications-node/CHANGELOG.md b/plugins/notifications-node/CHANGELOG.md index 98d1b3c84c..92e7469332 100644 --- a/plugins/notifications-node/CHANGELOG.md +++ b/plugins/notifications-node/CHANGELOG.md @@ -1,5 +1,24 @@ # @backstage/plugin-notifications-node +## 0.2.23-next.1 + +### Patch Changes + +- Updated dependencies + - @backstage/catalog-client@1.12.2-next.0 + - @backstage/backend-plugin-api@1.7.0-next.1 + +## 0.2.23-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/backend-plugin-api@1.7.0-next.0 + - @backstage/catalog-client@1.12.1 + - @backstage/catalog-model@1.7.6 + - @backstage/plugin-notifications-common@0.2.0 + - @backstage/plugin-signals-node@0.1.28-next.0 + ## 0.2.22 ### Patch Changes diff --git a/plugins/notifications-node/package.json b/plugins/notifications-node/package.json index 8007852dd5..bc3871dd6f 100644 --- a/plugins/notifications-node/package.json +++ b/plugins/notifications-node/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications-node", - "version": "0.2.22", + "version": "0.2.23-next.1", "description": "Node.js library for the notifications plugin", "backstage": { "role": "node-library", diff --git a/plugins/notifications/.eslintrc.js b/plugins/notifications/.eslintrc.js index a2d8179106..e487f765b2 100644 --- a/plugins/notifications/.eslintrc.js +++ b/plugins/notifications/.eslintrc.js @@ -1,5 +1,5 @@ module.exports = require('@backstage/cli/config/eslint-factory')(__dirname, { - rules: { - '@backstage/no-top-level-material-ui-4-imports': 'error', - }, + rules: { + '@backstage/no-top-level-material-ui-4-imports': 'error', + }, }); diff --git a/plugins/notifications/CHANGELOG.md b/plugins/notifications/CHANGELOG.md index 50bd9b35a3..c8bb983163 100644 --- a/plugins/notifications/CHANGELOG.md +++ b/plugins/notifications/CHANGELOG.md @@ -1,5 +1,55 @@ # @backstage/plugin-notifications +## 0.5.14-next.2 + +### 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/frontend-plugin-api@0.14.0-next.2 + - @backstage/core-components@0.18.7-next.2 + - @backstage/core-plugin-api@1.12.3-next.1 + - @backstage/plugin-signals-react@0.0.19-next.1 + - @backstage/theme@0.7.2-next.1 + +## 0.5.14-next.1 + +### Patch Changes + +- Updated dependencies + - @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.5.14-next.0 + +### Patch Changes + +- Updated dependencies + - @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/errors@1.2.7 + - @backstage/theme@0.7.1 + - @backstage/plugin-notifications-common@0.2.0 + - @backstage/plugin-signals-react@0.0.19-next.0 + +## 0.5.13 + +### Patch Changes + +- 4452d15: Added i18n support. +- Updated dependencies + - @backstage/frontend-plugin-api@0.13.3 + - @backstage/core-components@0.18.5 + +## 0.5.13-next.0 + +### Patch Changes + +- Updated dependencies + - @backstage/core-components@0.18.5-next.0 + ## 0.5.12 ### Patch Changes diff --git a/plugins/notifications/knip-report.md b/plugins/notifications/knip-report.md index 97d5b385fd..28921c328d 100644 --- a/plugins/notifications/knip-report.md +++ b/plugins/notifications/knip-report.md @@ -1,3 +1 @@ # Knip report - - diff --git a/plugins/notifications/package.json b/plugins/notifications/package.json index 1a6b544da3..2d6a84fc13 100644 --- a/plugins/notifications/package.json +++ b/plugins/notifications/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-notifications", - "version": "0.5.12", + "version": "0.5.14-next.2", "backstage": { "role": "frontend-plugin", "pluginId": "notifications", @@ -77,13 +77,13 @@ "msw": "^1.0.0", "react": "^18.0.2", "react-dom": "^18.0.2", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0", "react-dom": "^17.0.0 || ^18.0.0", - "react-router-dom": "^6.3.0" + "react-router-dom": "^6.30.2" }, "peerDependenciesMeta": { "@types/react": { diff --git a/plugins/notifications/report-alpha.api.md b/plugins/notifications/report-alpha.api.md index 98d036365e..9a27b67d80 100644 --- a/plugins/notifications/report-alpha.api.md +++ b/plugins/notifications/report-alpha.api.md @@ -13,6 +13,7 @@ import { OverridableExtensionDefinition } from '@backstage/frontend-plugin-api'; import { OverridableFrontendPlugin } from '@backstage/frontend-plugin-api'; import { RouteRef } from '@backstage/core-plugin-api'; import { RouteRef as RouteRef_2 } from '@backstage/frontend-plugin-api'; +import { TranslationRef } from '@backstage/frontend-plugin-api'; // @alpha (undocumented) const _default: OverridableFrontendPlugin< @@ -67,5 +68,70 @@ const _default: OverridableFrontendPlugin< >; export default _default; +// @alpha (undocumented) +export const notificationsTranslationRef: TranslationRef< + 'plugin.notifications', + { + readonly 'table.errors.markAllReadFailed': 'Failed to mark all notifications as read'; + readonly 'table.pagination.labelDisplayedRows': '{from}-{to} of {count}'; + readonly 'table.pagination.firstTooltip': 'First Page'; + readonly 'table.pagination.labelRowsSelect': 'rows'; + readonly 'table.pagination.lastTooltip': 'Last Page'; + readonly 'table.pagination.nextTooltip': 'Next Page'; + readonly 'table.pagination.previousTooltip': 'Previous Page'; + readonly 'table.emptyMessage': 'No records to display'; + readonly 'table.bulkActions.markAllRead': 'Mark all read'; + readonly 'table.bulkActions.markSelectedAsRead': 'Mark selected as read'; + readonly 'table.bulkActions.returnSelectedAmongUnread': 'Return selected among unread'; + readonly 'table.bulkActions.saveSelectedForLater': 'Save selected for later'; + readonly 'table.bulkActions.undoSaveForSelected': 'Undo save for selected'; + readonly 'table.confirmDialog.title': 'Are you sure?'; + readonly 'table.confirmDialog.markAllReadDescription': 'Mark all notifications as read.'; + readonly 'table.confirmDialog.markAllReadConfirmation': 'Mark All'; + readonly 'filters.view.all': 'All'; + readonly 'filters.view.label': 'View'; + readonly 'filters.view.read': 'Read notifications'; + readonly 'filters.view.saved': 'Saved'; + readonly 'filters.view.unread': 'Unread notifications'; + readonly 'filters.title': 'Filters'; + readonly 'filters.severity.normal': 'Normal'; + readonly 'filters.severity.high': 'High'; + readonly 'filters.severity.low': 'Low'; + readonly 'filters.severity.label': 'Min severity'; + readonly 'filters.severity.critical': 'Critical'; + readonly 'filters.topic.label': 'Topic'; + readonly 'filters.topic.anyTopic': 'Any topic'; + readonly 'filters.createdAfter.label': 'Sent out'; + readonly 'filters.createdAfter.placeholder': 'Notifications since'; + readonly 'filters.createdAfter.last24h': 'Last 24h'; + readonly 'filters.createdAfter.lastWeek': 'Last week'; + readonly 'filters.createdAfter.anyTime': 'Any time'; + readonly 'filters.sortBy.origin': 'Origin'; + readonly 'filters.sortBy.label': 'Sort by'; + readonly 'filters.sortBy.placeholder': 'Field to sort by'; + readonly 'filters.sortBy.newest': 'Newest on top'; + readonly 'filters.sortBy.oldest': 'Oldest on top'; + readonly 'filters.sortBy.topic': 'Topic'; + readonly 'settings.table.origin': 'Origin'; + readonly 'settings.table.topic': 'Topic'; + readonly 'settings.title': 'Notification settings'; + readonly 'settings.errors.useNotificationFormat': 'useNotificationFormat must be used within a NotificationFormatProvider'; + readonly 'settings.errorTitle': 'Failed to load settings'; + readonly 'settings.noSettingsAvailable': 'No notification settings available, check back later'; + readonly 'sidebar.title': 'Notifications'; + readonly 'sidebar.errors.markAsReadFailed': 'Failed to mark notification as read'; + readonly 'sidebar.errors.fetchNotificationFailed': 'Failed to fetch notification'; + readonly 'notificationsPage.title': 'Notifications'; + readonly 'notificationsPage.tableTitle.all_one': 'All notifications ({{count}})'; + readonly 'notificationsPage.tableTitle.all_other': 'All notifications ({{count}})'; + readonly 'notificationsPage.tableTitle.saved_one': 'Saved notifications ({{count}})'; + readonly 'notificationsPage.tableTitle.saved_other': 'Saved notifications ({{count}})'; + readonly 'notificationsPage.tableTitle.unread_one': 'Unread notifications ({{count}})'; + readonly 'notificationsPage.tableTitle.unread_other': 'Unread notifications ({{count}})'; + readonly 'notificationsPage.tableTitle.read_one': 'Read notifications ({{count}})'; + readonly 'notificationsPage.tableTitle.read_other': 'Read notifications ({{count}})'; + } +>; + // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/notifications/report.api.md b/plugins/notifications/report.api.md index f42814f983..0d2912638f 100644 --- a/plugins/notifications/report.api.md +++ b/plugins/notifications/report.api.md @@ -13,7 +13,6 @@ import { Notification as Notification_2 } from '@backstage/plugin-notifications- import { NotificationSettings } from '@backstage/plugin-notifications-common'; import { NotificationSeverity } from '@backstage/plugin-notifications-common'; import { NotificationStatus } from '@backstage/plugin-notifications-common'; -import * as React_2 from 'react'; import { RouteRef } from '@backstage/core-plugin-api'; import { TableProps } from '@backstage/core-components'; @@ -111,10 +110,10 @@ export type NotificationSnackbarProperties = { }; dense?: boolean; maxSnack?: number; - snackStyle?: React_2.CSSProperties; - iconVariant?: Partial>; + snackStyle?: React.CSSProperties; + iconVariant?: Partial>; Components?: { - [key in NotificationSeverity]: React_2.JSXElementConstructor; + [key in NotificationSeverity]: React.JSXElementConstructor; }; }; diff --git a/plugins/notifications/src/alpha.tsx b/plugins/notifications/src/alpha.tsx index 32b9ae429a..b930373a46 100644 --- a/plugins/notifications/src/alpha.tsx +++ b/plugins/notifications/src/alpha.tsx @@ -55,3 +55,5 @@ export default createFrontendPlugin({ // TODO(Rugvip): Nav item (i.e. NotificationsSidebarItem) currently needs to be installed manually extensions: [page, api], }); + +export { notificationsTranslationRef } from './translation'; diff --git a/plugins/notifications/src/components/NotificationsFilters/NotificationsFilters.tsx b/plugins/notifications/src/components/NotificationsFilters/NotificationsFilters.tsx index e8fa422fa1..66aacdb72e 100644 --- a/plugins/notifications/src/components/NotificationsFilters/NotificationsFilters.tsx +++ b/plugins/notifications/src/components/NotificationsFilters/NotificationsFilters.tsx @@ -15,10 +15,14 @@ */ import { ChangeEvent } from 'react'; import FormControl from '@material-ui/core/FormControl'; +import Divider from '@material-ui/core/Divider'; import Grid from '@material-ui/core/Grid'; import InputLabel from '@material-ui/core/InputLabel'; import MenuItem from '@material-ui/core/MenuItem'; import Select from '@material-ui/core/Select'; +import Typography from '@material-ui/core/Typography'; +import { useTranslationRef } from '@backstage/core-plugin-api/alpha'; +import { notificationsTranslationRef } from '../../translation'; import { GetNotificationsOptions } from '../../api'; import { NotificationSeverity } from '@backstage/plugin-notifications-common'; @@ -44,58 +48,53 @@ export type NotificationsFiltersProps = { const ALL = '___all___'; -export const CreatedAfterOptions: { - [key: string]: { label: string; getDate: () => Date }; -} = { +type TranslationKey = keyof (typeof notificationsTranslationRef)['T']; + +export const CreatedAfterOptions = { last24h: { - label: 'Last 24h', + labelKey: 'filters.createdAfter.last24h' satisfies TranslationKey, getDate: () => new Date(Date.now() - 24 * 3600 * 1000), }, lastWeek: { - label: 'Last week', + labelKey: 'filters.createdAfter.lastWeek' satisfies TranslationKey, getDate: () => new Date(Date.now() - 7 * 24 * 3600 * 1000), }, all: { - label: 'Any time', + labelKey: 'filters.createdAfter.anyTime' satisfies TranslationKey, getDate: () => new Date(0), }, -}; +} as const; -export const SortByOptions: { - [key: string]: { - label: string; - sortBy: SortBy; - }; -} = { +export const SortByOptions = { newest: { - label: 'Newest on top', + labelKey: 'filters.sortBy.newest' satisfies TranslationKey, sortBy: { - sort: 'created', - sortOrder: 'desc', + sort: 'created' as const, + sortOrder: 'desc' as const, }, }, oldest: { - label: 'Oldest on top', + labelKey: 'filters.sortBy.oldest' satisfies TranslationKey, sortBy: { - sort: 'created', - sortOrder: 'asc', + sort: 'created' as const, + sortOrder: 'asc' as const, }, }, topic: { - label: 'Topic', + labelKey: 'filters.sortBy.topic' satisfies TranslationKey, sortBy: { - sort: 'topic', - sortOrder: 'asc', + sort: 'topic' as const, + sortOrder: 'asc' as const, }, }, origin: { - label: 'Origin', + labelKey: 'filters.sortBy.origin' satisfies TranslationKey, sortBy: { - sort: 'origin', - sortOrder: 'asc', + sort: 'origin' as const, + sortOrder: 'asc' as const, }, }, -}; +} as const; const getSortByText = (sortBy?: SortBy): string => { if (sortBy?.sort === 'created' && sortBy?.sortOrder === 'asc') { @@ -111,13 +110,6 @@ const getSortByText = (sortBy?: SortBy): string => { return 'newest'; }; -const AllSeverityOptions: { [key in NotificationSeverity]: string } = { - critical: 'Critical', - high: 'High', - normal: 'Normal', - low: 'Low', -}; - export const NotificationsFilters = ({ sorting, onSortingChanged, @@ -133,6 +125,7 @@ export const NotificationsFilters = ({ onTopicChanged, allTopics, }: NotificationsFiltersProps) => { + const { t } = useTranslationRef(notificationsTranslationRef); const sortByText = getSortByText(sorting); const handleOnCreatedAfterChanged = ( @@ -163,7 +156,8 @@ export const NotificationsFilters = ({ const handleOnSortByChanged = ( event: ChangeEvent<{ name?: string; value: unknown }>, ) => { - const idx = (event.target.value as string) || 'newest'; + const idx = ((event.target.value as string) || + 'newest') as keyof typeof SortByOptions; const option = SortByOptions[idx]; onSortingChanged({ ...option.sortBy }); }; @@ -197,37 +191,49 @@ export const NotificationsFilters = ({ return ( <> + + {t('filters.title')} + + + - View + + {t('filters.view.label')} + - Sent out + + {t('filters.createdAfter.label')} + @@ -236,18 +242,20 @@ export const NotificationsFilters = ({ - Sort by + + {t('filters.sortBy.label')} + @@ -257,18 +265,20 @@ export const NotificationsFilters = ({ - Min severity + {t('filters.severity.label')} @@ -277,16 +287,18 @@ export const NotificationsFilters = ({ - Topic + + {t('filters.topic.label')} +