diff --git a/.changeset/afraid-bananas-behave.md b/.changeset/afraid-bananas-behave.md
deleted file mode 100644
index 624b798c17..0000000000
--- a/.changeset/afraid-bananas-behave.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Fixed an issue where the `--successCache` option for the `repo test` and `repo lint` commands would be include the workspace path in generated cache keys. This previously broke caching in environments where the workspace path varies across builds.
diff --git a/.changeset/afraid-carrots-greet.md b/.changeset/afraid-carrots-greet.md
deleted file mode 100644
index 9f77cba9b8..0000000000
--- a/.changeset/afraid-carrots-greet.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/plugin-catalog': minor
----
-
-- Updated EntityLayout component to implement breadcrumb navigation based on the entity relations.
-
-- Added parentEntityRelations prop to EntityLayoutProps to specify relation types for parent entities.
diff --git a/.changeset/angry-bags-compete.md b/.changeset/angry-bags-compete.md
deleted file mode 100644
index 87e9bf36b8..0000000000
--- a/.changeset/angry-bags-compete.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-api-docs': minor
----
-
-Added support for pagination in api-docs plugin - DefaultApiExplorerPage
diff --git a/.changeset/beige-chicken-type.md b/.changeset/beige-chicken-type.md
new file mode 100644
index 0000000000..d73500a7f9
--- /dev/null
+++ b/.changeset/beige-chicken-type.md
@@ -0,0 +1,5 @@
+---
+'yarn-plugin-backstage': patch
+---
+
+Use yarn's built-in http utilities for fetching release manifests
diff --git a/.changeset/big-tips-heal.md b/.changeset/big-tips-heal.md
deleted file mode 100644
index a223cda256..0000000000
--- a/.changeset/big-tips-heal.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/catalog-client': minor
----
-
-Internal update to use the updated generated code from `backstage-cli package schema openapi generate --client-package ...`.
diff --git a/.changeset/brave-maps-deliver.md b/.changeset/brave-maps-deliver.md
new file mode 100644
index 0000000000..51b60af153
--- /dev/null
+++ b/.changeset/brave-maps-deliver.md
@@ -0,0 +1,5 @@
+---
+'@backstage/create-app': patch
+---
+
+Updated Dockerfile to include `backstage.json` file
diff --git a/.changeset/brave-teachers-mate.md b/.changeset/brave-teachers-mate.md
new file mode 100644
index 0000000000..22f768b441
--- /dev/null
+++ b/.changeset/brave-teachers-mate.md
@@ -0,0 +1,8 @@
+---
+'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch
+'@backstage/plugin-scaffolder-backend': patch
+'@backstage/backend-defaults': patch
+'@backstage/plugin-catalog-backend': patch
+---
+
+Updated dependency `@opentelemetry/api` to `^1.9.0`.
diff --git a/.changeset/bright-buckets-laugh.md b/.changeset/bright-buckets-laugh.md
deleted file mode 100644
index e1e610b72a..0000000000
--- a/.changeset/bright-buckets-laugh.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Fix dev server reloads of plugin discovery for new frontend system.
diff --git a/.changeset/bright-singers-do.md b/.changeset/bright-singers-do.md
deleted file mode 100644
index 8b10363612..0000000000
--- a/.changeset/bright-singers-do.md
+++ /dev/null
@@ -1,10 +0,0 @@
----
-'@backstage/backend-dynamic-feature-service': minor
----
-
-**BREAKING** The `dynamicPluginsFeatureLoader` options related to the root logger behavior (`transports`, `level`, `format`) are now gathered under a single `logger` option which is a function taking an optional `Config` argument and returning the logger options.
-
-This breaking change is required for 2 reasons:
-
-- it's totally possible that the current `Config` would be required to provide the logger options,
-- the logger-related options should be gathered under a common `logger` option because, when the root auditing service is introduced, distinct but similarly-named options would be required for the auditor as well.
diff --git a/.changeset/brown-monkeys-ring.md b/.changeset/brown-monkeys-ring.md
new file mode 100644
index 0000000000..5aaf738d38
--- /dev/null
+++ b/.changeset/brown-monkeys-ring.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+If the Backstage yarn plugin is installed, it will now be automatically updated as part of `versions:bump`.
diff --git a/.changeset/chatty-weeks-impress.md b/.changeset/chatty-weeks-impress.md
new file mode 100644
index 0000000000..21beb168e9
--- /dev/null
+++ b/.changeset/chatty-weeks-impress.md
@@ -0,0 +1,44 @@
+---
+'@backstage/plugin-home': patch
+---
+
+Added a new Quick Start Card to `plugin-home`, which can display basic info to get users the info they need to onboard to the Catalog.
+
+```
+import { QuickStartCard } from '@backstage/plugin-home';
+
+ }
+ cardDescription="Backstage system model will help you create new entities"
+ video={
+
+ }
+ downloadImage={
+
+ }
+/>
+```
+
+See the [storybook examples](https://backstage.io/storybook/?path=/story/plugins-home-components-quickstartcard--default)
diff --git a/.changeset/chilled-taxis-dance.md b/.changeset/chilled-taxis-dance.md
deleted file mode 100644
index e2a5dcecee..0000000000
--- a/.changeset/chilled-taxis-dance.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-The check for `react-dom/client` in the Jest configuration will now properly always run from the target directory.
diff --git a/.changeset/chilly-games-trade.md b/.changeset/chilly-games-trade.md
new file mode 100644
index 0000000000..259063776f
--- /dev/null
+++ b/.changeset/chilly-games-trade.md
@@ -0,0 +1,7 @@
+---
+'@backstage/backend-defaults': minor
+---
+
+Added a new `backend.health.headers` configuration that can be used to set additional headers to include in health check responses.
+
+**BREAKING CONSUMERS**: As part of this change the `createHealthRouter` function exported from `@backstage/backend-defaults/rootHttpRouter` now requires the root config service to be passed through the `config` option.
diff --git a/.changeset/clean-pears-roll.md b/.changeset/clean-pears-roll.md
deleted file mode 100644
index 9c3c20fadc..0000000000
--- a/.changeset/clean-pears-roll.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/config': minor
----
-
-Make `readDurationFromConfig` support both ISO and ms formats as well, to make it easier to enter time as an end user
diff --git a/.changeset/cold-icons-worry.md b/.changeset/cold-icons-worry.md
new file mode 100644
index 0000000000..4e0b461b24
--- /dev/null
+++ b/.changeset/cold-icons-worry.md
@@ -0,0 +1,6 @@
+---
+'@backstage/cli': patch
+---
+
+Remove special-casing for `@types` packages when generating dependency entries
+during templating
diff --git a/.changeset/cold-jeans-stare.md b/.changeset/cold-jeans-stare.md
new file mode 100644
index 0000000000..c0356db3ad
--- /dev/null
+++ b/.changeset/cold-jeans-stare.md
@@ -0,0 +1,5 @@
+---
+'@backstage/create-app': patch
+---
+
+Updated the template to use `@backstage/cli/config/prettier` instead of `@spotify/prettier-config`.
diff --git a/.changeset/create-app-1729608704.md b/.changeset/create-app-1729608704.md
deleted file mode 100644
index b50d431d4b..0000000000
--- a/.changeset/create-app-1729608704.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/create-app': patch
----
-
-Bumped create-app version.
diff --git a/.changeset/create-app-1730809984.md b/.changeset/create-app-1730809984.md
deleted file mode 100644
index b50d431d4b..0000000000
--- a/.changeset/create-app-1730809984.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/create-app': patch
----
-
-Bumped create-app version.
diff --git a/.changeset/cuddly-chicken-wink.md b/.changeset/cuddly-chicken-wink.md
new file mode 100644
index 0000000000..79843ba64d
--- /dev/null
+++ b/.changeset/cuddly-chicken-wink.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-defaults': patch
+---
+
+Export `PluginTokenHandler` and `pluginTokenHandlerDecoratorServiceRef` to allow for custom decoration of the plugin token handler without having to re-implement the entire handler.
diff --git a/.changeset/cuddly-schools-scream.md b/.changeset/cuddly-schools-scream.md
new file mode 100644
index 0000000000..533d3d1d4e
--- /dev/null
+++ b/.changeset/cuddly-schools-scream.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-github': patch
+---
+
+Pass in a default schedule to the `GithubEntityProvider` if none is provided
diff --git a/.changeset/curly-hats-tell.md b/.changeset/curly-hats-tell.md
new file mode 100644
index 0000000000..c0e061c99b
--- /dev/null
+++ b/.changeset/curly-hats-tell.md
@@ -0,0 +1,18 @@
+---
+'@backstage/backend-defaults': minor
+'@backstage/backend-test-utils': minor
+---
+
+**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
+```
diff --git a/.changeset/curvy-bears-nail.md b/.changeset/curvy-bears-nail.md
deleted file mode 100644
index d0bdd51401..0000000000
--- a/.changeset/curvy-bears-nail.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/theme': patch
----
-
-Internal refactor to avoid top-level imports from MUI.
diff --git a/.changeset/curvy-poems-joke.md b/.changeset/curvy-poems-joke.md
deleted file mode 100644
index 9b8ea5998b..0000000000
--- a/.changeset/curvy-poems-joke.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog': patch
----
-
-Fixed an issue causing the `CatalogIndexPage` to not properly filter results when using offset pagination.
diff --git a/.changeset/cyan-rocks-divide.md b/.changeset/cyan-rocks-divide.md
new file mode 100644
index 0000000000..8576e515d8
--- /dev/null
+++ b/.changeset/cyan-rocks-divide.md
@@ -0,0 +1,5 @@
+---
+'@backstage/integration': minor
+---
+
+Add the integration for Azure blob storage to read the credentials to access the storage account and provide the default credential provider.
diff --git a/.changeset/cyan-trees-bow.md b/.changeset/cyan-trees-bow.md
deleted file mode 100644
index 6f23f67f55..0000000000
--- a/.changeset/cyan-trees-bow.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/plugin-events-node': patch
----
-
-Fixed an issue where subscribing to events threw an error and gave up too easily. Calling the subscribe method will cause the background polling loop to keep trying to connect to the events backend, even if the initial request fails.
-
-By default the events service will attempt to publish and subscribe to events from the events bus API in the events backend, but if it fails due to the events backend not being installed, it will bail and never try calling the API again. There is now a new `events.useEventBus` configuration and option for the `DefaultEventsService` that lets you control this behavior. You can set it to `'never'` to disabled API calls to the events backend completely, or `'always'` to never allow it to be disabled.
diff --git a/.changeset/dry-badgers-prove.md b/.changeset/dry-badgers-prove.md
new file mode 100644
index 0000000000..efd2011a7b
--- /dev/null
+++ b/.changeset/dry-badgers-prove.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Perform the by-query count inlined with the main query
diff --git a/.changeset/dry-needles-taste.md b/.changeset/dry-needles-taste.md
new file mode 100644
index 0000000000..472bc0edb3
--- /dev/null
+++ b/.changeset/dry-needles-taste.md
@@ -0,0 +1,6 @@
+---
+'@backstage/core-app-api': patch
+'@backstage/plugin-app': patch
+---
+
+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.
diff --git a/.changeset/dull-bulldogs-learn.md b/.changeset/dull-bulldogs-learn.md
new file mode 100644
index 0000000000..0892ecb6ba
--- /dev/null
+++ b/.changeset/dull-bulldogs-learn.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-defaults': patch
+---
+
+The user and plugin token verification in the default `AuthService` implementation will no longer forward verification errors to the caller, and instead log them as warnings.
diff --git a/.changeset/early-cobras-compare.md b/.changeset/early-cobras-compare.md
deleted file mode 100644
index 591d1377f3..0000000000
--- a/.changeset/early-cobras-compare.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend-module-ldap': patch
----
-
-Added a `dnCaseSensitive` flag to support LDAP servers with mixed-case attributes.
diff --git a/.changeset/early-monkeys-hammer.md b/.changeset/early-monkeys-hammer.md
deleted file mode 100644
index fab689d517..0000000000
--- a/.changeset/early-monkeys-hammer.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-api-docs': patch
----
-
-bump `@asyncapi/react-component` to latest `2.x`
diff --git a/.changeset/empty-bugs-deliver.md b/.changeset/empty-bugs-deliver.md
new file mode 100644
index 0000000000..5b26f4eaca
--- /dev/null
+++ b/.changeset/empty-bugs-deliver.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-defaults': patch
+---
+
+Export `DefaultHttpAuthService` to allow for custom token extraction logic.
diff --git a/.changeset/empty-lobsters-wait.md b/.changeset/empty-lobsters-wait.md
deleted file mode 100644
index 404b0c8066..0000000000
--- a/.changeset/empty-lobsters-wait.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-'@backstage/plugin-catalog-backend-module-incremental-ingestion': minor
----
-
-Use `HumanDuration` for all duration needs in the public API, instead of `luxon` types. These are generally compatible, with a few caveats:
-
-- If you scheduled things to run quarterly (`quarter` or `quarters`), you can use `{ months: 3 }` instead.
-- If you used the singular nouns such as `year: 1`, use plurals instead (e.g. `years: 1`).
diff --git a/.changeset/empty-ways-push.md b/.changeset/empty-ways-push.md
new file mode 100644
index 0000000000..11a67985d8
--- /dev/null
+++ b/.changeset/empty-ways-push.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-search-backend-module-elasticsearch': patch
+---
+
+Update the ElasticSearchSearchEngine translator to handle phrase searches.
diff --git a/.changeset/famous-eels-bow.md b/.changeset/famous-eels-bow.md
deleted file mode 100644
index 366ffab4b4..0000000000
--- a/.changeset/famous-eels-bow.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-defaults': patch
----
-
-Removed dependency `@backstage/backend-common`.
diff --git a/.changeset/fast-cheetahs-deliver.md b/.changeset/fast-cheetahs-deliver.md
new file mode 100644
index 0000000000..ce87a68409
--- /dev/null
+++ b/.changeset/fast-cheetahs-deliver.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch
+---
+
+Deprecate old-backend-system `IncrementalCatalogBuilder`
diff --git a/.changeset/few-colts-train.md b/.changeset/few-colts-train.md
new file mode 100644
index 0000000000..1dc6becad1
--- /dev/null
+++ b/.changeset/few-colts-train.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-ldap': minor
+---
+
+Updated fix for ldap entity mapping which doesn't require extra config setting of dnCaseSensitive
diff --git a/.changeset/few-hornets-rush.md b/.changeset/few-hornets-rush.md
deleted file mode 100644
index 7d23a5ffc9..0000000000
--- a/.changeset/few-hornets-rush.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-auth-backend-module-google-provider': patch
----
-
-Fix visibility of config for use in front end code
diff --git a/.changeset/few-lions-matter.md b/.changeset/few-lions-matter.md
deleted file mode 100644
index 29332fa398..0000000000
--- a/.changeset/few-lions-matter.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-notifications': minor
----
-
-Rephrasing labels of the View filter to be more clear. Based on the received users' feedback.
diff --git a/.changeset/few-lizards-search.md b/.changeset/few-lizards-search.md
deleted file mode 100644
index 12102c7282..0000000000
--- a/.changeset/few-lizards-search.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/types': minor
----
-
-Introduce `createDeferred` and `DeferredPromise`.
diff --git a/.changeset/few-pillows-remember.md b/.changeset/few-pillows-remember.md
new file mode 100644
index 0000000000..8f13651a70
--- /dev/null
+++ b/.changeset/few-pillows-remember.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-react': patch
+---
+
+Fixed an issue causing the `EntityOwnerPicker` to reset scrolling when more elements are loaded.
diff --git a/.changeset/fifty-countries-decide.md b/.changeset/fifty-countries-decide.md
new file mode 100644
index 0000000000..9c4553f3be
--- /dev/null
+++ b/.changeset/fifty-countries-decide.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': minor
+---
+
+Implement `/entities` in terms of `queryEntities` to not run into memory and performance problems on large catalogs
diff --git a/.changeset/five-goats-travel.md b/.changeset/five-goats-travel.md
new file mode 100644
index 0000000000..361c530fca
--- /dev/null
+++ b/.changeset/five-goats-travel.md
@@ -0,0 +1,6 @@
+---
+'@backstage/backend-defaults': patch
+---
+
+Log request and response metadata so it can be used for filtering log messages.
+The format of the request date was also changed from `clf` to `utc`.
diff --git a/.changeset/five-tables-remain.md b/.changeset/five-tables-remain.md
deleted file mode 100644
index dc7411c5b2..0000000000
--- a/.changeset/five-tables-remain.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-app-backend': patch
----
-
-The `index.html` templating is now done and served from memory rather than written to the filesystem. This means that you can now use config injection with a read-only filesystem, and you no longer need to use the `app.disableConfigInjection` flag.
diff --git a/.changeset/flat-feet-do.md b/.changeset/flat-feet-do.md
deleted file mode 100644
index 0495390273..0000000000
--- a/.changeset/flat-feet-do.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/create-app': patch
----
-
-Updated engines to support Node 20 or 22
diff --git a/.changeset/flat-rivers-smell.md b/.changeset/flat-rivers-smell.md
deleted file mode 100644
index 386b22525a..0000000000
--- a/.changeset/flat-rivers-smell.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-techdocs': patch
----
-
-Fixed an issue where `` would re-render infinitely under certain conditions.
diff --git a/.changeset/fluffy-cobras-sort.md b/.changeset/fluffy-cobras-sort.md
new file mode 100644
index 0000000000..363281a6c5
--- /dev/null
+++ b/.changeset/fluffy-cobras-sort.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-defaults': minor
+---
+
+Implemented `AzureBlobStorageUrlReader` to read from the url of committed location from the entity provider
diff --git a/.changeset/fluffy-falcons-shout.md b/.changeset/fluffy-falcons-shout.md
new file mode 100644
index 0000000000..7cdce8229c
--- /dev/null
+++ b/.changeset/fluffy-falcons-shout.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-auth-backend': patch
+'@backstage/plugin-auth-node': patch
+---
+
+Improved error forwarding for OAuth refresh endpoints
diff --git a/.changeset/fluffy-zebras-cheer.md b/.changeset/fluffy-zebras-cheer.md
new file mode 100644
index 0000000000..308f12d10a
--- /dev/null
+++ b/.changeset/fluffy-zebras-cheer.md
@@ -0,0 +1,8 @@
+---
+'@backstage/plugin-scaffolder-backend': patch
+'@backstage/plugin-scaffolder-common': patch
+'@backstage/plugin-scaffolder-react': patch
+'@backstage/plugin-scaffolder': patch
+---
+
+Experimental support for `formDecorators` to enable secret collection and mutations to the parameters for scaffolder tasks
diff --git a/.changeset/forty-apples-complain.md b/.changeset/forty-apples-complain.md
new file mode 100644
index 0000000000..5aa177a63f
--- /dev/null
+++ b/.changeset/forty-apples-complain.md
@@ -0,0 +1,6 @@
+---
+'@backstage/backend-plugin-api': patch
+'@backstage/backend-app-api': patch
+---
+
+Removed unused `express` dependencies.
diff --git a/.changeset/forty-pets-wave.md b/.changeset/forty-pets-wave.md
deleted file mode 100644
index 1b96867e7d..0000000000
--- a/.changeset/forty-pets-wave.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-search-backend-module-catalog': patch
----
-
-Fixed a bug where the `filter` setting of the collator was not permitted to be an array.
diff --git a/.changeset/forty-ravens-fry.md b/.changeset/forty-ravens-fry.md
new file mode 100644
index 0000000000..8deb149441
--- /dev/null
+++ b/.changeset/forty-ravens-fry.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-defaults': patch
+---
+
+The default `authServiceFactory` now correctly depends on the plugin scoped `Logger` services rather than the root scoped one.
diff --git a/.changeset/fresh-jeans-relate.md b/.changeset/fresh-jeans-relate.md
deleted file mode 100644
index a8f6ad8e0b..0000000000
--- a/.changeset/fresh-jeans-relate.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': minor
----
-
-**BREAKING**: Updates ESLint config to ignore all generated source code under `src/**/generated/**/*.ts`.
diff --git a/.changeset/friendly-dots-thank.md b/.changeset/friendly-dots-thank.md
new file mode 100644
index 0000000000..50337c0a0f
--- /dev/null
+++ b/.changeset/friendly-dots-thank.md
@@ -0,0 +1,7 @@
+---
+'@backstage/plugin-search-backend-module-techdocs': patch
+'@backstage/plugin-search-backend-module-catalog': patch
+'@backstage/plugin-search-backend-module-explore': patch
+---
+
+Update README
diff --git a/.changeset/friendly-hats-push.md b/.changeset/friendly-hats-push.md
deleted file mode 100644
index e730fcbf8c..0000000000
--- a/.changeset/friendly-hats-push.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/integration-aws-node': patch
----
-
-The `getDefaultCredentialsChain` function now accepts and applies a `region` parameter, preventing it from defaulting to `us-east-1` when no region is specified.
diff --git a/.changeset/friendly-kids-judge.md b/.changeset/friendly-kids-judge.md
deleted file mode 100644
index e4809c1f40..0000000000
--- a/.changeset/friendly-kids-judge.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-search': patch
----
-
-Removes the card UI from the search results type filter for a cleaner UI consistent with other filters
diff --git a/.changeset/friendly-melons-shake.md b/.changeset/friendly-melons-shake.md
deleted file mode 100644
index 7bdbb58fea..0000000000
--- a/.changeset/friendly-melons-shake.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/backend-dynamic-feature-service': patch
----
-
-Enhance the `CommonJSModuleLoader` to add support for `resolvePackagePath` calls from backend dynamic plugins, with customizable package resolution, and make the `CommonJSModuleLoader` public API.
-Fixing this backend dynamic plugin limitation related to `resolvePackagePath` is important for backend dynamic plugins which use the database, since database migration scripts systematically use `resolvePackagePath`.
diff --git a/.changeset/gold-stingrays-cross.md b/.changeset/gold-stingrays-cross.md
new file mode 100644
index 0000000000..f2a8da99b3
--- /dev/null
+++ b/.changeset/gold-stingrays-cross.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Fix a bug where sometimes the `by-query` endpoint could return nulls for entities that were not yet stitched.
diff --git a/.changeset/gorgeous-panthers-count.md b/.changeset/gorgeous-panthers-count.md
new file mode 100644
index 0000000000..f6c05d743b
--- /dev/null
+++ b/.changeset/gorgeous-panthers-count.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend': patch
+---
+
+The --no-node-snapshot check needs to be done against process.execArgv instead of process.argv
diff --git a/.changeset/great-buttons-cross.md b/.changeset/great-buttons-cross.md
new file mode 100644
index 0000000000..02247b94bf
--- /dev/null
+++ b/.changeset/great-buttons-cross.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-app-backend': patch
+---
+
+Fixed a bug where config would not be injected on the `/` and `/index.html` paths.
diff --git a/.changeset/green-tools-arrive.md b/.changeset/green-tools-arrive.md
deleted file mode 100644
index 78eed180d4..0000000000
--- a/.changeset/green-tools-arrive.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-react': patch
----
-
-Fix issue with form state not refreshing when updating
diff --git a/.changeset/grumpy-shoes-return.md b/.changeset/grumpy-shoes-return.md
deleted file mode 100644
index e5bf70c0a5..0000000000
--- a/.changeset/grumpy-shoes-return.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Fixed an issue with the `--successCache` flag for `repo test` where the tree hash for the wrong package directory would sometimes be used to generate the cache key.
diff --git a/.changeset/happy-forks-listen.md b/.changeset/happy-forks-listen.md
new file mode 100644
index 0000000000..4274c830f1
--- /dev/null
+++ b/.changeset/happy-forks-listen.md
@@ -0,0 +1,5 @@
+---
+'@backstage/release-manifests': patch
+---
+
+Switch to native fetch for loading release manifests
diff --git a/.changeset/healthy-bags-jog.md b/.changeset/healthy-bags-jog.md
deleted file mode 100644
index ab4930963c..0000000000
--- a/.changeset/healthy-bags-jog.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-kubernetes-react': patch
----
-
-add the pod delete feature to the kubernetes react plugin
diff --git a/.changeset/healthy-lions-judge.md b/.changeset/healthy-lions-judge.md
deleted file mode 100644
index f9ead85d2e..0000000000
--- a/.changeset/healthy-lions-judge.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/plugin-auth-backend-module-aws-alb-provider': minor
-'@backstage/plugin-auth-backend': minor
----
-
-**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.
diff --git a/.changeset/healthy-planets-confess.md b/.changeset/healthy-planets-confess.md
deleted file mode 100644
index a55b5c1044..0000000000
--- a/.changeset/healthy-planets-confess.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-react': patch
----
-
-Fixed bug in `EntityDisplayName` where text was overflowing.
diff --git a/.changeset/healthy-tables-wonder.md b/.changeset/healthy-tables-wonder.md
deleted file mode 100644
index be6da63de0..0000000000
--- a/.changeset/healthy-tables-wonder.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
-'@backstage/plugin-search-backend': minor
----
-
-Internal update to use the new generated server types from `backstage-cli package schema openapi generate --server`.
diff --git a/.changeset/healthy-years-begin.md b/.changeset/healthy-years-begin.md
new file mode 100644
index 0000000000..a1952b6648
--- /dev/null
+++ b/.changeset/healthy-years-begin.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-search-react': patch
+'@backstage/plugin-search': patch
+---
+
+Use Select from core-components and update Lifecycle filter to use Select instead checkboxes.
diff --git a/.changeset/heavy-mice-raise.md b/.changeset/heavy-mice-raise.md
deleted file mode 100644
index 8b32ecb4d7..0000000000
--- a/.changeset/heavy-mice-raise.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-react': patch
----
-
-Fix issue with `Stepper` and trying to trim additional properties. This is now all behind `liveOmit` and `omitExtraData` instead.
diff --git a/.changeset/heavy-needles-poke.md b/.changeset/heavy-needles-poke.md
new file mode 100644
index 0000000000..91a98a9102
--- /dev/null
+++ b/.changeset/heavy-needles-poke.md
@@ -0,0 +1,6 @@
+---
+'@backstage/backend-defaults': patch
+'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch
+---
+
+Add task metrics as two gauges that track the last start and end timestamps as epoch seconds.
diff --git a/.changeset/honest-hornets-double.md b/.changeset/honest-hornets-double.md
new file mode 100644
index 0000000000..6c2bffa5af
--- /dev/null
+++ b/.changeset/honest-hornets-double.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-node': minor
+---
+
+Updated the `catalogServiceMock` return type to match both `CatalogService` and `CatalogApi`
diff --git a/.changeset/hungry-cats-juggle.md b/.changeset/hungry-cats-juggle.md
deleted file mode 100644
index af52f9388f..0000000000
--- a/.changeset/hungry-cats-juggle.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-techdocs': patch
----
-
-Fix an issue with index page of documentation site being re-rendered.
diff --git a/.changeset/hungry-hairs-wait.md b/.changeset/hungry-hairs-wait.md
new file mode 100644
index 0000000000..ed4cd01ac7
--- /dev/null
+++ b/.changeset/hungry-hairs-wait.md
@@ -0,0 +1,5 @@
+---
+'@backstage/repo-tools': patch
+---
+
+Generated OpenAPI clients now support paths with tags.
diff --git a/.changeset/hungry-owls-sell.md b/.changeset/hungry-owls-sell.md
deleted file mode 100644
index cb2c18c21c..0000000000
--- a/.changeset/hungry-owls-sell.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-techdocs': patch
----
-
-Fix techdocs config schema for custom elements sanitizer
diff --git a/.changeset/itchy-elephants-trade.md b/.changeset/itchy-elephants-trade.md
deleted file mode 100644
index 8ac6aaeeb9..0000000000
--- a/.changeset/itchy-elephants-trade.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/plugin-events-backend': patch
-'@backstage/plugin-events-node': patch
----
-
-Fix `events.useEventBus` by propagating config to `DefaultEventsService`
diff --git a/.changeset/itchy-masks-work.md b/.changeset/itchy-masks-work.md
deleted file mode 100644
index f8fc792fab..0000000000
--- a/.changeset/itchy-masks-work.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-app-backend': minor
----
-
-Configuration is no longer injected into static assets if a `index.html.tmpl` file is present.
diff --git a/.changeset/itchy-rats-pump.md b/.changeset/itchy-rats-pump.md
new file mode 100644
index 0000000000..3b9073da77
--- /dev/null
+++ b/.changeset/itchy-rats-pump.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Compute deltas more efficiently, which generally leads to less wasted processing cycles
diff --git a/.changeset/itchy-ravens-punch.md b/.changeset/itchy-ravens-punch.md
new file mode 100644
index 0000000000..7d4cb9cd92
--- /dev/null
+++ b/.changeset/itchy-ravens-punch.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Implement `/entities/by-name/:kind/:namespace/:name` using `getEntitiesByRefs`
diff --git a/.changeset/khaki-badgers-watch.md b/.changeset/khaki-badgers-watch.md
deleted file mode 100644
index 50458cc63e..0000000000
--- a/.changeset/khaki-badgers-watch.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend-module-gitlab': patch
----
-
-Improve error messages from Gitlab
diff --git a/.changeset/khaki-fireants-march.md b/.changeset/khaki-fireants-march.md
deleted file mode 100644
index ec84fe1b63..0000000000
--- a/.changeset/khaki-fireants-march.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Added `--alwaysPack` as a replacement for the now hidden `--alwaysYarnPack` flag for the `build-workspace` command.
diff --git a/.changeset/khaki-ladybugs-swim.md b/.changeset/khaki-ladybugs-swim.md
new file mode 100644
index 0000000000..79cc1358df
--- /dev/null
+++ b/.changeset/khaki-ladybugs-swim.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-events-node': patch
+---
+
+Clarified purpose of subscriber ID in TSDoc for `EventsServiceSubscribeOptions`.
diff --git a/.changeset/khaki-pugs-perform.md b/.changeset/khaki-pugs-perform.md
deleted file mode 100644
index 55f89336ed..0000000000
--- a/.changeset/khaki-pugs-perform.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-notifications': patch
----
-
-Added title to the Notifications' table. The title clearly states the filter selection and total count of messages. This change aligns the look and feel closer to other tables.
diff --git a/.changeset/khaki-shrimps-tease.md b/.changeset/khaki-shrimps-tease.md
new file mode 100644
index 0000000000..a4dd3bc8e0
--- /dev/null
+++ b/.changeset/khaki-shrimps-tease.md
@@ -0,0 +1,9 @@
+---
+'@backstage/plugin-scaffolder-backend-module-gitlab': minor
+'@backstage/plugin-scaffolder-backend-module-bitbucket-cloud': patch
+'@backstage/plugin-scaffolder-react': patch
+'@backstage/plugin-scaffolder-node': patch
+'@backstage/plugin-scaffolder': patch
+---
+
+Added the autocomplete feature to GitlabRepoUrlPicker
diff --git a/.changeset/kind-steaks-flow.md b/.changeset/kind-steaks-flow.md
deleted file mode 100644
index fc93d5b1d0..0000000000
--- a/.changeset/kind-steaks-flow.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-notifications': patch
----
-
-The "Created after" filter renamed to the "Sent out" based on the received users' feedback.
diff --git a/.changeset/late-kings-wave.md b/.changeset/late-kings-wave.md
deleted file mode 100644
index 01877f2732..0000000000
--- a/.changeset/late-kings-wave.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Added a new `"rejectFrontendNetworkRequests"` configuration flag that can be set in the `"jest"` field in the root `package.json`:
-
-```json
-{
- "jest": {
- "rejectFrontendNetworkRequests": true
- }
-}
-```
-
-This flag causes rejection of any form of network requests that are attempted to be made in frontend or common package tests. This flag can only be set in the root `package.json` and can not be overridden in individual package configurations.
diff --git a/.changeset/lazy-pants-attack.md b/.changeset/lazy-pants-attack.md
new file mode 100644
index 0000000000..87a5fadb45
--- /dev/null
+++ b/.changeset/lazy-pants-attack.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-auth-backend': patch
+---
+
+Fix issue with `jwks` endpoint returning invalid data with `firestore`
diff --git a/.changeset/lazy-years-float.md b/.changeset/lazy-years-float.md
new file mode 100644
index 0000000000..23bd77a0bb
--- /dev/null
+++ b/.changeset/lazy-years-float.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-react': patch
+---
+
+Fix catalog filtering to allow searching entities by display name
diff --git a/.changeset/lemon-bulldogs-study.md b/.changeset/lemon-bulldogs-study.md
new file mode 100644
index 0000000000..7bb15b8193
--- /dev/null
+++ b/.changeset/lemon-bulldogs-study.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog': minor
+---
+
+Consistent title behaviour across CatalogTable, CursorPaginatedCatalogTable, and OffsetPaginatedCatalogTable.
diff --git a/.changeset/lemon-gifts-crash.md b/.changeset/lemon-gifts-crash.md
deleted file mode 100644
index c4ab159dc8..0000000000
--- a/.changeset/lemon-gifts-crash.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/plugin-scaffolder-common': patch
-'@backstage/plugin-scaffolder-react': patch
-'@backstage/plugin-scaffolder': minor
----
-
-Add scaffolder permission `scaffolder.template.management` for accessing the template management features
diff --git a/.changeset/little-rivers-deny.md b/.changeset/little-rivers-deny.md
deleted file mode 100644
index 8a6c60311e..0000000000
--- a/.changeset/little-rivers-deny.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-test-utils': minor
----
-
-Made it possible to construct `mockServices.database` with a given knex instance
diff --git a/.changeset/loud-plants-dream.md b/.changeset/loud-plants-dream.md
deleted file mode 100644
index a5099a088d..0000000000
--- a/.changeset/loud-plants-dream.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Add `--max-warnings -1` support to `backstage-cli package lint`
diff --git a/.changeset/loud-trainers-yawn.md b/.changeset/loud-trainers-yawn.md
deleted file mode 100644
index b48f773caa..0000000000
--- a/.changeset/loud-trainers-yawn.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-The `--successCache` option for the `repo test` and `repo lint` commands now use an additive store that keeps old entries around for a week before they are cleaned up automatically.
diff --git a/.changeset/lucky-bananas-eat.md b/.changeset/lucky-bananas-eat.md
deleted file mode 100644
index 758ff95c36..0000000000
--- a/.changeset/lucky-bananas-eat.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-import': patch
----
-
-Fixed parsing of catalog-info.yaml when creating a PR to register a repository if the file contains more than one document
diff --git a/.changeset/lucky-snakes-complain.md b/.changeset/lucky-snakes-complain.md
deleted file mode 100644
index 83aca565ba..0000000000
--- a/.changeset/lucky-snakes-complain.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core-components': patch
----
-
-Change core component Table tool bar search box to the a appropriate Search icon and text
diff --git a/.changeset/mean-shirts-design.md b/.changeset/mean-shirts-design.md
new file mode 100644
index 0000000000..ea89c6ecfd
--- /dev/null
+++ b/.changeset/mean-shirts-design.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli-node': patch
+---
+
+add PackageManager and Lockfile interfaces for future use
diff --git a/.changeset/mean-years-deliver.md b/.changeset/mean-years-deliver.md
deleted file mode 100644
index 82b4a12688..0000000000
--- a/.changeset/mean-years-deliver.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': patch
----
-
-Fix issue with token not being available because it's now non-enumerable
diff --git a/.changeset/metal-carrots-brush.md b/.changeset/metal-carrots-brush.md
deleted file mode 100644
index 776e1d3e56..0000000000
--- a/.changeset/metal-carrots-brush.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-'@backstage/cli': patch
----
-
-When using the experimental Rspack flag the app build and dev server now injects configuration via a `` tag in `index.html` rather than the `process.env.APP_CONFIG` definition, which will now be defined as an empty array instead.
-
-This requires the app to be using the config loader from the 1.31 release of Backstage. Make sure your app is using at least that version if you are upgrading to this version of the CLI.
-
-If you have copied the implementation of the `defaultConfigLoader`, make sure to update it to the new implementation. In particular the config loader needs to be able to read configuration from `script` tags with the type `backstage.io/config`.
diff --git a/.changeset/metal-files-itch.md b/.changeset/metal-files-itch.md
deleted file mode 100644
index ac045eba9f..0000000000
--- a/.changeset/metal-files-itch.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-'@backstage/cli': minor
----
-
-Added a new optimization to the `repo test` command that will filter out unused packages in watch mode if all provide filters are paths that point from the repo root. This significantly speeds up running individual tests from the repo root in a large workspace, for example:
-
-```sh
-yarn test packages/app/src/App.test.tsx
-```
diff --git a/.changeset/mighty-jobs-unite.md b/.changeset/mighty-jobs-unite.md
deleted file mode 100644
index c8e880ba3e..0000000000
--- a/.changeset/mighty-jobs-unite.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-api-docs': patch
----
-
-Uses theme values to style the API definition schema so that theme overrides apply.
diff --git a/.changeset/mighty-spoons-suffer.md b/.changeset/mighty-spoons-suffer.md
deleted file mode 100644
index 5b03378568..0000000000
--- a/.changeset/mighty-spoons-suffer.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-techdocs': patch
----
-
-Avoid page re-rendering when clicking on anchor links in the same documentation page.
diff --git a/.changeset/moody-chicken-enjoy.md b/.changeset/moody-chicken-enjoy.md
deleted file mode 100644
index 54919557f3..0000000000
--- a/.changeset/moody-chicken-enjoy.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch
-'@backstage/plugin-scaffolder-backend': patch
-'@backstage/config-loader': patch
----
-
-Internal refactor to use the deferred from the types package
diff --git a/.changeset/neat-buttons-wait.md b/.changeset/neat-buttons-wait.md
deleted file mode 100644
index 047f2e90c7..0000000000
--- a/.changeset/neat-buttons-wait.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-react': patch
----
-
-Ensure EntityDisplayName component link receives underline on hover.
diff --git a/.changeset/neat-insects-cough.md b/.changeset/neat-insects-cough.md
new file mode 100644
index 0000000000..fbdf214edb
--- /dev/null
+++ b/.changeset/neat-insects-cough.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Be more aggressive in dequeueing entities for stitching
diff --git a/.changeset/new-pandas-perform.md b/.changeset/new-pandas-perform.md
new file mode 100644
index 0000000000..797f34d6df
--- /dev/null
+++ b/.changeset/new-pandas-perform.md
@@ -0,0 +1,5 @@
+---
+'@backstage/repo-tools': minor
+---
+
+Fix invalid path and malformed flags bugs in api-reports.ts
diff --git a/.changeset/new-rules-teach.md b/.changeset/new-rules-teach.md
new file mode 100644
index 0000000000..cae0215bfc
--- /dev/null
+++ b/.changeset/new-rules-teach.md
@@ -0,0 +1,8 @@
+---
+'@backstage/catalog-client': minor
+'@backstage/plugin-catalog-backend': minor
+'@backstage/plugin-events-backend': minor
+'@backstage/plugin-search-backend': minor
+---
+
+Internal updates to generated code.
diff --git a/.changeset/ninety-panthers-provide.md b/.changeset/ninety-panthers-provide.md
deleted file mode 100644
index 467344ae61..0000000000
--- a/.changeset/ninety-panthers-provide.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/repo-tools': patch
----
-
-The `generate-patch` command now properly includes newly created files in the patch.
diff --git a/.changeset/ninety-shirts-float.md b/.changeset/ninety-shirts-float.md
deleted file mode 100644
index 4ff9a39560..0000000000
--- a/.changeset/ninety-shirts-float.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': patch
----
-
-Align with type declaration of template filter/global function by supporting undefined as return value.
diff --git a/.changeset/odd-apples-explain.md b/.changeset/odd-apples-explain.md
new file mode 100644
index 0000000000..324d98b0f6
--- /dev/null
+++ b/.changeset/odd-apples-explain.md
@@ -0,0 +1,8 @@
+---
+'@backstage/plugin-auth-node': patch
+'@backstage/plugin-permission-backend': patch
+'@backstage/plugin-devtools-backend': patch
+'@backstage/plugin-signals-backend': patch
+---
+
+Restrict `@types/express` version range from `*` to `^4.17.6`.
diff --git a/.changeset/odd-worms-peel.md b/.changeset/odd-worms-peel.md
new file mode 100644
index 0000000000..90e05f1e51
--- /dev/null
+++ b/.changeset/odd-worms-peel.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Correctly report stitching queue length
diff --git a/.changeset/old-taxis-exist.md b/.changeset/old-taxis-exist.md
new file mode 100644
index 0000000000..f2c7ac1f02
--- /dev/null
+++ b/.changeset/old-taxis-exist.md
@@ -0,0 +1,11 @@
+---
+'@backstage/plugin-events-backend': patch
+'@backstage/plugin-events-node': patch
+---
+
+Allow configuring a timeout for event bus polling requests. This can be set like so in your app-config:
+
+```yaml
+events:
+ notifyTimeoutMs: 30000
+```
diff --git a/.changeset/olive-berries-jump.md b/.changeset/olive-berries-jump.md
new file mode 100644
index 0000000000..d8e9fb1da6
--- /dev/null
+++ b/.changeset/olive-berries-jump.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-techdocs': patch
+---
+
+Added support for the Search bar in docs residing in the entity page tab, and not only the global "/docs" page.
diff --git a/.changeset/orange-coins-confess.md b/.changeset/orange-coins-confess.md
new file mode 100644
index 0000000000..8e8aefb096
--- /dev/null
+++ b/.changeset/orange-coins-confess.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-devtools-backend': minor
+---
+
+**BREAKING** Removed support for what is known as the legacy backend, please use the New Backend System.
diff --git a/.changeset/orange-moles-kick.md b/.changeset/orange-moles-kick.md
new file mode 100644
index 0000000000..6e6054418e
--- /dev/null
+++ b/.changeset/orange-moles-kick.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend': minor
+---
+
+Emit scaffolder events using the optional `EventsService`
diff --git a/.changeset/orange-moles-taste.md b/.changeset/orange-moles-taste.md
deleted file mode 100644
index 79a5bd70ff..0000000000
--- a/.changeset/orange-moles-taste.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-'@backstage/plugin-kubernetes-backend': minor
-'@backstage/plugin-kubernetes-common': minor
-'@backstage/plugin-kubernetes-react': minor
-'@backstage/plugin-kubernetes-node': minor
-'@backstage/plugin-kubernetes': minor
----
-
-Bumping @kubernetes/client-node to 1.0.0-rc7 to mitigate CVEs related to the request and tough-cookie packages
diff --git a/.changeset/perfect-goats-mate.md b/.changeset/perfect-goats-mate.md
deleted file mode 100644
index 6ad2884d08..0000000000
--- a/.changeset/perfect-goats-mate.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/core-components': minor
----
-
-The SupportButton component will now be hidden if no support config is specified in app-config
diff --git a/.changeset/pink-bees-shake.md b/.changeset/pink-bees-shake.md
new file mode 100644
index 0000000000..2d87b7ef6c
--- /dev/null
+++ b/.changeset/pink-bees-shake.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-node': patch
+---
+
+Make sure that isomorphic git push commands are not proxied.
diff --git a/.changeset/pink-pets-jump.md b/.changeset/pink-pets-jump.md
new file mode 100644
index 0000000000..d9bb97e36e
--- /dev/null
+++ b/.changeset/pink-pets-jump.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-defaults': patch
+---
+
+Support `connection.type: cloudsql` in database client for usage with `@google-cloud/cloud-sql-connector` and `iam` auth
diff --git a/.changeset/pink-schools-shave.md b/.changeset/pink-schools-shave.md
deleted file mode 100644
index a7cce72d1f..0000000000
--- a/.changeset/pink-schools-shave.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-react': patch
----
-
-Improve UI consistency of default catalog filters
diff --git a/.changeset/plenty-students-check.md b/.changeset/plenty-students-check.md
deleted file mode 100644
index b83199f9e0..0000000000
--- a/.changeset/plenty-students-check.md
+++ /dev/null
@@ -1,21 +0,0 @@
----
-'@backstage/core-components': patch
----
-
-Adds the ability to mock a media query per break point and to change the active break point during a test. Usage example:
-
-```ts
-const { set } = mockBreakpoint({
- initialBreakpoint: 'md',
- queryBreakpointMap: {
- '(min-width:1500px)': 'xl',
- '(min-width:1000px)': 'lg',
- '(min-width:700px)': 'md',
- '(min-width:400px)': 'sm',
- '(min-width:0px)': 'xs',
- },
-});
-// assertions for when the active break point is "md"
-set('lg');
-// assertions for when the active break point is "lg"
-```
diff --git a/.changeset/forty-spoons-burn.md b/.changeset/polite-foxes-buy.md
similarity index 59%
rename from .changeset/forty-spoons-burn.md
rename to .changeset/polite-foxes-buy.md
index 627cb31970..a67af204e0 100644
--- a/.changeset/forty-spoons-burn.md
+++ b/.changeset/polite-foxes-buy.md
@@ -2,4 +2,4 @@
'@backstage/plugin-scaffolder-backend': patch
---
-Fix tasks listing with postgres
+Add fs:readdir to scaffolder startup
diff --git a/.changeset/poor-hounds-jump.md b/.changeset/poor-hounds-jump.md
new file mode 100644
index 0000000000..2f1abb8ce8
--- /dev/null
+++ b/.changeset/poor-hounds-jump.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Bumped the version range for `html-webpack-plugin` to fix the `htmlPluginExports.getCompilationHooks is not a function` error when using experimental Rspack.
diff --git a/.changeset/popular-donkeys-rhyme.md b/.changeset/popular-donkeys-rhyme.md
new file mode 100644
index 0000000000..90195ff999
--- /dev/null
+++ b/.changeset/popular-donkeys-rhyme.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Added `@backstage/cli/config/prettier` as a replacement for `@spotify/prettier-config`, but with the same configuration.
diff --git a/.changeset/pre.json b/.changeset/pre.json
index eb945eac0c..f5f6c0f781 100644
--- a/.changeset/pre.json
+++ b/.changeset/pre.json
@@ -1,310 +1,278 @@
{
- "mode": "exit",
+ "mode": "pre",
"tag": "next",
"initialVersions": {
- "example-app": "0.2.102",
- "@backstage/app-defaults": "1.5.12",
- "example-app-next": "0.0.16",
- "app-next-example-plugin": "0.0.16",
- "example-backend": "0.0.31",
- "@backstage/backend-app-api": "1.0.1",
- "@backstage/backend-defaults": "0.5.1",
+ "example-app": "0.2.103",
+ "@backstage/app-defaults": "1.5.13",
+ "example-app-next": "0.0.17",
+ "app-next-example-plugin": "0.0.17",
+ "example-backend": "0.0.32",
+ "@backstage/backend-app-api": "1.0.2",
+ "@backstage/backend-defaults": "0.5.3",
"@backstage/backend-dev-utils": "0.1.5",
- "@backstage/backend-dynamic-feature-service": "0.4.2",
- "example-backend-legacy": "0.2.103",
- "@backstage/backend-openapi-utils": "0.2.0",
- "@backstage/backend-plugin-api": "1.0.1",
- "@backstage/backend-test-utils": "1.0.1",
- "@backstage/catalog-client": "1.7.1",
- "@backstage/catalog-model": "1.7.0",
- "@backstage/cli": "0.28.0",
- "@backstage/cli-common": "0.1.14",
- "@backstage/cli-node": "0.2.9",
- "@backstage/codemods": "0.1.51",
- "@backstage/config": "1.2.0",
- "@backstage/config-loader": "1.9.1",
- "@backstage/core-app-api": "1.15.1",
- "@backstage/core-compat-api": "0.3.1",
- "@backstage/core-components": "0.15.1",
- "@backstage/core-plugin-api": "1.10.0",
- "@backstage/create-app": "0.5.21",
- "@backstage/dev-utils": "1.1.2",
- "e2e-test": "0.2.21",
+ "@backstage/backend-dynamic-feature-service": "0.5.0",
+ "example-backend-legacy": "0.2.104",
+ "@backstage/backend-openapi-utils": "0.3.0",
+ "@backstage/backend-plugin-api": "1.0.2",
+ "@backstage/backend-test-utils": "1.1.0",
+ "@backstage/catalog-client": "1.8.0",
+ "@backstage/catalog-model": "1.7.1",
+ "@backstage/cli": "0.29.0",
+ "@backstage/cli-common": "0.1.15",
+ "@backstage/cli-node": "0.2.10",
+ "@backstage/codemods": "0.1.52",
+ "@backstage/config": "1.3.0",
+ "@backstage/config-loader": "1.9.2",
+ "@backstage/core-app-api": "1.15.2",
+ "@backstage/core-compat-api": "0.3.2",
+ "@backstage/core-components": "0.16.0",
+ "@backstage/core-plugin-api": "1.10.1",
+ "@backstage/create-app": "0.5.22",
+ "@backstage/dev-utils": "1.1.3",
+ "e2e-test": "0.2.22",
"@backstage/e2e-test-utils": "0.1.1",
- "@backstage/errors": "1.2.4",
+ "@backstage/errors": "1.2.5",
"@backstage/eslint-plugin": "0.1.10",
- "@backstage/frontend-app-api": "0.10.0",
- "@backstage/frontend-defaults": "0.1.1",
- "@internal/frontend": "0.0.2",
- "@backstage/frontend-plugin-api": "0.9.0",
- "@backstage/frontend-test-utils": "0.2.1",
- "@backstage/integration": "1.15.1",
- "@backstage/integration-aws-node": "0.1.12",
- "@backstage/integration-react": "1.2.0",
+ "@backstage/frontend-app-api": "0.10.1",
+ "@backstage/frontend-defaults": "0.1.2",
+ "@internal/frontend": "0.0.3",
+ "@backstage/frontend-plugin-api": "0.9.1",
+ "@backstage/frontend-test-utils": "0.2.2",
+ "@backstage/integration": "1.15.2",
+ "@backstage/integration-aws-node": "0.1.13",
+ "@backstage/integration-react": "1.2.1",
"@internal/opaque": "0.0.1",
"@backstage/release-manifests": "0.0.11",
- "@backstage/repo-tools": "0.10.0",
- "@internal/scaffolder": "0.0.2",
- "@techdocs/cli": "1.8.20",
- "techdocs-cli-embedded-app": "0.2.101",
- "@backstage/test-utils": "1.7.0",
- "@backstage/theme": "0.6.0",
- "@backstage/types": "1.1.1",
+ "@backstage/repo-tools": "0.11.0",
+ "@internal/scaffolder": "0.0.3",
+ "@techdocs/cli": "1.8.22",
+ "techdocs-cli-embedded-app": "0.2.102",
+ "@backstage/test-utils": "1.7.1",
+ "@backstage/theme": "0.6.1",
+ "@backstage/types": "1.2.0",
"@backstage/version-bridge": "1.0.10",
- "yarn-plugin-backstage": "0.0.2",
- "@backstage/plugin-api-docs": "0.11.11",
+ "yarn-plugin-backstage": "0.0.3",
+ "@backstage/plugin-api-docs": "0.12.0",
"@backstage/plugin-api-docs-module-protoc-gen-doc": "0.1.8",
- "@backstage/plugin-app": "0.1.1",
- "@backstage/plugin-app-backend": "0.3.76",
- "@backstage/plugin-app-node": "0.1.26",
- "@backstage/plugin-app-visualizer": "0.1.11",
- "@backstage/plugin-auth-backend": "0.23.1",
- "@backstage/plugin-auth-backend-module-atlassian-provider": "0.3.1",
- "@backstage/plugin-auth-backend-module-auth0-provider": "0.1.1",
- "@backstage/plugin-auth-backend-module-aws-alb-provider": "0.2.1",
- "@backstage/plugin-auth-backend-module-azure-easyauth-provider": "0.2.1",
- "@backstage/plugin-auth-backend-module-bitbucket-provider": "0.2.1",
- "@backstage/plugin-auth-backend-module-bitbucket-server-provider": "0.1.1",
- "@backstage/plugin-auth-backend-module-cloudflare-access-provider": "0.3.1",
- "@backstage/plugin-auth-backend-module-gcp-iap-provider": "0.3.1",
- "@backstage/plugin-auth-backend-module-github-provider": "0.2.1",
- "@backstage/plugin-auth-backend-module-gitlab-provider": "0.2.1",
- "@backstage/plugin-auth-backend-module-google-provider": "0.2.1",
- "@backstage/plugin-auth-backend-module-guest-provider": "0.2.1",
- "@backstage/plugin-auth-backend-module-microsoft-provider": "0.2.1",
- "@backstage/plugin-auth-backend-module-oauth2-provider": "0.3.1",
- "@backstage/plugin-auth-backend-module-oauth2-proxy-provider": "0.2.1",
- "@backstage/plugin-auth-backend-module-oidc-provider": "0.3.1",
- "@backstage/plugin-auth-backend-module-okta-provider": "0.1.1",
- "@backstage/plugin-auth-backend-module-onelogin-provider": "0.2.1",
- "@backstage/plugin-auth-backend-module-pinniped-provider": "0.2.1",
- "@backstage/plugin-auth-backend-module-vmware-cloud-provider": "0.4.0",
- "@backstage/plugin-auth-node": "0.5.3",
- "@backstage/plugin-auth-react": "0.1.7",
- "@backstage/plugin-bitbucket-cloud-common": "0.2.24",
- "@backstage/plugin-catalog": "1.24.0",
- "@backstage/plugin-catalog-backend": "1.27.0",
- "@backstage/plugin-catalog-backend-module-aws": "0.4.3",
- "@backstage/plugin-catalog-backend-module-azure": "0.2.3",
- "@backstage/plugin-catalog-backend-module-backstage-openapi": "0.4.1",
- "@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.4.0",
- "@backstage/plugin-catalog-backend-module-bitbucket-server": "0.2.3",
- "@backstage/plugin-catalog-backend-module-gcp": "0.3.1",
- "@backstage/plugin-catalog-backend-module-gerrit": "0.2.3",
- "@backstage/plugin-catalog-backend-module-github": "0.7.5",
- "@backstage/plugin-catalog-backend-module-github-org": "0.3.2",
- "@backstage/plugin-catalog-backend-module-gitlab": "0.4.3",
- "@backstage/plugin-catalog-backend-module-gitlab-org": "0.2.1",
- "@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.5.5",
- "@backstage/plugin-catalog-backend-module-ldap": "0.9.1",
- "@backstage/plugin-catalog-backend-module-logs": "0.1.2",
- "@backstage/plugin-catalog-backend-module-msgraph": "0.6.3",
- "@backstage/plugin-catalog-backend-module-openapi": "0.2.2",
- "@backstage/plugin-catalog-backend-module-puppetdb": "0.2.3",
- "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "0.2.1",
- "@backstage/plugin-catalog-backend-module-unprocessed": "0.5.1",
- "@backstage/plugin-catalog-common": "1.1.0",
- "@backstage/plugin-catalog-graph": "0.4.11",
- "@backstage/plugin-catalog-import": "0.12.5",
- "@backstage/plugin-catalog-node": "1.13.1",
- "@backstage/plugin-catalog-react": "1.14.0",
- "@backstage/plugin-catalog-unprocessed-entities": "0.2.9",
- "@backstage/plugin-catalog-unprocessed-entities-common": "0.0.4",
- "@backstage/plugin-config-schema": "0.1.60",
- "@backstage/plugin-devtools": "0.1.19",
- "@backstage/plugin-devtools-backend": "0.4.1",
- "@backstage/plugin-devtools-common": "0.1.12",
- "@backstage/plugin-events-backend": "0.3.13",
- "@backstage/plugin-events-backend-module-aws-sqs": "0.4.3",
- "@backstage/plugin-events-backend-module-azure": "0.2.12",
- "@backstage/plugin-events-backend-module-bitbucket-cloud": "0.2.12",
- "@backstage/plugin-events-backend-module-gerrit": "0.2.12",
- "@backstage/plugin-events-backend-module-github": "0.2.12",
- "@backstage/plugin-events-backend-module-gitlab": "0.2.12",
- "@backstage/plugin-events-backend-test-utils": "0.1.36",
- "@backstage/plugin-events-node": "0.4.1",
- "@internal/plugin-todo-list": "1.0.32",
- "@internal/plugin-todo-list-backend": "1.0.32",
- "@internal/plugin-todo-list-common": "1.0.21",
- "@backstage/plugin-home": "0.8.0",
- "@backstage/plugin-home-react": "0.1.18",
- "@backstage/plugin-kubernetes": "0.11.16",
- "@backstage/plugin-kubernetes-backend": "0.18.7",
- "@backstage/plugin-kubernetes-cluster": "0.0.17",
- "@backstage/plugin-kubernetes-common": "0.8.3",
- "@backstage/plugin-kubernetes-node": "0.1.20",
- "@backstage/plugin-kubernetes-react": "0.4.4",
- "@backstage/plugin-notifications": "0.3.2",
- "@backstage/plugin-notifications-backend": "0.4.1",
- "@backstage/plugin-notifications-backend-module-email": "0.3.1",
- "@backstage/plugin-notifications-common": "0.0.5",
- "@backstage/plugin-notifications-node": "0.2.7",
- "@backstage/plugin-org": "0.6.31",
- "@backstage/plugin-org-react": "0.1.30",
- "@backstage/plugin-permission-backend": "0.5.50",
- "@backstage/plugin-permission-backend-module-allow-all-policy": "0.2.1",
- "@backstage/plugin-permission-common": "0.8.1",
- "@backstage/plugin-permission-node": "0.8.4",
- "@backstage/plugin-permission-react": "0.4.27",
- "@backstage/plugin-proxy-backend": "0.5.7",
- "@backstage/plugin-scaffolder": "1.26.0",
- "@backstage/plugin-scaffolder-backend": "1.26.0",
- "@backstage/plugin-scaffolder-backend-module-azure": "0.2.1",
- "@backstage/plugin-scaffolder-backend-module-bitbucket": "0.3.1",
- "@backstage/plugin-scaffolder-backend-module-bitbucket-cloud": "0.2.1",
- "@backstage/plugin-scaffolder-backend-module-bitbucket-server": "0.2.1",
- "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "0.3.1",
- "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.3.1",
- "@backstage/plugin-scaffolder-backend-module-gcp": "0.2.1",
- "@backstage/plugin-scaffolder-backend-module-gerrit": "0.2.1",
- "@backstage/plugin-scaffolder-backend-module-gitea": "0.2.1",
- "@backstage/plugin-scaffolder-backend-module-github": "0.5.1",
- "@backstage/plugin-scaffolder-backend-module-gitlab": "0.6.0",
- "@backstage/plugin-scaffolder-backend-module-notifications": "0.1.1",
- "@backstage/plugin-scaffolder-backend-module-rails": "0.5.1",
- "@backstage/plugin-scaffolder-backend-module-sentry": "0.2.1",
- "@backstage/plugin-scaffolder-backend-module-yeoman": "0.4.1",
- "@backstage/plugin-scaffolder-common": "1.5.6",
- "@backstage/plugin-scaffolder-node": "0.5.0",
- "@backstage/plugin-scaffolder-node-test-utils": "0.1.13",
- "@backstage/plugin-scaffolder-react": "1.13.0",
- "@backstage/plugin-search": "1.4.18",
- "@backstage/plugin-search-backend": "1.6.0",
- "@backstage/plugin-search-backend-module-catalog": "0.2.3",
- "@backstage/plugin-search-backend-module-elasticsearch": "1.6.0",
- "@backstage/plugin-search-backend-module-explore": "0.2.3",
- "@backstage/plugin-search-backend-module-pg": "0.5.36",
- "@backstage/plugin-search-backend-module-stack-overflow-collator": "0.3.1",
- "@backstage/plugin-search-backend-module-techdocs": "0.3.0",
- "@backstage/plugin-search-backend-node": "1.3.3",
- "@backstage/plugin-search-common": "1.2.14",
- "@backstage/plugin-search-react": "1.8.1",
- "@backstage/plugin-signals": "0.0.11",
- "@backstage/plugin-signals-backend": "0.2.1",
- "@backstage/plugin-signals-node": "0.1.12",
- "@backstage/plugin-signals-react": "0.0.6",
- "@backstage/plugin-techdocs": "1.11.0",
- "@backstage/plugin-techdocs-addons-test-utils": "1.0.40",
- "@backstage/plugin-techdocs-backend": "1.11.0",
+ "@backstage/plugin-app": "0.1.2",
+ "@backstage/plugin-app-backend": "0.4.0",
+ "@backstage/plugin-app-node": "0.1.27",
+ "@backstage/plugin-app-visualizer": "0.1.12",
+ "@backstage/plugin-auth-backend": "0.24.0",
+ "@backstage/plugin-auth-backend-module-atlassian-provider": "0.3.2",
+ "@backstage/plugin-auth-backend-module-auth0-provider": "0.1.2",
+ "@backstage/plugin-auth-backend-module-aws-alb-provider": "0.3.0",
+ "@backstage/plugin-auth-backend-module-azure-easyauth-provider": "0.2.2",
+ "@backstage/plugin-auth-backend-module-bitbucket-provider": "0.2.2",
+ "@backstage/plugin-auth-backend-module-bitbucket-server-provider": "0.1.2",
+ "@backstage/plugin-auth-backend-module-cloudflare-access-provider": "0.3.2",
+ "@backstage/plugin-auth-backend-module-gcp-iap-provider": "0.3.2",
+ "@backstage/plugin-auth-backend-module-github-provider": "0.2.2",
+ "@backstage/plugin-auth-backend-module-gitlab-provider": "0.2.2",
+ "@backstage/plugin-auth-backend-module-google-provider": "0.2.2",
+ "@backstage/plugin-auth-backend-module-guest-provider": "0.2.2",
+ "@backstage/plugin-auth-backend-module-microsoft-provider": "0.2.2",
+ "@backstage/plugin-auth-backend-module-oauth2-provider": "0.3.2",
+ "@backstage/plugin-auth-backend-module-oauth2-proxy-provider": "0.2.2",
+ "@backstage/plugin-auth-backend-module-oidc-provider": "0.3.2",
+ "@backstage/plugin-auth-backend-module-okta-provider": "0.1.2",
+ "@backstage/plugin-auth-backend-module-onelogin-provider": "0.2.2",
+ "@backstage/plugin-auth-backend-module-pinniped-provider": "0.2.2",
+ "@backstage/plugin-auth-backend-module-vmware-cloud-provider": "0.4.1",
+ "@backstage/plugin-auth-node": "0.5.4",
+ "@backstage/plugin-auth-react": "0.1.8",
+ "@backstage/plugin-bitbucket-cloud-common": "0.2.25",
+ "@backstage/plugin-catalog": "1.25.0",
+ "@backstage/plugin-catalog-backend": "1.28.0",
+ "@backstage/plugin-catalog-backend-module-aws": "0.4.5",
+ "@backstage/plugin-catalog-backend-module-azure": "0.2.4",
+ "@backstage/plugin-catalog-backend-module-backstage-openapi": "0.4.2",
+ "@backstage/plugin-catalog-backend-module-bitbucket-cloud": "0.4.2",
+ "@backstage/plugin-catalog-backend-module-bitbucket-server": "0.2.4",
+ "@backstage/plugin-catalog-backend-module-gcp": "0.3.2",
+ "@backstage/plugin-catalog-backend-module-gerrit": "0.2.4",
+ "@backstage/plugin-catalog-backend-module-github": "0.7.7",
+ "@backstage/plugin-catalog-backend-module-github-org": "0.3.4",
+ "@backstage/plugin-catalog-backend-module-gitlab": "0.5.0",
+ "@backstage/plugin-catalog-backend-module-gitlab-org": "0.2.3",
+ "@backstage/plugin-catalog-backend-module-incremental-ingestion": "0.6.0",
+ "@backstage/plugin-catalog-backend-module-ldap": "0.10.0",
+ "@backstage/plugin-catalog-backend-module-logs": "0.1.4",
+ "@backstage/plugin-catalog-backend-module-msgraph": "0.6.4",
+ "@backstage/plugin-catalog-backend-module-openapi": "0.2.4",
+ "@backstage/plugin-catalog-backend-module-puppetdb": "0.2.4",
+ "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "0.2.2",
+ "@backstage/plugin-catalog-backend-module-unprocessed": "0.5.2",
+ "@backstage/plugin-catalog-common": "1.1.1",
+ "@backstage/plugin-catalog-graph": "0.4.12",
+ "@backstage/plugin-catalog-import": "0.12.6",
+ "@backstage/plugin-catalog-node": "1.14.0",
+ "@backstage/plugin-catalog-react": "1.14.1",
+ "@backstage/plugin-catalog-unprocessed-entities": "0.2.10",
+ "@backstage/plugin-catalog-unprocessed-entities-common": "0.0.5",
+ "@backstage/plugin-config-schema": "0.1.61",
+ "@backstage/plugin-devtools": "0.1.20",
+ "@backstage/plugin-devtools-backend": "0.4.2",
+ "@backstage/plugin-devtools-common": "0.1.13",
+ "@backstage/plugin-events-backend": "0.3.16",
+ "@backstage/plugin-events-backend-module-aws-sqs": "0.4.5",
+ "@backstage/plugin-events-backend-module-azure": "0.2.14",
+ "@backstage/plugin-events-backend-module-bitbucket-cloud": "0.2.14",
+ "@backstage/plugin-events-backend-module-gerrit": "0.2.14",
+ "@backstage/plugin-events-backend-module-github": "0.2.14",
+ "@backstage/plugin-events-backend-module-gitlab": "0.2.14",
+ "@backstage/plugin-events-backend-test-utils": "0.1.38",
+ "@backstage/plugin-events-node": "0.4.5",
+ "@internal/plugin-todo-list": "1.0.33",
+ "@internal/plugin-todo-list-backend": "1.0.33",
+ "@internal/plugin-todo-list-common": "1.0.22",
+ "@backstage/plugin-home": "0.8.1",
+ "@backstage/plugin-home-react": "0.1.19",
+ "@backstage/plugin-kubernetes": "0.12.0",
+ "@backstage/plugin-kubernetes-backend": "0.19.0",
+ "@backstage/plugin-kubernetes-cluster": "0.0.18",
+ "@backstage/plugin-kubernetes-common": "0.9.0",
+ "@backstage/plugin-kubernetes-node": "0.2.0",
+ "@backstage/plugin-kubernetes-react": "0.5.0",
+ "@backstage/plugin-notifications": "0.4.0",
+ "@backstage/plugin-notifications-backend": "0.4.3",
+ "@backstage/plugin-notifications-backend-module-email": "0.3.3",
+ "@backstage/plugin-notifications-common": "0.0.6",
+ "@backstage/plugin-notifications-node": "0.2.9",
+ "@backstage/plugin-org": "0.6.32",
+ "@backstage/plugin-org-react": "0.1.31",
+ "@backstage/plugin-permission-backend": "0.5.51",
+ "@backstage/plugin-permission-backend-module-allow-all-policy": "0.2.2",
+ "@backstage/plugin-permission-common": "0.8.2",
+ "@backstage/plugin-permission-node": "0.8.5",
+ "@backstage/plugin-permission-react": "0.4.28",
+ "@backstage/plugin-proxy-backend": "0.5.8",
+ "@backstage/plugin-scaffolder": "1.27.0",
+ "@backstage/plugin-scaffolder-backend": "1.27.0",
+ "@backstage/plugin-scaffolder-backend-module-azure": "0.2.2",
+ "@backstage/plugin-scaffolder-backend-module-bitbucket": "0.3.2",
+ "@backstage/plugin-scaffolder-backend-module-bitbucket-cloud": "0.2.2",
+ "@backstage/plugin-scaffolder-backend-module-bitbucket-server": "0.2.2",
+ "@backstage/plugin-scaffolder-backend-module-confluence-to-markdown": "0.3.2",
+ "@backstage/plugin-scaffolder-backend-module-cookiecutter": "0.3.3",
+ "@backstage/plugin-scaffolder-backend-module-gcp": "0.2.2",
+ "@backstage/plugin-scaffolder-backend-module-gerrit": "0.2.2",
+ "@backstage/plugin-scaffolder-backend-module-gitea": "0.2.2",
+ "@backstage/plugin-scaffolder-backend-module-github": "0.5.2",
+ "@backstage/plugin-scaffolder-backend-module-gitlab": "0.6.1",
+ "@backstage/plugin-scaffolder-backend-module-notifications": "0.1.3",
+ "@backstage/plugin-scaffolder-backend-module-rails": "0.5.2",
+ "@backstage/plugin-scaffolder-backend-module-sentry": "0.2.2",
+ "@backstage/plugin-scaffolder-backend-module-yeoman": "0.4.3",
+ "@backstage/plugin-scaffolder-common": "1.5.7",
+ "@backstage/plugin-scaffolder-node": "0.6.0",
+ "@backstage/plugin-scaffolder-node-test-utils": "0.1.15",
+ "@backstage/plugin-scaffolder-react": "1.14.0",
+ "@backstage/plugin-search": "1.4.19",
+ "@backstage/plugin-search-backend": "1.7.0",
+ "@backstage/plugin-search-backend-module-catalog": "0.2.5",
+ "@backstage/plugin-search-backend-module-elasticsearch": "1.6.2",
+ "@backstage/plugin-search-backend-module-explore": "0.2.5",
+ "@backstage/plugin-search-backend-module-pg": "0.5.38",
+ "@backstage/plugin-search-backend-module-stack-overflow-collator": "0.3.3",
+ "@backstage/plugin-search-backend-module-techdocs": "0.3.2",
+ "@backstage/plugin-search-backend-node": "1.3.5",
+ "@backstage/plugin-search-common": "1.2.15",
+ "@backstage/plugin-search-react": "1.8.2",
+ "@backstage/plugin-signals": "0.0.12",
+ "@backstage/plugin-signals-backend": "0.2.3",
+ "@backstage/plugin-signals-node": "0.1.14",
+ "@backstage/plugin-signals-react": "0.0.7",
+ "@backstage/plugin-techdocs": "1.11.1",
+ "@backstage/plugin-techdocs-addons-test-utils": "1.0.41",
+ "@backstage/plugin-techdocs-backend": "1.11.2",
"@backstage/plugin-techdocs-common": "0.1.0",
- "@backstage/plugin-techdocs-module-addons-contrib": "1.1.16",
- "@backstage/plugin-techdocs-node": "1.12.12",
- "@backstage/plugin-techdocs-react": "1.2.9",
- "@backstage/plugin-user-settings": "0.8.14",
- "@backstage/plugin-user-settings-backend": "0.2.25",
- "@backstage/plugin-user-settings-common": "0.0.1"
+ "@backstage/plugin-techdocs-module-addons-contrib": "1.1.17",
+ "@backstage/plugin-techdocs-node": "1.12.13",
+ "@backstage/plugin-techdocs-react": "1.2.10",
+ "@backstage/plugin-user-settings": "0.8.15",
+ "@backstage/plugin-user-settings-backend": "0.2.27",
+ "@backstage/plugin-user-settings-common": "0.0.1",
+ "@backstage/canon": "0.0.0"
},
"changesets": [
- "afraid-bananas-behave",
- "afraid-carrots-greet",
- "big-tips-heal",
- "bright-buckets-laugh",
- "bright-singers-do",
- "chilled-taxis-dance",
- "create-app-1729608704",
- "create-app-1730809984",
- "curvy-bears-nail",
- "cyan-trees-bow",
- "early-cobras-compare",
- "early-monkeys-hammer",
- "empty-lobsters-wait",
- "few-hornets-rush",
- "flat-feet-do",
- "forty-pets-wave",
- "forty-spoons-burn",
- "fresh-jeans-relate",
- "friendly-hats-push",
- "friendly-kids-judge",
- "friendly-melons-shake",
- "green-tools-arrive",
- "grumpy-shoes-return",
- "healthy-bags-jog",
- "healthy-lions-judge",
- "healthy-tables-wonder",
- "heavy-mice-raise",
- "heavy-phones-shave",
- "hungry-cats-juggle",
- "hungry-owls-sell",
- "itchy-elephants-trade",
- "khaki-fireants-march",
- "late-kings-wave",
- "lemon-gifts-crash",
- "little-rivers-deny",
- "loud-plants-dream",
- "loud-trainers-yawn",
- "lucky-bananas-eat",
- "lucky-snakes-complain",
- "mean-years-deliver",
- "metal-files-itch",
- "mighty-jobs-unite",
- "mighty-spoons-suffer",
- "neat-buttons-wait",
- "ninety-panthers-provide",
- "ninety-shirts-float",
- "orange-moles-taste",
- "perfect-goats-mate",
- "pink-schools-shave",
- "plenty-students-check",
- "pretty-zebras-listen",
- "purple-masks-swim",
- "quick-cougars-fry",
- "rare-otters-judge",
- "rare-trains-scream",
- "red-fishes-press",
- "renovate-3d822ce",
- "renovate-4635182",
- "renovate-6193787",
- "renovate-7a33477",
- "renovate-7b59eed",
- "renovate-b2c2aaf",
- "renovate-bcc9782",
- "rotten-lions-cover",
- "rotten-needles-relax",
- "selfish-ads-count",
- "selfish-spies-cough",
- "serious-penguins-remain",
- "seven-berries-listen",
- "seven-hotels-move",
- "shiny-falcons-fly",
- "short-geckos-sniff",
- "short-pots-remember",
- "shy-clouds-brake",
- "shy-pots-speak",
- "shy-rats-hear",
- "silent-wasps-whisper",
- "silly-kiwis-destroy",
- "silver-ears-grin",
- "silver-kings-sort",
- "six-beds-exercise",
- "slimy-jobs-scream",
- "slimy-penguins-care",
- "slow-mayflies-sleep",
- "slow-shrimps-call",
- "smart-bags-sell",
- "soft-turkeys-tie",
- "spotty-snails-worry",
- "strange-clocks-pretend",
- "strong-paws-change",
- "swift-laws-applaud",
- "ten-hats-appear",
- "ten-pears-unite",
- "tender-feet-scream",
- "thick-trees-worry",
- "three-mangos-dance",
- "tough-onions-dance",
- "tricky-crabs-lick",
- "twelve-masks-call",
- "two-donuts-float",
- "unlucky-countries-shop",
- "violet-ears-dance",
- "violet-parrots-knock",
- "warm-tomatoes-develop",
- "wild-experts-unite",
- "wise-avocados-behave",
- "wise-snakes-sleep",
- "witty-bobcats-push",
- "witty-socks-repeat",
- "yellow-horses-pretend",
- "young-penguins-act"
+ "beige-chicken-type",
+ "brave-maps-deliver",
+ "brown-monkeys-ring",
+ "chatty-weeks-impress",
+ "cold-icons-worry",
+ "cold-jeans-stare",
+ "cuddly-chicken-wink",
+ "cuddly-schools-scream",
+ "curly-hats-tell",
+ "cyan-rocks-divide",
+ "dry-needles-taste",
+ "empty-bugs-deliver",
+ "empty-ways-push",
+ "fast-cheetahs-deliver",
+ "few-colts-train",
+ "few-pillows-remember",
+ "five-goats-travel",
+ "fluffy-cobras-sort",
+ "fluffy-falcons-shout",
+ "fluffy-zebras-cheer",
+ "forty-apples-complain",
+ "friendly-dots-thank",
+ "gold-stingrays-cross",
+ "great-buttons-cross",
+ "happy-forks-listen",
+ "healthy-years-begin",
+ "heavy-needles-poke",
+ "honest-hornets-double",
+ "hungry-hairs-wait",
+ "itchy-rats-pump",
+ "khaki-ladybugs-swim",
+ "khaki-shrimps-tease",
+ "lazy-pants-attack",
+ "lazy-years-float",
+ "mean-shirts-design",
+ "neat-insects-cough",
+ "new-pandas-perform",
+ "new-rules-teach",
+ "odd-apples-explain",
+ "odd-worms-peel",
+ "old-taxis-exist",
+ "olive-berries-jump",
+ "orange-coins-confess",
+ "orange-moles-kick",
+ "pink-bees-shake",
+ "pink-pets-jump",
+ "polite-foxes-buy",
+ "poor-hounds-jump",
+ "popular-donkeys-rhyme",
+ "real-shirts-cry",
+ "renovate-998a490",
+ "renovate-a5f3bd6",
+ "rich-beers-eat",
+ "rollup-fix-forward",
+ "rollup-release-borked-packages",
+ "seven-bulldogs-count",
+ "short-baboons-search",
+ "shy-teachers-count",
+ "silent-pigs-collect",
+ "sixty-shirts-rescue",
+ "slow-horses-destroy",
+ "slow-singers-jump",
+ "spotty-shoes-exercise",
+ "stale-rats-tease",
+ "strong-papayas-remember",
+ "swift-kangaroos-drop",
+ "tall-comics-heal",
+ "ten-keys-nail",
+ "thick-items-bathe",
+ "tiny-mice-run",
+ "twenty-parents-judge",
+ "violet-snakes-laugh",
+ "warm-pumpkins-bathe",
+ "weak-avocados-suffer",
+ "weak-meals-doubt",
+ "wet-rats-exist",
+ "young-carrots-collect",
+ "young-months-admire"
]
}
diff --git a/.changeset/pretty-ligers-bake.md b/.changeset/pretty-ligers-bake.md
deleted file mode 100644
index 871154f974..0000000000
--- a/.changeset/pretty-ligers-bake.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-notifications': patch
----
-
-The notification's title is emphasized to be clearly distinguished from the description.
diff --git a/.changeset/pretty-zebras-listen.md b/.changeset/pretty-zebras-listen.md
deleted file mode 100644
index d7ee0faef4..0000000000
--- a/.changeset/pretty-zebras-listen.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Fixed an issue where the `raw-loader` for loading HTML templates was not resolved from the context of the CLI package.
diff --git a/.changeset/purple-masks-swim.md b/.changeset/purple-masks-swim.md
deleted file mode 100644
index d285712f64..0000000000
--- a/.changeset/purple-masks-swim.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-kubernetes-backend': patch
----
-
-Adapted the config.d.ts for custom k8s cluster authProvider implementations
diff --git a/.changeset/quick-cougars-fry.md b/.changeset/quick-cougars-fry.md
deleted file mode 100644
index 6ae8b66eda..0000000000
--- a/.changeset/quick-cougars-fry.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-'@backstage/plugin-home': patch
----
-
-Improve Starred Entities UI to reduce whitespace and provide more context on the entities:
-
-- Use the Entity Presentation API (via ``) to display the entity's name
-- Component's `kind` and `spec.type` are displayed as a secondary text
-- List items are condensed to reduce unnecessary spacing
diff --git a/.changeset/rare-otters-judge.md b/.changeset/rare-otters-judge.md
deleted file mode 100644
index 3c3f91e094..0000000000
--- a/.changeset/rare-otters-judge.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-auth-node': patch
----
-
-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.
diff --git a/.changeset/rare-trains-scream.md b/.changeset/rare-trains-scream.md
deleted file mode 100644
index e6a3a141fa..0000000000
--- a/.changeset/rare-trains-scream.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder': patch
----
-
-fix(scaffolder): use `onInputChange` in `RepoUrlPicker` to fix issue with the value not updating properly
diff --git a/.changeset/real-shirts-cry.md b/.changeset/real-shirts-cry.md
new file mode 100644
index 0000000000..78056368ae
--- /dev/null
+++ b/.changeset/real-shirts-cry.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli-node': patch
+---
+
+Internal refactor
diff --git a/.changeset/red-fishes-press.md b/.changeset/red-fishes-press.md
deleted file mode 100644
index 8493ddf446..0000000000
--- a/.changeset/red-fishes-press.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/plugin-techdocs': patch
----
-
-Added DomPurify sanitizer configuration for custom elements implementing RFC https://github.com/backstage/backstage/issues/26988.
-See https://backstage.io/docs/features/techdocs/how-to-guides#how-to-enable-custom-elements-in-techdocs for how to enable it in the configuration.
diff --git a/.changeset/renovate-297315f.md b/.changeset/renovate-297315f.md
deleted file mode 100644
index 6904a54681..0000000000
--- a/.changeset/renovate-297315f.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Updated dependency `vite` to `^5.0.0`.
diff --git a/.changeset/renovate-3d822ce.md b/.changeset/renovate-3d822ce.md
deleted file mode 100644
index 805b924b3b..0000000000
--- a/.changeset/renovate-3d822ce.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-search-backend-module-elasticsearch': patch
----
-
-Updated dependency `@short.io/opensearch-mock` to `^0.4.0`.
diff --git a/.changeset/renovate-4635182.md b/.changeset/renovate-4635182.md
deleted file mode 100644
index c75b098e23..0000000000
--- a/.changeset/renovate-4635182.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/cli': patch
-'@backstage/repo-tools': patch
-'@backstage/plugin-bitbucket-cloud-common': patch
----
-
-Updated dependency `ts-morph` to `^24.0.0`.
diff --git a/.changeset/renovate-6193787.md b/.changeset/renovate-6193787.md
deleted file mode 100644
index ce392b7c81..0000000000
--- a/.changeset/renovate-6193787.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Updated dependency `css-loader` to `^7.0.0`.
diff --git a/.changeset/renovate-7a33477.md b/.changeset/renovate-7a33477.md
deleted file mode 100644
index daf17a280f..0000000000
--- a/.changeset/renovate-7a33477.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Updated dependency `@module-federation/enhanced` to `^0.7.0`.
diff --git a/.changeset/renovate-7b59eed.md b/.changeset/renovate-7b59eed.md
deleted file mode 100644
index 8031f9c4e7..0000000000
--- a/.changeset/renovate-7b59eed.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Updated dependency `del` to `^8.0.0`.
diff --git a/.changeset/renovate-998a490.md b/.changeset/renovate-998a490.md
new file mode 100644
index 0000000000..8def7d49cd
--- /dev/null
+++ b/.changeset/renovate-998a490.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-react': patch
+---
+
+Updated dependency `flatted` to `3.3.2`.
diff --git a/.changeset/renovate-a5f3bd6.md b/.changeset/renovate-a5f3bd6.md
new file mode 100644
index 0000000000..9911fd311f
--- /dev/null
+++ b/.changeset/renovate-a5f3bd6.md
@@ -0,0 +1,11 @@
+---
+'@backstage/plugin-home-react': patch
+'@backstage/plugin-home': patch
+'@backstage/plugin-scaffolder-react': patch
+'@backstage/plugin-scaffolder': patch
+---
+
+Updated dependency `@rjsf/utils` to `5.23.1`.
+Updated dependency `@rjsf/core` to `5.23.1`.
+Updated dependency `@rjsf/material-ui` to `5.23.1`.
+Updated dependency `@rjsf/validator-ajv8` to `5.23.1`.
diff --git a/.changeset/renovate-b2c2aaf.md b/.changeset/renovate-b2c2aaf.md
deleted file mode 100644
index b6e7a8c029..0000000000
--- a/.changeset/renovate-b2c2aaf.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder': patch
----
-
-Updated dependency `idb-keyval` to `5.1.5`.
diff --git a/.changeset/renovate-bcc9782.md b/.changeset/renovate-bcc9782.md
deleted file mode 100644
index 56b6704f79..0000000000
--- a/.changeset/renovate-bcc9782.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-search-backend-module-explore': patch
----
-
-Updated dependency `@backstage-community/plugin-explore-common` to `^0.0.7`.
diff --git a/.changeset/renovate-f322bf6.md b/.changeset/renovate-f322bf6.md
deleted file mode 100644
index 370c832ea5..0000000000
--- a/.changeset/renovate-f322bf6.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend-module-openapi': patch
----
-
-Updated dependency `@apidevtools/json-schema-ref-parser` to `^11.0.0`.
diff --git a/.changeset/rich-beers-eat.md b/.changeset/rich-beers-eat.md
new file mode 100644
index 0000000000..55115e929e
--- /dev/null
+++ b/.changeset/rich-beers-eat.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch
+---
+
+Wire up the events together in the new backend system
diff --git a/.changeset/rich-suns-drive.md b/.changeset/rich-suns-drive.md
new file mode 100644
index 0000000000..0b2eb85a5b
--- /dev/null
+++ b/.changeset/rich-suns-drive.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-openapi-utils': minor
+---
+
+Fixed a Typescript error when trying to use the new OpenAPI server-side generated code.
diff --git a/.changeset/rollup-fix-forward.md b/.changeset/rollup-fix-forward.md
new file mode 100644
index 0000000000..681812a134
--- /dev/null
+++ b/.changeset/rollup-fix-forward.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Update `rollup` to avoid issues with build output when running `backstage-cli package build`.
diff --git a/.changeset/rollup-release-borked-packages.md b/.changeset/rollup-release-borked-packages.md
new file mode 100644
index 0000000000..f13d7d2de7
--- /dev/null
+++ b/.changeset/rollup-release-borked-packages.md
@@ -0,0 +1,12 @@
+---
+'@backstage/cli': patch
+'@backstage/frontend-plugin-api': patch
+'@backstage/repo-tools': patch
+'@backstage/theme': patch
+'@backstage/plugin-app': patch
+'@backstage/plugin-catalog-backend-module-ldap': patch
+'@backstage/plugin-scaffolder-backend-module-bitbucket': patch
+'@backstage/plugin-techdocs-node': patch
+---
+
+Fixed a bug that caused missing code in published packages.
diff --git a/.changeset/rotten-lions-cover.md b/.changeset/rotten-lions-cover.md
deleted file mode 100644
index f64e8209b9..0000000000
--- a/.changeset/rotten-lions-cover.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-techdocs': patch
----
-
-Removed `canvas` dev dependency.
diff --git a/.changeset/rotten-mangos-hug.md b/.changeset/rotten-mangos-hug.md
deleted file mode 100644
index 022d3f3d45..0000000000
--- a/.changeset/rotten-mangos-hug.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend-module-github': patch
----
-
-Fixed an issue in `GithubOrgEntityProvider` that caused an error when processing teams without a parent.
diff --git a/.changeset/rotten-needles-relax.md b/.changeset/rotten-needles-relax.md
deleted file mode 100644
index ef389402aa..0000000000
--- a/.changeset/rotten-needles-relax.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/plugin-catalog-node': minor
----
-
-The `catalogServiceRef` now has its own accompanying `CatalogService` interface that requires Backstage `credentials` objects to be passed. This new version of the `catalogServiceRef` has been promoted and is now available via the main `@backstage/plugin-catalog-node` entry point.
-
-The old `catalogServiceRef` with the old `CatalogApi` type is still available from the `/alpha` entry point.
diff --git a/.changeset/rude-shrimps-brake.md b/.changeset/rude-shrimps-brake.md
deleted file mode 100644
index 7335558b29..0000000000
--- a/.changeset/rude-shrimps-brake.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/create-app': patch
----
-
-This update adds the @backstage/repo-tools package to the versions.ts file, enabling proper version resolution for templates. The {{version '@backstage/repo-tools'}} placeholder now works as expected in the create-app process.
diff --git a/.changeset/selfish-ads-count.md b/.changeset/selfish-ads-count.md
deleted file mode 100644
index 2f2f0597dd..0000000000
--- a/.changeset/selfish-ads-count.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-test-utils': patch
----
-
-The `mockServices.discovery.factory()` factory now uses the mocked discovery service as its implementation, avoid the need for configuration.
diff --git a/.changeset/selfish-dots-attend.md b/.changeset/selfish-dots-attend.md
deleted file mode 100644
index d11d3003f1..0000000000
--- a/.changeset/selfish-dots-attend.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend-module-gitlab': patch
----
-
-Removed circular import
diff --git a/.changeset/selfish-spies-cough.md b/.changeset/selfish-spies-cough.md
deleted file mode 100644
index f702699080..0000000000
--- a/.changeset/selfish-spies-cough.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-defaults': patch
----
-
-Disabling database migrations now correctly uses the `backend.default.skipMigrations` config value.
diff --git a/.changeset/serious-gorillas-work.md b/.changeset/serious-gorillas-work.md
deleted file mode 100644
index a17a2a44e6..0000000000
--- a/.changeset/serious-gorillas-work.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-'@backstage/plugin-auth-backend-module-cloudflare-access-provider': patch
-'@backstage/plugin-notifications-backend-module-email': patch
-'@backstage/plugin-events-backend-module-aws-sqs': patch
-'@backstage/backend-plugin-api': patch
-'@backstage/plugin-scaffolder-backend': patch
-'@backstage/backend-defaults': patch
-'@backstage/plugin-catalog-backend': patch
-'@backstage/plugin-auth-backend': patch
----
-
-Support ISO and ms string forms of durations in config too
diff --git a/.changeset/serious-penguins-remain.md b/.changeset/serious-penguins-remain.md
deleted file mode 100644
index fc90b4ad01..0000000000
--- a/.changeset/serious-penguins-remain.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog': minor
----
-
-Allow `OffsetPaginatedCatalogTable` to configure Table options and `CursorPaginatedCatalogTable` to configure `paginationPosition`.
diff --git a/.changeset/seven-berries-listen.md b/.changeset/seven-berries-listen.md
deleted file mode 100644
index 2ab18d9e19..0000000000
--- a/.changeset/seven-berries-listen.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': minor
----
-
-The package packing now populates `typesVersions` for additional entry points rather than using additional `package.json` files for type resolution. This improves auto completion of separate entry points when consuming published packages.
diff --git a/.changeset/seven-bulldogs-count.md b/.changeset/seven-bulldogs-count.md
new file mode 100644
index 0000000000..9fa888767b
--- /dev/null
+++ b/.changeset/seven-bulldogs-count.md
@@ -0,0 +1,5 @@
+---
+'@backstage/cli': patch
+---
+
+Add support for `--output-file` option from ESLint to `package lint` and `repo lint` commands.
diff --git a/.changeset/seven-hotels-move.md b/.changeset/seven-hotels-move.md
deleted file mode 100644
index 03bb39116a..0000000000
--- a/.changeset/seven-hotels-move.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/plugin-events-backend-module-github': patch
----
-
-Fix the event request validation for incoming requests for GitHub webhook events
-by using the raw body when verifying the signature.
diff --git a/.changeset/shiny-falcons-fly.md b/.changeset/shiny-falcons-fly.md
deleted file mode 100644
index 899bbfbda4..0000000000
--- a/.changeset/shiny-falcons-fly.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-'@backstage/plugin-events-node': patch
-'@backstage/plugin-events-backend-module-github': patch
-'@backstage/plugin-events-backend': patch
----
-
-Add raw body information to `RequestDetails`
-and use the raw body when validating incoming event requests.
diff --git a/.changeset/short-baboons-search.md b/.changeset/short-baboons-search.md
new file mode 100644
index 0000000000..9855ad6df7
--- /dev/null
+++ b/.changeset/short-baboons-search.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-defaults': minor
+---
+
+All middleware used by the default `coreServices.http` is now exported for use by custom implementations.
diff --git a/.changeset/short-geckos-sniff.md b/.changeset/short-geckos-sniff.md
deleted file mode 100644
index 4d31ca436b..0000000000
--- a/.changeset/short-geckos-sniff.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Fixed an issue with the `repo lint` command where the cache key for the `--successCache` option would not properly ignore files that should be ignored according to `.eslintignore`s.
diff --git a/.changeset/short-pots-remember.md b/.changeset/short-pots-remember.md
deleted file mode 100644
index 9a30bc222c..0000000000
--- a/.changeset/short-pots-remember.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend': patch
----
-
-Fixed an issue where entities would not be marked for restitching if only the target of a relationship changed.
diff --git a/.changeset/shy-clouds-brake.md b/.changeset/shy-clouds-brake.md
deleted file mode 100644
index 1e69a1d193..0000000000
--- a/.changeset/shy-clouds-brake.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': minor
----
-
-Bumped the `isolated-vm` dependency from v4 to v5, which drops support for Node.js v16.
diff --git a/.changeset/shy-pots-speak.md b/.changeset/shy-pots-speak.md
deleted file mode 100644
index 8eceacb9ec..0000000000
--- a/.changeset/shy-pots-speak.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-test-utils': patch
----
-
-Removed unused `msw` dependency.
diff --git a/.changeset/shy-rats-hear.md b/.changeset/shy-rats-hear.md
deleted file mode 100644
index 460d70c56a..0000000000
--- a/.changeset/shy-rats-hear.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-defaults': patch
----
-
-Link to proper package in `rootLoggerServiceFactory` doc string.
diff --git a/.changeset/shy-teachers-count.md b/.changeset/shy-teachers-count.md
new file mode 100644
index 0000000000..7723fe377b
--- /dev/null
+++ b/.changeset/shy-teachers-count.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-backend-module-gitlab': minor
+---
+
+**BREAKING**: Upgraded the `gitbeaker` library to version 41. As part of this, the `scopes` parameter to the `gitlab:projectDeployToken:create` is no longer optional, so you will have to pass it a value (for example `['read_repository']`).
diff --git a/.changeset/silent-pigs-collect.md b/.changeset/silent-pigs-collect.md
new file mode 100644
index 0000000000..9010605ffb
--- /dev/null
+++ b/.changeset/silent-pigs-collect.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-search-backend-node': patch
+---
+
+Removed unnecessary dependency on `@backstage/backend-defaults`.
diff --git a/.changeset/silent-wasps-whisper.md b/.changeset/silent-wasps-whisper.md
deleted file mode 100644
index 33620139e7..0000000000
--- a/.changeset/silent-wasps-whisper.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder': patch
----
-
-Revert the change of the option label for `EntityPicker`
diff --git a/.changeset/silly-kiwis-destroy.md b/.changeset/silly-kiwis-destroy.md
deleted file mode 100644
index 31bdf4560b..0000000000
--- a/.changeset/silly-kiwis-destroy.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-events-backend': patch
----
-
-Cleaning up event subscriptions after the max age window
diff --git a/.changeset/silver-ears-grin.md b/.changeset/silver-ears-grin.md
deleted file mode 100644
index 104c18719e..0000000000
--- a/.changeset/silver-ears-grin.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/repo-tools': minor
----
-
-`backstage-repo-tools package schema openapi generate --server` now generates complete TS interfaces for all request/response objects in your OpenAPI schema. This fixes an edge case around recursive schemas and standardizes both the generated client and server to have similar generated types.
diff --git a/.changeset/silver-kings-sort.md b/.changeset/silver-kings-sort.md
deleted file mode 100644
index b59f70c401..0000000000
--- a/.changeset/silver-kings-sort.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend-module-gitlab': minor
----
-
-Extended the configuration with the `includeArchivedRepos` property, which allows including repositories when the project is archived.
diff --git a/.changeset/six-beds-exercise.md b/.changeset/six-beds-exercise.md
deleted file mode 100644
index b2c01e8ac7..0000000000
--- a/.changeset/six-beds-exercise.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-defaults': patch
----
-
-Use `node-fetch` instead of native fetch, as per https://backstage.io/docs/architecture-decisions/adrs-adr013
diff --git a/.changeset/six-eels-add.md b/.changeset/six-eels-add.md
new file mode 100644
index 0000000000..fa0481b757
--- /dev/null
+++ b/.changeset/six-eels-add.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch
+---
+
+Remove backend-common package from incremental-ingestion plugin and update related code
diff --git a/.changeset/sixty-sheep-drive.md b/.changeset/sixty-sheep-drive.md
deleted file mode 100644
index 2e947b30f9..0000000000
--- a/.changeset/sixty-sheep-drive.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend': patch
----
-
-Fixed bug when searching an entity by `spec.profile.displayName` in the catalog on the frontend. Text filter fields were not applied correctly to the database query resulting in empty results.
diff --git a/.changeset/sixty-shirts-rescue.md b/.changeset/sixty-shirts-rescue.md
new file mode 100644
index 0000000000..b6c1443eea
--- /dev/null
+++ b/.changeset/sixty-shirts-rescue.md
@@ -0,0 +1,41 @@
+---
+'@backstage/plugin-auth-backend-module-cloudflare-access-provider': patch
+'@backstage/plugin-auth-backend-module-bitbucket-server-provider': patch
+'@backstage/plugin-search-backend-module-stack-overflow-collator': patch
+'@backstage/plugin-scaffolder-backend-module-bitbucket-server': patch
+'@backstage/plugin-scaffolder-backend-module-bitbucket-cloud': patch
+'@backstage/plugin-catalog-backend-module-bitbucket-server': patch
+'@backstage/plugin-auth-backend-module-microsoft-provider': patch
+'@backstage/plugin-auth-backend-module-aws-alb-provider': patch
+'@backstage/plugin-scaffolder-backend-module-bitbucket': patch
+'@backstage/plugin-scaffolder-backend-module-gerrit': patch
+'@backstage/plugin-scaffolder-backend-module-sentry': patch
+'@backstage/plugin-catalog-backend-module-puppetdb': patch
+'@backstage/plugin-scaffolder-backend-module-gitea': patch
+'@backstage/plugin-catalog-backend-module-msgraph': patch
+'@backstage/plugin-search-backend-module-techdocs': patch
+'@backstage/plugin-catalog-backend-module-gerrit': patch
+'@backstage/plugin-catalog-backend-module-gitlab': patch
+'@backstage/plugin-search-backend-module-explore': patch
+'@backstage/plugin-catalog-backend-module-azure': patch
+'@backstage/plugin-notifications-backend': patch
+'@backstage/plugin-notifications-node': patch
+'@backstage/plugin-permission-backend': patch
+'@backstage/backend-app-api': patch
+'@backstage/plugin-devtools-backend': patch
+'@backstage/plugin-techdocs-backend': patch
+'@backstage/plugin-catalog-backend': patch
+'@backstage/plugin-signals-backend': patch
+'@backstage/config-loader': patch
+'@backstage/plugin-proxy-backend': patch
+'@backstage/plugin-auth-backend': patch
+'@backstage/create-app': patch
+'@backstage/plugin-app-backend': patch
+'@backstage/plugin-auth-node': patch
+'@backstage/cli': patch
+'@backstage/backend-defaults': patch
+'@backstage/plugin-catalog-backend-module-github': patch
+'@backstage/plugin-scaffolder-backend-module-confluence-to-markdown': patch
+---
+
+Use native fetch instead of node-fetch
diff --git a/.changeset/slimy-jobs-scream.md b/.changeset/slimy-jobs-scream.md
deleted file mode 100644
index e20119fed4..0000000000
--- a/.changeset/slimy-jobs-scream.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/plugin-techdocs-react': patch
-'@backstage/plugin-techdocs': patch
----
-
-Fix an issue that caused the current documentation page to be re-rendered when navigating to
-another one.
diff --git a/.changeset/slimy-penguins-care.md b/.changeset/slimy-penguins-care.md
deleted file mode 100644
index 96016b1ba4..0000000000
--- a/.changeset/slimy-penguins-care.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Fix for the `--link` flag for `package start` to deduplicate `react-router` and `react-router-dom`.
diff --git a/.changeset/slow-horses-destroy.md b/.changeset/slow-horses-destroy.md
new file mode 100644
index 0000000000..fe23d6cf27
--- /dev/null
+++ b/.changeset/slow-horses-destroy.md
@@ -0,0 +1,6 @@
+---
+'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch
+'@backstage/plugin-kubernetes-backend': patch
+---
+
+Create a `dev/index.ts` entrypoint for `yarn start`
diff --git a/.changeset/slow-mayflies-sleep.md b/.changeset/slow-mayflies-sleep.md
deleted file mode 100644
index ebfb9d12d4..0000000000
--- a/.changeset/slow-mayflies-sleep.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/repo-tools': minor
----
-
-Adds a `--watch` mode to the `schema openapi generate` command for a better local schema writing experience.
diff --git a/.changeset/slow-shrimps-call.md b/.changeset/slow-shrimps-call.md
deleted file mode 100644
index 7e04633307..0000000000
--- a/.changeset/slow-shrimps-call.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/plugin-notifications-backend': patch
-'@backstage/plugin-notifications-common': patch
-'@backstage/plugin-notifications': patch
----
-
-Add support for user specific notification settings
diff --git a/.changeset/slow-singers-jump.md b/.changeset/slow-singers-jump.md
new file mode 100644
index 0000000000..2eef032d7b
--- /dev/null
+++ b/.changeset/slow-singers-jump.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': minor
+---
+
+Fetch all facets in a single database query
diff --git a/.changeset/small-boxes-enjoy.md b/.changeset/small-boxes-enjoy.md
new file mode 100644
index 0000000000..819e247d49
--- /dev/null
+++ b/.changeset/small-boxes-enjoy.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+When parsing filters, do not make redundant `anyOf` and `allOf` nodes when there's only a single entry within them
diff --git a/.changeset/smart-bags-sell.md b/.changeset/smart-bags-sell.md
deleted file mode 100644
index 2c5f5c4d87..0000000000
--- a/.changeset/smart-bags-sell.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-app-visualizer': patch
----
-
-New `devDependency` for local development setup.
diff --git a/.changeset/soft-turkeys-tie.md b/.changeset/soft-turkeys-tie.md
deleted file mode 100644
index 3962f49460..0000000000
--- a/.changeset/soft-turkeys-tie.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': patch
----
-
-Modified `createDryRunner` and corresponding route to include `templateMetaData` inside the `templateInfo`. This allows custom action writers to access things like `templateInfo.entity.metadata.name` via the action context while executing templates using the dry run framework.
diff --git a/.changeset/spotty-shoes-exercise.md b/.changeset/spotty-shoes-exercise.md
new file mode 100644
index 0000000000..92e0825c9f
--- /dev/null
+++ b/.changeset/spotty-shoes-exercise.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Support changing location keys on existing entities, in delta mutations
diff --git a/.changeset/spotty-snails-worry.md b/.changeset/spotty-snails-worry.md
deleted file mode 100644
index 3ecf2e9b35..0000000000
--- a/.changeset/spotty-snails-worry.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-signals-backend': patch
----
-
-The signals backend now supports scaled deployments where clients may be connecting to one of many signal backend instances.
diff --git a/.changeset/stale-hats-exist.md b/.changeset/stale-hats-exist.md
new file mode 100644
index 0000000000..227656cd5b
--- /dev/null
+++ b/.changeset/stale-hats-exist.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Avoid extra ordering in by-query when the user doesn't ask for it
diff --git a/.changeset/stale-rats-tease.md b/.changeset/stale-rats-tease.md
new file mode 100644
index 0000000000..3564742cc6
--- /dev/null
+++ b/.changeset/stale-rats-tease.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-auth-backend-module-google-provider': patch
+---
+
+Pass through `includeGrantedScopes` in order to persist scopes across refresh calls
diff --git a/.changeset/strange-brooms-check.md b/.changeset/strange-brooms-check.md
new file mode 100644
index 0000000000..b6cb897170
--- /dev/null
+++ b/.changeset/strange-brooms-check.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-react': patch
+---
+
+Fixed an issue where the `EntityOwnerPicker` component failed to load when the `mode` prop was set to `owners-only`. In this mode, the `EntityOwnerPicker` does not load details about the owners, such as `displayName` or `title`. To display these details, use `mode=all` instead.
diff --git a/.changeset/strange-clocks-pretend.md b/.changeset/strange-clocks-pretend.md
deleted file mode 100644
index 9a3b6e20ac..0000000000
--- a/.changeset/strange-clocks-pretend.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/repo-tools': patch
----
-
-The `generate-patch` command will now fall back to always adding a `resolutions` entry, even if no matching descriptors are found.
diff --git a/.changeset/strong-papayas-remember.md b/.changeset/strong-papayas-remember.md
new file mode 100644
index 0000000000..7787258c58
--- /dev/null
+++ b/.changeset/strong-papayas-remember.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-api-docs': patch
+---
+
+Fix link styling in ProvidedApisCard component so it aligns with other card components.
diff --git a/.changeset/strong-paws-change.md b/.changeset/strong-paws-change.md
deleted file mode 100644
index 9ac6c06993..0000000000
--- a/.changeset/strong-paws-change.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/create-app': patch
----
-
-Use the main entrypoint for `create-app` installs
diff --git a/.changeset/sweet-pigs-pump.md b/.changeset/sweet-pigs-pump.md
deleted file mode 100644
index 9e88e65dbc..0000000000
--- a/.changeset/sweet-pigs-pump.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/core-app-api': patch
-'@backstage/frontend-defaults': patch
----
-
-The default config loader no longer requires `process.env.APP_CONFIG` to be set, allowing config to be read from other sources instead.
diff --git a/.changeset/swift-kangaroos-drop.md b/.changeset/swift-kangaroos-drop.md
new file mode 100644
index 0000000000..77d837deba
--- /dev/null
+++ b/.changeset/swift-kangaroos-drop.md
@@ -0,0 +1,5 @@
+---
+'@backstage/catalog-client': patch
+---
+
+Fixed a bug in the `queryEntities` method where errors were not being handled properly.
diff --git a/.changeset/swift-laws-applaud.md b/.changeset/swift-laws-applaud.md
deleted file mode 100644
index 8de93e825b..0000000000
--- a/.changeset/swift-laws-applaud.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Update upgrade-helper link in `versions:bump` command to include `yarnPlugin` parameter when the yarn plugin is installed
diff --git a/.changeset/tall-comics-heal.md b/.changeset/tall-comics-heal.md
new file mode 100644
index 0000000000..3d65caee67
--- /dev/null
+++ b/.changeset/tall-comics-heal.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-azure': minor
+---
+
+Added the Azure Blob Storage as catalog entity provider to import all the desired entities from storage account provided in app-config.yaml
diff --git a/.changeset/ten-hats-appear.md b/.changeset/ten-hats-appear.md
deleted file mode 100644
index 318bbfbb25..0000000000
--- a/.changeset/ten-hats-appear.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-'@backstage/plugin-scaffolder-react': minor
-'@backstage/plugin-scaffolder': minor
----
-
-Fix `contextMenu` not being disabled bug in new scaffolder pages
diff --git a/.changeset/ten-keys-nail.md b/.changeset/ten-keys-nail.md
new file mode 100644
index 0000000000..0662e4a346
--- /dev/null
+++ b/.changeset/ten-keys-nail.md
@@ -0,0 +1,5 @@
+---
+'@backstage/backend-defaults': patch
+---
+
+Fixed an issue in the WinstonLogger where Errors thrown and given to logger.error with field values that could not be cast to a string would throw a TypeError
diff --git a/.changeset/ten-pears-unite.md b/.changeset/ten-pears-unite.md
deleted file mode 100644
index 75f7e2cc22..0000000000
--- a/.changeset/ten-pears-unite.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-openapi-utils': minor
----
-
-Adds a new `createValidatedOpenApiRouterFromGeneratedEndpointMap` function that uses the new static server generation in `backstage-cli package schema openapi generate --server` to create a typed express router.
diff --git a/.changeset/tender-feet-scream.md b/.changeset/tender-feet-scream.md
deleted file mode 100644
index b8ed5dd792..0000000000
--- a/.changeset/tender-feet-scream.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-Added `entity_ref` column to `final_entities` in order to move `refresh_state` away from the read path
diff --git a/.changeset/thick-items-bathe.md b/.changeset/thick-items-bathe.md
new file mode 100644
index 0000000000..455718ed1c
--- /dev/null
+++ b/.changeset/thick-items-bathe.md
@@ -0,0 +1,5 @@
+---
+'@backstage/core-components': patch
+---
+
+Added data-testid to placeholder rendered by Progress component to simplify assertions in tests
diff --git a/.changeset/thick-rice-hunt.md b/.changeset/thick-rice-hunt.md
deleted file mode 100644
index ac1ee64f3b..0000000000
--- a/.changeset/thick-rice-hunt.md
+++ /dev/null
@@ -1,34 +0,0 @@
----
-'@backstage/plugin-auth-backend-module-cloudflare-access-provider': patch
-'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch
-'@backstage/plugin-catalog-backend-module-backstage-openapi': patch
-'@backstage/plugin-catalog-backend-module-bitbucket-server': patch
-'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch
-'@backstage/plugin-search-backend-module-elasticsearch': patch
-'@backstage/plugin-catalog-backend-module-puppetdb': patch
-'@backstage/plugin-catalog-backend-module-msgraph': patch
-'@backstage/plugin-catalog-backend-module-gerrit': patch
-'@backstage/plugin-catalog-backend-module-github': patch
-'@backstage/plugin-catalog-backend-module-gitlab': patch
-'@backstage/plugin-catalog-backend-module-azure': patch
-'@backstage/plugin-catalog-backend-module-ldap': patch
-'@backstage/plugin-catalog-backend-module-aws': patch
-'@backstage/plugin-search-backend-module-pg': patch
-'@backstage/plugin-notifications-backend': patch
-'@backstage/backend-test-utils': patch
-'@backstage/plugin-search-backend-node': patch
-'@backstage/plugin-notifications-node': patch
-'@backstage/plugin-scaffolder-backend': patch
-'@backstage/backend-defaults': patch
-'@backstage/plugin-permission-common': patch
-'@backstage/backend-app-api': patch
-'@backstage/plugin-catalog-backend': patch
-'@backstage/plugin-signals-backend': patch
-'@backstage/plugin-proxy-backend': patch
-'@backstage/plugin-auth-backend': patch
-'@backstage/plugin-signals-node': patch
-'@backstage/plugin-auth-node': patch
-'@backstage/plugin-signals': patch
----
-
-Upgrade to uuid v11 internally
diff --git a/.changeset/thick-trees-worry.md b/.changeset/thick-trees-worry.md
deleted file mode 100644
index 7f5428f739..0000000000
--- a/.changeset/thick-trees-worry.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Fixed an issue where `.css` style injection would fail for published packages.
diff --git a/.changeset/thin-hotels-explode.md b/.changeset/thin-hotels-explode.md
new file mode 100644
index 0000000000..f06b512cc5
--- /dev/null
+++ b/.changeset/thin-hotels-explode.md
@@ -0,0 +1,5 @@
+---
+'@backstage/errors': patch
+---
+
+Trim `error.cause.stack` in addition to `error.stack` when trimming stack traces from serialized errors.
diff --git a/.changeset/three-mangos-dance.md b/.changeset/three-mangos-dance.md
deleted file mode 100644
index 0135869611..0000000000
--- a/.changeset/three-mangos-dance.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/backend-openapi-utils': patch
----
-
-Moves msw from dependencies to devDependencies
diff --git a/.changeset/three-parrots-dress.md b/.changeset/three-parrots-dress.md
deleted file mode 100644
index 836abbf21c..0000000000
--- a/.changeset/three-parrots-dress.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-search-backend-module-catalog': patch
----
-
-Fix search collator text formatting for catalog entities without description
diff --git a/.changeset/tiny-mice-run.md b/.changeset/tiny-mice-run.md
new file mode 100644
index 0000000000..4829ef7390
--- /dev/null
+++ b/.changeset/tiny-mice-run.md
@@ -0,0 +1,5 @@
+---
+'@backstage/repo-tools': patch
+---
+
+The `generate-patch` command will now add a single resolution entry for all versions of the patched package, rather than separate entries for each version query.
diff --git a/.changeset/tough-onions-dance.md b/.changeset/tough-onions-dance.md
deleted file mode 100644
index 46b7477399..0000000000
--- a/.changeset/tough-onions-dance.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/repo-tools': patch
----
-
-Added a new `generate-patch` command that can be used to generate patches for current changes in a source workspace to be installed it a target workspace.
diff --git a/.changeset/tricky-crabs-lick.md b/.changeset/tricky-crabs-lick.md
deleted file mode 100644
index 4f858538a3..0000000000
--- a/.changeset/tricky-crabs-lick.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend-module-bitbucket-server': patch
-'@backstage/plugin-scaffolder-backend-module-bitbucket-cloud': patch
----
-
-Fix double branch creation in `public:bitbucket{Cloud,Server}:pull-request`
-This resulted in the following error when using the actions:
-
-```
-AlreadyExistsError: Failed to create branch at create-test because it already exists.
-```
-
-The issue was original introduced in d103a48fa306d745599dc0c793668c9e6a479d32
diff --git a/.changeset/twelve-masks-call.md b/.changeset/twelve-masks-call.md
deleted file mode 100644
index 7fc79db655..0000000000
--- a/.changeset/twelve-masks-call.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-'@backstage/plugin-catalog-backend': minor
----
-
-Drop redundant indices from the database.
-
-The following redundant indices are removed in this version:
-
-- `final_entities_entity_id_idx` - overlaps with `final_entities_pkey`
-- `refresh_state_entity_id_idx` - overlaps with `refresh_state_pkey`
-- `refresh_state_entity_ref_idx` - overlaps with `refresh_state_entity_ref_uniq`
-- `search_key_idx` and `search_value_idx` - these were replaced by the composite index `search_key_value_idx` in #22594
-
-No negative end user impact is expected, but rather that performance should increase due to less index churn.
diff --git a/.changeset/twenty-parents-judge.md b/.changeset/twenty-parents-judge.md
new file mode 100644
index 0000000000..a639f83ba1
--- /dev/null
+++ b/.changeset/twenty-parents-judge.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-app-backend': patch
+---
+
+Fix root route handling when query parameters are present
diff --git a/.changeset/two-beds-bow.md b/.changeset/two-beds-bow.md
deleted file mode 100644
index 1b1c22fc12..0000000000
--- a/.changeset/two-beds-bow.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-notifications': patch
----
-
-Show count of unread notifications in the left-side MenuItem. This replaces the simple true/false bullet.
diff --git a/.changeset/two-donuts-float.md b/.changeset/two-donuts-float.md
deleted file mode 100644
index d9df082910..0000000000
--- a/.changeset/two-donuts-float.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/catalog-client': patch
----
-
-Fix for certain filter fields in the `catalogApiMock` being case sensitive.
diff --git a/.changeset/unlucky-countries-shop.md b/.changeset/unlucky-countries-shop.md
deleted file mode 100644
index 06c193068b..0000000000
--- a/.changeset/unlucky-countries-shop.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend-module-rails': patch
-'@backstage/plugin-kubernetes-cluster': patch
-'@techdocs/cli': patch
-'@backstage/cli-common': patch
-'@backstage/create-app': patch
-'@backstage/repo-tools': patch
-'@backstage/codemods': patch
-'@backstage/cli': patch
----
-
-Bumped dev dependencies `@types/node`
diff --git a/.changeset/violet-dolphins-juggle.md b/.changeset/violet-dolphins-juggle.md
deleted file mode 100644
index e0e75f1481..0000000000
--- a/.changeset/violet-dolphins-juggle.md
+++ /dev/null
@@ -1,16 +0,0 @@
----
-'@backstage/plugin-search-backend-module-stack-overflow-collator': patch
-'@backstage/plugin-scaffolder-backend-module-notifications': patch
-'@backstage/plugin-auth-backend-module-aws-alb-provider': patch
-'@backstage/plugin-auth-backend-module-guest-provider': patch
-'@backstage/plugin-notifications-backend-module-email': patch
-'@backstage/plugin-auth-backend-module-oidc-provider': patch
-'@backstage/plugin-scaffolder-backend-module-yeoman': patch
-'@backstage/plugin-notifications-node': patch
-'@backstage/backend-app-api': patch
-'@backstage/plugin-signals-node': patch
-'@backstage/plugin-events-node': patch
-'@backstage/cli': patch
----
-
-Remove unused backend-common dependency
diff --git a/.changeset/violet-ears-dance.md b/.changeset/violet-ears-dance.md
deleted file mode 100644
index dba3671338..0000000000
--- a/.changeset/violet-ears-dance.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': minor
----
-
-**BREAKING**: The `LEGACY_BACKEND_START` flag has been removed, along with support for `src/run.ts` as the development entry point.
diff --git a/.changeset/violet-parrots-knock.md b/.changeset/violet-parrots-knock.md
deleted file mode 100644
index dde0f9e606..0000000000
--- a/.changeset/violet-parrots-knock.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': patch
----
-
-Add new `fs:readdir` action to list current content of the workspace
diff --git a/.changeset/violet-snakes-laugh.md b/.changeset/violet-snakes-laugh.md
new file mode 100644
index 0000000000..7002cfeaf0
--- /dev/null
+++ b/.changeset/violet-snakes-laugh.md
@@ -0,0 +1,5 @@
+---
+'@backstage/release-manifests': patch
+---
+
+Allow overriding the fetch function used inside getManifestByVersion
diff --git a/.changeset/warm-boats-move.md b/.changeset/warm-boats-move.md
deleted file mode 100644
index 2b21e42717..0000000000
--- a/.changeset/warm-boats-move.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend': patch
----
-
-Internal refactor to slightly speed up the processing loop
diff --git a/.changeset/warm-pumpkins-bathe.md b/.changeset/warm-pumpkins-bathe.md
new file mode 100644
index 0000000000..93fa603342
--- /dev/null
+++ b/.changeset/warm-pumpkins-bathe.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-scaffolder-react': patch
+---
+
+Open links in the scaffolder entity and step descriptions in a new tab, to ensure consistency and improve user experience
diff --git a/.changeset/warm-tomatoes-develop.md b/.changeset/warm-tomatoes-develop.md
deleted file mode 100644
index 100692f612..0000000000
--- a/.changeset/warm-tomatoes-develop.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/backend-dynamic-feature-service': patch
----
-
-Improve the way alpha packages are supported when loading dynamic backend plugins.
-The `ScannedPluginPackage` descriptor of dynamic backend plugins loaded from their alpha `package.json` now contain both the main package manifest and the alpha manifest. Previously it used to contain only the content of the alpha `package.json`, which is nearly empty.
-This will make it easier to use or display metadata of loaded dynamic backend plugins, which is contained in the main manifest.
diff --git a/.changeset/heavy-phones-shave.md b/.changeset/weak-avocados-suffer.md
similarity index 64%
rename from .changeset/heavy-phones-shave.md
rename to .changeset/weak-avocados-suffer.md
index 4f268d81ac..01142aa927 100644
--- a/.changeset/heavy-phones-shave.md
+++ b/.changeset/weak-avocados-suffer.md
@@ -2,4 +2,4 @@
'@backstage/plugin-catalog-backend-module-ldap': minor
---
-Add Support for Google LDAP Vendor
+Add new ldap vendor config 'LLDAP'
diff --git a/.changeset/weak-meals-doubt.md b/.changeset/weak-meals-doubt.md
new file mode 100644
index 0000000000..42199ed296
--- /dev/null
+++ b/.changeset/weak-meals-doubt.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch
+---
+
+Ensure that the scheduled worker task doesn't run at an unreasonably high frequency
diff --git a/.changeset/wet-rats-exist.md b/.changeset/wet-rats-exist.md
new file mode 100644
index 0000000000..08bcc1c28f
--- /dev/null
+++ b/.changeset/wet-rats-exist.md
@@ -0,0 +1,5 @@
+---
+'@backstage/core-app-api': patch
+---
+
+Decrease OAuth2 token refresh grace period
diff --git a/.changeset/wild-experts-unite.md b/.changeset/wild-experts-unite.md
deleted file mode 100644
index 872a3aa8de..0000000000
--- a/.changeset/wild-experts-unite.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Bump the Webpack dependency range to `^5.94.0`, as our current configuration is not compatible with some older versions.
diff --git a/.changeset/wise-avocados-behave.md b/.changeset/wise-avocados-behave.md
deleted file mode 100644
index 5d26ec0066..0000000000
--- a/.changeset/wise-avocados-behave.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Added support for `.webp` files in the frontend tooling.
diff --git a/.changeset/wise-snakes-sleep.md b/.changeset/wise-snakes-sleep.md
deleted file mode 100644
index ca51972f57..0000000000
--- a/.changeset/wise-snakes-sleep.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch
----
-
-Implemented discovery on project-level to shift Bitbucket Cloud API limits
diff --git a/.changeset/witty-bobcats-push.md b/.changeset/witty-bobcats-push.md
deleted file mode 100644
index c2b357a860..0000000000
--- a/.changeset/witty-bobcats-push.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-scaffolder-backend': patch
----
-
-Add example template for notification sending
diff --git a/.changeset/witty-socks-repeat.md b/.changeset/witty-socks-repeat.md
deleted file mode 100644
index bbac3d9a88..0000000000
--- a/.changeset/witty-socks-repeat.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@backstage/cli': patch
----
-
-Added a new `--link ` option for frontend builds that allow you to override module resolution to link in an external workspace at runtime.
-
-As part of this change the Webpack linked workspace resolution plugin for frontend builds has been removed. It was in place to support the old workspace linking where it was done by Yarn, which is no longer a working option.
diff --git a/.changeset/yellow-horses-pretend.md b/.changeset/yellow-horses-pretend.md
deleted file mode 100644
index 3171993d2a..0000000000
--- a/.changeset/yellow-horses-pretend.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/plugin-events-node': patch
----
-
-Fixed an issue where the event bus polling would duplicate and increase exponentially over time.
diff --git a/.changeset/young-carrots-collect.md b/.changeset/young-carrots-collect.md
new file mode 100644
index 0000000000..1350400d39
--- /dev/null
+++ b/.changeset/young-carrots-collect.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-catalog-backend': patch
+---
+
+Compute some metrics using search table facet aggregations instead of reading the full refresh state
diff --git a/.changeset/young-months-admire.md b/.changeset/young-months-admire.md
new file mode 100644
index 0000000000..a2062b3f88
--- /dev/null
+++ b/.changeset/young-months-admire.md
@@ -0,0 +1,6 @@
+---
+'@backstage/backend-app-api': minor
+'@backstage/backend-plugin-api': minor
+---
+
+**EXPERIMENTAL**: Adds a new `instanceMetadataService` to hold information about a specific backend instance.
diff --git a/.changeset/young-penguins-act.md b/.changeset/young-penguins-act.md
deleted file mode 100644
index bae2fe089f..0000000000
--- a/.changeset/young-penguins-act.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-'@backstage/catalog-client': minor
----
-
-The client now automatically splits up very large `getEntitiesByRefs` calls into several smaller requests behind the scenes when needed. This ensures that each individual request does not exceed common Express.js request body limits or overload the server.
diff --git a/.github/vale/config/vocabularies/Backstage/accept.txt b/.github/vale/config/vocabularies/Backstage/accept.txt
index a015b97a32..4f5d3e338d 100644
--- a/.github/vale/config/vocabularies/Backstage/accept.txt
+++ b/.github/vale/config/vocabularies/Backstage/accept.txt
@@ -101,6 +101,8 @@ Deutsche
dev
devops
devs
+dequeue
+dequeueing
dialogs
discoverability
Discoverability
diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml
index a1c643377d..a379772722 100644
--- a/.github/workflows/scorecard.yml
+++ b/.github/workflows/scorecard.yml
@@ -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@f779452ac5af1c261dce0346a8f964149f49322b # v3.26.13
+ uses: github/codeql-action/upload-sarif@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5
with:
sarif_file: results.sarif
diff --git a/.github/workflows/sync_canon.yml b/.github/workflows/sync_canon.yml
new file mode 100644
index 0000000000..9cedb9fc24
--- /dev/null
+++ b/.github/workflows/sync_canon.yml
@@ -0,0 +1,56 @@
+name: Sync Canon Storybook
+on:
+ push:
+ branches: [master]
+
+jobs:
+ sync-canon-storybook:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Harden Runner
+ uses: step-security/harden-runner@91182cccc01eb5e619899d80e4e971d6181294a7 # v2.10.1
+ with:
+ egress-policy: audit
+
+ - name: Checkout
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+
+ - name: Use Node.js 20.x
+ uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
+ with:
+ node-version: 20.x
+ registry-url: https://registry.npmjs.org/ # Needed for auth
+
+ - name: yarn install
+ uses: backstage/actions/yarn-install@25145dd4117d50e1da9330e9ed2893bc6b75373e # v0.6.15
+ with:
+ cache-prefix: ${{ runner.os }}-v20.x
+
+ - name: Checkout backstage/canon-storybook
+ uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
+ with:
+ repository: backstage/canon-storybook
+ path: canon-storybook
+ token: ${{ secrets.GH_SERVICE_ACCOUNT_TOKEN }}
+
+ - name: Configure Git
+ run: |
+ git config --global user.email noreply@backstage.io
+ git config --global user.name 'Github Canon Storybook workflow'
+
+ - name: Build Canon Storybook
+ run: |
+ yarn workspace @backstage/canon run build-storybook
+
+ - name: Replace contents of canon-storybook repo with Storybook build output
+ working-directory: canon-storybook
+ run: |
+ git rm -rf .
+ cp -R ../packages/canon/storybook-static/. .
+
+ - name: Commit to canon-storybook repo
+ working-directory: canon-storybook
+ run: |
+ git add .
+ git commit -am "Canon Storybook build for backstage/backstage@${{ github.sha }}"
+ git push
diff --git a/.github/workflows/sync_snyk-monitor.yml b/.github/workflows/sync_snyk-monitor.yml
index c3bdb9b647..0c0148e047 100644
--- a/.github/workflows/sync_snyk-monitor.yml
+++ b/.github/workflows/sync_snyk-monitor.yml
@@ -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@f779452ac5af1c261dce0346a8f964149f49322b # v3.26.13
+ uses: github/codeql-action/upload-sarif@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5
with:
sarif_file: snyk.sarif
diff --git a/.github/workflows/verify_codeql.yml b/.github/workflows/verify_codeql.yml
index af16c5b5af..be301559ec 100644
--- a/.github/workflows/verify_codeql.yml
+++ b/.github/workflows/verify_codeql.yml
@@ -55,7 +55,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@f779452ac5af1c261dce0346a8f964149f49322b # v3.26.13
+ uses: github/codeql-action/init@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5
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@f779452ac5af1c261dce0346a8f964149f49322b # v3.26.13
+ uses: github/codeql-action/autobuild@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5
# ℹ️ 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@f779452ac5af1c261dce0346a8f964149f49322b # v3.26.13
+ uses: github/codeql-action/analyze@f09c1c0a94de965c15400f5634aa42fac8fb8f88 # v3.27.5
diff --git a/.github/workflows/verify_e2e-linux.yml b/.github/workflows/verify_e2e-linux.yml
index 9f3c5ae009..055350a7cf 100644
--- a/.github/workflows/verify_e2e-linux.yml
+++ b/.github/workflows/verify_e2e-linux.yml
@@ -8,6 +8,8 @@ on:
- 'docs/**'
- 'microsite/**'
- 'beps/**'
+ push:
+ branches: [master]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
diff --git a/.github/workflows/verify_e2e-techdocs.yml b/.github/workflows/verify_e2e-techdocs.yml
index b42cae8896..03c07e716a 100644
--- a/.github/workflows/verify_e2e-techdocs.yml
+++ b/.github/workflows/verify_e2e-techdocs.yml
@@ -7,6 +7,8 @@ on:
- 'packages/techdocs-cli/**'
- 'packages/techdocs-cli-embedded-app/**'
- 'plugins/techdocs/**'
+ push:
+ branches: [master]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
diff --git a/.github/workflows/verify_e2e-windows.yml b/.github/workflows/verify_e2e-windows.yml
index c45d40b448..bb1612a0f5 100644
--- a/.github/workflows/verify_e2e-windows.yml
+++ b/.github/workflows/verify_e2e-windows.yml
@@ -11,6 +11,8 @@ on:
- 'packages/cli/**'
- 'packages/e2e-test/**'
- 'packages/create-app/**'
+ push:
+ branches: [master]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
diff --git a/ADOPTERS.md b/ADOPTERS.md
index c2c2388497..1653f8ea88 100644
--- a/ADOPTERS.md
+++ b/ADOPTERS.md
@@ -276,4 +276,6 @@ _You can do this by using the [Adopter form](https://info.backstage.spotify.com/
| [Cigna](https://www.cigna.com/) / [Evernorth](https://www.evernorth.com/) | [@raphtalia](https://github.com/raphtalia), [Devon Paluso](mailto:Devon.Paluso@evernorth.com), [Bryan Rego](mailto:Bryan.Rego@evernorth.com), [Ian Skillings](mailto:Ian.Skillings@evernorth.com) | Internal developer portal providing TechDocs, software templates, centralized secret management, with information consolidation from ServiceNow, Okta, GitHub, GitLab, and WebEx. |
| [Infobip](https://www.infobip.com/) | [Antonio Ereiz](https://github.com/SonilPro) | Visual representation of all our entities registered within an existing internal catalog, along with a UI for editing their manifests. It serves as the go-to place for new internal tools that require a user interface and provides standardization of new components using Software Templates.
| [CloudScript](https://www.cloudscript.com.br/) | [Helias Rodrigues](https://github.com/xcloudscript) | We use it to centralize and organize the components of our internal development platform. In addition, it provides an integrated experience for developers by using all the core modules and some plugins.
-| [Alauda](https://www.alauda.io/) | [Mario](https://github.com/mario-mui) | We use it to centralize and organize the components of our internal development platform. In addition, it provides environment templates for developers to create development testing or others environments
\ No newline at end of file
+| [Alauda](https://www.alauda.io/) | [Mario](https://github.com/mario-mui) | We use it to centralize and organize the components of our internal development platform. In addition, it provides environment templates for developers to create development testing or others environments
+| [New10](https://www.new10.com/) | [Cleber Gasparoto](https://github.com/chgasparoto) | We use Backstage as our internal developer portal to catalog services across teams, implement custom Tech Insights for ensuring service standards adoption, and centralize API specifications to streamline development processes and cross-team collaboration.
+| [Tele2 Kazakhstan](https://tele2.kz/) / [Altel Digital](https://digital.altel.kz/) | [Kuanysh Bekkulov](https://www.linkedin.com/in/kuanysh-bekkulov/), [Alexandr Puzeyev](https://www.linkedin.com/in/alexandr-puzeyev/) | Developer portal: services, components, APIs, and resources; includes documentation (Docs-as-Code), service templates, and plugins for integration with internal systems and tools.
diff --git a/app-config.yaml b/app-config.yaml
index cb70170541..64c2fa5c4c 100644
--- a/app-config.yaml
+++ b/app-config.yaml
@@ -221,6 +221,17 @@ integrations:
# apiBaseUrl: server.bitbucket.com
# username: ${BITBUCKET_SERVER_USERNAME}
# appPassword: ${BITBUCKET_SERVER_APP_PASSWORD}
+
+ # azureBlobStorage:
+ # - accountName: ${ACCOUNT_NAME} # required
+ # endpoint: ${CUSTOM_ENDPOINT} # custom endpoint will require either aadCredentials or sasToken
+ # sasToken: ${SAS_TOKEN}
+ # aadCredential:
+ # clientId: ${CLIENT_ID}
+ # tenantId: ${TENANT_ID}
+ # clientSecret: ${CLIENT_SECRET}
+ # accountKey: ${ACCOUNT_KEY}
+
azure:
- host: dev.azure.com
token: ${AZURE_TOKEN}
@@ -245,6 +256,14 @@ catalog:
- Domain
- Location
providers:
+ azureBlob:
+ accountName: ${ACCOUNT_NAME}
+ containerName: ${CONTAINER_NAME}
+ schedule: # same options as in TaskScheduleDefinition
+ # supports cron, ISO duration, "human duration" as used in code
+ frequency: { minutes: 30 }
+ # supports ISO duration, "human duration" as used in code
+ timeout: { minutes: 3 }
backstageOpenapi:
plugins:
- catalog
diff --git a/beps/NNNN-template/README.md b/beps/NNNN-template/README.md
index 3ecb1ffb4e..2fce6ecd95 100644
--- a/beps/NNNN-template/README.md
+++ b/beps/NNNN-template/README.md
@@ -1,6 +1,6 @@
---
title: BEP Title
-status: provisional
+status: implementable
authors:
- '@ghost'
owners:
@@ -13,16 +13,10 @@ creation-date: yyyy-mm-dd
# BEP:
-
-
-[**Discussion Issue**](https://github.com/backstage/backstage/issues/NNNNN)
-
- [Summary](#summary)
- [Motivation](#motivation)
- [Goals](#goals)
diff --git a/beps/README.md b/beps/README.md
index 531bd15f50..84bf967b5c 100644
--- a/beps/README.md
+++ b/beps/README.md
@@ -4,19 +4,18 @@ A Backstage Enhancement Proposal (BEP) is a way to propose, communicate and coor
## Quick start for the BEP process
-1. Discuss the idea with the community and maintainers. Either here on GitHub, Discord, or during community sessions or SIG meetings.
- Make sure that others think the work is worth taking up and will help review the BEP and any code changes required.
+1. Discuss the idea with the community and maintainers. Either here on GitHub, Discord, or during community sessions or SIG meetings. Make sure that others think the work is worth taking up and will help review the BEP and any code changes required.
1. Make a copy of the [BEP template](./NNNN-template/) directory as `beps/NNNN-short-descriptive-title`, where `NNNN` is the next available number padded with leading zeroes.
1. Fill out as much of the YAML metadata as you can.
1. Fill out the template as best you can.
1. If you want the BEP to be owned by a particular project area, add an entry for the BEP folder to [CODEOWNERS](../.github/CODEOWNERS).
-1. Create a PR for the BEP. Title it "BEP: <title>". Aim to get the high level goals clarified and avoid getting hung up on specific details. The PR can be merged early and iterated on.
-1. Once the BEP is ready to be merged, create a [feature issue](https://github.com/backstage/backstage/issues/new?template=feature.yaml) titled "BEP: <title>". Use the summary of the BEP as description and link to the BEP PR in the context section. Once the PR is merged, the issue should be updated to link to the BEP folder instead. This issue will serve as a general discussion issue for the BEP.
-1. Once the initial BEP is merged you should keep iterating on it until it is ready to leave that `provisional` state. Leaving the `provisional` state is a decision made by the project area maintainers.
+1. Create a PR for the BEP. Title it "BEP: <title>". Aim to get the high level goals clarified and avoid getting hung up on specific details. The PR can be iterated on until the BEP is ready to be merged.
+1. The relevant maintainers will review the BEP and provide feedback. It can also be useful to join relevant SIG meetings to discuss the BEP, to help drive it forward faster.
+1. Let the maintainers know when you think the BEP is ready to be merged. At this point the BEP should be fully filled out and ready for implementation, along with a clear owner for the work.
-Just because a BEP is merged does not mean it is complete or approved for implementation. Any BEP marked as `provisional` is a working document and subject to change.
+The merging of a BEP means that it is approved for implementation and has an owner that is responsible for said implementation. Up until that point, the author(s) of the BEP are responsible for driving the BEP forward.
-The authors of the BEP are also responsible for driving the BEP forward all the way to implementation. The approval of a BEP is not a commitment to implement it.
+While the BEP PR is open the owner can open separate PRs to ship experimental features in support of the BEP to help drive the design forward, and these may be merged pending usual PR review. If the BEP is withdrawn or rejected these features should generally be removed.
## FAQs
@@ -38,7 +37,7 @@ No, except for plugins that implement core features of Backstage. The BEP proces
### Can I update an existing BEP?
-Yes! As long as the BEP is still in the `provisional` state you should keep iterating on it. Please keep each PR focused on a single topic and avoid long-running and overly broad PRs.
+Yes! As long as the BEP is in the `implementable` state. Updates should however only be done based on new discoveries during the implementation phase. If you want to make a significant change to a BEP that has already been approved, you should open a new BEP to replace the old one.
### Can I update a BEP that was submitted by someone else?
@@ -48,6 +47,10 @@ Yes! BEPs are living documents and anyone can suggest changes to them. We encour
Architecture Decision Records (ADRs) are used to document decisions made for development within the Backstage project. They are not intended to be used for proposing new features or changes to Backstage.
+### What's does it mean for a BEP to be in "provisional" state?
+
+This is a state from an older version of the BEP process, and means that it has been approved as work to be done but the exact design is not yet agreed upon. BEPs in this state need to be moved to the `implementable` state before they can be implemented.
+
### My FAQ isn't answered here!
The BEP process is still evolving!
@@ -72,13 +75,10 @@ At the start of each BEP is a YAML document that contains metadata about the BEP
The BEP Status is critical to clearly communicate the status of each BEP. Each BEP must have its status field set to one of the following values:
-- `provisional`: The BEP has been proposed and is actively being defined. The BEP as been approved by the owning project area maintainers as work to be done.
-- `implementable`: The approvers have approved this BEP for implementation.
-- `implemented`: The BEP has been implemented and is no longer actively changed.
-- `deferred`: The BEP is proposed but not actively being worked on.
-- `rejected`: The approvers and authors have decided that this BEP is not moving forward.
- The BEP is kept around as a historical document.
-- `withdrawn`: The authors have withdrawn the BEP.
+- `implementable`: The BEP has been approved for implementation by the owning project area maintainers.
+- `implemented`: The BEP has been implemented.
+- `deferred`: The BEP was approved but is no longer being actively worked on. If anyone wishes to pick up the work they can move it back to the `implementable` state.
+- `rejected`: The approvers and authors have decided that this BEP is not moving forward. The BEP is kept around as a historical document.
- `replaced`: The BEP has been replaced by a new BEP.
### Prior Art
diff --git a/docs/deployment/flightcontrol.md b/contrib/docs/tutorials/flightcontrol-deployment.md
similarity index 98%
rename from docs/deployment/flightcontrol.md
rename to contrib/docs/tutorials/flightcontrol-deployment.md
index df0c9284fb..aee915ba2f 100644
--- a/docs/deployment/flightcontrol.md
+++ b/contrib/docs/tutorials/flightcontrol-deployment.md
@@ -1,9 +1,4 @@
----
-id: flightcontrol
-title: Deploying with Flightcontrol
-sidebar_label: AWS Fargate via Flightcontrol
-description: Deploying Backstage to AWS Fargate via Flightcontrol
----
+# Deploying Backstage to AWS with Flightcontrol
This guide explains how to deploy Backstage to [Flightcontrol](https://www.flightcontrol.dev?ref=backstage), a platform that fully automates deployments to Amazon Web Services (AWS). Flightcontrol supports git-driven and image registry deployments.
diff --git a/docs/deployment/heroku.md b/contrib/docs/tutorials/heroku-deployment.md
similarity index 96%
rename from docs/deployment/heroku.md
rename to contrib/docs/tutorials/heroku-deployment.md
index 8961848894..2dea1f021c 100644
--- a/docs/deployment/heroku.md
+++ b/contrib/docs/tutorials/heroku-deployment.md
@@ -1,9 +1,4 @@
----
-id: heroku
-title: Deploying with Heroku
-sidebar_label: Heroku
-description: How to deploy Backstage to Heroku
----
+# Deploying Backstage to Heroku
Heroku is a Platform as a Service (PaaS) designed to simplify application deployment.
diff --git a/docs/deployment/koyeb.md b/contrib/docs/tutorials/koyeb-deployment.md
similarity index 86%
rename from docs/deployment/koyeb.md
rename to contrib/docs/tutorials/koyeb-deployment.md
index 3e30881752..75d42d8814 100644
--- a/docs/deployment/koyeb.md
+++ b/contrib/docs/tutorials/koyeb-deployment.md
@@ -1,9 +1,4 @@
----
-id: koyeb
-title: Deploying with Koyeb
-sidebar_label: Koyeb
-description: How to deploy Backstage to Koyeb
----
+# Deploying Backstage to Koyeb
This guide explains how to deploy Backstage to [Koyeb](https://www.koyeb.com/), a serverless platform that provides the fastest way to deploy applications globally. Koyeb supports git-driven and container-based deployments.
@@ -31,7 +26,7 @@ backend:
## Push and deploy Backstage to Koyeb
-Push your Backstage application with its [Dockerfile](docker.md) to Koyeb using the following command:
+Push your Backstage application with its [Dockerfile](https://backstage.io/docs/deployment/docker) to Koyeb using the following command:
```bash
koyeb app init example-backstage \
diff --git a/contrib/scaffolder/template-testing-dry-run.md b/contrib/scaffolder/template-testing-dry-run.md
index 70e0c572ab..12c4210ed6 100644
--- a/contrib/scaffolder/template-testing-dry-run.md
+++ b/contrib/scaffolder/template-testing-dry-run.md
@@ -26,7 +26,6 @@ import { readFile, writeFile } from 'node:fs/promises';
import { gzipSync } from 'node:zlib';
import { ensureDir } from 'fs-extra';
import { program } from 'commander';
-import fetch from 'node-fetch';
import ora from 'ora';
import readdir from 'recursive-readdir';
import { parse } from 'yaml';
diff --git a/docs/architecture-decisions/adr013-use-node-fetch.md b/docs/architecture-decisions/adr013-use-node-fetch.md
index f6f022ed29..e65cf0a97b 100644
--- a/docs/architecture-decisions/adr013-use-node-fetch.md
+++ b/docs/architecture-decisions/adr013-use-node-fetch.md
@@ -1,10 +1,16 @@
---
id: adrs-adr013
-title: 'ADR013: Proper use of HTTP fetching libraries'
+title: 'ADR013: [superseded] Proper use of HTTP fetching libraries'
# prettier-ignore
description: Architecture Decision Record (ADR) for the proper use of fetchApiRef, node-fetch, and cross-fetch for data fetching.
---
+:::note Superseded
+
+This ADR has been superseded by [ADR014](./adr014-use-fetch.md) and no longer applies.
+
+:::
+
## Context
Using multiple HTTP packages for data fetching increases the complexity and the
diff --git a/docs/architecture-decisions/adr014-use-fetch.md b/docs/architecture-decisions/adr014-use-fetch.md
new file mode 100644
index 0000000000..8454e69e7c
--- /dev/null
+++ b/docs/architecture-decisions/adr014-use-fetch.md
@@ -0,0 +1,80 @@
+---
+id: adrs-adr014
+title: 'ADR014: Proper use of HTTP fetching libraries'
+# prettier-ignore
+description: Architecture Decision Record (ADR) for the proper use of fetchApiRef, native fetch, and cross-fetch for data fetching.
+---
+
+## Context
+
+Until now we have been recommending the use of `node-fetch` in Node.js contexts
+through [ADR013](./adr013-use-node-fetch.md). Since then, Backstage has had its
+minimum requirements upgraded to Node.js 20 or newer. The Node.js platform has
+established a stable, reliable `undici` based native `fetch` in these versions.
+Additionally, there are [some issues](https://github.com/backstage/backstage/issues/24590)
+with using third party libraries that only appeared in newer versions of
+Node.js.
+
+## Decision
+
+All code that is executed in Node.js (including backend and CLIs) should use the
+native `fetch` for HTTP data fetching, and `typeof fetch` as the TypeScript type
+in code where a `fetch` implementation can be injected or is referred to.
+Example:
+
+```ts
+import { ResponseError } from '@backstage/errors';
+
+// this is implicitly global.fetch
+const response = await fetch('https://example.com/api/v1/users.json');
+if (!response.ok) {
+ throw await ResponseError.fromResponse(response);
+}
+const users = await response.json();
+```
+
+Frontend plugins and packages should prefer to use the
+[`fetchApiRef`](https://backstage.io/docs/reference/core-plugin-api.fetchapiref).
+
+```ts
+import { useApi } from '@backstage/core-plugin-api';
+
+// Inside some React component...
+const { fetch } = useApi(fetchApiRef);
+
+const response = await fetch('https://example.com/api/v1/users.json');
+if (!response.ok) {
+ throw await ResponseError.fromResponse(response);
+}
+const users = await response.json();
+```
+
+Isomorphic packages should have a dependency on the `cross-fetch` package for
+mocking and type definitions. Preferably, classes and functions in isomorphic
+packages should accept an argument of type `typeof fetch` to let callers supply
+their preferred implementation of `fetch`. This lets them adorn the calls with
+auth or other information, and track metrics etc, in a cross-platform way.
+Example:
+
+```ts
+import crossFetch from 'cross-fetch';
+
+export class MyClient {
+ private readonly fetch: typeof crossFetch;
+
+ constructor(options: { fetch?: typeof crossFetch }) {
+ this.fetch = options.fetch || crossFetch;
+ }
+
+ async users() {
+ return await this.fetch('https://example.com/api/v1/users.json');
+ }
+}
+```
+
+## Consequences
+
+We will gradually transition away from third party `fetch` replacement packages
+such as `node-fetch` and others on the Node.js platform.
+
+The `@mswjs/interceptors` library as used by `msw` version 1.x [does not support native fetch properly](https://github.com/mswjs/msw/issues/1563#issuecomment-1694249010) and likely never will. When you switch to using native fetch, you may see `msw` based tests start to fail to both capture and block traffic. Certain tests may need to be rewritten to use `msw` 2.x or newer instead, which uses a newer version of the interceptors.
diff --git a/docs/auth/google/provider.md b/docs/auth/google/provider.md
index 109c2ddd9f..e03985d432 100644
--- a/docs/auth/google/provider.md
+++ b/docs/auth/google/provider.md
@@ -89,6 +89,6 @@ backend.add(import('@backstage/plugin-auth-backend-module-google-provider'));
## Adding the provider to the Backstage frontend
-To add the provider to the frontend, add the `googleAuthApi` reference and
+To add the provider to the frontend, add the `googleAuthApiRef` reference and
`SignInPage` component as shown in
[Adding the provider to the sign-in page](../index.md#sign-in-configuration).
diff --git a/docs/auth/service-to-service-auth.md b/docs/auth/service-to-service-auth.md
index 13516a1117..126b136d0b 100644
--- a/docs/auth/service-to-service-auth.md
+++ b/docs/auth/service-to-service-auth.md
@@ -412,3 +412,31 @@ Each entry has one or more of the following fields:
# Also supports the shorthand form:
# action: create, read
```
+
+## Adding custom or logic for validation and issuing of tokens
+
+The `pluginTokenHandlerDecoratorServiceRef` can be used to decorate the existing token handler without having to re-implement the entire `AuthService` implementation.
+This is particularly useful when you want to add additional logic to the handler, such as logging or metrics or custom token validation.
+
+The `PluginTokenHandler` interface has two methods:
+
+- `issueToken`: This method is used to issue a token for a plugin. It takes in the `pluginId` and `targetPluginId` as arguments, and an optional `limitedUserToken` object which can be used to issue a token on behalf of another user. The method returns a promise that resolves to an object containing the issued token.
+
+- `verifyToken`: This method is used to verify a token. It takes in the token as an argument and returns a promise that resolves to an object containing the subject of the token and an optional limited user token.
+
+```ts
+import {
+ PluginTokenHandler,
+ pluginTokenHandlerDecoratorServiceRef,
+} from '@backstage/backend-defaults/auth';
+import { createServiceFactory } from '@backstage/backend-plugin-api';
+
+const decoratedPluginTokenHandler = createServiceFactory({
+ service: pluginTokenHandlerDecoratorServiceRef,
+ deps: {},
+ async factory() {
+ return (defaultImplementation: PluginTokenHandler) =>
+ new CustomTokenHandler(defaultImplementation);
+ },
+});
+```
diff --git a/docs/backend-system/core-services/discovery.md b/docs/backend-system/core-services/discovery.md
index 455e398d8b..4324edbbf9 100644
--- a/docs/backend-system/core-services/discovery.md
+++ b/docs/backend-system/core-services/discovery.md
@@ -16,7 +16,6 @@ import {
coreServices,
createBackendPlugin,
} from '@backstage/backend-plugin-api';
-import { fetch } from 'node-fetch';
createBackendPlugin({
pluginId: 'example',
diff --git a/docs/backend-system/core-services/http-auth.md b/docs/backend-system/core-services/http-auth.md
index 13938c921d..f3ce96fb25 100644
--- a/docs/backend-system/core-services/http-auth.md
+++ b/docs/backend-system/core-services/http-auth.md
@@ -102,6 +102,45 @@ or [contribute](https://github.com/backstage/backstage/blob/master/CONTRIBUTING.
:::
+### Custom token extraction logic
+
+In some cases, you might want to customize how tokens are extracted from incoming requests. It might be that you want to extract tokens from a different location in the request. To support this you can supply your own slightly modified httpAuth service. The `DefaultHttpAuthService` class is exported from `@backstage/backend-defaults/httpAuth` and it's static `create` method can be used to pass in a custom `getTokenFromRequest` extraction function.
+
+```ts
+import { DefaultHttpAuthService } from '@backstage/backend-defaults/httpAuth';
+import {
+ coreServices,
+ createServiceFactory,
+} from '@backstage/backend-plugin-api';
+
+export const customizedAuthServiceFactory = createServiceFactory({
+ service: coreServices.httpAuth,
+ deps: {
+ auth: coreServices.auth,
+ discovery: coreServices.discovery,
+ plugin: coreServices.pluginMetadata,
+ },
+ async factory({ auth, discovery, plugin }) {
+ return DefaultHttpAuthService.create({
+ auth,
+ discovery,
+ pluginId: plugin.getId(),
+ getTokenFromRequest: req => {
+ let token: string | undefined;
+ const header = req.headers.some_random_header;
+ if (typeof header === 'string') {
+ const parts = header.split(' ');
+ if (parts.length === 2 && parts[0] === 'Bearer') {
+ token = parts[1];
+ }
+ }
+ return { token };
+ },
+ });
+ },
+});
+```
+
This service has no configuration options, but it abides by the policies you
have set up using [the `httpRouter` service](./http-router.md) for your routes,
if any.
diff --git a/docs/backend-system/core-services/http-router.md b/docs/backend-system/core-services/http-router.md
index 6ab8218c83..c354f4fceb 100644
--- a/docs/backend-system/core-services/http-router.md
+++ b/docs/backend-system/core-services/http-router.md
@@ -70,4 +70,67 @@ access the incoming credentials.
## Configuring the service
-This service does not have any configuration options.
+For more advanced customization, there are several APIs from the `@backstage/backend-defaults/httpRouter` package that allow you to customize the implementation of the config service. The default implementation uses all of the middleware exported from `@backstage/backend-defaults/httpRouter`, including `createLifecycleMiddleware`, `createAuthIntegrationRouter`, `createCredentialsBarrier` and `createCookieAuthRefreshMiddleware`. You can use these to create your own `httpRouter` service implementation, for example - here's how you would add a custom health check route to all plugins:
+
+```ts
+import {
+ createLifecycleMiddleware,
+ createCookieAuthRefreshMiddleware,
+ createCredentialsBarrier,
+ createAuthIntegrationRouter,
+} from '@backstage/backend-defaults/httpRouter';
+import { createServiceFactory } from '@backstage/backend-plugin-api';
+
+const backend = createBackend();
+
+backend.add(
+ createServiceFactory({
+ service: coreServices.httpRouter,
+ initialization: 'always',
+ deps: {
+ plugin: coreServices.pluginMetadata,
+ config: coreServices.rootConfig,
+ lifecycle: coreServices.lifecycle,
+ rootHttpRouter: coreServices.rootHttpRouter,
+ auth: coreServices.auth,
+ httpAuth: coreServices.httpAuth,
+ },
+ async factory({
+ auth,
+ httpAuth,
+ config,
+ plugin,
+ rootHttpRouter,
+ lifecycle,
+ }) {
+ const router = PromiseRouter();
+
+ rootHttpRouter.use(`/api/${plugin.getId()}`, router);
+
+ const credentialsBarrier = createCredentialsBarrier({
+ httpAuth,
+ config,
+ });
+
+ router.use(createAuthIntegrationRouter({ auth }));
+ router.use(createLifecycleMiddleware({ lifecycle }));
+ router.use(credentialsBarrier.middleware);
+ router.use(createCookieAuthRefreshMiddleware({ auth, httpAuth }));
+
+ // Add a custom healthcheck endpoint for all plugins.
+ router.use('/health', (_, res) => {
+ res.status(200);
+ });
+
+ return {
+ use(handler: Handler): void {
+ router.use(handler);
+ },
+ addAuthPolicy(policy: HttpRouterServiceAuthPolicy): void {
+ credentialsBarrier.addAuthPolicy(policy);
+ },
+ };
+ },
+ }),
+);
+```
diff --git a/docs/backend-system/core-services/root-health.md b/docs/backend-system/core-services/root-health.md
index 663dd699ae..fa147499a6 100644
--- a/docs/backend-system/core-services/root-health.md
+++ b/docs/backend-system/core-services/root-health.md
@@ -38,3 +38,29 @@ backend.add(
}),
);
```
+
+### Custom headers in health check responses
+
+While not implemented directly in the root health service, the default implementation of the [RootHttpRouter](./root-http-router.md) service includes a configuration option to set additional headers to include in health check responses. For example, you can add a `service-name` header using the following configuration:
+
+```yaml
+backend:
+ health:
+ headers:
+ service-name: my-service
+```
+
+It can be a good idea to set a header for your health check responses that
+uniquely identifies your service in a multi-service environment. This ensures
+that the health check that is configured for your service is actually hitting
+your service and not another.
+
+For example, if using Envoy you can use the [`service_name_matcher`](https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/health_checking#health-check-identity) configuration and
+set the `x-envoy-upstream-healthchecked-cluster` header to a matching value. For example:
+
+```yaml
+backend:
+ health:
+ headers:
+ x-envoy-upstream-healthchecked-cluster: my-service
+```
diff --git a/docs/backend-system/core-services/scheduler.md b/docs/backend-system/core-services/scheduler.md
index e4c67a1199..154878ddfc 100644
--- a/docs/backend-system/core-services/scheduler.md
+++ b/docs/backend-system/core-services/scheduler.md
@@ -16,7 +16,6 @@ import {
coreServices,
createBackendPlugin,
} from '@backstage/backend-plugin-api';
-import { fetch } from 'node-fetch';
createBackendPlugin({
pluginId: 'example',
diff --git a/docs/deployment/backstage-deploy/aws.md b/docs/deployment/backstage-deploy/aws.md
deleted file mode 100644
index 818850a6f5..0000000000
--- a/docs/deployment/backstage-deploy/aws.md
+++ /dev/null
@@ -1,182 +0,0 @@
----
-id: aws-lightsail
-title: Deploying Backstage on AWS Lightsail
-sidebar_label: AWS Lightsail
-description: How to deploy Backstage on AWS Lightsail
----
-
-> **DISCLAIMER: The `deploy` command is in alpha and still experimental. Do not use the `deploy` command for production deployments.**
-
-Getting started with Backstage often involves setting up an instance on a cloud provider and sharing it with your team so they can experiment. To make this cloud deployment easier, we've built a `deploy` command to stand up a proof-of-concept instance on AWS (using Lightsail).
-
-## What is AWS Lightsail
-
-:::tip
-
-AWS offers a free tier for up to three months on $10 USD/month Container service (Micro -1 node). By default we use the `nano` node, so if you are a new user this approach shouldn't cost you anything. For more information, refer to the [pricing](https://aws.amazon.com/lightsail/pricing/) documentation.
-
-:::
-
-AWS Lightsail offers a simple way to run containers in the cloud. To learn more about AWS Lightsail, please refer to the [official documentation](https://lightsail.aws.amazon.com/ls/docs/en_us/articles/amazon-lightsail-container-services-deployments).
-
-## Creating user in AWS
-
-- Open the AWS console and navigate to the IAM section
-- In the left side menu click on `Users` and then click on `Add users`
-- Specify a username and then click on `Next`
-- Afterwards you can assign permissions, select `Attach policies directly` and then click on `Create policy`.
- This should take you to a new window in which you can create a new policy based on `JSON`.
- Copy over the following:
-
-```json
-{
- "Version": "2012-10-17",
- "Statement": [
- {
- "Sid": "VisualEditor0",
- "Effect": "Allow",
- "Action": [
- "ecr:DescribeImageReplicationStatus",
- "ecr:ListTagsForResource",
- "ecr:UploadLayerPart",
- "ecr:BatchGetRepositoryScanningConfiguration",
- "ecr:DeleteRepository",
- "ecr:GetRegistryScanningConfiguration",
- "ecr:CompleteLayerUpload",
- "ecr:TagResource",
- "ecr:DescribeRepositories",
- "ecr:DeleteRepositoryPolicy",
- "ecr:BatchCheckLayerAvailability",
- "ecr:GetLifecyclePolicy",
- "ecr:GetRegistryPolicy",
- "ecr:PutLifecyclePolicy",
- "ecr:DescribeImageScanFindings",
- "ecr:GetLifecyclePolicyPreview",
- "ecr:CreateRepository",
- "ecr:DescribeRegistry",
- "ecr:GetDownloadUrlForLayer",
- "ecr:GetAuthorizationToken",
- "ecr:DeleteLifecyclePolicy",
- "ecr:PutImage",
- "ecr:UntagResource",
- "ecr:SetRepositoryPolicy",
- "ecr:BatchGetImage",
- "ecr:InitiateLayerUpload",
- "ecr:GetRepositoryPolicy",
- "lightsail:CreateContainerService",
- "lightsail:GetKeyPair",
- "lightsail:GetContainerServiceDeployments",
- "lightsail:CreateContainerServiceRegistryLogin",
- "lightsail:GetContainerImages",
- "lightsail:UntagResource",
- "lightsail:RegisterContainerImage",
- "lightsail:GetContainerServices",
- "lightsail:GetContainerServicePowers",
- "lightsail:GetKeyPairs",
- "lightsail:CreateContainerServiceDeployment",
- "lightsail:GetContainerServiceMetricData",
- "lightsail:GetContainerAPIMetadata",
- "lightsail:DeleteContainerService",
- "lightsail:GetContainerLog",
- "lightsail:TagResource"
- ],
- "Resource": "*"
- },
- {
- "Sid": "Statement1",
- "Effect": "Allow",
- "Action": [],
- "Resource": []
- }
- ]
-}
-```
-
-Then click on `Next` and give the policy a name and a description of your liking. Afterwards, click on `Create policy`.
-
-- Navigate back to the user creation window and press on the refresh button and search for the policy you just created. Now, create the user.
-- Now you will be redirected to all users, click on the user you just created and click on `Security credentials`
-- Scroll below and click on `Create access key`
-- Choose `Command Line Interface (CLI)`
-- Now export the following values
-
-```bash
-$ export AWS_ACCESS_KEY_ID=... (first value)
-$ export AWS_SECRET_ACCESS_KEY=.... (second secret value)
-```
-
-## Configuring the Pulumi CLI
-
-Second, install the [Pulumi CLI](https://www.pulumi.com/docs/get-started/install/) - `backstage-deploy` uses it to
-simplify the management of cloud resources (Pulumi allows us to simply specify the desired "target cloud state", and
-Pulumi will intelligently create/modify/delete resources to reach that state. Nice!).
-
-Then we need to execute the following commands, to set Pulumi up:
-
-:::tip
-
-Make sure to store your passphrase somewhere safe as it is used to encrypt/decrypt your Pulumi config.
-
-:::
-
-```bash
-$ pulumi login --local
-$ export PULUMI_CONFIG_PASSPHRASE=""
-```
-
-By using `pulumi login --local` we are making sure that Pulumi stores our state on the local file disk. The environment variable `PULUMI_CONFIG_PASSPHRASE` is used by Pulumi to generate a unique key for your stack
-
-## Deploying your instance on Lightsail
-
-:::tip
-
-Make sure that [Docker](https://docs.docker.com/) is running on your machine before you start this section.
-
-:::
-
-After you have made your changes to your local instance, it's time to deploy it on Lightsail.
-
-First, we need to configure a new `app-config` file and update the `baseUrl`.
-
-```bash
-$ touch app-config.deployment.yaml
-```
-
-And then update the file with the following yaml:
-
-```yaml
-app:
- baseUrl: ${BACKSTAGE_HOST}
-
-backend:
- baseUrl: ${BACKSTAGE_HOST}
-```
-
-The environment variable `BACKSTAGE_HOST` will be set to the endpoint that AWS Lightsail creates.
-
-Now we can deploy our instance!
-
-```bash
-$ npx backstage-deploy aws --stack backstage-poc --create-dockerfile
-```
-
-In the first part of the command, we are specifying that we want to deploy our instance on AWS. With the [`--stack`](https://www.pulumi.com/docs/reference/cli/pulumi_stack/) option, we are providing Pulumi a reference to our container deployment. Furthermore, with the `--create-dockerfile` option, there will be a `Dockerfile` and `.dockerignore` created in the root of the project.
-
-After running the command, Pulumi will start creating the following resources for you in AWS:
-
-- ECR Repository
-- Lightsail Container Service
-- Lightsail Container Service Deployment
-- Policy that allows Lightsail to pull from ECR
-
-If it's the first time building the Docker image, it might take a while for everything to be fully provisioned. After the command is finished running, your Backstage instance should be up and running on AWS Lightsail! 🎉
-
-### Cleaning up resources
-
-Cleaning up the resources is also done with the deploy command.
-
-```bash
-$ npx backstage-deploy aws --stack backstage-poc --destroy
-```
-
-This will delete everything that was originally created by the `deploy` command.
diff --git a/docs/deployment/docker.md b/docs/deployment/docker.md
index 79be3cb074..546d027b86 100644
--- a/docs/deployment/docker.md
+++ b/docs/deployment/docker.md
@@ -5,6 +5,10 @@ sidebar_label: Docker
description: How to build a Backstage Docker image for deployment
---
+:::note Note
+Before you start this section, it would be good to have a basic understanding of Docker and how it works. If you are new to Docker, you can start with the [Docker overview](https://docs.docker.com/get-started/overview/) guide.
+:::
+
This section describes how to build a Backstage App into a deployable Docker
image. It is split into three sections, first covering the host build approach,
which is recommended due to its speed and more efficient and often simpler
@@ -84,6 +88,7 @@ WORKDIR /app
# Copy files needed by Yarn
COPY --chown=node:node .yarn ./.yarn
COPY --chown=node:node .yarnrc.yml ./
+COPY --chown=node:node backstage.json ./
# This switches many Node.js dependencies to production mode.
ENV NODE_ENV=production
@@ -180,7 +185,7 @@ the repo root:
FROM node:20-bookworm-slim AS packages
WORKDIR /app
-COPY package.json yarn.lock ./
+COPY backstage.json package.json yarn.lock ./
COPY .yarn ./.yarn
COPY .yarnrc.yml ./
@@ -218,6 +223,7 @@ WORKDIR /app
COPY --from=packages --chown=node:node /app .
COPY --from=packages --chown=node:node /app/.yarn ./.yarn
COPY --from=packages --chown=node:node /app/.yarnrc.yml ./
+COPY --from=packages --chown=node:node /app/backstage.json ./
RUN --mount=type=cache,target=/home/node/.cache/yarn,sharing=locked,uid=1000,gid=1000 \
yarn install --immutable
@@ -265,7 +271,9 @@ WORKDIR /app
# Copy the install dependencies from the build stage and context
COPY --from=build --chown=node:node /app/.yarn ./.yarn
COPY --from=build --chown=node:node /app/.yarnrc.yml ./
+COPY --from=build --chown=node:node /app/backstage.json ./
COPY --from=build --chown=node:node /app/yarn.lock /app/package.json /app/packages/backend/dist/skeleton/ ./
+
# Note: The skeleton bundle only includes package.json files -- if your app has
# plugins that define a `bin` export, the bin files need to be copied as well to
# be linked in node_modules/.bin during yarn install.
diff --git a/docs/deployment/index.md b/docs/deployment/index.md
index 0524e71db8..76c8c12932 100644
--- a/docs/deployment/index.md
+++ b/docs/deployment/index.md
@@ -30,14 +30,7 @@ At Spotify, we deploy software generally by:
This method is covered in [Building a Docker image](docker.md) and
[Deploying with Kubernetes](k8s.md).
-There is also an example of deploying on [Heroku](heroku.md), which only
-requires the first two steps.
-
-There is also a contrib guide to deploying Backstage with
-[AWS Fargate and Aurora PostgreSQL](https://github.com/backstage/backstage/blob/master/contrib/docs/tutorials/aws-fargate-deployment.md).
-
-Please consider contributing other deployment guides if you get Backstage set up
-on common infrastructure, it would be a great benefit to the community.
+There are many ways to deploy Backstage! You can find more examples in the community contributed guides found [here](https://github.com/backstage/backstage/blob/master/contrib/docs/tutorials/).
If you need to run Backstage behind a corporate proxy, this
[contributed guide](https://github.com/backstage/backstage/blob/master/contrib/docs/tutorials/help-im-behind-a-corporate-proxy.md)
diff --git a/docs/features/software-templates/experimental.md b/docs/features/software-templates/experimental.md
new file mode 100644
index 0000000000..e37971ad82
--- /dev/null
+++ b/docs/features/software-templates/experimental.md
@@ -0,0 +1,87 @@
+---
+id: experimental
+title: Experimental Features
+# prettier-ignore
+description: Information on Experimental Features that are currently available in the Scaffolder
+---
+
+## Introduction
+
+This section contains information and guides on the experimental features that are currently available in the Scaffolder. Be advised that these features are still in development and may not be fully stable or complete, and are subject to change at any time.
+
+Please leave feedback on these features in the [Backstage Discord](https://discord.com/invite/MUpMjP2) or by [creating an issue](https://github.com/backstage/backstage/issues/new/choose) on the Backstage GitHub repository.
+
+## Retries and Recovery
+
+### TODO
+
+## Form Decorators
+
+Form decorators provide the ability to run arbitrary code before the form is submitted along with secrets to the `scaffolder-backend` plugin. They are provided to the `app` using a Utility API.
+
+#### Installation
+
+To install the Form Decorators, add the following to your `packages/app/src/apis.ts`:
+
+```ts
+ createApiFactory({
+ api: formDecoratorsApiRef,
+ deps: {},
+ factory: () =>
+ DefaultScaffolderFormDecoratorsApi.create({
+ decorators: [
+ // add decorators here
+ ],
+ }),
+ }),
+```
+
+And then you'll also need to define which decorators run in each template using the `EXPERIMENTAL_formDecorators` key in the template's `spec`:
+
+```yaml
+kind: Template
+metadata:
+ name: my-template
+spec:
+ EXPERIMENTAL_formDecorators:
+ - id: my-decorator
+ input:
+ test: something funky
+
+ parameters: ...
+ steps: ...
+```
+
+#### Creating a Decorator
+
+You can create a decorator using the simple helper method `createScaffolderFormDecorator`:
+
+```ts
+export const mockDecorator = createScaffolderFormDecorator({
+ // give the decorator a name
+ id: 'mock-decorator',
+
+ // define the schema for the input that can be proided in `template.yaml`
+ schema: {
+ input: {
+ test: z => z.string(),
+ },
+ },
+ deps: {
+ // define dependencies here
+ githubApi: githubAuthApiRef,
+ },
+ decorator: async (
+ // Context has all the things needed to write simple decorators
+ { setSecrets, setFormState, input: { test } },
+ // Depepdencies injected here
+ { githubApi },
+ ) => {
+ // mutate the form state
+ setFormState(state => ({ ...state, test, mock: 'MOCK' }));
+
+ // mutate the form secrets
+ setSecrets(state => ({ ...state, GITHUB_TOKEN: 'MOCK_TOKEN' }));
+ },
+});
+```
diff --git a/docs/features/software-templates/input-examples.md b/docs/features/software-templates/input-examples.md
index ef90013e49..0162ffb8f3 100644
--- a/docs/features/software-templates/input-examples.md
+++ b/docs/features/software-templates/input-examples.md
@@ -198,6 +198,23 @@ parameters:
ui:widget: checkboxes
```
+## Markdown text blocks
+
+```yaml
+parameters:
+ - title: Fill in some steps
+ properties:
+ markdown:
+ type: 'null' # Needs to be quoted
+ description: |
+ ## Markdown Text Block
+
+ Standard markdown formatting is supported including *italics*, **bold** and [links](https://example.com)
+
+ * bullet 1
+ * bullet 2
+```
+
## Use parameters as condition in steps
Conditions use Javascript equality operators.
@@ -250,6 +267,54 @@ parameters:
- lastName
```
+### Multiple conditional fields with custom ordering
+
+```yaml
+parameters:
+ - title: Fill in some steps
+ ui:order:
+ - includeName
+ - lastName
+ - includeAddress
+ - address
+ properties:
+ includeName:
+ title: Include Name?
+ type: boolean
+ default: true
+ includeAddress:
+ title: Include Address?
+ type: boolean
+ default: true
+ dependencies:
+ includeName:
+ allOf:
+ - if:
+ properties:
+ includeName:
+ const: true
+ then:
+ properties:
+ lastName:
+ title: Name
+ type: string
+ required:
+ - lastName
+ includeAddress:
+ allOf:
+ - if:
+ properties:
+ includeAddress:
+ const: true
+ then:
+ properties:
+ address:
+ title: Address
+ type: string
+ required:
+ - address
+```
+
## Conditionally set parameters
The `if` keyword within the parameter uses [nunjucks templating](https://mozilla.github.io/nunjucks/templating.html#if). The `not` keyword is unavailable; instead, use javascript equality.
diff --git a/docs/features/software-templates/writing-custom-actions.md b/docs/features/software-templates/writing-custom-actions.md
index 00a171523c..11e67af07f 100644
--- a/docs/features/software-templates/writing-custom-actions.md
+++ b/docs/features/software-templates/writing-custom-actions.md
@@ -141,6 +141,39 @@ Prefer to use `camelCase` over `snake_case` or `kebab-case` for these actions if
> We're aware that there are some exceptions to this, but try to follow as close as possible. We'll be working on migrating these in the repository over time too.
+### Adding a TemplateExample
+
+A TemplateExample is a predefined structure that can be used to create custom actions in your software templates. It serves as a blueprint for users to understand how to use a specific action and its fields as well as to ensure consistency and standardization across different custom actions.
+
+#### Define a TemplateExample and add to your Custom Action
+
+```ts title="With JSON Schema"
+import { TemplateExample } from '@backstage/plugin-scaffolder-node';
+import yaml from 'yaml';
+
+export const examples: TemplateExample[] = [
+ {
+ description: 'Template Example for Creating an Acme file',
+ example: yaml.stringify({
+ steps: [
+ {
+ action: 'acme:file:create',
+ name: 'Create an Acme file.',
+ input: {
+ contents: 'file contents...',
+ filename: 'ACME.properties',
+ },
+ },
+ ],
+ }),
+ },
+];
+```
+
+Add the example to the `createTemplateAction` under the object property `examples`:
+
+`return createTemplateAction<{ contents: string; filename: string }>({id: 'acme:file:create', description: 'Create an Acme file', examples, ...};`
+
### The context object
When the action `handler` is called, we provide you a `context` as the only
diff --git a/docs/features/techdocs/getting-started.md b/docs/features/techdocs/getting-started.md
index 66772c861d..2c365bb5b9 100644
--- a/docs/features/techdocs/getting-started.md
+++ b/docs/features/techdocs/getting-started.md
@@ -297,7 +297,9 @@ You can do so by including the following lines right above `USER node` of your
`Dockerfile`:
```Dockerfile
-RUN apt-get update && apt-get install -y python3 python3-pip python3-venv
+RUN apt-get update && \
+ apt-get install -y python3 python3-pip python3-venv && \
+ rm -rf /var/lib/apt/lists/*
ENV VIRTUAL_ENV=/opt/venv
RUN python3 -m venv $VIRTUAL_ENV
diff --git a/docs/frontend-system/building-apps/06-plugin-conversion.md b/docs/frontend-system/building-apps/06-plugin-conversion.md
index 5e7d431e73..2fab6cf828 100644
--- a/docs/frontend-system/building-apps/06-plugin-conversion.md
+++ b/docs/frontend-system/building-apps/06-plugin-conversion.md
@@ -58,7 +58,7 @@ The following are the known conversion functions provided by various libraries:
## Putting it all together
-Using the plugin converter along with extension converters from various libraries, we can not more fully convert our 3rd-party plugin to be able to install it in an app built with the new frontend system:
+Using the plugin converter along with extension converters from various libraries, we can now more fully convert our 3rd-party plugin to be able to install it in an app built with the new frontend system:
```ts
import {
diff --git a/docs/getting-started/concepts.md b/docs/getting-started/concepts.md
deleted file mode 100644
index f8aba8537d..0000000000
--- a/docs/getting-started/concepts.md
+++ /dev/null
@@ -1,21 +0,0 @@
----
-id: concepts
-title: Key Concepts
-# prettier-ignore
-description: High level key concepts used in the Backstage project
----
-
-For users of Backstage, there are certain concepts which are central to its
-design and functionality. Being an expert in each of these concepts is not
-necessary, however having a base understanding of each will make administering,
-configuring, and operating Backstage easier.
-
-- CHANGELOG - https://keepachangelog.com
-- Docker - https://www.docker.com/
-- Monorepo - https://semaphoreci.com/blog/what-is-monorepo
-- Node.js - https://nodejs.org
-- React - https://reactjs.org
-- Semantic Versioning - https://semver.org
-- TypeScript - https://www.typescriptlang.org
-- YAML - https://yaml.org
-- Yarn - https://www.pluralsight.com/guides/yarn-a-package-manager-for-node-js
diff --git a/docs/getting-started/config/database.md b/docs/getting-started/config/database.md
index 0fbd66d5a3..e6d1278b70 100644
--- a/docs/getting-started/config/database.md
+++ b/docs/getting-started/config/database.md
@@ -6,13 +6,13 @@ description: How to set up PostgreSQL for your Backstage instance.
Audience: Admins
-### Summary
+## Summary
-This guide walks through how to set up a PostgreSQL database to host your Backstage data. It assumes you've already have a scaffolded Backstage app from following the [Standalone Install](../index.md) guide.
+This guide walks through how to set up a PostgreSQL database to host your Backstage data. It assumes you've already have a scaffolded Backstage app from following the [Creating your Backstage App](../index.md) guide.
By the end of this tutorial, you will have a working PostgreSQL database hooked up to your Backstage install.
-### Prerequisites
+## Prerequisites
This guide assumes a basic understanding of working on a Linux based operating system and have some experience with the terminal, specifically, these commands: `apt-get`, `psql`, `yarn`.
@@ -23,7 +23,7 @@ This guide assumes a basic understanding of working on a Linux based operating s
- If the database is not hosted on the same server as the Backstage app, the
PostgreSQL port needs to be accessible (the default is `5432` or `5433`)
-### 1. Install and configure PostgreSQL
+## 1. Install and Configure PostgreSQL
:::tip Already configured your database?
@@ -68,17 +68,9 @@ That's enough database administration to get started. Type `\q`, followed by
pressing the enter key. Then again type `exit` and press enter. Next, you need
to install and configure the client.
-### 2. Configuring Backstage `pg` Client
+## 2. Configuring Backstage `pg` Client
-Go to the root directory of your freshly installed Backstage
-App. Run the following to install the PostgreSQL client into your backend:
-
-```bash title="From your Backstage root directory"
-yarn --cwd packages/backend add pg
-```
-
-Use your favorite editor to open `app-config.yaml` and add your PostgreSQL
-configuration in the root directory of your Backstage app using the credentials from the previous steps.
+Use your favorite editor to open `app-config.yaml` and add your PostgreSQL configuration in the root directory of your Backstage app using the credentials from the previous steps.
```yaml title="app-config.yaml"
backend:
@@ -126,6 +118,47 @@ After the Backstage frontend launches, you should notice that nothing has change
We've now made your data persist in your Backstage database.
+## Alternatives
+
+You may not want to install Postgres locally, the following sections outline alternatives.
+
+### Docker
+
+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.
+
+```shell
+docker pull postgres:17.0-bookworm
+```
+
+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
+```
+
+This will run Postgres in the background for you, but remember to start it up again when you reboot your system.
+
+### Docker Compose
+
+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
+ environment:
+ POSTGRES_USER: postgres
+ POSTGRES_PASSWORD:
+ ports:
+ - 5432:5432
+```
+
+Then you would just run `docker compose -f docker-compose.local.yaml up` to start Postgres.
+
## Next Steps
We recommend you read [Setting up authentication](./authentication.md) next.
@@ -136,3 +169,4 @@ If you want to read more about the database configuration, here are some helpful
- [Configuring Plugin Databases](../../tutorials/configuring-plugin-databases.md#privileges)
- [Read more about Knex](http://knexjs.org/), the database wrapper that we use.
+- [Install pgAdmin 4](https://www.pgadmin.org/), a helpful tool for querying your database.
diff --git a/docs/getting-started/configure-app-with-plugins.md b/docs/getting-started/configure-app-with-plugins.md
index 95fd456dc0..c31cdc0a06 100644
--- a/docs/getting-started/configure-app-with-plugins.md
+++ b/docs/getting-started/configure-app-with-plugins.md
@@ -4,6 +4,14 @@ title: Configuring App with plugins
description: Documentation on How Configuring App with plugins
---
+Audience: Developers
+
+:::note Note
+Backstage plugins are primarily written using [TypeScript](https://www.typescriptlang.org), [Node.js](https://nodejs.org) and [React](https://reactjs.org). Having an understanding of these technologies will be beneficial on your journey to customizing Backstage!
+:::
+
+## Summary
+
Backstage plugins customize the app for your needs. There is a
[plugin directory](https://backstage.io/plugins) with plugins for many common
infrastructure needs - CI/CD, monitoring, auditing, and more.
diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md
index 926225724a..687cf0be16 100644
--- a/docs/getting-started/index.md
+++ b/docs/getting-started/index.md
@@ -7,6 +7,10 @@ description: How to install Backstage for your own use.
Audience: Developers and Admins
+:::note Note
+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
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.
@@ -21,7 +25,7 @@ If you are planning to contribute a new feature or bug fix to the Backstage proj
## Prerequisites
-This guide assumes a basic understanding of working on a Linux based operating system and have some experience with the terminal, specifically, these commands: `npm`, `yarn`.
+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/)
diff --git a/docs/getting-started/keeping-backstage-updated.md b/docs/getting-started/keeping-backstage-updated.md
index 08b89db518..a641523215 100644
--- a/docs/getting-started/keeping-backstage-updated.md
+++ b/docs/getting-started/keeping-backstage-updated.md
@@ -4,46 +4,19 @@ title: Keeping Backstage Updated
description: How to keep your Backstage App updated
---
+Audience: Developers and Admins
+
+:::note Note
+To better understand the concepts in this section, it's recommended to have an understanding of [Monorepos](https://semaphoreci.com/blog/what-is-monorepo), [Semantic Versioning](https://semver.org) and [CHANGELOGs](https://keepachangelog.com).
+:::
+
+## Summary
+
Backstage is always improving, so it's a good idea to stay in sync with the
latest releases. Backstage is more of a library than an application or service;
similar to `create-react-app`, the `@backstage/create-app` tool gives you a
starting point that's meant to be evolved.
-## Managing package versions with the Backstage yarn plugin
-
-The Backstage yarn plugin makes it easier to manage Backstage package versions,
-by determining the appropriate version for each package based on the overall
-Backstage version in backstage.json. This avoids the need to update every
-package.json across your Backstage monorepo, and means that when adding new
-`@backstage` dependencies, you don't need to worry about figuring out the right
-version to use to match the currently-installed release of Backstage.
-
-### Requirements
-
-In order to use the yarn plugin, you'll need to be using yarn 4.1.1 or greater.
-
-### Installation
-
-To install the yarn plugin, run the following command in your Backstage
-monorepo:
-
-```bash
-yarn plugin import https://versions.backstage.io/v1/tags/main/yarn-plugin
-```
-
-The resulting changes in the file system should be committed to your repo.
-
-### Usage
-
-When the yarn plugin is installed, versions for currently-released `@backstage`
-packages can be replaced in package.json with the string `"backstage:^"`. This
-instructs yarn to resolve the version based on the overall Backstage version in
-backstage.json.
-
-The `backstage-cli versions:bump` command documented below will detect the
-installation of the yarn plugin, and when it's installed, will automatically
-migrate dependencies across the monorepo to use it.
-
## Updating Backstage versions with backstage-cli
The Backstage CLI has a command to bump all `@backstage` packages and
@@ -57,6 +30,12 @@ yarn backstage-cli versions:bump
The reason for bumping all `@backstage` packages at once is to maintain the
dependencies that they have between each other.
+:::tip
+
+To make the the version bump process even easier and more streamlined we highly recommend using the [Backstage yarn plugin](#managing-package-versions-with-the-backstage-yarn-plugin)
+
+:::
+
By default the bump command will upgrade `@backstage` packages to the latest `main` release line which is released monthly. For those in a hurry that want to track the `next` release line which releases weekly can do so using the `--release next` option.
```bash
@@ -87,6 +66,53 @@ for any applicable updates when upgrading packages. As an alternative, the
a consolidated view of all the changes between two versions of Backstage. You
can find the current version of your Backstage installation in `backstage.json`.
+## Managing package versions with the Backstage yarn plugin
+
+The Backstage yarn plugin makes it easier to manage Backstage package versions,
+by determining the appropriate version for each package based on the overall
+Backstage version in `backstage.json`. This avoids the need to update every
+package.json across your Backstage monorepo, and means that when adding new
+`@backstage` dependencies, you don't need to worry about figuring out the right
+version to use to match the currently-installed release of Backstage.
+
+### Requirements
+
+In order to use the yarn plugin, you'll need to be using yarn 4.1.1 or greater.
+
+### Installation
+
+To install the yarn plugin, run the following command in your Backstage
+monorepo:
+
+```bash
+yarn plugin import https://versions.backstage.io/v1/tags/main/yarn-plugin
+```
+
+The resulting changes in the file system should be committed to your repo.
+
+:::tip
+
+For best results it's ideal to add the Backstage Yarn plugin when you are about to do a Backstage upgrade as it will make it easier to confirm everything is working.
+
+:::
+
+### Usage
+
+When the yarn plugin is installed, versions for currently-released `@backstage`
+packages can be replaced in package.json with the string `"backstage:^"`. This
+instructs yarn to resolve the version based on the overall Backstage version in
+`backstage.json`.
+
+:::tip
+
+The `backstage.json` is key for the plugin to work, make sure this file is included in your CI/CD pipelines and/or any Container builds.
+
+:::
+
+The `backstage-cli versions:bump` command documented above will detect the
+installation of the yarn plugin, and when it's installed, will automatically
+migrate dependencies across the monorepo to use it.
+
## More information on dependency mismatches
Backstage is structured as a monorepo with
diff --git a/docs/getting-started/register-a-component.md b/docs/getting-started/register-a-component.md
index c935d25807..4e2076ee8d 100644
--- a/docs/getting-started/register-a-component.md
+++ b/docs/getting-started/register-a-component.md
@@ -6,6 +6,10 @@ description: Start populating your Backstage app with your data.
Audience: Developers
+:::note Note
+Entity files are stored in YAML format, if you are not familiar with YAML, you can learn more about it [here](https://yaml.org).
+:::
+
## Summary
This guide will walk you through how to pull Backstage data from other locations manually. There are integrations that will automatically do this for you.
diff --git a/docs/integrations/azure-blobStorage/discovery.md b/docs/integrations/azure-blobStorage/discovery.md
new file mode 100644
index 0000000000..32612daf75
--- /dev/null
+++ b/docs/integrations/azure-blobStorage/discovery.md
@@ -0,0 +1,76 @@
+---
+id: discovery
+title: Azure Blob Storage Discovery
+sidebar_label: Discovery
+# prettier-ignore
+description: Automatically discovering catalog entities from an Azure Blob Storage account
+---
+
+:::info
+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).
+:::
+
+The Azure Blob Storage account integration has a special entity provider for discovering catalog
+entities located in a storage account container. If you have a container that contains multiple
+catalog files, and you want to automatically discover them, you can use this
+provider. The provider will crawl your Blob Storage account container and register entities
+matching the configured path. This can be useful as an alternative to static
+locations or manually adding things to the catalog.
+
+To use the entity provider, you'll need an Azure Blob Storage account integration
+[set up](locations.md) with `accountName` and either `aadCredential`, `sasToken`, or `accountKey`
+
+At production deployments, you likely manage these with the permissions attached
+to your instance.
+
+In your configuration, you add a provider config per bucket:
+
+```yaml
+# app-config.yaml
+
+catalog:
+ providers:
+ azureBlob:
+ providerId:
+ accountName: ${ACCOUNT_NAME}
+ containerName: ${CONTAINER_NAME}
+ schedule: # same options as in TaskScheduleDefinition
+ # supports cron, ISO duration, "human duration" as used in code
+ frequency: { minutes: 30 }
+ # supports ISO duration, "human duration" as used in code
+ timeout: { minutes: 3 }
+```
+
+For simple setups, you can omit the provider ID at the config
+which has the same effect as using `default` for it.
+
+```yaml
+# app-config.yaml
+
+catalog:
+ providers:
+ azureBlob:
+ accountName: ${ACCOUNT_NAME}
+ containerName: ${CONTAINER_NAME}
+ schedule: # same options as in TaskScheduleDefinition
+ # supports cron, ISO duration, "human duration" as used in code
+ frequency: { minutes: 30 }
+ # supports ISO duration, "human duration" as used in code
+ timeout: { minutes: 3 }
+```
+
+As this provider is not one of the default providers, you will first need to install
+the Azure catalog plugin:
+
+```bash title="From your Backstage root directory"
+yarn --cwd packages/backend add @backstage/plugin-catalog-backend-module-azure
+```
+
+Then updated your backend by adding the following line:
+
+```ts title="packages/backend/src/index.ts"
+backend.add(import('@backstage/plugin-catalog-backend'));
+/* highlight-add-start */
+backend.add(import('@backstage/plugin-catalog-backend-module-azure'));
+/* highlight-add-end */
+```
diff --git a/docs/integrations/azure-blobStorage/locations.md b/docs/integrations/azure-blobStorage/locations.md
new file mode 100644
index 0000000000..38d8555c2e
--- /dev/null
+++ b/docs/integrations/azure-blobStorage/locations.md
@@ -0,0 +1,51 @@
+---
+id: locations
+sidebar_label: Locations
+title: Azure Blob Storage account Locations
+# prettier-ignore
+description: Setting up an integration with Azure Blob Storage account
+---
+
+The Azure Blob Storage account integration supports loading catalog entities from an blob storage account container.
+Entities can be added to
+[static catalog configuration](../../features/software-catalog/configuration.md),
+or registered with the
+[catalog-import](https://github.com/backstage/backstage/tree/master/plugins/catalog-import)
+plugin.
+
+## Configuration
+
+To use this integration, add configuration to your `app-config.yaml`:
+
+Using Azure active directory credentials:
+
+```yaml
+integrations:
+ azureBlobStorage:
+ - accountName: ${ACCOUNT_NAME} # required
+ endpoint: ${CUSTOM_ENDPOINT} # custom endpoint will require either aadCredentials or sasToken
+ aadCredential:
+ clientId: ${CLIENT_ID}
+ tenantId: ${TENANT_ID}
+ clientSecret: ${CLIENT_SECRET}
+```
+
+Using Azure storage account SAS token:
+
+```yaml
+integrations:
+ azureBlobStorage:
+ - accountName: ${ACCOUNT_NAME} # required
+ endpoint: ${CUSTOM_ENDPOINT} # custom endpoint will require either aadCredentials or sasToken
+ sasToken: ${SAS_TOKEN}
+```
+
+Using Azure storage account access key:
+
+```yaml
+integrations:
+ azureBlobStorage:
+ - accountName: ${ACCOUNT_NAME} # required
+ endpoint: ${CUSTOM_ENDPOINT} # custom endpoint will require either aadCredentials or sasToken
+ accountKey: ${ACCOUNT_KEY}
+```
diff --git a/docs/overview/architecture-overview.md b/docs/overview/architecture-overview.md
index 2295a3e503..c745719e08 100644
--- a/docs/overview/architecture-overview.md
+++ b/docs/overview/architecture-overview.md
@@ -323,11 +323,8 @@ backend:
cache:
store: redis
connection: redis://user:pass@cache.example.com:6379
- useRedisSets: true
```
-The useRedisSets flag is explained [here](https://github.com/jaredwray/keyv/tree/main/packages/redis#useredissets).
-
Contributions supporting other cache stores are welcome!
## Containerization
diff --git a/docs/plugins/integrating-search-into-plugins.md b/docs/plugins/integrating-search-into-plugins.md
index 05d07feb08..e51b4cfefa 100644
--- a/docs/plugins/integrating-search-into-plugins.md
+++ b/docs/plugins/integrating-search-into-plugins.md
@@ -106,15 +106,12 @@ Imagine your FAQs can be retrieved at the URL `https://backstage.example.biz/faq
Below we provide an example implementation of how the FAQ collator factory could look like using our new document type, placed in the `plugins/search-backend-module-faq-snippets-collator/src/factory.ts` file:
```ts
-import fetch from 'node-fetch';
import { Readable } from 'stream';
-
import {
LoggerService,
RootConfigService,
} from '@backstage/backend-plugin-api';
import { DocumentCollatorFactory } from '@backstage/plugin-search-common';
-
import { FaqSnippetDocument } from './types';
const DEFAULT_BASE_URL = 'https://backstage.example.biz/faq-snippets';
diff --git a/docs/releases/v1.33.0-changelog.md b/docs/releases/v1.33.0-changelog.md
new file mode 100644
index 0000000000..f8c9c17aeb
--- /dev/null
+++ b/docs/releases/v1.33.0-changelog.md
@@ -0,0 +1,2659 @@
+# Release v1.33.0
+
+Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.33.0](https://backstage.github.io/upgrade-helper/?to=1.33.0)
+
+## @backstage/backend-dynamic-feature-service@0.5.0
+
+### Minor Changes
+
+- e939cd7: **BREAKING** The `dynamicPluginsFeatureLoader` options related to the root logger behavior (`transports`, `level`, `format`) are now gathered under a single `logger` option which is a function taking an optional `Config` argument and returning the logger options.
+
+ This breaking change is required for 2 reasons:
+
+ - it's totally possible that the current `Config` would be required to provide the logger options,
+ - the logger-related options should be gathered under a common `logger` option because, when the root auditing service is introduced, distinct but similarly-named options would be required for the auditor as well.
+
+### Patch Changes
+
+- 1aeec12: Enhance the `CommonJSModuleLoader` to add support for `resolvePackagePath` calls from backend dynamic plugins, with customizable package resolution, and make the `CommonJSModuleLoader` public API.
+ Fixing this backend dynamic plugin limitation related to `resolvePackagePath` is important for backend dynamic plugins which use the database, since database migration scripts systematically use `resolvePackagePath`.
+- 8593dfa: Improve the way alpha packages are supported when loading dynamic backend plugins.
+ The `ScannedPluginPackage` descriptor of dynamic backend plugins loaded from their alpha `package.json` now contain both the main package manifest and the alpha manifest. Previously it used to contain only the content of the alpha `package.json`, which is nearly empty.
+ This will make it easier to use or display metadata of loaded dynamic backend plugins, which is contained in the main manifest.
+- 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-catalog-backend@1.28.0
+ - @backstage/plugin-events-backend@0.3.16
+ - @backstage/config-loader@1.9.2
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-search-backend-node@1.3.5
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/backend-app-api@1.0.2
+ - @backstage/cli-common@0.1.15
+ - @backstage/plugin-scaffolder-node@0.6.0
+ - @backstage/cli-node@0.2.10
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-app-node@0.1.27
+ - @backstage/plugin-permission-node@0.8.5
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/backend-openapi-utils@0.3.0
+
+### Minor Changes
+
+- 1440232: Adds a new `createValidatedOpenApiRouterFromGeneratedEndpointMap` function that uses the new static server generation in `backstage-cli package schema openapi generate --server` to create a typed express router.
+
+### Patch Changes
+
+- f01787a: Moves msw from dependencies to devDependencies
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/errors@1.2.5
+
+## @backstage/backend-test-utils@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
+
+## @backstage/catalog-client@1.8.0
+
+### Minor Changes
+
+- 656d1ef: Internal update to use the updated generated code from `backstage-cli package schema openapi generate --client-package ...`.
+- 31c4fe0: The client now automatically splits up very large `getEntitiesByRefs` calls into several smaller requests behind the scenes when needed. This ensures that each individual request does not exceed common Express.js request body limits or overload the server.
+
+### Patch Changes
+
+- 873f89a: Fix for certain filter fields in the `catalogApiMock` being case sensitive.
+- Updated dependencies
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+
+## @backstage/cli@0.29.0
+
+### Minor Changes
+
+- bc47b17: **BREAKING**: Updates ESLint config to ignore all generated source code under `src/**/generated/**/*.ts`.
+
+- 6819f8c: Added a new optimization to the `repo test` command that will filter out unused packages in watch mode if all provide filters are paths that point from the repo root. This significantly speeds up running individual tests from the repo root in a large workspace, for example:
+
+ ```sh
+ yarn test packages/app/src/App.test.tsx
+ ```
+
+- d849865: The package packing now populates `typesVersions` for additional entry points rather than using additional `package.json` files for type resolution. This improves auto completion of separate entry points when consuming published packages.
+
+- bc71665: **BREAKING**: The `LEGACY_BACKEND_START` flag has been removed, along with support for `src/run.ts` as the development entry point.
+
+### Patch Changes
+
+- 4046d53: Fixed an issue where the `--successCache` option for the `repo test` and `repo lint` commands would be include the workspace path in generated cache keys. This previously broke caching in environments where the workspace path varies across builds.
+
+- 4a378d3: Fix dev server reloads of plugin discovery for new frontend system.
+
+- 28b60ad: The check for `react-dom/client` in the Jest configuration will now properly always run from the target directory.
+
+- 6b2888c: Fixed an issue with the `--successCache` flag for `repo test` where the tree hash for the wrong package directory would sometimes be used to generate the cache key.
+
+- e30b65d: Added `--alwaysPack` as a replacement for the now hidden `--alwaysYarnPack` flag for the `build-workspace` command.
+
+- be0278e: Removed circular import
+
+- a7f97e4: Added a new `"rejectFrontendNetworkRequests"` configuration flag that can be set in the `"jest"` field in the root `package.json`:
+
+ ```json
+ {
+ "jest": {
+ "rejectFrontendNetworkRequests": true
+ }
+ }
+ ```
+
+ This flag causes rejection of any form of network requests that are attempted to be made in frontend or common package tests. This flag can only be set in the root `package.json` and can not be overridden in individual package configurations.
+
+- 6c48ebd: Add `--max-warnings -1` support to `backstage-cli package lint`
+
+- 04297a0: The `--successCache` option for the `repo test` and `repo lint` commands now use an additive store that keeps old entries around for a week before they are cleaned up automatically.
+
+- a2f0559: When using the experimental Rspack flag the app build and dev server now injects configuration via a `` tag in `index.html` rather than the `process.env.APP_CONFIG` definition, which will now be defined as an empty array instead.
+
+ This requires the app to be using the config loader from the 1.31 release of Backstage. Make sure your app is using at least that version if you are upgrading to this version of the CLI.
+
+ If you have copied the implementation of the `defaultConfigLoader`, make sure to update it to the new implementation. In particular the config loader needs to be able to read configuration from `script` tags with the type `backstage.io/config`.
+
+- b4627f2: Fixed an issue where the `raw-loader` for loading HTML templates was not resolved from the context of the CLI package.
+
+- cd1ef2b: Updated dependency `vite` to `^5.0.0`.
+
+- 23f1da2: Updated dependency `ts-morph` to `^24.0.0`.
+
+- b533056: Updated dependency `css-loader` to `^7.0.0`.
+
+- be008c3: Updated dependency `@module-federation/enhanced` to `^0.7.0`.
+
+- 6266ed3: Updated dependency `del` to `^8.0.0`.
+
+- 4046d53: Fixed an issue with the `repo lint` command where the cache key for the `--successCache` option would not properly ignore files that should be ignored according to `.eslintignore`s.
+
+- e19c53c: Fix for the `--link` flag for `package start` to deduplicate `react-router` and `react-router-dom`.
+
+- 17850a5: Update upgrade-helper link in `versions:bump` command to include `yarnPlugin` parameter when the yarn plugin is installed
+
+- 09ea093: Fixed an issue where `.css` style injection would fail for published packages.
+
+- 702f41d: Bumped dev dependencies `@types/node`
+
+- 5d74716: Remove unused backend-common dependency
+
+- b084f5a: Bump the Webpack dependency range to `^5.94.0`, as our current configuration is not compatible with some older versions.
+
+- e565f73: Added support for `.webp` files in the frontend tooling.
+
+- 946fa34: Added a new `--link ` option for frontend builds that allow you to override module resolution to link in an external workspace at runtime.
+
+ As part of this change the Webpack linked workspace resolution plugin for frontend builds has been removed. It was in place to support the old workspace linking where it was done by Yarn, which is no longer a working option.
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/config-loader@1.9.2
+ - @backstage/cli-common@0.1.15
+ - @backstage/catalog-model@1.7.1
+ - @backstage/cli-node@0.2.10
+ - @backstage/errors@1.2.5
+ - @backstage/eslint-plugin@0.1.10
+ - @backstage/integration@1.15.2
+ - @backstage/release-manifests@0.0.11
+
+## @backstage/config@1.3.0
+
+### Minor Changes
+
+- d52d7f9: Make `readDurationFromConfig` support both ISO and ms formats as well, to make it easier to enter time as an end user
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/errors@1.2.5
+
+## @backstage/core-components@0.16.0
+
+### Minor Changes
+
+- dc409c5: The SupportButton component will now be hidden if no support config is specified in app-config
+
+### Patch Changes
+
+- 0f18340: Change core component Table tool bar search box to the a appropriate Search icon and text
+
+- af9097e: Adds the ability to mock a media query per break point and to change the active break point during a test. Usage example:
+
+ ```ts
+ const { set } = mockBreakpoint({
+ initialBreakpoint: 'md',
+ queryBreakpointMap: {
+ '(min-width:1500px)': 'xl',
+ '(min-width:1000px)': 'lg',
+ '(min-width:700px)': 'md',
+ '(min-width:400px)': 'sm',
+ '(min-width:0px)': 'xs',
+ },
+ });
+ // assertions for when the active break point is "md"
+ set('lg');
+ // assertions for when the active break point is "lg"
+ ```
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/theme@0.6.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/version-bridge@1.0.10
+
+## @backstage/repo-tools@0.11.0
+
+### Minor Changes
+
+- 1440232: `backstage-repo-tools package schema openapi generate --server` now generates complete TS interfaces for all request/response objects in your OpenAPI schema. This fixes an edge case around recursive schemas and standardizes both the generated client and server to have similar generated types.
+- 47fdbb4: Adds a `--watch` mode to the `schema openapi generate` command for a better local schema writing experience.
+
+### Patch Changes
+
+- 95401a8: The `generate-patch` command now properly includes newly created files in the patch.
+- 23f1da2: Updated dependency `ts-morph` to `^24.0.0`.
+- 3f1fb21: The `generate-patch` command will now fall back to always adding a `resolutions` entry, even if no matching descriptors are found.
+- dde85ee: Added a new `generate-patch` command that can be used to generate patches for current changes in a source workspace to be installed it a target workspace.
+- 702f41d: Bumped dev dependencies `@types/node`
+- Updated dependencies
+ - @backstage/config-loader@1.9.2
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/cli-common@0.1.15
+ - @backstage/catalog-model@1.7.1
+ - @backstage/cli-node@0.2.10
+ - @backstage/errors@1.2.5
+
+## @backstage/types@1.2.0
+
+### Minor Changes
+
+- c5e39e7: Introduce `createDeferred` and `DeferredPromise`.
+
+## @backstage/plugin-api-docs@0.12.0
+
+### Minor Changes
+
+- 6836522: Added support for pagination in api-docs plugin - DefaultApiExplorerPage
+
+### Patch Changes
+
+- 11f57de: bump `@asyncapi/react-component` to latest `2.x`
+- 3cd1dee: Uses theme values to style the API definition schema so that theme overrides apply.
+- Updated dependencies
+ - @backstage/plugin-catalog@1.25.0
+ - @backstage/plugin-catalog-react@1.14.1
+ - @backstage/core-components@0.16.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/plugin-app-backend@0.4.0
+
+### Minor Changes
+
+- 815b702: Configuration is no longer injected into static assets if a `index.html.tmpl` file is present.
+
+### Patch Changes
+
+- 815b702: The `index.html` templating is now done and served from memory rather than written to the filesystem. This means that you can now use config injection with a read-only filesystem, and you no longer need to use the `app.disableConfigInjection` flag.
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/config-loader@1.9.2
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-app-node@0.1.27
+
+## @backstage/plugin-auth-backend@0.24.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
+
+- d52d7f9: Support ISO and ms string forms of durations in config too
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/config@1.3.0
+ - @backstage/plugin-auth-backend-module-google-provider@0.2.2
+ - @backstage/types@1.2.0
+ - @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.0
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.2
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-auth-backend-module-oidc-provider@0.3.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-auth-backend-module-atlassian-provider@0.3.2
+ - @backstage/plugin-auth-backend-module-auth0-provider@0.1.2
+ - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.2
+ - @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.2
+ - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.2
+ - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.2
+ - @backstage/plugin-auth-backend-module-github-provider@0.2.2
+ - @backstage/plugin-auth-backend-module-gitlab-provider@0.2.2
+ - @backstage/plugin-auth-backend-module-microsoft-provider@0.2.2
+ - @backstage/plugin-auth-backend-module-oauth2-provider@0.3.2
+ - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.2
+ - @backstage/plugin-auth-backend-module-okta-provider@0.1.2
+ - @backstage/plugin-auth-backend-module-onelogin-provider@0.2.2
+
+## @backstage/plugin-auth-backend-module-aws-alb-provider@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
+
+## @backstage/plugin-catalog@1.25.0
+
+### Minor Changes
+
+- 50df3c8: - Updated EntityLayout component to implement breadcrumb navigation based on the entity relations.
+
+ - Added parentEntityRelations prop to EntityLayoutProps to specify relation types for parent entities.
+
+- 79e9631: Allow `OffsetPaginatedCatalogTable` to configure Table options and `CursorPaginatedCatalogTable` to configure `paginationPosition`.
+
+### Patch Changes
+
+- 2a67594: Fixed an issue causing the `CatalogIndexPage` to not properly filter results when using offset pagination.
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-react@1.14.1
+ - @backstage/plugin-scaffolder-common@1.5.7
+ - @backstage/core-components@0.16.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/integration-react@1.2.1
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-react@0.4.28
+ - @backstage/plugin-search-common@1.2.15
+ - @backstage/plugin-search-react@1.8.2
+
+## @backstage/plugin-catalog-backend@1.28.0
+
+### Minor Changes
+
+- 39fd704: Internal update to use the new generated server types from `backstage-cli package schema openapi generate --server`.
+- 76857da: Added `entity_ref` column to `final_entities` in order to move `refresh_state` away from the read path
+- 34d4360: Drop redundant indices from the database.
+
+ The following redundant indices are removed in this version:
+
+ - `final_entities_entity_id_idx` - overlaps with `final_entities_pkey`
+ - `refresh_state_entity_id_idx` - overlaps with `refresh_state_pkey`
+ - `refresh_state_entity_ref_idx` - overlaps with `refresh_state_entity_ref_uniq`
+ - `search_key_idx` and `search_value_idx` - these were replaced by the composite index `search_key_value_idx` in #22594
+
+ No negative end user impact is expected, but rather that performance should increase due to less index churn.
+
+### Patch Changes
+
+- d52d7f9: Support ISO and ms string forms of durations in config too
+- b89834b: Fixed an issue where entities would not be marked for restitching if only the target of a relationship changed.
+- 1bf02cc: Fixed bug when searching an entity by `spec.profile.displayName` in the catalog on the frontend. Text filter fields were not applied correctly to the database query resulting in empty results.
+- 4e58bc7: Upgrade to uuid v11 internally
+- 5efde17: Internal refactor to slightly speed up the processing loop
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-search-backend-module-catalog@0.2.5
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/backend-openapi-utils@0.3.0
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-node@0.8.5
+
+## @backstage/plugin-catalog-backend-module-gitlab@0.5.0
+
+### Minor Changes
+
+- 1b5fdd9: Extended the configuration with the `includeArchivedRepos` property, which allows including repositories when the project is archived.
+
+### Patch Changes
+
+- 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/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/integration@1.15.2
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.6.0
+
+### Minor Changes
+
+- 6cf91c5: Use `HumanDuration` for all duration needs in the public API, instead of `luxon` types. These are generally compatible, with a few caveats:
+
+ - If you scheduled things to run quarterly (`quarter` or `quarters`), you can use `{ months: 3 }` instead.
+ - If you used the singular nouns such as `year: 1`, use plurals instead (e.g. `years: 1`).
+
+### Patch Changes
+
+- c5e39e7: Internal refactor to use the deferred from the types package
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-backend@1.28.0
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-catalog-backend-module-ldap@0.10.0
+
+### Minor Changes
+
+- 415aeb3: Add Support for Google LDAP Vendor
+
+### Patch Changes
+
+- 884a86c: Added a `dnCaseSensitive` flag to support LDAP servers with mixed-case attributes.
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-catalog-node@1.14.0
+
+### Minor Changes
+
+- bc13b42: The `catalogServiceRef` now has its own accompanying `CatalogService` interface that requires Backstage `credentials` objects to be passed. This new version of the `catalogServiceRef` has been promoted and is now available via the main `@backstage/plugin-catalog-node` entry point.
+
+ The old `catalogServiceRef` with the old `CatalogApi` type is still available from the `/alpha` entry point.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/types@1.2.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-node@0.8.5
+
+## @backstage/plugin-kubernetes@0.12.0
+
+### Minor Changes
+
+- 71b8704: Bumping @kubernetes/client-node to 1.0.0-rc7 to mitigate CVEs related to the request and tough-cookie packages
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-kubernetes-react@0.5.0
+ - @backstage/plugin-catalog-react@1.14.1
+ - @backstage/core-components@0.16.0
+ - @backstage/plugin-kubernetes-common@0.9.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.1
+
+## @backstage/plugin-kubernetes-backend@0.19.0
+
+### Minor Changes
+
+- 71b8704: Bumping @kubernetes/client-node to 1.0.0-rc7 to mitigate CVEs related to the request and tough-cookie packages
+
+### Patch Changes
+
+- bee9664: Adapted the config.d.ts for custom k8s cluster authProvider implementations
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/plugin-kubernetes-common@0.9.0
+ - @backstage/plugin-kubernetes-node@0.2.0
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-permission-node@0.8.5
+
+## @backstage/plugin-kubernetes-common@0.9.0
+
+### Minor Changes
+
+- 71b8704: Bumping @kubernetes/client-node to 1.0.0-rc7 to mitigate CVEs related to the request and tough-cookie packages
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/catalog-model@1.7.1
+
+## @backstage/plugin-kubernetes-node@0.2.0
+
+### Minor Changes
+
+- 71b8704: Bumping @kubernetes/client-node to 1.0.0-rc7 to mitigate CVEs related to the request and tough-cookie packages
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/plugin-kubernetes-common@0.9.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/catalog-model@1.7.1
+
+## @backstage/plugin-kubernetes-react@0.5.0
+
+### Minor Changes
+
+- 71b8704: Bumping @kubernetes/client-node to 1.0.0-rc7 to mitigate CVEs related to the request and tough-cookie packages
+
+### Patch Changes
+
+- 0b729da: add the pod delete feature to the kubernetes react plugin
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/core-components@0.16.0
+ - @backstage/plugin-kubernetes-common@0.9.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-notifications@0.4.0
+
+### Minor Changes
+
+- 87ffc1c: Rephrasing labels of the View filter to be more clear. Based on the received users' feedback.
+
+### Patch Changes
+
+- 4186105: Added title to the Notifications' table. The title clearly states the filter selection and total count of messages. This change aligns the look and feel closer to other tables.
+- 3a0731e: The "Created after" filter renamed to the "Sent out" based on the received users' feedback.
+- 3e135f2: The notification's title is emphasized to be clearly distinguished from the description.
+- 97ba58f: Add support for user specific notification settings
+- 1d87c43: Show count of unread notifications in the left-side MenuItem. This replaces the simple true/false bullet.
+- Updated dependencies
+ - @backstage/theme@0.6.1
+ - @backstage/types@1.2.0
+ - @backstage/core-components@0.16.0
+ - @backstage/plugin-notifications-common@0.0.6
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-signals-react@0.0.7
+
+## @backstage/plugin-scaffolder@1.27.0
+
+### Minor Changes
+
+- f61d4cc: Add scaffolder permission `scaffolder.template.management` for accessing the template management features
+- 69fb6e7: Fix `contextMenu` not being disabled bug in new scaffolder pages
+
+### Patch Changes
+
+- 99471cd: fix(scaffolder): use `onInputChange` in `RepoUrlPicker` to fix issue with the value not updating properly
+- 8e4bed4: Updated dependency `idb-keyval` to `5.1.5`.
+- 7669af3: Revert the change of the option label for `EntityPicker`
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-scaffolder-react@1.14.0
+ - @backstage/plugin-catalog-react@1.14.1
+ - @backstage/plugin-scaffolder-common@1.5.7
+ - @backstage/core-components@0.16.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/integration@1.15.2
+ - @backstage/integration-react@1.2.1
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/plugin-scaffolder-backend@1.27.0
+
+### Minor Changes
+
+- 0587633: Bumped the `isolated-vm` dependency from v4 to v5, which drops support for Node.js v16.
+- e61d5ef: BREAKING EXPERIMENTAL: The `checkpoint` method now takes an object instead of previous arguments.
+
+ ```ts
+ await ctx.checkpoint({ key: 'repo.create', fn: () => ockokit.repo.create({...})})
+ ```
+
+ You can also now return `void` from the checkpoint if the method returns `void` inside the `checkpoint` handler.
+
+### Patch Changes
+
+- 6aa5b98: Fix tasks listing with postgres
+- 59137ff: Fix issue with token not being available because it's now non-enumerable
+- c5e39e7: Internal refactor to use the deferred from the types package
+- e4f5d95: Align with type declaration of template filter/global function by supporting undefined as return value.
+- d52d7f9: Support ISO and ms string forms of durations in config too
+- 7ab3371: Modified `createDryRunner` and corresponding route to include `templateMetaData` inside the `templateInfo`. This allows custom action writers to access things like `templateInfo.entity.metadata.name` via the action context while executing templates using the dry run framework.
+- 4e58bc7: Upgrade to uuid v11 internally
+- 2dae341: Add new `fs:readdir` action to list current content of the workspace
+- 97ba58f: Add example template for notification sending
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/config@1.3.0
+ - @backstage/backend-defaults@0.5.3
+ - @backstage/types@1.2.0
+ - @backstage/plugin-scaffolder-backend-module-gitlab@0.6.1
+ - @backstage/plugin-scaffolder-common@1.5.7
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/plugin-bitbucket-cloud-common@0.2.25
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.2
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.2
+ - @backstage/plugin-scaffolder-node@0.6.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.2
+ - @backstage/plugin-permission-node@0.8.5
+ - @backstage/plugin-scaffolder-backend-module-azure@0.2.2
+ - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.2
+ - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.2
+ - @backstage/plugin-scaffolder-backend-module-gitea@0.2.2
+ - @backstage/plugin-scaffolder-backend-module-github@0.5.2
+
+## @backstage/plugin-scaffolder-node@0.6.0
+
+### Minor Changes
+
+- e61d5ef: BREAKING EXPERIMENTAL: The `checkpoint` method now takes an object instead of previous arguments.
+
+ ```ts
+ await ctx.checkpoint({ key: 'repo.create', fn: () => ockokit.repo.create({...})})
+ ```
+
+ You can also now return `void` from the checkpoint if the method returns `void` inside the `checkpoint` handler.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/plugin-scaffolder-common@1.5.7
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+
+## @backstage/plugin-scaffolder-react@1.14.0
+
+### Minor Changes
+
+- 69fb6e7: Fix `contextMenu` not being disabled bug in new scaffolder pages
+
+### Patch Changes
+
+- 8b5ff7e: Fix issue with form state not refreshing when updating
+- ade301c: Fix issue with `Stepper` and trying to trim additional properties. This is now all behind `liveOmit` and `omitExtraData` instead.
+- f61d4cc: Add scaffolder permission `scaffolder.template.management` for accessing the template management features
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/theme@0.6.1
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-react@1.14.1
+ - @backstage/plugin-scaffolder-common@1.5.7
+ - @backstage/core-components@0.16.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/version-bridge@1.0.10
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/plugin-search-backend@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
+
+## @backstage/app-defaults@1.5.13
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/theme@0.6.1
+ - @backstage/core-components@0.16.0
+ - @backstage/core-app-api@1.15.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/backend-app-api@1.0.2
+
+### Patch Changes
+
+- 4e58bc7: Upgrade to uuid v11 internally
+- 5d74716: Remove unused backend-common dependency
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/config-loader@1.9.2
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/cli-common@0.1.15
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-permission-node@0.8.5
+
+## @backstage/backend-defaults@0.5.3
+
+### Patch Changes
+
+- bf306cb: Removed dependency `@backstage/backend-common`.
+- e30bb46: Disabling database migrations now correctly uses the `backend.default.skipMigrations` config value.
+- d52d7f9: Support ISO and ms string forms of durations in config too
+- f6eaec2: Link to proper package in `rootLoggerServiceFactory` doc string.
+- ecf6b39: Use `node-fetch` instead of native fetch, as per
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/types@1.2.0
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/config-loader@1.9.2
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/backend-app-api@1.0.2
+ - @backstage/cli-common@0.1.15
+ - @backstage/backend-dev-utils@0.1.5
+ - @backstage/cli-node@0.2.10
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+ - @backstage/plugin-permission-node@0.8.5
+
+## @backstage/backend-plugin-api@1.0.2
+
+### Patch Changes
+
+- d52d7f9: Support ISO and ms string forms of durations in config too
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/cli-common@0.1.15
+ - @backstage/errors@1.2.5
+
+## @backstage/catalog-model@1.7.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/errors@1.2.5
+
+## @backstage/cli-common@0.1.15
+
+### Patch Changes
+
+- 702f41d: Bumped dev dependencies `@types/node`
+
+## @backstage/cli-node@0.2.10
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/cli-common@0.1.15
+ - @backstage/errors@1.2.5
+
+## @backstage/codemods@0.1.52
+
+### Patch Changes
+
+- 702f41d: Bumped dev dependencies `@types/node`
+- Updated dependencies
+ - @backstage/cli-common@0.1.15
+
+## @backstage/config-loader@1.9.2
+
+### Patch Changes
+
+- c5e39e7: Internal refactor to use the deferred from the types package
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/cli-common@0.1.15
+ - @backstage/errors@1.2.5
+
+## @backstage/core-app-api@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
+
+## @backstage/core-compat-api@0.3.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/version-bridge@1.0.10
+
+## @backstage/core-plugin-api@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
+
+## @backstage/create-app@0.5.22
+
+### Patch Changes
+
+- 7907e3b: Bumped create-app version.
+- 42386c2: Bumped create-app version.
+- 702f41d: Updated engines to support Node 20 or 22
+- a917f86: This update adds the @backstage/repo-tools package to the versions.ts file, enabling proper version resolution for templates. The {{version '@backstage/repo-tools'}} placeholder now works as expected in the create-app process.
+- 5872964: Use the main entrypoint for `create-app` installs
+- 702f41d: Bumped dev dependencies `@types/node`
+- Updated dependencies
+ - @backstage/cli-common@0.1.15
+
+## @backstage/dev-utils@1.1.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/theme@0.6.1
+ - @backstage/plugin-catalog-react@1.14.1
+ - @backstage/core-components@0.16.0
+ - @backstage/core-app-api@1.15.2
+ - @backstage/app-defaults@1.5.13
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/integration-react@1.2.1
+
+## @backstage/errors@1.2.5
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+
+## @backstage/frontend-app-api@0.10.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/core-app-api@1.15.2
+ - @backstage/frontend-defaults@0.1.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/version-bridge@1.0.10
+
+## @backstage/frontend-defaults@0.1.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/errors@1.2.5
+ - @backstage/frontend-app-api@0.10.1
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/plugin-app@0.1.2
+
+## @backstage/frontend-plugin-api@0.9.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/core-components@0.16.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/version-bridge@1.0.10
+
+## @backstage/frontend-test-utils@0.2.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/frontend-app-api@0.10.1
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/test-utils@1.7.1
+ - @backstage/version-bridge@1.0.10
+ - @backstage/plugin-app@0.1.2
+
+## @backstage/integration@1.15.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+
+## @backstage/integration-aws-node@0.1.13
+
+### Patch Changes
+
+- 52ae92d: The `getDefaultCredentialsChain` function now accepts and applies a `region` parameter, preventing it from defaulting to `us-east-1` when no region is specified.
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+
+## @backstage/integration-react@1.2.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/integration@1.15.2
+
+## @techdocs/cli@1.8.22
+
+### Patch Changes
+
+- 702f41d: Bumped dev dependencies `@types/node`
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/backend-defaults@0.5.3
+ - @backstage/cli-common@0.1.15
+ - @backstage/catalog-model@1.7.1
+ - @backstage/plugin-techdocs-node@1.12.13
+
+## @backstage/test-utils@1.7.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/theme@0.6.1
+ - @backstage/types@1.2.0
+ - @backstage/core-app-api@1.15.2
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/theme@0.6.1
+
+### Patch Changes
+
+- ea75c37: Internal refactor to avoid top-level imports from MUI.
+
+## @backstage/plugin-app@0.1.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/theme@0.6.1
+ - @backstage/core-components@0.16.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/integration-react@1.2.1
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/plugin-app-node@0.1.27
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config-loader@1.9.2
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-app-visualizer@0.1.12
+
+### Patch Changes
+
+- e586e77: New `devDependency` for local development setup.
+- Updated dependencies
+ - @backstage/core-components@0.16.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.1
+
+## @backstage/plugin-auth-backend-module-atlassian-provider@0.3.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-auth-backend-module-auth0-provider@0.1.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-auth-backend-module-azure-easyauth-provider@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
+
+## @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-auth-backend-module-cloudflare-access-provider@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
+
+## @backstage/plugin-auth-backend-module-gcp-iap-provider@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
+
+## @backstage/plugin-auth-backend-module-github-provider@0.2.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-auth-backend-module-gitlab-provider@0.2.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-auth-backend-module-google-provider@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
+
+## @backstage/plugin-auth-backend-module-guest-provider@0.2.2
+
+### Patch Changes
+
+- 5d74716: Remove unused backend-common dependency
+- 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
+
+## @backstage/plugin-auth-backend-module-microsoft-provider@0.2.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-auth-backend-module-oauth2-provider@0.3.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-auth-backend-module-oauth2-proxy-provider@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
+
+## @backstage/plugin-auth-backend-module-oidc-provider@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
+
+## @backstage/plugin-auth-backend-module-okta-provider@0.1.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-auth-backend-module-onelogin-provider@0.2.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-auth-backend-module-pinniped-provider@0.2.2
+
+### 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-auth-backend-module-vmware-cloud-provider@0.4.1
+
+### 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/plugin-auth-node@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
+
+## @backstage/plugin-auth-react@0.1.8
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-bitbucket-cloud-common@0.2.25
+
+### Patch Changes
+
+- 23f1da2: Updated dependency `ts-morph` to `^24.0.0`.
+- Updated dependencies
+ - @backstage/integration@1.15.2
+
+## @backstage/plugin-catalog-backend-module-aws@0.4.5
+
+### Patch Changes
+
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/backend-defaults@0.5.3
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/plugin-kubernetes-common@0.9.0
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-catalog-backend-module-azure@0.2.4
+
+### Patch Changes
+
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/integration@1.15.2
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.2
+
+### Patch Changes
+
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/backend-openapi-utils@0.3.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.4.2
+
+### Patch Changes
+
+- 4e58bc7: Upgrade to uuid v11 internally
+- f6b4b8a: Implemented discovery on project-level to shift Bitbucket Cloud API limits
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/plugin-bitbucket-cloud-common@0.2.25
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/integration@1.15.2
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-catalog-backend-module-bitbucket-server@0.2.4
+
+### Patch Changes
+
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+
+## @backstage/plugin-catalog-backend-module-gcp@0.3.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/plugin-kubernetes-common@0.9.0
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/catalog-model@1.7.1
+
+## @backstage/plugin-catalog-backend-module-gerrit@0.2.4
+
+### Patch Changes
+
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+
+## @backstage/plugin-catalog-backend-module-github@0.7.7
+
+### Patch Changes
+
+- 9790c02: Fixed an issue in `GithubOrgEntityProvider` that caused an error when processing teams without a parent.
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/plugin-catalog-backend@1.28.0
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/integration@1.15.2
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-catalog-backend-module-github-org@0.3.4
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/plugin-catalog-backend-module-github@0.7.7
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-catalog-backend-module-gitlab@0.5.0
+
+## @backstage/plugin-catalog-backend-module-logs@0.1.4
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/plugin-catalog-backend@1.28.0
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-catalog-backend-module-msgraph@0.6.4
+
+### Patch Changes
+
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-catalog-backend-module-openapi@0.2.4
+
+### Patch Changes
+
+- 5f058e2: Updated dependency `@apidevtools/json-schema-ref-parser` to `^11.0.0`.
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-backend@1.28.0
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/integration@1.15.2
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-catalog-backend-module-puppetdb@0.2.4
+
+### Patch Changes
+
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-common@1.5.7
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-catalog-backend-module-unprocessed@0.5.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-catalog-unprocessed-entities-common@0.0.5
+
+## @backstage/plugin-catalog-common@1.1.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-catalog-graph@0.4.12
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-react@1.14.1
+ - @backstage/core-components@0.16.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.1
+
+## @backstage/plugin-catalog-import@0.12.6
+
+### Patch Changes
+
+- ea5b7f3: Fixed parsing of catalog-info.yaml when creating a PR to register a repository if the file contains more than one document
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/config@1.3.0
+ - @backstage/plugin-catalog-react@1.14.1
+ - @backstage/core-components@0.16.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/integration@1.15.2
+ - @backstage/integration-react@1.2.1
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-catalog-react@1.14.1
+
+### Patch Changes
+
+- 9cc82c0: Fixed bug in `EntityDisplayName` where text was overflowing.
+- 6fcbb3b: Ensure EntityDisplayName component link receives underline on hover.
+- 9670906: Improve UI consistency of default catalog filters
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/types@1.2.0
+ - @backstage/core-components@0.16.0
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/frontend-test-utils@0.2.2
+ - @backstage/integration-react@1.2.1
+ - @backstage/version-bridge@1.0.10
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/plugin-catalog-unprocessed-entities@0.2.10
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-catalog-unprocessed-entities-common@0.0.5
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-permission-common@0.8.2
+
+## @backstage/plugin-config-schema@0.1.61
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/core-components@0.16.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-devtools@0.1.20
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.0
+ - @backstage/core-compat-api@0.3.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/plugin-devtools-common@0.1.13
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/plugin-devtools-backend@0.4.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/config-loader@1.9.2
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/cli-common@0.1.15
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-devtools-common@0.1.13
+ - @backstage/plugin-permission-node@0.8.5
+
+## @backstage/plugin-devtools-common@0.1.13
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/plugin-permission-common@0.8.2
+
+## @backstage/plugin-events-backend@0.3.16
+
+### Patch Changes
+
+- e02a02b: Fix `events.useEventBus` by propagating config to `DefaultEventsService`
+- 9816f51: Add raw body information to `RequestDetails`
+ and use the raw body when validating incoming event requests.
+- b7d0334: Cleaning up event subscriptions after the max age window
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/types@1.2.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/backend-openapi-utils@0.3.0
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-events-backend-module-aws-sqs@0.4.5
+
+### Patch Changes
+
+- d52d7f9: Support ISO and ms string forms of durations in config too
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/types@1.2.0
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-events-backend-module-azure@0.2.14
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-events-backend-module-bitbucket-cloud@0.2.14
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-events-backend-module-gerrit@0.2.14
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-events-backend-module-github@0.2.14
+
+### Patch Changes
+
+- 9816f51: Fix the event request validation for incoming requests for GitHub webhook events
+ by using the raw body when verifying the signature.
+- 9816f51: Add raw body information to `RequestDetails`
+ and use the raw body when validating incoming event requests.
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-events-backend-module-gitlab@0.2.14
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-events-backend-test-utils@0.1.38
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.5
+
+## @backstage/plugin-events-node@0.4.5
+
+### Patch Changes
+
+- 4501631: Fixed an issue where subscribing to events threw an error and gave up too easily. Calling the subscribe method will cause the background polling loop to keep trying to connect to the events backend, even if the initial request fails.
+
+ By default the events service will attempt to publish and subscribe to events from the events bus API in the events backend, but if it fails due to the events backend not being installed, it will bail and never try calling the API again. There is now a new `events.useEventBus` configuration and option for the `DefaultEventsService` that lets you control this behavior. You can set it to `'never'` to disabled API calls to the events backend completely, or `'always'` to never allow it to be disabled.
+
+- e02a02b: Fix `events.useEventBus` by propagating config to `DefaultEventsService`
+
+- 9816f51: Add raw body information to `RequestDetails`
+ and use the raw body when validating incoming event requests.
+
+- 5d74716: Remove unused backend-common dependency
+
+- 0b57aa1: Fixed an issue where the event bus polling would duplicate and increase exponentially over time.
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-home@0.8.1
+
+### Patch Changes
+
+- 8b1b2cf: Improve Starred Entities UI to reduce whitespace and provide more context on the entities:
+
+ - Use the Entity Presentation API (via ``) to display the entity's name
+ - Component's `kind` and `spec.type` are displayed as a secondary text
+ - List items are condensed to reduce unnecessary spacing
+
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/config@1.3.0
+ - @backstage/theme@0.6.1
+ - @backstage/plugin-catalog-react@1.14.1
+ - @backstage/core-components@0.16.0
+ - @backstage/core-app-api@1.15.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/plugin-home-react@0.1.19
+
+## @backstage/plugin-home-react@0.1.19
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.0
+ - @backstage/core-plugin-api@1.10.1
+
+## @backstage/plugin-kubernetes-cluster@0.0.18
+
+### Patch Changes
+
+- 702f41d: Bumped dev dependencies `@types/node`
+- Updated dependencies
+ - @backstage/plugin-kubernetes-react@0.5.0
+ - @backstage/plugin-catalog-react@1.14.1
+ - @backstage/core-components@0.16.0
+ - @backstage/plugin-kubernetes-common@0.9.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-plugin-api@1.10.1
+
+## @backstage/plugin-notifications-backend@0.4.3
+
+### Patch Changes
+
+- 97ba58f: Add support for user specific notification settings
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-notifications-common@0.0.6
+ - @backstage/plugin-notifications-node@0.2.9
+ - @backstage/plugin-signals-node@0.1.14
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-notifications-backend-module-email@0.3.3
+
+### Patch Changes
+
+- d52d7f9: Support ISO and ms string forms of durations in config too
+- 5d74716: Remove unused backend-common dependency
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-notifications-common@0.0.6
+ - @backstage/plugin-notifications-node@0.2.9
+ - @backstage/catalog-model@1.7.1
+
+## @backstage/plugin-notifications-common@0.0.6
+
+### Patch Changes
+
+- 97ba58f: Add support for user specific notification settings
+- Updated dependencies
+ - @backstage/config@1.3.0
+
+## @backstage/plugin-notifications-node@0.2.9
+
+### Patch Changes
+
+- 4e58bc7: Upgrade to uuid v11 internally
+- 5d74716: Remove unused backend-common dependency
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-notifications-common@0.0.6
+ - @backstage/plugin-signals-node@0.1.14
+ - @backstage/catalog-model@1.7.1
+
+## @backstage/plugin-org@0.6.32
+
+### Patch Changes
+
+- a278fdd: Fix rendering of description in MembersListCard. Add guardrails for potential long texts to prevent it from breaking the UI.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.1
+ - @backstage/core-components@0.16.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-org-react@0.1.31
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/plugin-catalog-react@1.14.1
+ - @backstage/core-components@0.16.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-plugin-api@1.10.1
+
+## @backstage/plugin-permission-backend@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
+
+## @backstage/plugin-permission-backend-module-allow-all-policy@0.2.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-permission-node@0.8.5
+
+## @backstage/plugin-permission-common@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
+
+## @backstage/plugin-permission-node@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
+
+## @backstage/plugin-permission-react@0.4.28
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/core-plugin-api@1.10.1
+
+## @backstage/plugin-proxy-backend@0.5.8
+
+### Patch Changes
+
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-scaffolder-backend-module-azure@0.2.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-scaffolder-node@0.6.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+
+## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.2
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.2
+ - @backstage/plugin-scaffolder-node@0.6.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+
+## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.2
+
+### Patch Changes
+
+- 9cf827c: Fix double branch creation in `public:bitbucket{Cloud,Server}:pull-request`
+ This resulted in the following error when using the actions:
+
+ AlreadyExistsError: Failed to create branch at create-test because it already exists.
+
+ The issue was original introduced in d103a48fa306d745599dc0c793668c9e6a479d32
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/plugin-bitbucket-cloud-common@0.2.25
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-scaffolder-node@0.6.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+
+## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.2
+
+### Patch Changes
+
+- 9cf827c: Fix double branch creation in `public:bitbucket{Cloud,Server}:pull-request`
+ This resulted in the following error when using the actions:
+
+ AlreadyExistsError: Failed to create branch at create-test because it already exists.
+
+ The issue was original introduced in d103a48fa306d745599dc0c793668c9e6a479d32
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-scaffolder-node@0.6.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+
+## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-scaffolder-node@0.6.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+
+## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.3
+
+### 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/plugin-scaffolder-node@0.6.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+
+## @backstage/plugin-scaffolder-backend-module-gcp@0.2.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-scaffolder-node@0.6.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+
+## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-scaffolder-node@0.6.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+
+## @backstage/plugin-scaffolder-backend-module-gitea@0.2.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-scaffolder-node@0.6.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+
+## @backstage/plugin-scaffolder-backend-module-github@0.5.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/config@1.3.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-scaffolder-node@0.6.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+
+## @backstage/plugin-scaffolder-backend-module-gitlab@0.6.1
+
+### Patch Changes
+
+- cdc8b4c: Improve error messages from Gitlab
+- 2dbdccb: Removed circular import
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-scaffolder-node@0.6.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+
+## @backstage/plugin-scaffolder-backend-module-notifications@0.1.3
+
+### Patch Changes
+
+- 5d74716: Remove unused backend-common dependency
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-notifications-common@0.0.6
+ - @backstage/plugin-notifications-node@0.2.9
+ - @backstage/plugin-scaffolder-node@0.6.0
+
+## @backstage/plugin-scaffolder-backend-module-rails@0.5.2
+
+### Patch Changes
+
+- 702f41d: Bumped dev dependencies `@types/node`
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-scaffolder-node@0.6.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+
+## @backstage/plugin-scaffolder-backend-module-sentry@0.2.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-scaffolder-node@0.6.0
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.3
+
+### Patch Changes
+
+- 5d74716: Remove unused backend-common dependency
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-scaffolder-node@0.6.0
+ - @backstage/plugin-scaffolder-node-test-utils@0.1.15
+
+## @backstage/plugin-scaffolder-common@1.5.7
+
+### Patch Changes
+
+- f61d4cc: Add scaffolder permission `scaffolder.template.management` for accessing the template management features
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/catalog-model@1.7.1
+
+## @backstage/plugin-scaffolder-node-test-utils@0.1.15
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/backend-test-utils@1.1.0
+ - @backstage/plugin-scaffolder-node@0.6.0
+
+## @backstage/plugin-search@1.4.19
+
+### Patch Changes
+
+- a4ccc82: Removes the card UI from the search results type filter for a cleaner UI consistent with other filters
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-react@1.14.1
+ - @backstage/core-components@0.16.0
+ - @backstage/core-compat-api@0.3.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/version-bridge@1.0.10
+ - @backstage/plugin-search-common@1.2.15
+ - @backstage/plugin-search-react@1.8.2
+
+## @backstage/plugin-search-backend-module-catalog@0.2.5
+
+### Patch Changes
+
+- 0b8f344: Fixed a bug where the `filter` setting of the collator was not permitted to be an array.
+- 1a1e2f4: Fix search collator text formatting for catalog entities without description
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/config@1.3.0
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-search-backend-node@1.3.5
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-backend-module-elasticsearch@1.6.2
+
+### Patch Changes
+
+- dae59c1: Updated dependency `@short.io/opensearch-mock` to `^0.4.0`.
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-search-backend-node@1.3.5
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-backend-module-explore@0.2.5
+
+### Patch Changes
+
+- a9a7c7c: Updated dependency `@backstage-community/plugin-explore-common` to `^0.0.7`.
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-search-backend-node@1.3.5
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-backend-module-pg@0.5.38
+
+### Patch Changes
+
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-search-backend-node@1.3.5
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-backend-module-stack-overflow-collator@0.3.3
+
+### Patch Changes
+
+- 5d74716: Remove unused backend-common dependency
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-search-backend-node@1.3.5
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-backend-module-techdocs@0.3.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/config@1.3.0
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-search-backend-node@1.3.5
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-search-common@1.2.15
+ - @backstage/plugin-techdocs-node@1.12.13
+
+## @backstage/plugin-search-backend-node@1.3.5
+
+### Patch Changes
+
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/backend-defaults@0.5.3
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-common@1.2.15
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/plugin-permission-common@0.8.2
+
+## @backstage/plugin-search-react@1.8.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/theme@0.6.1
+ - @backstage/types@1.2.0
+ - @backstage/core-components@0.16.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/version-bridge@1.0.10
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-signals@0.0.12
+
+### Patch Changes
+
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/theme@0.6.1
+ - @backstage/types@1.2.0
+ - @backstage/core-components@0.16.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/plugin-signals-react@0.0.7
+
+## @backstage/plugin-signals-backend@0.2.3
+
+### Patch Changes
+
+- a1e01ff: The signals backend now supports scaled deployments where clients may be connecting to one of many signal backend instances.
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-signals-node@0.1.14
+
+## @backstage/plugin-signals-node@0.1.14
+
+### Patch Changes
+
+- 4e58bc7: Upgrade to uuid v11 internally
+- 5d74716: Remove unused backend-common dependency
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+
+## @backstage/plugin-signals-react@0.0.7
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/core-plugin-api@1.10.1
+
+## @backstage/plugin-techdocs@1.11.1
+
+### Patch Changes
+
+- 37a7810: Fixed an issue where `` would re-render infinitely under certain conditions.
+- e937ae7: Fix an issue with index page of documentation site being re-rendered.
+- 90246a9: Fix techdocs config schema for custom elements sanitizer
+- 605bdc0: Avoid page re-rendering when clicking on anchor links in the same documentation page.
+- 4f0cb89: Added DomPurify sanitizer configuration for custom elements implementing RFC .
+ See for how to enable it in the configuration.
+- f246178: Removed `canvas` dev dependency.
+- 4a2f73a: Fix an issue that caused the current documentation page to be re-rendered when navigating to
+ another one.
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/theme@0.6.1
+ - @backstage/plugin-catalog-react@1.14.1
+ - @backstage/core-components@0.16.0
+ - @backstage/plugin-techdocs-react@1.2.10
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/integration@1.15.2
+ - @backstage/integration-react@1.2.1
+ - @backstage/plugin-auth-react@0.1.8
+ - @backstage/plugin-search-common@1.2.15
+ - @backstage/plugin-search-react@1.8.2
+ - @backstage/plugin-techdocs-common@0.1.0
+
+## @backstage/plugin-techdocs-addons-test-utils@1.0.41
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog@1.25.0
+ - @backstage/plugin-techdocs@1.11.1
+ - @backstage/plugin-catalog-react@1.14.1
+ - @backstage/plugin-techdocs-react@1.2.10
+ - @backstage/core-app-api@1.15.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/integration-react@1.2.1
+ - @backstage/test-utils@1.7.1
+ - @backstage/plugin-search-react@1.8.2
+
+## @backstage/plugin-techdocs-backend@1.11.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/config@1.3.0
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-search-backend-module-techdocs@0.3.2
+ - @backstage/plugin-techdocs-common@0.1.0
+ - @backstage/plugin-techdocs-node@1.12.13
+
+## @backstage/plugin-techdocs-module-addons-contrib@1.1.17
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.0
+ - @backstage/plugin-techdocs-react@1.2.10
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/integration@1.15.2
+ - @backstage/integration-react@1.2.1
+
+## @backstage/plugin-techdocs-node@1.12.13
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+ - @backstage/plugin-search-common@1.2.15
+ - @backstage/plugin-techdocs-common@0.1.0
+
+## @backstage/plugin-techdocs-react@1.2.10
+
+### Patch Changes
+
+- 4a2f73a: Fix an issue that caused the current documentation page to be re-rendered when navigating to
+ another one.
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/core-components@0.16.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/version-bridge@1.0.10
+
+## @backstage/plugin-user-settings@0.8.15
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/theme@0.6.1
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-react@1.14.1
+ - @backstage/core-components@0.16.0
+ - @backstage/core-app-api@1.15.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/plugin-signals-react@0.0.7
+ - @backstage/plugin-user-settings-common@0.0.1
+
+## @backstage/plugin-user-settings-backend@0.2.27
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @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/plugin-signals-node@0.1.14
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-user-settings-common@0.0.1
+
+## example-app@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
+
+## example-app-next@0.0.17
+
+### 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/plugin-app-visualizer@0.1.12
+ - @backstage/core-app-api@1.15.2
+ - @backstage/frontend-defaults@0.1.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-compat-api@0.3.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-app-api@0.10.1
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/integration-react@1.2.1
+ - @backstage/plugin-app@0.1.2
+ - @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-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
+
+## app-next-example-plugin@0.0.17
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.0
+ - @backstage/frontend-plugin-api@0.9.1
+
+## example-backend@0.0.32
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.5.3
+ - @backstage/plugin-app-backend@0.4.0
+ - @backstage/plugin-search-backend-module-catalog@0.2.5
+ - @backstage/plugin-scaffolder-backend@1.27.0
+ - @backstage/plugin-auth-backend@0.24.0
+ - @backstage/plugin-catalog-backend@1.28.0
+ - @backstage/plugin-search-backend@1.7.0
+ - @backstage/plugin-events-backend@0.3.16
+ - @backstage/plugin-kubernetes-backend@0.19.0
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/plugin-search-backend-module-explore@0.2.5
+ - @backstage/plugin-catalog-backend-module-openapi@0.2.4
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-notifications-backend@0.4.3
+ - @backstage/plugin-signals-backend@0.2.3
+ - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.2
+ - @backstage/plugin-search-backend-node@1.3.5
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-proxy-backend@0.5.8
+ - @backstage/plugin-scaffolder-backend-module-notifications@0.1.3
+ - @backstage/plugin-auth-backend-module-guest-provider@0.2.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/plugin-auth-backend-module-github-provider@0.2.2
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.2
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.5.2
+ - @backstage/plugin-devtools-backend@0.4.2
+ - @backstage/plugin-permission-backend@0.5.51
+ - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.2
+ - @backstage/plugin-permission-node@0.8.5
+ - @backstage/plugin-scaffolder-backend-module-github@0.5.2
+ - @backstage/plugin-search-backend-module-techdocs@0.3.2
+ - @backstage/plugin-techdocs-backend@1.11.2
+
+## example-backend-legacy@0.2.104
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/backend-defaults@0.5.3
+ - @backstage/plugin-app-backend@0.4.0
+ - @backstage/plugin-search-backend-module-catalog@0.2.5
+ - @backstage/plugin-scaffolder-backend@1.27.0
+ - @backstage/plugin-auth-backend@0.24.0
+ - @backstage/plugin-catalog-backend@1.28.0
+ - @backstage/plugin-search-backend@1.7.0
+ - @backstage/plugin-events-backend@0.3.16
+ - @backstage/plugin-scaffolder-backend-module-gitlab@0.6.1
+ - @backstage/plugin-kubernetes-backend@0.19.0
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/plugin-search-backend-module-elasticsearch@1.6.2
+ - @backstage/plugin-search-backend-module-explore@0.2.5
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-signals-backend@0.2.3
+ - @backstage/plugin-search-backend-module-pg@0.5.38
+ - @backstage/plugin-search-backend-node@1.3.5
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-proxy-backend@0.5.8
+ - @backstage/plugin-signals-node@0.1.14
+ - @backstage/plugin-scaffolder-backend-module-rails@0.5.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/integration@1.15.2
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.2
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.5.2
+ - @backstage/plugin-devtools-backend@0.4.2
+ - @backstage/plugin-permission-backend@0.5.51
+ - @backstage/plugin-permission-node@0.8.5
+ - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.2
+ - @backstage/plugin-search-backend-module-techdocs@0.3.2
+ - @backstage/plugin-techdocs-backend@1.11.2
+
+## e2e-test@0.2.22
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/create-app@0.5.22
+ - @backstage/cli-common@0.1.15
+ - @backstage/errors@1.2.5
+
+## @internal/frontend@0.0.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/version-bridge@1.0.10
+
+## @internal/scaffolder@0.0.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-react@1.14.0
+
+## techdocs-cli-embedded-app@0.2.102
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.29.0
+ - @backstage/plugin-catalog@1.25.0
+ - @backstage/config@1.3.0
+ - @backstage/theme@0.6.1
+ - @backstage/plugin-techdocs@1.11.1
+ - @backstage/core-components@0.16.0
+ - @backstage/plugin-techdocs-react@1.2.10
+ - @backstage/core-app-api@1.15.2
+ - @backstage/app-defaults@1.5.13
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/integration-react@1.2.1
+ - @backstage/test-utils@1.7.1
+
+## yarn-plugin-backstage@0.0.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli-common@0.1.15
+ - @backstage/release-manifests@0.0.11
+
+## @internal/plugin-todo-list@1.0.33
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.0
+ - @backstage/core-plugin-api@1.10.1
+
+## @internal/plugin-todo-list-backend@1.0.33
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/errors@1.2.5
+
+## @internal/plugin-todo-list-common@1.0.22
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-permission-common@0.8.2
diff --git a/docs/releases/v1.33.0.md b/docs/releases/v1.33.0.md
new file mode 100644
index 0000000000..c8798ea9e5
--- /dev/null
+++ b/docs/releases/v1.33.0.md
@@ -0,0 +1,73 @@
+---
+id: v1.33.0
+title: v1.33.0
+description: Backstage Release v1.33.0
+---
+
+These are the release notes for the v1.33.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
+
+### Catalog performance improvements and breadcrumbs
+
+Some database improvements and fixes have been made to the catalog. The `refresh_state` table is no longer needed in the read path, and some indices have been dropped. We don't expect this to have any negative impact on end users; rather, performance should increase due to reduced index churn and less used storage.
+
+Entity pages now also by default have a breadcrumb control in the page header, showing the context of the current entity such as what system and domain it’s in, if any.
+
+### App backend config injection with read-only filesystem
+
+The `app-backend` now stores the templated `index.html` file in memory rather than writing it to disk. This means you no longer need to use the `app.disableConfigInjection` flag when running with a read-only filesystem, allowing you to take advantage of the config injection.
+
+### **BREAKING**: `LEGACY_BACKEND_START` has been removed
+
+The CLI no longer supports the `LEGACY_BACKEND_START` flag, which means that old dev endpoints in `src/run.ts` have to be migrated to the new `dev/index.ts` structure instead.
+
+### Scaffolder now supports Node.js v22
+
+The `isolated-vm` dependency has been upgraded to `v5`, which means the scaffolder now supports Node.js v22. It also means that running Scaffolder with Node.js v16 is no longer possible.
+
+### Scaffolder permissions and actions
+
+A new `scaffolder.template.management` permission has been added. This permission is useful if you want to limit access to the frontend template management features. Contributed by [@stephenglass](https://github.com/stephenglass) in [#26946](https://github.com/backstage/backstage/pull/26946)
+
+A new `fs:readdir` action has been added. This action is useful if you need to retrieve the contents of a specific directory within a workspace. Contributed by [@secustor](https://github.com/secustor) in [#27283](https://github.com/backstage/backstage/pull/27283)
+
+### Catalog service ref for backends
+
+The `@backstage/plugin-catalog-node` package now has a `catalogServiceRef` that backends should move to depending on for their catalog communication needs. If you are currently instantiating a `CatalogService` by hand, you will enjoy using this new service instead. The most important improvement is that it supports a credentials argument directly which gives it support for proper auth toward the catalog without having to make tokens with the `auth` core service.
+
+### New generate-patch cli command
+
+We have added a new `generate-patch` CLI command that can be used to generate patches for current changes in a source workspace, which can then be installed in a target workspace. This allows you to easily and immediately use changes that have been contributed upstream, without needing to wait for a release.
+[#27331](https://github.com/backstage/backstage/pull/27331)
+
+### Google LDAP support
+
+Added support for Google LDAP to `@backstage/plugin-catalog-backend-module-ldap`. Contributed by [@megatroom](https://github.com/megatroom) in [#27373](https://github.com/backstage/backstage/pull/27373)
+
+### **BREAKING** AWS ALB authentication
+
+The AWS ALB `fullProfile` will no longer have 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 via `@backstage/plugin-auth-backend-module-aws-alb-provider`.
+
+## Security Fixes
+
+The kubernetes plugin received a bump of the `@kubernetes/client-node` dependency to mitigate CVEs related to the `request` and `tough-cookie` packages. Contributed by [@coreydaley](https://github.com/coreydaley) in [#25385](https://github.com/backstage/backstage/pull/25385)
+
+## 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.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.
diff --git a/docs/releases/v1.34.0-next.0-changelog.md b/docs/releases/v1.34.0-next.0-changelog.md
new file mode 100644
index 0000000000..4ed7a2a57b
--- /dev/null
+++ b/docs/releases/v1.34.0-next.0-changelog.md
@@ -0,0 +1,2234 @@
+# Release v1.34.0-next.0
+
+Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.34.0-next.0](https://backstage.github.io/upgrade-helper/?to=1.34.0-next.0)
+
+## @backstage/backend-defaults@0.6.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
+ ```
+
+- 277092a: Implemented `AzureBlobStorageUrlReader` to read from the url of committed location from the entity provider
+
+- 18a2c00: All middleware used by the default `coreServices.http` is now exported for use by custom implementations.
+
+### Patch Changes
+
+- 8863b38: Export `PluginTokenHandler` and `pluginTokenHandlerDecoratorServiceRef` to allow for custom decoration of the plugin token handler without having to re-implement the entire handler.
+- 97c6837: Export `DefaultHttpAuthService` to allow for custom token extraction logic.
+- e5255f1: Log request and response metadata so it can be used for filtering log messages.
+ The format of the request date was also changed from `clf` to `utc`.
+- Updated dependencies
+ - @backstage/integration@1.16.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/cli-node@0.2.11-next.0
+ - @backstage/plugin-auth-node@0.5.5-next.0
+ - @backstage/backend-dev-utils@0.1.5
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.0
+ - @backstage/config-loader@1.9.2
+ - @backstage/errors@1.2.5
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/types@1.2.0
+ - @backstage/plugin-permission-node@0.8.6-next.0
+
+## @backstage/backend-test-utils@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
+
+## @backstage/integration@1.16.0-next.0
+
+### Minor Changes
+
+- 277092a: Add the integration for Azure blob storage to read the credentials to access the storage account and provide the default credential provider.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+
+## @backstage/repo-tools@0.12.0-next.0
+
+### Minor Changes
+
+- c1eccd6: Fix invalid path and malformed flags bugs in api-reports.ts
+
+### Patch Changes
+
+- 5f04976: Fixed a bug that caused missing code in published packages.
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/cli-node@0.2.11-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/config-loader@1.9.2
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-catalog-backend-module-azure@0.3.0-next.0
+
+### Minor Changes
+
+- 277092a: Added the Azure Blob Storage as catalog entity provider to import all the desired entities from storage account provided in app-config.yaml
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/config@1.3.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+
+## @backstage/plugin-catalog-backend-module-ldap@0.11.0-next.0
+
+### Minor Changes
+
+- 732700a: Updated fix for ldap entity mapping which doesn't require extra config setting of dnCaseSensitive
+- 95ac4a2: Add new ldap vendor config 'LLDAP'
+
+### Patch Changes
+
+- 5f04976: Fixed a bug that caused missing code in published packages.
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+
+## @backstage/plugin-scaffolder-backend@1.28.0-next.0
+
+### Minor Changes
+
+- c05a343: Emit scaffolder events using the optional `EventsService`
+
+### Patch Changes
+
+- 3c62a50: Experimental support for `formDecorators` to enable secret collection and mutations to the parameters for scaffolder tasks
+- 8f59dc5: Add fs:readdir to scaffolder startup
+- Updated dependencies
+ - @backstage/backend-defaults@0.6.0-next.0
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/plugin-scaffolder-common@1.5.8-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+ - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0-next.0
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.3-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
+ - @backstage/plugin-auth-node@0.5.5-next.0
+ - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.4-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
+ - @backstage/plugin-bitbucket-cloud-common@0.2.26-next.0
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.0
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-permission-node@0.8.6-next.0
+ - @backstage/plugin-scaffolder-backend-module-azure@0.2.3-next.0
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.3-next.0
+ - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.3-next.0
+ - @backstage/plugin-scaffolder-backend-module-gitea@0.2.3-next.0
+ - @backstage/plugin-scaffolder-backend-module-github@0.5.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0-next.0
+
+### Minor Changes
+
+- c4ffd13: Added the autocomplete feature to GitlabRepoUrlPicker
+- 32459d0: **BREAKING**: Upgraded the `gitbeaker` library to version 41. As part of this, the `scopes` parameter to the `gitlab:projectDeployToken:create` is no longer optional, so you will have to pass it a value (for example `['read_repository']`).
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+
+## @backstage/app-defaults@1.5.15-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/backend-app-api@1.0.3-next.0
+
+### Patch Changes
+
+- eef3ef1: Removed unused `express` dependencies.
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-auth-node@0.5.5-next.0
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.0
+ - @backstage/config-loader@1.9.2
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-permission-node@0.8.6-next.0
+
+## @backstage/backend-dynamic-feature-service@0.5.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-app-api@1.0.3-next.0
+ - @backstage/plugin-catalog-backend@1.28.1-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
+ - @backstage/cli-node@0.2.11-next.0
+ - @backstage/plugin-auth-node@0.5.5-next.0
+ - @backstage/plugin-events-backend@0.3.17-next.0
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.0
+ - @backstage/config-loader@1.9.2
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-app-node@0.1.28-next.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
+
+## @backstage/backend-openapi-utils@0.3.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+
+## @backstage/backend-plugin-api@1.0.3-next.0
+
+### Patch Changes
+
+- eef3ef1: Removed unused `express` dependencies.
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.5-next.0
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-permission-common@0.8.2
+
+## @backstage/catalog-client@1.8.1-next.0
+
+### Patch Changes
+
+- d7e7836: Fixed a bug in the `queryEntities` method where errors were not being handled properly.
+- Updated dependencies
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+
+## @backstage/cli@0.29.3-next.0
+
+### Patch Changes
+
+- 2b6c1ea: If the Backstage yarn plugin is installed, it will now be automatically updated as part of `versions:bump`.
+- 7dcff85: Remove special-casing for `@types` packages when generating dependency entries
+ during templating
+- 0aff006: Bumped the version range for `html-webpack-plugin` to fix the `htmlPluginExports.getCompilationHooks is not a function` error when using experimental Rspack.
+- 583f3d4: Added `@backstage/cli/config/prettier` as a replacement for `@spotify/prettier-config`, but with the same configuration.
+- 5f04976: Update `rollup` to avoid issues with build output when running `backstage-cli package build`.
+- 5f04976: Fixed a bug that caused missing code in published packages.
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/release-manifests@0.0.12-next.0
+ - @backstage/cli-node@0.2.11-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.0
+ - @backstage/config-loader@1.9.2
+ - @backstage/errors@1.2.5
+ - @backstage/eslint-plugin@0.1.10
+ - @backstage/types@1.2.0
+
+## @backstage/cli-node@0.2.11-next.0
+
+### Patch Changes
+
+- af665ea: add PackageManager and Lockfile interfaces for future use
+- cbfc69e: Internal refactor
+- Updated dependencies
+ - @backstage/cli-common@0.1.15
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+
+## @backstage/core-app-api@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
+
+## @backstage/core-compat-api@0.3.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/version-bridge@1.0.10
+
+## @backstage/core-components@0.16.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/config@1.3.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/version-bridge@1.0.10
+
+## @backstage/create-app@0.5.23-next.0
+
+### Patch Changes
+
+- 5819f8d: Updated Dockerfile to include `backstage.json` file
+- 583f3d4: Updated the template to use `@backstage/cli/config/prettier` instead of `@spotify/prettier-config`.
+- Updated dependencies
+ - @backstage/cli-common@0.1.15
+
+## @backstage/dev-utils@1.1.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/plugin-catalog-react@1.14.3-next.0
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/app-defaults@1.5.15-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/integration-react@1.2.2-next.0
+
+## @backstage/frontend-app-api@0.10.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/config@1.3.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-defaults@0.1.4-next.0
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+
+## @backstage/frontend-defaults@0.1.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-app@0.1.4-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-app-api@0.10.3-next.0
+
+## @backstage/frontend-plugin-api@0.9.3-next.0
+
+### Patch Changes
+
+- 5f04976: Fixed a bug that caused missing code in published packages.
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+
+## @backstage/frontend-test-utils@0.2.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-app@0.1.4-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/config@1.3.0
+ - @backstage/frontend-app-api@0.10.3-next.0
+ - @backstage/test-utils@1.7.3-next.0
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+
+## @backstage/integration-react@1.2.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/config@1.3.0
+ - @backstage/core-plugin-api@1.10.1
+
+## @backstage/release-manifests@0.0.12-next.0
+
+### Patch Changes
+
+- 2e140dc: Switch to native fetch for loading release manifests
+
+## @techdocs/cli@1.8.24-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.6.0-next.0
+ - @backstage/plugin-techdocs-node@1.12.15-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.0
+
+## @backstage/test-utils@1.7.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/config@1.3.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/types@1.2.0
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/theme@0.6.3-next.0
+
+### Patch Changes
+
+- 5f04976: Fixed a bug that caused missing code in published packages.
+
+## @backstage/plugin-api-docs@0.12.2-next.0
+
+### Patch Changes
+
+- 11babd9: Fix link styling in ProvidedApisCard component so it aligns with other card components.
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.4-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/plugin-catalog@1.25.2-next.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/plugin-app@0.1.4-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.
+- 5f04976: Fixed a bug that caused missing code in published packages.
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/plugin-app-backend@0.4.3-next.0
+
+### Patch Changes
+
+- 74c3f2a: Fixed a bug where config would not be injected on the `/` and `/index.html` paths.
+- d66fa80: Fix root route handling when query parameters are present
+- 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/config-loader@1.9.2
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-app-node@0.1.28-next.0
+
+## @backstage/plugin-app-node@0.1.28-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/config-loader@1.9.2
+
+## @backstage/plugin-app-visualizer@0.1.14-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+
+## @backstage/plugin-auth-backend@0.24.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/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
+ - @backstage/plugin-auth-backend-module-atlassian-provider@0.3.3-next.0
+ - @backstage/plugin-auth-backend-module-auth0-provider@0.1.3-next.0
+ - @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.1-next.0
+ - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.3-next.0
+ - @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.3-next.0
+ - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.3-next.0
+ - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.3-next.0
+ - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.3-next.0
+ - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.0
+ - @backstage/plugin-auth-backend-module-gitlab-provider@0.2.3-next.0
+ - @backstage/plugin-auth-backend-module-google-provider@0.2.3-next.0
+ - @backstage/plugin-auth-backend-module-microsoft-provider@0.2.3-next.0
+ - @backstage/plugin-auth-backend-module-oauth2-provider@0.3.3-next.0
+ - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.3-next.0
+ - @backstage/plugin-auth-backend-module-oidc-provider@0.3.3-next.0
+ - @backstage/plugin-auth-backend-module-okta-provider@0.1.3-next.0
+ - @backstage/plugin-auth-backend-module-onelogin-provider@0.2.3-next.0
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+
+## @backstage/plugin-auth-backend-module-atlassian-provider@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-module-auth0-provider@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
+
+## @backstage/plugin-auth-backend-module-aws-alb-provider@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
+
+## @backstage/plugin-auth-backend-module-azure-easyauth-provider@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
+
+## @backstage/plugin-auth-backend-module-bitbucket-provider@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/plugin-auth-backend-module-bitbucket-server-provider@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
+
+## @backstage/plugin-auth-backend-module-cloudflare-access-provider@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
+
+## @backstage/plugin-auth-backend-module-gcp-iap-provider@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
+
+## @backstage/plugin-auth-backend-module-github-provider@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/plugin-auth-backend-module-gitlab-provider@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/plugin-auth-backend-module-google-provider@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/plugin-auth-backend-module-guest-provider@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
+
+## @backstage/plugin-auth-backend-module-microsoft-provider@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/plugin-auth-backend-module-oauth2-provider@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-module-oauth2-proxy-provider@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
+
+## @backstage/plugin-auth-backend-module-oidc-provider@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
+
+## @backstage/plugin-auth-backend-module-okta-provider@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
+
+## @backstage/plugin-auth-backend-module-onelogin-provider@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/plugin-auth-backend-module-pinniped-provider@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/config@1.3.0
+
+## @backstage/plugin-auth-backend-module-vmware-cloud-provider@0.4.2-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/plugin-auth-node@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
+
+## @backstage/plugin-auth-react@0.1.10-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-bitbucket-cloud-common@0.2.26-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+
+## @backstage/plugin-catalog@1.25.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-common@1.5.8-next.0
+ - @backstage/plugin-search-react@1.8.4-next.0
+ - @backstage/plugin-catalog-react@1.14.3-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/catalog-client@1.8.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.4-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-react@0.4.28
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-catalog-backend@1.28.1-next.0
+
+### Patch Changes
+
+- f159b25: Compute deltas more efficiently, which generally leads to less wasted processing cycles
+- 56511ba: Be more aggressive in dequeueing entities for stitching
+- 71152e3: Correctly report stitching queue length
+- 3ab57c6: Support changing location keys on existing entities, in delta mutations
+- 2924ffe: Compute some metrics using search table facet aggregations instead of reading the full refresh state
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-search-backend-module-catalog@0.2.6-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+ - @backstage/catalog-client@1.8.1-next.0
+ - @backstage/backend-openapi-utils@0.3.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-permission-node@0.8.6-next.0
+
+## @backstage/plugin-catalog-backend-module-aws@0.4.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.6.0-next.0
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+ - @backstage/plugin-kubernetes-common@0.9.0
+
+## @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/backend-openapi-utils@0.3.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+
+## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.4.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+ - @backstage/catalog-client@1.8.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/plugin-bitbucket-cloud-common@0.2.26-next.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+
+## @backstage/plugin-catalog-backend-module-bitbucket-server@0.2.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+
+## @backstage/plugin-catalog-backend-module-gcp@0.3.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+ - @backstage/plugin-kubernetes-common@0.9.0
+
+## @backstage/plugin-catalog-backend-module-gerrit@0.2.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+
+## @backstage/plugin-catalog-backend-module-github@0.7.8-next.0
+
+### Patch Changes
+
+- 468bbcc: Pass in a default schedule to the `GithubEntityProvider` if none is provided
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-catalog-backend@1.28.1-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+ - @backstage/catalog-client@1.8.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+
+## @backstage/plugin-catalog-backend-module-github-org@0.3.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend-module-github@0.7.8-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+ - @backstage/config@1.3.0
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+
+## @backstage/plugin-catalog-backend-module-gitlab@0.5.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.6.0-next.0
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+
+## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+ - @backstage/plugin-catalog-backend-module-gitlab@0.5.1-next.0
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+
+## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.6.1-next.0
+
+### Patch Changes
+
+- cce9cae: Deprecate old-backend-system `IncrementalCatalogBuilder`
+- 5aa44d2: Wire up the events together in the new backend system
+- cbfc69e: Create a `dev/index.ts` entrypoint for `yarn start`
+- 3ca5f70: Ensure that the scheduled worker task doesn't run at an unreasonably high frequency
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-catalog-backend@1.28.1-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+ - @backstage/plugin-permission-common@0.8.2
+
+## @backstage/plugin-catalog-backend-module-logs@0.1.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-catalog-backend@1.28.1-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+
+## @backstage/plugin-catalog-backend-module-msgraph@0.6.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+
+## @backstage/plugin-catalog-backend-module-openapi@0.2.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-catalog-backend@1.28.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+
+## @backstage/plugin-catalog-backend-module-puppetdb@0.2.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+
+## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-common@1.5.8-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+
+## @backstage/plugin-catalog-backend-module-unprocessed@0.5.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
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+ - @backstage/plugin-catalog-unprocessed-entities-common@0.0.5
+ - @backstage/plugin-permission-common@0.8.2
+
+## @backstage/plugin-catalog-graph@0.4.14-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/catalog-client@1.8.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.4-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/types@1.2.0
+
+## @backstage/plugin-catalog-import@0.12.8-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/plugin-catalog-react@1.14.3-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/catalog-client@1.8.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/core-compat-api@0.3.4-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-catalog-node@1.14.1-next.0
+
+### Patch Changes
+
+- 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/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-permission-node@0.8.6-next.0
+
+## @backstage/plugin-catalog-react@1.14.3-next.0
+
+### Patch Changes
+
+- f18c67d: Fix catalog filtering to allow searching entities by display name
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/catalog-client@1.8.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.4-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-test-utils@0.2.4-next.0
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/plugin-catalog-unprocessed-entities@0.2.12-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-config-schema@0.1.63-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+
+## @backstage/plugin-devtools@0.1.22-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/core-compat-api@0.3.4-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-devtools-common@0.1.13
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/plugin-devtools-backend@0.4.3-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/cli-common@0.1.15
+ - @backstage/config@1.3.0
+ - @backstage/config-loader@1.9.2
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-devtools-common@0.1.13
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-permission-node@0.8.6-next.0
+
+## @backstage/plugin-events-backend@0.3.17-next.0
+
+### Patch Changes
+
+- 1577511: Allow configuring a timeout for event bus polling requests. This can be set like so in your app-config:
+
+ ```yaml
+ events:
+ notifyTimeoutMs: 30000
+ ```
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-events-node@0.4.6-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-events-backend-module-aws-sqs@0.4.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+
+## @backstage/plugin-events-backend-module-azure@0.2.15-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+
+## @backstage/plugin-events-backend-module-bitbucket-cloud@0.2.15-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+
+## @backstage/plugin-events-backend-module-gerrit@0.2.15-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+
+## @backstage/plugin-events-backend-module-github@0.2.15-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+ - @backstage/config@1.3.0
+
+## @backstage/plugin-events-backend-module-gitlab@0.2.15-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+ - @backstage/config@1.3.0
+
+## @backstage/plugin-events-backend-test-utils@0.1.39-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.6-next.0
+
+## @backstage/plugin-events-node@0.4.6-next.0
+
+### Patch Changes
+
+- 79a06f6: Clarified purpose of subscriber ID in TSDoc for `EventsServiceSubscribeOptions`.
+
+- 1577511: Allow configuring a timeout for event bus polling requests. This can be set like so in your app-config:
+
+ ```yaml
+ events:
+ notifyTimeoutMs: 30000
+ ```
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+
+## @backstage/plugin-home@0.8.3-next.0
+
+### Patch Changes
+
+- 9951ba4: Updated dependency `@rjsf/utils` to `5.23.1`.
+ Updated dependency `@rjsf/core` to `5.23.1`.
+ Updated dependency `@rjsf/material-ui` to `5.23.1`.
+ Updated dependency `@rjsf/validator-ajv8` to `5.23.1`.
+- Updated dependencies
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/plugin-catalog-react@1.14.3-next.0
+ - @backstage/plugin-home-react@0.1.21-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/catalog-client@1.8.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/core-compat-api@0.3.4-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+
+## @backstage/plugin-home-react@0.1.21-next.0
+
+### Patch Changes
+
+- 9951ba4: Updated dependency `@rjsf/utils` to `5.23.1`.
+ Updated dependency `@rjsf/core` to `5.23.1`.
+ Updated dependency `@rjsf/material-ui` to `5.23.1`.
+ Updated dependency `@rjsf/validator-ajv8` to `5.23.1`.
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+
+## @backstage/plugin-kubernetes@0.12.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.4-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/plugin-kubernetes-common@0.9.0
+ - @backstage/plugin-kubernetes-react@0.5.2-next.0
+
+## @backstage/plugin-kubernetes-backend@0.19.1-next.0
+
+### Patch Changes
+
+- cbfc69e: Create a `dev/index.ts` entrypoint for `yarn start`
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-auth-node@0.5.5-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/integration-aws-node@0.1.13
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+ - @backstage/plugin-kubernetes-common@0.9.0
+ - @backstage/plugin-kubernetes-node@0.2.1-next.0
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-permission-node@0.8.6-next.0
+
+## @backstage/plugin-kubernetes-cluster@0.0.20-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/plugin-kubernetes-common@0.9.0
+ - @backstage/plugin-kubernetes-react@0.5.2-next.0
+
+## @backstage/plugin-kubernetes-node@0.2.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/types@1.2.0
+ - @backstage/plugin-kubernetes-common@0.9.0
+
+## @backstage/plugin-kubernetes-react@0.5.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-kubernetes-common@0.9.0
+
+## @backstage/plugin-notifications@0.4.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-notifications-common@0.0.6
+ - @backstage/plugin-signals-react@0.0.7
+
+## @backstage/plugin-notifications-backend@0.4.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-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/catalog-client@1.8.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+ - @backstage/plugin-notifications-common@0.0.6
+ - @backstage/plugin-notifications-node@0.2.10-next.0
+ - @backstage/plugin-signals-node@0.1.15-next.0
+
+## @backstage/plugin-notifications-backend-module-email@0.3.4-next.0
+
+### Patch Changes
+
+- 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/integration-aws-node@0.1.13
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+ - @backstage/plugin-notifications-common@0.0.6
+ - @backstage/plugin-notifications-node@0.2.10-next.0
+
+## @backstage/plugin-notifications-node@0.2.10-next.0
+
+### Patch Changes
+
+- 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/plugin-notifications-common@0.0.6
+ - @backstage/plugin-signals-node@0.1.15-next.0
+
+## @backstage/plugin-org@0.6.34-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.4-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-org-react@0.1.33-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.0
+ - @backstage/catalog-client@1.8.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+
+## @backstage/plugin-permission-backend@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
+
+## @backstage/plugin-permission-backend-module-allow-all-policy@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/plugin-permission-common@0.8.2
+ - @backstage/plugin-permission-node@0.8.6-next.0
+
+## @backstage/plugin-permission-node@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
+
+## @backstage/plugin-proxy-backend@0.5.9-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+
+## @backstage/plugin-scaffolder@1.27.2-next.0
+
+### Patch Changes
+
+- 3c62a50: Experimental support for `formDecorators` to enable secret collection and mutations to the parameters for scaffolder tasks
+- c4ffd13: Added the autocomplete feature to GitlabRepoUrlPicker
+- 9951ba4: Updated dependency `@rjsf/utils` to `5.23.1`.
+ Updated dependency `@rjsf/core` to `5.23.1`.
+ Updated dependency `@rjsf/material-ui` to `5.23.1`.
+ Updated dependency `@rjsf/validator-ajv8` to `5.23.1`.
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/plugin-scaffolder-common@1.5.8-next.0
+ - @backstage/plugin-scaffolder-react@1.14.2-next.0
+ - @backstage/plugin-catalog-react@1.14.3-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/catalog-client@1.8.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.4-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/plugin-scaffolder-backend-module-azure@0.2.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.4-next.0
+
+### Patch Changes
+
+- 5f04976: Fixed a bug that caused missing code in published packages.
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.3-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.3-next.0
+
+## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.3-next.0
+
+### Patch Changes
+
+- c4ffd13: Added the autocomplete feature to GitlabRepoUrlPicker
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-bitbucket-cloud-common@0.2.26-next.0
+
+## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.6.0-next.0
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+
+## @backstage/plugin-scaffolder-backend-module-gcp@0.2.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-scaffolder-backend-module-gitea@0.2.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-scaffolder-backend-module-github@0.5.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-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/plugin-scaffolder-backend-module-notifications@0.1.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
+ - @backstage/plugin-notifications-common@0.0.6
+ - @backstage/plugin-notifications-node@0.2.10-next.0
+
+## @backstage/plugin-scaffolder-backend-module-rails@0.5.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+
+## @backstage/plugin-scaffolder-backend-module-sentry@0.2.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-scaffolder-node-test-utils@0.1.16-next.0
+
+## @backstage/plugin-scaffolder-common@1.5.8-next.0
+
+### Patch Changes
+
+- 3c62a50: Experimental support for `formDecorators` to enable secret collection and mutations to the parameters for scaffolder tasks
+- Updated dependencies
+ - @backstage/catalog-model@1.7.1
+ - @backstage/types@1.2.0
+ - @backstage/plugin-permission-common@0.8.2
+
+## @backstage/plugin-scaffolder-node@0.6.1-next.0
+
+### Patch Changes
+
+- c4ffd13: Added the autocomplete feature to GitlabRepoUrlPicker
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/plugin-scaffolder-common@1.5.8-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+
+## @backstage/plugin-scaffolder-node-test-utils@0.1.16-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-test-utils@1.2.0-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
+ - @backstage/types@1.2.0
+
+## @backstage/plugin-scaffolder-react@1.14.2-next.0
+
+### Patch Changes
+
+- 3c62a50: Experimental support for `formDecorators` to enable secret collection and mutations to the parameters for scaffolder tasks
+- c4ffd13: Added the autocomplete feature to GitlabRepoUrlPicker
+- 9951ba4: Updated dependency `@rjsf/utils` to `5.23.1`.
+ Updated dependency `@rjsf/core` to `5.23.1`.
+ Updated dependency `@rjsf/material-ui` to `5.23.1`.
+ Updated dependency `@rjsf/validator-ajv8` to `5.23.1`.
+- Updated dependencies
+ - @backstage/plugin-scaffolder-common@1.5.8-next.0
+ - @backstage/plugin-catalog-react@1.14.3-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/catalog-client@1.8.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/plugin-search@1.4.21-next.0
+
+### Patch Changes
+
+- d311c84: Use Select from core-components and update Lifecycle filter to use Select instead checkboxes.
+- Updated dependencies
+ - @backstage/plugin-search-react@1.8.4-next.0
+ - @backstage/plugin-catalog-react@1.14.3-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/core-compat-api@0.3.4-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-backend@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
+
+## @backstage/plugin-search-backend-module-catalog@0.2.6-next.0
+
+### Patch Changes
+
+- ed0aaec: Update README
+- 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/plugin-catalog-common@1.1.1
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-search-backend-node@1.3.6-next.0
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-backend-module-elasticsearch@1.6.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/config@1.3.0
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/plugin-search-backend-node@1.3.6-next.0
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-backend-module-explore@0.2.6-next.0
+
+### Patch Changes
+
+- ed0aaec: Update README
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/config@1.3.0
+ - @backstage/plugin-search-backend-node@1.3.6-next.0
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-backend-module-pg@0.5.39-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/config@1.3.0
+ - @backstage/plugin-search-backend-node@1.3.6-next.0
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-backend-module-stack-overflow-collator@0.3.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/config@1.3.0
+ - @backstage/plugin-search-backend-node@1.3.6-next.0
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-backend-module-techdocs@0.3.4-next.0
+
+### Patch Changes
+
+- ed0aaec: Update README
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-techdocs-node@1.12.15-next.0
+ - @backstage/catalog-client@1.8.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-search-backend-node@1.3.6-next.0
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-backend-node@1.3.6-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.6.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-react@1.8.4-next.0
+
+### Patch Changes
+
+- d311c84: Use Select from core-components and update Lifecycle filter to use Select instead checkboxes.
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-signals@0.0.14-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/types@1.2.0
+ - @backstage/plugin-signals-react@0.0.7
+
+## @backstage/plugin-signals-backend@0.2.4-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-events-node@0.4.6-next.0
+ - @backstage/plugin-auth-node@0.5.5-next.0
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-signals-node@0.1.15-next.0
+
+## @backstage/plugin-signals-node@0.1.15-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-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/types@1.2.0
+
+## @backstage/plugin-techdocs@1.11.3-next.0
+
+### Patch Changes
+
+- 7d8777d: Added support for the Search bar in docs residing in the entity page tab, and not only the global "/docs" page.
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/plugin-search-react@1.8.4-next.0
+ - @backstage/plugin-catalog-react@1.14.3-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/core-compat-api@0.3.4-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/plugin-auth-react@0.1.10-next.0
+ - @backstage/plugin-search-common@1.2.15
+ - @backstage/plugin-techdocs-common@0.1.0
+ - @backstage/plugin-techdocs-react@1.2.12-next.0
+
+## @backstage/plugin-techdocs-addons-test-utils@1.0.43-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/plugin-search-react@1.8.4-next.0
+ - @backstage/plugin-catalog-react@1.14.3-next.0
+ - @backstage/plugin-techdocs@1.11.3-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/test-utils@1.7.3-next.0
+ - @backstage/plugin-catalog@1.25.2-next.0
+ - @backstage/plugin-techdocs-react@1.2.12-next.0
+
+## @backstage/plugin-techdocs-backend@1.11.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.0
+ - @backstage/plugin-techdocs-node@1.12.15-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/plugin-catalog-common@1.1.1
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-techdocs-common@0.1.0
+
+## @backstage/plugin-techdocs-module-addons-contrib@1.1.19-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/plugin-techdocs-react@1.2.12-next.0
+
+## @backstage/plugin-techdocs-node@1.12.15-next.0
+
+### Patch Changes
+
+- 5f04976: Fixed a bug that caused missing code in published packages.
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/plugin-search-common@1.2.15
+ - @backstage/plugin-techdocs-common@0.1.0
+
+## @backstage/plugin-techdocs-react@1.2.12-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @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/version-bridge@1.0.10
+
+## @backstage/plugin-user-settings@0.8.17-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/plugin-catalog-react@1.14.3-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.4-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-signals-react@0.0.7
+ - @backstage/plugin-user-settings-common@0.0.1
+
+## @backstage/plugin-user-settings-backend@0.2.28-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.6.0-next.0
+ - @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/types@1.2.0
+ - @backstage/plugin-signals-node@0.1.15-next.0
+ - @backstage/plugin-user-settings-common@0.0.1
+
+## example-app@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
+
+## example-app-next@0.0.18-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.29.3-next.0
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/plugin-app@0.1.4-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/frontend-plugin-api@0.9.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-compat-api@0.3.4-next.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/frontend-defaults@0.1.4-next.0
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/plugin-app-visualizer@0.1.14-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-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
+
+## app-next-example-plugin@0.0.18-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/core-components@0.16.2-next.0
+
+## example-backend@0.0.33-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.6.0-next.0
+ - @backstage/plugin-scaffolder-backend@1.28.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.0
+ - @backstage/plugin-search-backend-module-catalog@0.2.6-next.0
+ - @backstage/plugin-search-backend-module-explore@0.2.6-next.0
+ - @backstage/plugin-app-backend@0.4.3-next.0
+ - @backstage/plugin-catalog-backend@1.28.1-next.0
+ - @backstage/plugin-auth-node@0.5.5-next.0
+ - @backstage/plugin-permission-backend@0.5.52-next.0
+ - @backstage/plugin-devtools-backend@0.4.3-next.0
+ - @backstage/plugin-signals-backend@0.2.4-next.0
+ - @backstage/plugin-events-backend@0.3.17-next.0
+ - @backstage/plugin-kubernetes-backend@0.19.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/plugin-auth-backend@0.24.1-next.0
+ - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.0
+ - @backstage/plugin-auth-backend-module-guest-provider@0.2.3-next.0
+ - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3-next.0
+ - @backstage/plugin-catalog-backend-module-openapi@0.2.5-next.0
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.0
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.0
+ - @backstage/plugin-notifications-backend@0.4.4-next.0
+ - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3-next.0
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-permission-node@0.8.6-next.0
+ - @backstage/plugin-proxy-backend@0.5.9-next.0
+ - @backstage/plugin-scaffolder-backend-module-github@0.5.3-next.0
+ - @backstage/plugin-scaffolder-backend-module-notifications@0.1.4-next.0
+ - @backstage/plugin-search-backend@1.7.1-next.0
+ - @backstage/plugin-search-backend-node@1.3.6-next.0
+ - @backstage/plugin-techdocs-backend@1.11.4-next.0
+
+## example-backend-legacy@0.2.105-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.6.0-next.0
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/plugin-scaffolder-backend@1.28.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.0
+ - @backstage/plugin-search-backend-module-catalog@0.2.6-next.0
+ - @backstage/plugin-search-backend-module-explore@0.2.6-next.0
+ - @backstage/plugin-app-backend@0.4.3-next.0
+ - @backstage/plugin-catalog-backend@1.28.1-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+ - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0-next.0
+ - @backstage/plugin-auth-node@0.5.5-next.0
+ - @backstage/plugin-permission-backend@0.5.52-next.0
+ - @backstage/plugin-devtools-backend@0.4.3-next.0
+ - @backstage/plugin-signals-backend@0.2.4-next.0
+ - @backstage/plugin-events-backend@0.3.17-next.0
+ - @backstage/plugin-kubernetes-backend@0.19.1-next.0
+ - @backstage/catalog-client@1.8.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/plugin-auth-backend@0.24.1-next.0
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.0
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.0
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-permission-node@0.8.6-next.0
+ - @backstage/plugin-proxy-backend@0.5.9-next.0
+ - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.3-next.0
+ - @backstage/plugin-scaffolder-backend-module-rails@0.5.3-next.0
+ - @backstage/plugin-search-backend@1.7.1-next.0
+ - @backstage/plugin-search-backend-module-elasticsearch@1.6.3-next.0
+ - @backstage/plugin-search-backend-module-pg@0.5.39-next.0
+ - @backstage/plugin-search-backend-node@1.3.6-next.0
+ - @backstage/plugin-signals-node@0.1.15-next.0
+ - @backstage/plugin-techdocs-backend@1.11.4-next.0
+
+## e2e-test@0.2.23-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/create-app@0.5.23-next.0
+ - @backstage/cli-common@0.1.15
+ - @backstage/errors@1.2.5
+
+## @internal/frontend@0.0.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+
+## @internal/scaffolder@0.0.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-react@1.14.2-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+
+## techdocs-cli-embedded-app@0.2.103-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.29.3-next.0
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/plugin-techdocs@1.11.3-next.0
+ - @backstage/theme@0.6.3-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/integration-react@1.2.2-next.0
+ - @backstage/test-utils@1.7.3-next.0
+ - @backstage/plugin-catalog@1.25.2-next.0
+ - @backstage/plugin-techdocs-react@1.2.12-next.0
+
+## yarn-plugin-backstage@0.0.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/release-manifests@0.0.12-next.0
+ - @backstage/cli-common@0.1.15
+
+## @internal/plugin-todo-list@1.0.34-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+
+## @internal/plugin-todo-list-backend@1.0.34-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
diff --git a/docs/releases/v1.34.0-next.1-changelog.md b/docs/releases/v1.34.0-next.1-changelog.md
new file mode 100644
index 0000000000..b61e5b1560
--- /dev/null
+++ b/docs/releases/v1.34.0-next.1-changelog.md
@@ -0,0 +1,2146 @@
+# Release v1.34.0-next.1
+
+Upgrade Helper: [https://backstage.github.io/upgrade-helper/?to=1.34.0-next.1](https://backstage.github.io/upgrade-helper/?to=1.34.0-next.1)
+
+## @backstage/backend-app-api@1.1.0-next.1
+
+### Minor Changes
+
+- 12eac85: **EXPERIMENTAL**: Adds a new `instanceMetadataService` to hold information about a specific backend instance.
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.5-next.1
+ - @backstage/config-loader@1.9.3-next.0
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-permission-node@0.8.6-next.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+
+## @backstage/backend-plugin-api@1.1.0-next.1
+
+### Minor Changes
+
+- 12eac85: **EXPERIMENTAL**: Adds a new `instanceMetadataService` to hold information about a specific backend instance.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.5-next.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-permission-common@0.8.2
+
+## @backstage/catalog-client@1.9.0-next.1
+
+### Minor Changes
+
+- 384e494: Internal updates to generated code.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-catalog-backend@1.29.0-next.1
+
+### Minor Changes
+
+- 384e494: Internal updates to generated code.
+- 1d0bc11: Fetch all facets in a single database query
+
+### Patch Changes
+
+- e4aab10: Fix a bug where sometimes the `by-query` endpoint could return nulls for entities that were not yet stitched.
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-permission-node@0.8.6-next.1
+ - @backstage/plugin-search-backend-module-catalog@0.2.6-next.1
+ - @backstage/backend-openapi-utils@0.3.1-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-events-node@0.4.6-next.1
+ - @backstage/plugin-permission-common@0.8.2
+
+## @backstage/plugin-catalog-node@1.15.0-next.1
+
+### Minor Changes
+
+- 8edc4cd: Updated the `catalogServiceMock` return type to match both `CatalogService` and `CatalogApi`
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-permission-node@0.8.6-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-common@0.8.2
+
+## @backstage/plugin-devtools-backend@0.5.0-next.1
+
+### Minor Changes
+
+- c781a9a: **BREAKING** Removed support for what is known as the legacy backend, please use the New Backend System.
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/backend-defaults@0.6.0-next.1
+ - @backstage/config-loader@1.9.3-next.0
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-permission-node@0.8.6-next.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-devtools-common@0.1.13
+ - @backstage/plugin-permission-common@0.8.2
+
+## @backstage/plugin-events-backend@0.4.0-next.1
+
+### Minor Changes
+
+- 384e494: Internal updates to generated code.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.1.0-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-events-node@0.4.6-next.1
+
+## @backstage/plugin-search-backend@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
+
+## @backstage/app-defaults@1.5.15-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/backend-defaults@0.6.0-next.1
+
+### Patch Changes
+
+- fe87fbf: Add task metrics as two gauges that track the last start and end timestamps as epoch seconds.
+- 1ac6b72: Support `connection.type: cloudsql` in database client for usage with `@google-cloud/cloud-sql-connector` and `iam` auth
+- 5c9cc05: Use native fetch instead of node-fetch
+- cf627c6: Fixed an issue in the WinstonLogger where Errors thrown and given to logger.error with field values that could not be cast to a string would throw a TypeError
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.5-next.1
+ - @backstage/backend-app-api@1.1.0-next.1
+ - @backstage/config-loader@1.9.3-next.0
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-permission-node@0.8.6-next.1
+ - @backstage/backend-dev-utils@0.1.5
+ - @backstage/cli-common@0.1.15
+ - @backstage/cli-node@0.2.11-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/types@1.2.0
+ - @backstage/plugin-events-node@0.4.6-next.1
+
+## @backstage/backend-dynamic-feature-service@0.5.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.5-next.1
+ - @backstage/plugin-catalog-backend@1.29.0-next.1
+ - @backstage/backend-defaults@0.6.0-next.1
+ - @backstage/plugin-events-backend@0.4.0-next.1
+ - @backstage/plugin-scaffolder-node@0.6.2-next.1
+ - @backstage/plugin-search-backend-node@1.3.6-next.1
+ - @backstage/backend-app-api@1.1.0-next.1
+ - @backstage/config-loader@1.9.3-next.0
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-permission-node@0.8.6-next.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/cli-node@0.2.11-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-app-node@0.1.28-next.1
+ - @backstage/plugin-events-node@0.4.6-next.1
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/backend-openapi-utils@0.3.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+
+## @backstage/backend-test-utils@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
+
+## @backstage/cli@0.29.3-next.1
+
+### Patch Changes
+
+- a49030a: Add support for `--output-file` option from ESLint to `package lint` and `repo lint` commands.
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/config-loader@1.9.3-next.0
+ - @backstage/release-manifests@0.0.12-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/cli-node@0.2.11-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/eslint-plugin@0.1.10
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/types@1.2.0
+
+## @backstage/config-loader@1.9.3-next.0
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+
+## @backstage/core-compat-api@0.3.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/version-bridge@1.0.10
+
+## @backstage/core-components@0.16.2-next.1
+
+### Patch Changes
+
+- e47be38: Added data-testid to placeholder rendered by Progress component to simplify assertions in tests
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/version-bridge@1.0.10
+
+## @backstage/create-app@0.5.23-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/cli-common@0.1.15
+
+## @backstage/dev-utils@1.1.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.1
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/app-defaults@1.5.15-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/theme@0.6.3-next.0
+
+## @backstage/frontend-app-api@0.10.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-defaults@0.1.4-next.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+
+## @backstage/frontend-defaults@0.1.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-app-api@0.10.3-next.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/plugin-app@0.1.4-next.1
+
+## @backstage/frontend-plugin-api@0.9.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+
+## @backstage/frontend-test-utils@0.2.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/frontend-app-api@0.10.3-next.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/test-utils@1.7.3-next.0
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+ - @backstage/plugin-app@0.1.4-next.1
+
+## @backstage/release-manifests@0.0.12-next.1
+
+### Patch Changes
+
+- b29eaea: Allow overriding the fetch function used inside getManifestByVersion
+
+## @backstage/repo-tools@0.12.0-next.1
+
+### Patch Changes
+
+- 860e3b5: Generated OpenAPI clients now support paths with tags.
+- 00058d0: The `generate-patch` command will now add a single resolution entry for all versions of the patched package, rather than separate entries for each version query.
+- Updated dependencies
+ - @backstage/config-loader@1.9.3-next.0
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/cli-node@0.2.11-next.0
+ - @backstage/errors@1.2.5
+
+## @techdocs/cli@1.8.24-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.6.0-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.0
+ - @backstage/plugin-techdocs-node@1.12.15-next.1
+
+## @backstage/plugin-api-docs@0.12.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.1
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/plugin-catalog@1.25.2-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.4-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/plugin-app@0.1.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/plugin-app-backend@0.4.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/config-loader@1.9.3-next.0
+ - @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-app-node@0.1.28-next.1
+
+## @backstage/plugin-app-node@0.1.28-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config-loader@1.9.3-next.0
+ - @backstage/backend-plugin-api@1.1.0-next.1
+
+## @backstage/plugin-app-visualizer@0.1.14-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+
+## @backstage/plugin-auth-backend@0.24.1-next.1
+
+### Patch Changes
+
+- c907440: Improved error forwarding for OAuth refresh endpoints
+- 40518ab: Fix issue with `jwks` endpoint returning invalid data with `firestore`
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.5-next.1
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/plugin-auth-backend-module-cloudflare-access-provider@0.3.3-next.1
+ - @backstage/plugin-auth-backend-module-bitbucket-server-provider@0.1.3-next.1
+ - @backstage/plugin-auth-backend-module-microsoft-provider@0.2.3-next.1
+ - @backstage/plugin-auth-backend-module-aws-alb-provider@0.3.1-next.1
+ - @backstage/plugin-auth-backend-module-google-provider@0.2.3-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-auth-backend-module-atlassian-provider@0.3.3-next.1
+ - @backstage/plugin-auth-backend-module-auth0-provider@0.1.3-next.1
+ - @backstage/plugin-auth-backend-module-azure-easyauth-provider@0.2.3-next.1
+ - @backstage/plugin-auth-backend-module-bitbucket-provider@0.2.3-next.1
+ - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.1
+ - @backstage/plugin-auth-backend-module-gitlab-provider@0.2.3-next.1
+ - @backstage/plugin-auth-backend-module-oauth2-provider@0.3.3-next.1
+ - @backstage/plugin-auth-backend-module-oidc-provider@0.3.3-next.1
+ - @backstage/plugin-auth-backend-module-okta-provider@0.1.3-next.1
+ - @backstage/plugin-auth-backend-module-onelogin-provider@0.2.3-next.1
+ - @backstage/plugin-auth-backend-module-gcp-iap-provider@0.3.3-next.1
+ - @backstage/plugin-auth-backend-module-oauth2-proxy-provider@0.2.3-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+
+## @backstage/plugin-auth-backend-module-atlassian-provider@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/plugin-auth-backend-module-auth0-provider@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
+
+## @backstage/plugin-auth-backend-module-aws-alb-provider@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
+
+## @backstage/plugin-auth-backend-module-azure-easyauth-provider@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
+
+## @backstage/plugin-auth-backend-module-bitbucket-provider@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/plugin-auth-backend-module-bitbucket-server-provider@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
+
+## @backstage/plugin-auth-backend-module-cloudflare-access-provider@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
+
+## @backstage/plugin-auth-backend-module-gcp-iap-provider@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
+
+## @backstage/plugin-auth-backend-module-github-provider@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/plugin-auth-backend-module-gitlab-provider@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/plugin-auth-backend-module-google-provider@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
+
+## @backstage/plugin-auth-backend-module-guest-provider@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
+
+## @backstage/plugin-auth-backend-module-microsoft-provider@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
+
+## @backstage/plugin-auth-backend-module-oauth2-provider@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/plugin-auth-backend-module-oauth2-proxy-provider@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
+
+## @backstage/plugin-auth-backend-module-oidc-provider@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
+
+## @backstage/plugin-auth-backend-module-okta-provider@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
+
+## @backstage/plugin-auth-backend-module-onelogin-provider@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/plugin-auth-backend-module-pinniped-provider@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/config@1.3.0
+
+## @backstage/plugin-auth-backend-module-vmware-cloud-provider@0.4.2-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/plugin-auth-node@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
+
+## @backstage/plugin-auth-react@0.1.10-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-catalog@1.25.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.1
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.4-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-react@0.4.28
+ - @backstage/plugin-scaffolder-common@1.5.8-next.0
+ - @backstage/plugin-search-common@1.2.15
+ - @backstage/plugin-search-react@1.8.4-next.1
+
+## @backstage/plugin-catalog-backend-module-aws@0.4.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.6.0-next.1
+ - @backstage/plugin-catalog-node@1.15.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/integration@1.16.0-next.0
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-kubernetes-common@0.9.0
+
+## @backstage/plugin-catalog-backend-module-azure@0.3.0-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/backend-openapi-utils@0.3.1-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-catalog-backend-module-bitbucket-cloud@0.4.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @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/integration@1.16.0-next.0
+ - @backstage/plugin-bitbucket-cloud-common@0.2.26-next.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-events-node@0.4.6-next.1
+
+## @backstage/plugin-catalog-backend-module-bitbucket-server@0.2.5-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.15.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/integration@1.16.0-next.0
+
+## @backstage/plugin-catalog-backend-module-gcp@0.3.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/plugin-kubernetes-common@0.9.0
+
+## @backstage/plugin-catalog-backend-module-gerrit@0.2.5-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.16.0-next.0
+
+## @backstage/plugin-catalog-backend-module-github@0.7.8-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.29.0-next.1
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @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/integration@1.16.0-next.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-events-node@0.4.6-next.1
+
+## @backstage/plugin-catalog-backend-module-github-org@0.3.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/plugin-catalog-backend-module-github@0.7.8-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.6-next.1
+
+## @backstage/plugin-catalog-backend-module-gitlab@0.5.1-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/backend-defaults@0.6.0-next.1
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-events-node@0.4.6-next.1
+
+## @backstage/plugin-catalog-backend-module-gitlab-org@0.2.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/plugin-catalog-backend-module-gitlab@0.5.1-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-events-node@0.4.6-next.1
+
+## @backstage/plugin-catalog-backend-module-incremental-ingestion@0.6.1-next.1
+
+### Patch Changes
+
+- fe87fbf: Add task metrics as two gauges that track the last start and end timestamps as epoch seconds.
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.29.0-next.1
+ - @backstage/plugin-catalog-node@1.15.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
+ - @backstage/plugin-events-node@0.4.6-next.1
+ - @backstage/plugin-permission-common@0.8.2
+
+## @backstage/plugin-catalog-backend-module-ldap@0.11.0-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.15.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
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-catalog-backend-module-logs@0.1.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.29.0-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-events-node@0.4.6-next.1
+
+## @backstage/plugin-catalog-backend-module-msgraph@0.6.5-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-catalog-backend-module-openapi@0.2.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-backend@1.29.0-next.1
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-catalog-backend-module-puppetdb@0.2.5-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.15.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
+
+## @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-scaffolder-common@1.5.8-next.0
+
+## @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.5-next.1
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-catalog-unprocessed-entities-common@0.0.5
+ - @backstage/plugin-permission-common@0.8.2
+
+## @backstage/plugin-catalog-graph@0.4.14-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.1
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.4-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/types@1.2.0
+
+## @backstage/plugin-catalog-import@0.12.8-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.1
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/core-compat-api@0.3.4-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-catalog-react@1.14.3-next.1
+
+### Patch Changes
+
+- d97a2cd: Fixed an issue causing the `EntityOwnerPicker` to reset scrolling when more elements are loaded.
+- Updated dependencies
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.4-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/frontend-test-utils@0.2.4-next.1
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/plugin-catalog-unprocessed-entities@0.2.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-config-schema@0.1.63-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+
+## @backstage/plugin-devtools@0.1.22-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/core-compat-api@0.3.4-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/plugin-devtools-common@0.1.13
+ - @backstage/plugin-permission-react@0.4.28
+
+## @backstage/plugin-events-backend-module-aws-sqs@0.4.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-events-node@0.4.6-next.1
+
+## @backstage/plugin-events-backend-module-azure@0.2.15-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-events-node@0.4.6-next.1
+
+## @backstage/plugin-events-backend-module-bitbucket-cloud@0.2.15-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-events-node@0.4.6-next.1
+
+## @backstage/plugin-events-backend-module-gerrit@0.2.15-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-events-node@0.4.6-next.1
+
+## @backstage/plugin-events-backend-module-github@0.2.15-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.6-next.1
+
+## @backstage/plugin-events-backend-module-gitlab@0.2.15-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.6-next.1
+
+## @backstage/plugin-events-backend-test-utils@0.1.39-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-events-node@0.4.6-next.1
+
+## @backstage/plugin-events-node@0.4.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+
+## @backstage/plugin-home@0.8.3-next.1
+
+### Patch Changes
+
+- 7248f3b: Added a new Quick Start Card to `plugin-home`, which can display basic info to get users the info they need to onboard to the Catalog.
+
+ import { QuickStartCard } from '@backstage/plugin-home';
+
+ }
+ cardDescription="Backstage system model will help you create new entities"
+ video={
+
+ }
+ downloadImage={
+
+ }
+ />
+
+ See the [storybook examples](https://backstage.io/storybook/?path=/story/plugins-home-components-quickstartcard--default)
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.1
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/core-compat-api@0.3.4-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/plugin-home-react@0.1.21-next.1
+
+## @backstage/plugin-home-react@0.1.21-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/core-plugin-api@1.10.1
+
+## @backstage/plugin-kubernetes@0.12.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.1
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.4-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/plugin-kubernetes-common@0.9.0
+ - @backstage/plugin-kubernetes-react@0.5.2-next.1
+
+## @backstage/plugin-kubernetes-backend@0.19.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.5-next.1
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-permission-node@0.8.6-next.1
+ - @backstage/plugin-kubernetes-node@0.2.1-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/types@1.2.0
+ - @backstage/plugin-kubernetes-common@0.9.0
+ - @backstage/plugin-permission-common@0.8.2
+
+## @backstage/plugin-kubernetes-cluster@0.0.20-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.1
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/plugin-kubernetes-common@0.9.0
+ - @backstage/plugin-kubernetes-react@0.5.2-next.1
+
+## @backstage/plugin-kubernetes-node@0.2.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/types@1.2.0
+ - @backstage/plugin-kubernetes-common@0.9.0
+
+## @backstage/plugin-kubernetes-react@0.5.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-kubernetes-common@0.9.0
+
+## @backstage/plugin-notifications@0.4.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-notifications-common@0.0.6
+ - @backstage/plugin-signals-react@0.0.7
+
+## @backstage/plugin-notifications-backend@0.4.4-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.5-next.1
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/plugin-notifications-node@0.2.10-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-signals-node@0.1.15-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-events-node@0.4.6-next.1
+ - @backstage/plugin-notifications-common@0.0.6
+
+## @backstage/plugin-notifications-backend-module-email@0.3.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/plugin-notifications-node@0.2.10-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/types@1.2.0
+ - @backstage/plugin-notifications-common@0.0.6
+
+## @backstage/plugin-notifications-node@0.2.10-next.1
+
+### Patch Changes
+
+- 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/plugin-signals-node@0.1.15-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/plugin-notifications-common@0.0.6
+
+## @backstage/plugin-org@0.6.34-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.1
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.4-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/plugin-catalog-common@1.1.1
+
+## @backstage/plugin-org-react@0.1.33-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.1
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-plugin-api@1.10.1
+
+## @backstage/plugin-permission-backend@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
+
+## @backstage/plugin-permission-backend-module-allow-all-policy@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/plugin-permission-node@0.8.6-next.1
+ - @backstage/plugin-permission-common@0.8.2
+
+## @backstage/plugin-permission-node@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
+
+## @backstage/plugin-proxy-backend@0.5.9-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+
+## @backstage/plugin-scaffolder@1.27.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.1
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/plugin-scaffolder-react@1.14.2-next.1
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-compat-api@0.3.4-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-react@0.4.28
+ - @backstage/plugin-scaffolder-common@1.5.8-next.0
+
+## @backstage/plugin-scaffolder-backend@1.28.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/plugin-catalog-node@1.15.0-next.1
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/plugin-scaffolder-node@0.6.2-next.1
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.4-next.1
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.4-next.1
+ - @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.5-next.1
+ - @backstage/plugin-scaffolder-backend-module-gerrit@0.2.4-next.1
+ - @backstage/plugin-scaffolder-backend-module-gitea@0.2.4-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-permission-node@0.8.6-next.1
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.1
+ - @backstage/plugin-scaffolder-backend-module-github@0.5.4-next.1
+ - @backstage/plugin-scaffolder-backend-module-azure@0.2.4-next.1
+ - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-bitbucket-cloud-common@0.2.26-next.0
+ - @backstage/plugin-events-node@0.4.6-next.1
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-scaffolder-common@1.5.8-next.0
+
+## @backstage/plugin-scaffolder-backend-module-azure@0.2.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.6.2-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.16.0-next.0
+
+## @backstage/plugin-scaffolder-backend-module-bitbucket@0.3.5-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.6.2-next.1
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.4-next.1
+ - @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.4-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.16.0-next.0
+
+## @backstage/plugin-scaffolder-backend-module-bitbucket-cloud@0.2.4-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.6.2-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/plugin-bitbucket-cloud-common@0.2.26-next.0
+
+## @backstage/plugin-scaffolder-backend-module-bitbucket-server@0.2.4-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.6.2-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.16.0-next.0
+
+## @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.4-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.6.2-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.16.0-next.0
+
+## @backstage/plugin-scaffolder-backend-module-cookiecutter@0.3.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.6.0-next.1
+ - @backstage/plugin-scaffolder-node@0.6.2-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/types@1.2.0
+
+## @backstage/plugin-scaffolder-backend-module-gcp@0.2.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.6.2-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.16.0-next.0
+
+## @backstage/plugin-scaffolder-backend-module-gerrit@0.2.4-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.6.2-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.16.0-next.0
+
+## @backstage/plugin-scaffolder-backend-module-gitea@0.2.4-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.6.2-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.16.0-next.0
+
+## @backstage/plugin-scaffolder-backend-module-github@0.5.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/plugin-scaffolder-node@0.6.2-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/integration@1.16.0-next.0
+
+## @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.6.2-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.16.0-next.0
+
+## @backstage/plugin-scaffolder-backend-module-notifications@0.1.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.6.2-next.1
+ - @backstage/plugin-notifications-node@0.2.10-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-notifications-common@0.0.6
+
+## @backstage/plugin-scaffolder-backend-module-rails@0.5.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.6.2-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/types@1.2.0
+
+## @backstage/plugin-scaffolder-backend-module-sentry@0.2.4-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.6.2-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+
+## @backstage/plugin-scaffolder-backend-module-yeoman@0.4.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.6.2-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-scaffolder-node-test-utils@0.1.17-next.1
+ - @backstage/types@1.2.0
+
+## @backstage/plugin-scaffolder-node@0.6.2-next.1
+
+### Patch Changes
+
+- 1a23421: Make sure that isomorphic git push commands are not proxied.
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-scaffolder-common@1.5.8-next.0
+
+## @backstage/plugin-scaffolder-node-test-utils@0.1.17-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-node@0.6.2-next.1
+ - @backstage/backend-test-utils@1.2.0-next.1
+ - @backstage/types@1.2.0
+
+## @backstage/plugin-scaffolder-react@1.14.2-next.1
+
+### Patch Changes
+
+- c846d76: Updated dependency `flatted` to `3.3.2`.
+- b21a5ae: Open links in the scaffolder entity and step descriptions in a new tab, to ensure consistency and improve user experience
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.1
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+ - @backstage/plugin-permission-react@0.4.28
+ - @backstage/plugin-scaffolder-common@1.5.8-next.0
+
+## @backstage/plugin-search@1.4.21-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.1
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/core-compat-api@0.3.4-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+ - @backstage/plugin-search-common@1.2.15
+ - @backstage/plugin-search-react@1.8.4-next.1
+
+## @backstage/plugin-search-backend-module-catalog@0.2.6-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/plugin-search-backend-node@1.3.6-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/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-backend-module-elasticsearch@1.6.3-next.1
+
+### Patch Changes
+
+- 991c9fe: Update the ElasticSearchSearchEngine translator to handle phrase searches.
+- Updated dependencies
+ - @backstage/plugin-search-backend-node@1.3.6-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-backend-module-explore@0.2.6-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-search-backend-node@1.3.6-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-backend-module-pg@0.5.39-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-backend-node@1.3.6-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-backend-module-stack-overflow-collator@0.3.4-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-search-backend-node@1.3.6-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/config@1.3.0
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-backend-module-techdocs@0.3.4-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/plugin-search-backend-node@1.3.6-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-search-common@1.2.15
+ - @backstage/plugin-techdocs-node@1.12.15-next.1
+
+## @backstage/plugin-search-backend-node@1.3.6-next.1
+
+### Patch Changes
+
+- 5ae8a2c: Removed unnecessary dependency on `@backstage/backend-defaults`.
+- Updated dependencies
+ - @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
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-search-react@1.8.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+ - @backstage/plugin-search-common@1.2.15
+
+## @backstage/plugin-signals@0.0.14-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-signals-react@0.0.7
+
+## @backstage/plugin-signals-backend@0.2.4-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-signals-node@0.1.15-next.1
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-events-node@0.4.6-next.1
+
+## @backstage/plugin-signals-node@0.1.15-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/types@1.2.0
+ - @backstage/plugin-events-node@0.4.6-next.1
+
+## @backstage/plugin-techdocs@1.11.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.1
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/core-compat-api@0.3.4-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/integration@1.16.0-next.0
+ - @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-search-common@1.2.15
+ - @backstage/plugin-search-react@1.8.4-next.1
+ - @backstage/plugin-techdocs-common@0.1.0
+ - @backstage/plugin-techdocs-react@1.2.12-next.1
+
+## @backstage/plugin-techdocs-addons-test-utils@1.0.43-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.1
+ - @backstage/plugin-catalog@1.25.2-next.1
+ - @backstage/plugin-techdocs@1.11.3-next.1
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/test-utils@1.7.3-next.0
+ - @backstage/plugin-search-react@1.8.4-next.1
+ - @backstage/plugin-techdocs-react@1.2.12-next.1
+
+## @backstage/plugin-techdocs-backend@1.11.4-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/plugin-search-backend-module-techdocs@0.3.4-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/integration@1.16.0-next.0
+ - @backstage/plugin-catalog-common@1.1.1
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-techdocs-common@0.1.0
+ - @backstage/plugin-techdocs-node@1.12.15-next.1
+
+## @backstage/plugin-techdocs-module-addons-contrib@1.1.19-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/plugin-techdocs-react@1.2.12-next.1
+
+## @backstage/plugin-techdocs-node@1.12.15-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @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/integration@1.16.0-next.0
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/plugin-search-common@1.2.15
+ - @backstage/plugin-techdocs-common@0.1.0
+
+## @backstage/plugin-techdocs-react@1.2.12-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/version-bridge@1.0.10
+
+## @backstage/plugin-user-settings@0.8.17-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.1
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/core-compat-api@0.3.4-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-signals-react@0.0.7
+ - @backstage/plugin-user-settings-common@0.0.1
+
+## @backstage/plugin-user-settings-backend@0.2.28-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-plugin-api@1.1.0-next.1
+ - @backstage/plugin-signals-node@0.1.15-next.1
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-user-settings-common@0.0.1
+
+## example-app@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
+
+## example-app-next@0.0.18-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-compat-api@0.3.4-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-app-api@0.10.3-next.1
+ - @backstage/frontend-defaults@0.1.4-next.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/plugin-app@0.1.4-next.1
+ - @backstage/plugin-app-visualizer@0.1.14-next.1
+ - @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-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
+
+## app-next-example-plugin@0.0.18-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+
+## example-backend@0.0.33-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/plugin-catalog-backend@1.29.0-next.1
+ - @backstage/backend-defaults@0.6.0-next.1
+ - @backstage/plugin-events-backend@0.4.0-next.1
+ - @backstage/plugin-search-backend@1.8.0-next.1
+ - @backstage/plugin-devtools-backend@0.5.0-next.1
+ - @backstage/plugin-search-backend-node@1.3.6-next.1
+ - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.1
+ - @backstage/plugin-search-backend-module-explore@0.2.6-next.1
+ - @backstage/plugin-notifications-backend@0.4.4-next.1
+ - @backstage/plugin-permission-backend@0.5.52-next.1
+ - @backstage/plugin-techdocs-backend@1.11.4-next.1
+ - @backstage/plugin-signals-backend@0.2.4-next.1
+ - @backstage/plugin-proxy-backend@0.5.9-next.1
+ - @backstage/plugin-app-backend@0.4.3-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.1
+ - @backstage/plugin-auth-backend-module-guest-provider@0.2.3-next.1
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.1
+ - @backstage/plugin-kubernetes-backend@0.19.1-next.1
+ - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3-next.1
+ - @backstage/plugin-permission-node@0.8.6-next.1
+ - @backstage/plugin-scaffolder-backend@1.28.0-next.1
+ - @backstage/plugin-catalog-backend-module-openapi@0.2.5-next.1
+ - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3-next.1
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.1
+ - @backstage/plugin-search-backend-module-catalog@0.2.6-next.1
+ - @backstage/plugin-scaffolder-backend-module-github@0.5.4-next.1
+ - @backstage/plugin-scaffolder-backend-module-notifications@0.1.5-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/plugin-permission-common@0.8.2
+
+## example-backend-legacy@0.2.105-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-backend-module-elasticsearch@1.6.3-next.1
+ - @backstage/plugin-auth-backend@0.24.1-next.1
+ - @backstage/plugin-auth-node@0.5.5-next.1
+ - @backstage/plugin-catalog-backend@1.29.0-next.1
+ - @backstage/backend-defaults@0.6.0-next.1
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/plugin-events-backend@0.4.0-next.1
+ - @backstage/plugin-search-backend@1.8.0-next.1
+ - @backstage/plugin-search-backend-node@1.3.6-next.1
+ - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.1
+ - @backstage/plugin-search-backend-module-explore@0.2.6-next.1
+ - @backstage/plugin-permission-backend@0.5.52-next.1
+ - @backstage/plugin-techdocs-backend@1.11.4-next.1
+ - @backstage/plugin-signals-backend@0.2.4-next.1
+ - @backstage/plugin-proxy-backend@0.5.9-next.1
+ - @backstage/plugin-app-backend@0.4.3-next.1
+ - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.4-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.1
+ - @backstage/plugin-kubernetes-backend@0.19.1-next.1
+ - @backstage/plugin-permission-node@0.8.6-next.1
+ - @backstage/plugin-scaffolder-backend@1.28.0-next.1
+ - @backstage/plugin-signals-node@0.1.15-next.1
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.1
+ - @backstage/plugin-search-backend-module-catalog@0.2.6-next.1
+ - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0-next.1
+ - @backstage/plugin-scaffolder-backend-module-rails@0.5.4-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/plugin-events-node@0.4.6-next.1
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-search-backend-module-pg@0.5.39-next.1
+
+## e2e-test@0.2.23-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/create-app@0.5.23-next.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/errors@1.2.5
+
+## @internal/frontend@0.0.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+
+## @internal/scaffolder@0.0.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-scaffolder-react@1.14.2-next.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+
+## techdocs-cli-embedded-app@0.2.103-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.29.3-next.1
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/plugin-catalog@1.25.2-next.1
+ - @backstage/plugin-techdocs@1.11.3-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/integration-react@1.2.2-next.0
+ - @backstage/test-utils@1.7.3-next.0
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/plugin-techdocs-react@1.2.12-next.1
+
+## yarn-plugin-backstage@0.0.4-next.1
+
+### Patch Changes
+
+- 48cc7c5: Use yarn's built-in http utilities for fetching release manifests
+- Updated dependencies
+ - @backstage/release-manifests@0.0.12-next.1
+ - @backstage/cli-common@0.1.15
+
+## @internal/plugin-todo-list@1.0.34-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/core-plugin-api@1.10.1
+
+## @internal/plugin-todo-list-backend@1.0.34-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
diff --git a/docs/tooling/local-dev/linking-local-packages.md b/docs/tooling/local-dev/linking-local-packages.md
index 853f470a39..9205195f64 100644
--- a/docs/tooling/local-dev/linking-local-packages.md
+++ b/docs/tooling/local-dev/linking-local-packages.md
@@ -57,7 +57,7 @@ After making local changes to a package in an external workspace you might often
For example, if you've made changes to the `@backstage/backend-app-api` package in a local clone of the main `backstage` repository, you can generate a patch for your internal project as follows:
```bash title="Run in the cloned backstage repository"
-yarn backstage-repo-tools generate patch @backstage/backend-app-api --target ../our-developer-portal
+yarn backstage-repo-tools generate-patch @backstage/backend-app-api --target ../our-developer-portal
```
This will generate a patch file in your `our-developer-portal` workspace. The patch will be based on the most recently released version of the source package, with the additional changes on top.
diff --git a/docs/tutorials/migrate-to-mui5.md b/docs/tutorials/migrate-to-mui5.md
index c65abbc680..a0f8a9017e 100644
--- a/docs/tutorials/migrate-to-mui5.md
+++ b/docs/tutorials/migrate-to-mui5.md
@@ -4,6 +4,12 @@ title: Migrating from Material UI v4 to v5
description: Additional resources for the Material UI v5 migration guide specifically for Backstage
---
+:::info
+
+We are in the process of determining the path forward regarding a New Design System for Backstage, for the time being we recommend pausing any migrations to MUI v5 until this has been settled. More details can be found in ["RFC: New design system for Backstage"](https://github.com/backstage/backstage/issues/27726).
+
+:::
+
Backstage supports developing new plugins or components using Material UI v5. At the same time, large parts of the application as well as existing plugins will still be using Material UI v4. To support Material UI v4 and v5 at the same time, we have introduced a new concept called the `UnifiedTheme`. The goal of the `UnifiedTheme` is to allow gradual migration by running both versions in parallel, applying theme options similarly & supporting potential future versions of Material UI.
By default, the `UnifiedThemeProvider` is already used. If you add a custom theme in your `createApp` function, you would need to replace the Material UI `ThemeProvider` with the `UnifiedThemeProvider`:
diff --git a/microsite/data/plugins/mend.yaml b/microsite/data/plugins/mend.yaml
new file mode 100644
index 0000000000..8c18c6b71f
--- /dev/null
+++ b/microsite/data/plugins/mend.yaml
@@ -0,0 +1,12 @@
+---
+title: Mend.io
+author: Mend.io
+authorUrl: https://www.mend.io/
+category: Security
+description: Proactive application risk management for developer and security teams directly in Backstage
+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/docusaurus.config.ts b/microsite/docusaurus.config.ts
index 7795e9f8a5..43bde19e35 100644
--- a/microsite/docusaurus.config.ts
+++ b/microsite/docusaurus.config.ts
@@ -444,8 +444,5 @@ const config: Config = {
],
},
} satisfies Preset.ThemeConfig,
- future: {
- experimental_faster: true,
- },
};
export default config;
diff --git a/microsite/package.json b/microsite/package.json
index ee5652416a..e3b0388903 100644
--- a/microsite/package.json
+++ b/microsite/package.json
@@ -17,12 +17,12 @@
"version": "docusaurus-version",
"write-translations": "docusaurus-write-translations"
},
- "prettier": "@spotify/prettier-config",
+ "prettier": "@backstage/cli/config/prettier",
"dependencies": {
- "@docusaurus/core": "^3.6.0",
- "@docusaurus/plugin-client-redirects": "^3.6.0",
- "@docusaurus/preset-classic": "^3.6.0",
- "@docusaurus/types": "^3.6.0",
+ "@docusaurus/core": "^3.1.1",
+ "@docusaurus/plugin-client-redirects": "^3.1.1",
+ "@docusaurus/preset-classic": "^3.1.1",
+ "@docusaurus/types": "^3.1.1",
"@mdx-js/react": "^3.0.0",
"@swc/core": "^1.3.46",
"clsx": "^2.0.0",
@@ -36,10 +36,8 @@
"swc-loader": "^0.2.3"
},
"devDependencies": {
- "@docusaurus/faster": "^3.6.0",
- "@docusaurus/module-type-aliases": "^3.6.0",
- "@docusaurus/tsconfig": "^3.6.0",
- "@spotify/prettier-config": "^15.0.0",
+ "@docusaurus/module-type-aliases": "^3.1.1",
+ "@docusaurus/tsconfig": "^3.1.1",
"@types/luxon": "^3.0.0",
"@types/webpack-env": "^1.18.0",
"js-yaml": "^4.1.0",
diff --git a/microsite/sidebars.js b/microsite/sidebars.js
index 871cec0a0f..2647143065 100644
--- a/microsite/sidebars.js
+++ b/microsite/sidebars.js
@@ -27,6 +27,16 @@ module.exports = {
'getting-started/homepage',
],
},
+ {
+ type: 'category',
+ label: 'Deploying Backstage',
+ items: [
+ 'deployment/index',
+ 'deployment/scaling',
+ 'deployment/docker',
+ 'deployment/k8s',
+ ],
+ },
{
type: 'category',
label: 'Using Backstage',
@@ -37,7 +47,6 @@ module.exports = {
],
},
'getting-started/keeping-backstage-updated',
- 'getting-started/concepts',
],
'Core Features': [
{
@@ -92,6 +101,7 @@ module.exports = {
'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',
],
},
{
@@ -138,6 +148,14 @@ module.exports = {
'integrations/aws-s3/discovery',
],
},
+ {
+ type: 'category',
+ label: 'Azure Blob Storage',
+ items: [
+ 'integrations/azure-blobStorage/locations',
+ 'integrations/azure-blobStorage/discovery',
+ ],
+ },
{
type: 'category',
label: 'Azure',
@@ -341,20 +359,6 @@ module.exports = {
},
'tooling/package-metadata',
],
- Deployment: [
- 'deployment/index',
- 'deployment/scaling',
- 'deployment/docker',
- 'deployment/k8s',
- 'deployment/heroku',
- 'deployment/koyeb',
- 'deployment/flightcontrol',
- {
- type: 'category',
- label: 'Using Backstage Deploy (alpha)',
- items: ['deployment/backstage-deploy/aws-lightsail'],
- },
- ],
'New Backend System': [
'backend-system/index',
{
diff --git a/microsite/src/pages/plugins/_pluginCard.tsx b/microsite/src/pages/plugins/_pluginCard.tsx
index ba8e8069d2..ba7864f9aa 100644
--- a/microsite/src/pages/plugins/_pluginCard.tsx
+++ b/microsite/src/pages/plugins/_pluginCard.tsx
@@ -9,14 +9,14 @@ export interface IPluginData {
category: string;
description: string;
documentation: string;
- iconUrl: string;
+ iconUrl?: string;
title: string;
addedDate: string;
isNew: boolean;
order?: number;
}
-const defaultIconUrl = 'img/logo-gradient-on-dark.svg';
+const defaultIconUrl = '/img/logo-gradient-on-dark.svg';
export const PluginCard = ({
author,
diff --git a/microsite/yarn.lock b/microsite/yarn.lock
index 93248d9dc2..6197b0463e 100644
--- a/microsite/yarn.lock
+++ b/microsite/yarn.lock
@@ -197,119 +197,132 @@ __metadata:
languageName: node
linkType: hard
-"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0, @babel/code-frame@npm:^7.8.3":
- version: 7.26.2
- resolution: "@babel/code-frame@npm:7.26.2"
+"@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"
dependencies:
- "@babel/helper-validator-identifier": ^7.25.9
- js-tokens: ^4.0.0
+ "@babel/highlight": ^7.24.7
picocolors: ^1.0.0
- checksum: db13f5c42d54b76c1480916485e6900748bbcb0014a8aca87f50a091f70ff4e0d0a6db63cade75eb41fcc3d2b6ba0a7f89e343def4f96f00269b41b8ab8dd7b8
+ checksum: 830e62cd38775fdf84d612544251ce773d544a8e63df667728cc9e0126eeef14c6ebda79be0f0bc307e8318316b7f58c27ce86702e0a1f5c321d842eb38ffda4
languageName: node
linkType: hard
-"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.9, @babel/compat-data@npm:^7.26.0":
- version: 7.26.2
- resolution: "@babel/compat-data@npm:7.26.2"
- checksum: d52fae9b0dc59b409d6005ae6b172e89329f46d68136130065ebe923a156fc633e0f1c8600b3e319b9e0f99fd948f64991a5419e2e9431d00d9d235d5f7a7618
+"@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: b12a91d27c3731a4b0bdc9312a50b1911f41f7f728aaf0d4b32486e2257fd2cb2d3ea1a295e98449600c48f2c7883a3196ca77cda1cef7d97a10c2e83d037974
languageName: node
linkType: hard
-"@babel/core@npm:^7.21.3, @babel/core@npm:^7.25.9":
- version: 7.26.0
- resolution: "@babel/core@npm:7.26.0"
+"@babel/core@npm:^7.21.3, @babel/core@npm:^7.23.3":
+ version: 7.25.2
+ resolution: "@babel/core@npm:7.25.2"
dependencies:
"@ampproject/remapping": ^2.2.0
- "@babel/code-frame": ^7.26.0
- "@babel/generator": ^7.26.0
- "@babel/helper-compilation-targets": ^7.25.9
- "@babel/helper-module-transforms": ^7.26.0
- "@babel/helpers": ^7.26.0
- "@babel/parser": ^7.26.0
- "@babel/template": ^7.25.9
- "@babel/traverse": ^7.25.9
- "@babel/types": ^7.26.0
+ "@babel/code-frame": ^7.24.7
+ "@babel/generator": ^7.25.0
+ "@babel/helper-compilation-targets": ^7.25.2
+ "@babel/helper-module-transforms": ^7.25.2
+ "@babel/helpers": ^7.25.0
+ "@babel/parser": ^7.25.0
+ "@babel/template": ^7.25.0
+ "@babel/traverse": ^7.25.2
+ "@babel/types": ^7.25.2
convert-source-map: ^2.0.0
debug: ^4.1.0
gensync: ^1.0.0-beta.2
json5: ^2.2.3
semver: ^6.3.1
- checksum: b296084cfd818bed8079526af93b5dfa0ba70282532d2132caf71d4060ab190ba26d3184832a45accd82c3c54016985a4109ab9118674347a7e5e9bc464894e6
+ checksum: 9a1ef604a7eb62195f70f9370cec45472a08114e3934e3eaaedee8fd754edf0730e62347c7b4b5e67d743ce57b5bb8cf3b92459482ca94d06e06246ef021390a
languageName: node
linkType: hard
-"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0":
- version: 7.26.2
- resolution: "@babel/generator@npm:7.26.2"
+"@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"
dependencies:
- "@babel/parser": ^7.26.2
- "@babel/types": ^7.26.0
+ "@babel/types": ^7.25.4
"@jridgewell/gen-mapping": ^0.3.5
"@jridgewell/trace-mapping": ^0.3.25
- jsesc: ^3.0.2
- checksum: 6ff850b7d6082619f8c2f518d993cf7254cfbaa20b026282cbef5c9b2197686d076a432b18e36c4d1a42721c016df4f77a8f62c67600775d9683621d534b91b4
+ jsesc: ^2.5.1
+ checksum: d7713f02536a8144eca810e9b13ae854b05fec462348eaf52e7b50df2c0a312bc43bfff0e8e10d6dd982e8986d61175ac8e67d7358a8b4dad9db4d6733bf0c9c
languageName: node
linkType: hard
-"@babel/helper-annotate-as-pure@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-annotate-as-pure@npm:7.25.9"
+"@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"
dependencies:
- "@babel/types": ^7.25.9
- checksum: 41edda10df1ae106a9b4fe617bf7c6df77db992992afd46192534f5cff29f9e49a303231733782dd65c5f9409714a529f215325569f14282046e9d3b7a1ffb6c
+ "@babel/types": ^7.24.7
+ checksum: 6178566099a6a0657db7a7fa601a54fb4731ca0b8614fbdccfd8e523c210c13963649bc8fdfd53ce7dd14d05e3dda2fb22dea5b30113c488b9eb1a906d60212e
languageName: node
linkType: hard
-"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.25.9"
+"@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"
dependencies:
- "@babel/traverse": ^7.25.9
- "@babel/types": ^7.25.9
- checksum: e1bb465b3b0155702d82cfef09e3813e87a6d777cdd2c513796861eac14953340491eafea1d4109278bf4ceb48b54074c45758f042c0544d00c498090bee5a6f
+ "@babel/traverse": ^7.24.7
+ "@babel/types": ^7.24.7
+ checksum: 71a6158a9fdebffb82fdc400d5555ba8f2e370cea81a0d578155877bdc4db7d5252b75c43b2fdf3f72b3f68348891f99bd35ae315542daad1b7ace8322b1abcb
languageName: node
linkType: hard
-"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-compilation-targets@npm:7.25.9"
+"@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": ^7.25.9
- "@babel/helper-validator-option": ^7.25.9
- browserslist: ^4.24.0
+ "@babel/compat-data": ^7.25.2
+ "@babel/helper-validator-option": ^7.24.8
+ browserslist: ^4.23.1
lru-cache: ^5.1.1
semver: ^6.3.1
- checksum: 3af536e2db358b38f968abdf7d512d425d1018fef2f485d6f131a57a7bcaed32c606b4e148bb230e1508fa42b5b2ac281855a68eb78270f54698c48a83201b9b
+ checksum: aed33c5496cb9db4b5e2d44e26bf8bc474074cc7f7bb5ebe1d4a20fdeb362cb3ba9e1596ca18c7484bcd6e5c3a155ab975e420d520c0ae60df81f9de04d0fd16
languageName: node
linkType: hard
-"@babel/helper-create-class-features-plugin@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-create-class-features-plugin@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-annotate-as-pure": ^7.25.9
- "@babel/helper-member-expression-to-functions": ^7.25.9
- "@babel/helper-optimise-call-expression": ^7.25.9
- "@babel/helper-replace-supers": ^7.25.9
- "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9
- "@babel/traverse": ^7.25.9
+ "@babel/helper-annotate-as-pure": ^7.24.7
+ "@babel/helper-member-expression-to-functions": ^7.24.8
+ "@babel/helper-optimise-call-expression": ^7.24.7
+ "@babel/helper-replace-supers": ^7.25.0
+ "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7
+ "@babel/traverse": ^7.25.4
semver: ^6.3.1
peerDependencies:
"@babel/core": ^7.0.0
- checksum: 91dd5f203ed04568c70b052e2f26dfaac7c146447196c00b8ecbb6d3d2f3b517abadb985d3321a19d143adaed6fe17f7f79f8f50e0c20e9d8ad83e1027b42424
+ checksum: 4544ebda4516eb25efdebd47ca024bd7bdb1eb6e7cc3ad89688c8ef8e889734c2f4411ed78981899c641394f013f246f2af63d92a0e9270f6c453309b4cb89ba
languageName: node
linkType: hard
-"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-create-regexp-features-plugin@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-annotate-as-pure": ^7.25.9
- regexpu-core: ^6.1.1
+ "@babel/helper-annotate-as-pure": ^7.24.7
+ regexpu-core: ^5.3.1
semver: ^6.3.1
peerDependencies:
"@babel/core": ^7.0.0
- checksum: 563ed361ceed3d7a9d64dd58616bf6f0befcc23620ab22d31dd6d8b751d3f99d6d210487b1a5a1e209ab4594df67bacfab7445cbfa092bfe2b719cd42ae1ba6f
+ checksum: df55fdc6a1f3090dd37d91347df52d9322d52affa239543808dc142f8fe35e6787e67d8612337668198fac85826fafa9e6772e6c28b7d249ec94e6fafae5da6e
+ 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"
+ dependencies:
+ "@babel/helper-compilation-targets": ^7.22.6
+ "@babel/helper-plugin-utils": ^7.22.5
+ debug: ^4.1.1
+ lodash.debounce: ^4.0.8
+ resolve: ^1.14.2
+ peerDependencies:
+ "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0
+ checksum: 1f6dec0c5d0876d278fe15b71238eccc5f74c4e2efa2c78aaafa8bc2cc96336b8e68d94cd1a78497356c96e8b91b8c1f4452179820624d1702aee2f9832e6569
languageName: node
linkType: hard
@@ -328,210 +341,223 @@ __metadata:
languageName: node
linkType: hard
-"@babel/helper-member-expression-to-functions@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-member-expression-to-functions@npm:7.25.9"
+"@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"
dependencies:
- "@babel/traverse": ^7.25.9
- "@babel/types": ^7.25.9
- checksum: 8e2f1979b6d596ac2a8cbf17f2cf709180fefc274ac3331408b48203fe19134ed87800774ef18838d0275c3965130bae22980d90caed756b7493631d4b2cf961
+ "@babel/traverse": ^7.24.8
+ "@babel/types": ^7.24.8
+ checksum: bf923d05d81b06857f4ca4fe9c528c9c447a58db5ea39595bb559eae2fce01a8266173db0fd6a2ec129d7bbbb9bb22f4e90008252f7c66b422c76630a878a4bc
languageName: node
linkType: hard
-"@babel/helper-module-imports@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-module-imports@npm:7.25.9"
+"@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"
dependencies:
- "@babel/traverse": ^7.25.9
- "@babel/types": ^7.25.9
- checksum: 1b411ce4ca825422ef7065dffae7d8acef52023e51ad096351e3e2c05837e9bf9fca2af9ca7f28dc26d596a588863d0fedd40711a88e350b736c619a80e704e6
+ "@babel/traverse": ^7.24.7
+ "@babel/types": ^7.24.7
+ checksum: 8ac15d96d262b8940bc469052a048e06430bba1296369be695fabdf6799f201dd0b00151762b56012a218464e706bc033f27c07f6cec20c6f8f5fd6543c67054
languageName: node
linkType: hard
-"@babel/helper-module-transforms@npm:^7.25.9, @babel/helper-module-transforms@npm:^7.26.0":
- version: 7.26.0
- resolution: "@babel/helper-module-transforms@npm:7.26.0"
+"@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"
dependencies:
- "@babel/helper-module-imports": ^7.25.9
- "@babel/helper-validator-identifier": ^7.25.9
- "@babel/traverse": ^7.25.9
+ "@babel/helper-module-imports": ^7.24.7
+ "@babel/helper-simple-access": ^7.24.7
+ "@babel/helper-validator-identifier": ^7.24.7
+ "@babel/traverse": ^7.25.2
peerDependencies:
"@babel/core": ^7.0.0
- checksum: 942eee3adf2b387443c247a2c190c17c4fd45ba92a23087abab4c804f40541790d51ad5277e4b5b1ed8d5ba5b62de73857446b7742f835c18ebd350384e63917
+ checksum: 282d4e3308df6746289e46e9c39a0870819630af5f84d632559171e4fae6045684d771a65f62df3d569e88ccf81dc2def78b8338a449ae3a94bb421aa14fc367
languageName: node
linkType: hard
-"@babel/helper-optimise-call-expression@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-optimise-call-expression@npm:7.25.9"
+"@babel/helper-optimise-call-expression@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/helper-optimise-call-expression@npm:7.24.7"
dependencies:
- "@babel/types": ^7.25.9
- checksum: f09d0ad60c0715b9a60c31841b3246b47d67650c512ce85bbe24a3124f1a4d66377df793af393273bc6e1015b0a9c799626c48e53747581c1582b99167cc65dc
+ "@babel/types": ^7.24.7
+ checksum: 280654eaf90e92bf383d7eed49019573fb35a98c9e992668f701ad099957246721044be2068cf6840cb2299e0ad393705a1981c88c23a1048096a8d59e5f79a3
languageName: node
linkType: hard
-"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.8, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.8.0":
- version: 7.25.9
- resolution: "@babel/helper-plugin-utils@npm:7.25.9"
- checksum: e19ec8acf0b696756e6d84531f532c5fe508dce57aa68c75572a77798bd04587a844a9a6c8ea7d62d673e21fdc174d091c9097fb29aea1c1b49f9c6eaa80f022
+"@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: 73b1a83ba8bcee21dc94de2eb7323207391715e4369fd55844bb15cf13e3df6f3d13a40786d990e6370bf0f571d94fc31f70dec96c1d1002058258c35ca3767a
languageName: node
linkType: hard
-"@babel/helper-remap-async-to-generator@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-remap-async-to-generator@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-annotate-as-pure": ^7.25.9
- "@babel/helper-wrap-function": ^7.25.9
- "@babel/traverse": ^7.25.9
+ "@babel/helper-annotate-as-pure": ^7.24.7
+ "@babel/helper-wrap-function": ^7.25.0
+ "@babel/traverse": ^7.25.0
peerDependencies:
"@babel/core": ^7.0.0
- checksum: ea37ad9f8f7bcc27c109963b8ebb9d22bac7a5db2a51de199cb560e251d5593fe721e46aab2ca7d3e7a24b0aa4aff0eaf9c7307af9c2fd3a1d84268579073052
+ checksum: 47f3065e43fe9d6128ddb4291ffb9cf031935379265fd13de972b5f241943121f7583efb69cd2e1ecf39e3d0f76f047547d56c3fcc2c853b326fad5465da0bd7
languageName: node
linkType: hard
-"@babel/helper-replace-supers@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-replace-supers@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-member-expression-to-functions": ^7.25.9
- "@babel/helper-optimise-call-expression": ^7.25.9
- "@babel/traverse": ^7.25.9
+ "@babel/helper-member-expression-to-functions": ^7.24.8
+ "@babel/helper-optimise-call-expression": ^7.24.7
+ "@babel/traverse": ^7.25.0
peerDependencies:
"@babel/core": ^7.0.0
- checksum: 84f40e12520b7023e52d289bf9d569a06284879fe23bbbacad86bec5d978b2669769f11b073fcfeb1567d8c547168323005fda88607a4681ecaeb4a5cdd48bb9
+ checksum: f669fc2487c22d40b808f94b9c3ee41129484d5ef0ba689bdd70f216ff91e10b6b021d2f8cd37e7bdd700235a2a6ae6622526344f064528190383bf661ac65f8
languageName: node
linkType: hard
-"@babel/helper-simple-access@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-simple-access@npm:7.25.9"
+"@babel/helper-simple-access@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/helper-simple-access@npm:7.24.7"
dependencies:
- "@babel/traverse": ^7.25.9
- "@babel/types": ^7.25.9
- checksum: 6d96c94b88e8288d15e5352c1221486bd4f62de8c7dc7c7b9f5b107ce2c79f67fec5ed71a0476e146f1fefbbbf1d69abe35dc821d80ce01fc7f472286c342421
+ "@babel/traverse": ^7.24.7
+ "@babel/types": ^7.24.7
+ checksum: ddbf55f9dea1900213f2a1a8500fabfd21c5a20f44dcfa957e4b0d8638c730f88751c77f678644f754f1a1dc73f4eb8b766c300deb45a9daad000e4247957819
languageName: node
linkType: hard
-"@babel/helper-skip-transparent-expression-wrappers@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.9"
+"@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"
dependencies:
- "@babel/traverse": ^7.25.9
- "@babel/types": ^7.25.9
- checksum: fdbb5248932198bc26daa6abf0d2ac42cab9c2dbb75b7e9f40d425c8f28f09620b886d40e7f9e4e08ffc7aaa2cefe6fc2c44be7c20e81f7526634702fb615bdc
+ "@babel/traverse": ^7.24.7
+ "@babel/types": ^7.24.7
+ checksum: 11b28fe534ce2b1a67c4d8e51a7b5711a2a0a0cae802f74614eee54cca58c744d9a62f6f60103c41759e81c537d270bfd665bf368a6bea214c6052f2094f8407
languageName: node
linkType: hard
-"@babel/helper-string-parser@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-string-parser@npm:7.25.9"
- checksum: 6435ee0849e101681c1849868278b5aee82686ba2c1e27280e5e8aca6233af6810d39f8e4e693d2f2a44a3728a6ccfd66f72d71826a94105b86b731697cdfa99
+"@babel/helper-string-parser@npm:^7.24.8":
+ version: 7.24.8
+ resolution: "@babel/helper-string-parser@npm:7.24.8"
+ checksum: 39b03c5119216883878655b149148dc4d2e284791e969b19467a9411fccaa33f7a713add98f4db5ed519535f70ad273cdadfd2eb54d47ebbdeac5083351328ce
languageName: node
linkType: hard
-"@babel/helper-validator-identifier@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-validator-identifier@npm:7.25.9"
- checksum: 5b85918cb1a92a7f3f508ea02699e8d2422fe17ea8e82acd445006c0ef7520fbf48e3dbcdaf7b0a1d571fc3a2715a29719e5226636cb6042e15fe6ed2a590944
+"@babel/helper-validator-identifier@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/helper-validator-identifier@npm:7.24.7"
+ checksum: 6799ab117cefc0ecd35cd0b40ead320c621a298ecac88686a14cffceaac89d80cdb3c178f969861bf5fa5e4f766648f9161ea0752ecfe080d8e89e3147270257
languageName: node
linkType: hard
-"@babel/helper-validator-option@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-validator-option@npm:7.25.9"
- checksum: 9491b2755948ebbdd68f87da907283698e663b5af2d2b1b02a2765761974b1120d5d8d49e9175b167f16f72748ffceec8c9cf62acfbee73f4904507b246e2b3d
+"@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: a52442dfa74be6719c0608fee3225bd0493c4057459f3014681ea1a4643cd38b68ff477fe867c4b356da7330d085f247f0724d300582fa4ab9a02efaf34d107c
languageName: node
linkType: hard
-"@babel/helper-wrap-function@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/helper-wrap-function@npm:7.25.9"
+"@babel/helper-wrap-function@npm:^7.25.0":
+ version: 7.25.0
+ resolution: "@babel/helper-wrap-function@npm:7.25.0"
dependencies:
- "@babel/template": ^7.25.9
- "@babel/traverse": ^7.25.9
- "@babel/types": ^7.25.9
- checksum: 8ec1701e60ae004415800c4a7a188f5564c73b4e4f3fdf58dd3f34a3feaa9753173f39bbd6d02e7ecc974f48155efc7940e62584435b3092c07728ee46a604ea
+ "@babel/template": ^7.25.0
+ "@babel/traverse": ^7.25.0
+ "@babel/types": ^7.25.0
+ checksum: 0095b4741704066d1687f9bbd5370bb88c733919e4275e49615f70c180208148ff5f24ab58d186ce92f8f5d28eab034ec6617e9264590cc4744c75302857629c
languageName: node
linkType: hard
-"@babel/helpers@npm:^7.26.0":
- version: 7.26.0
- resolution: "@babel/helpers@npm:7.26.0"
+"@babel/helpers@npm:^7.25.0":
+ version: 7.25.0
+ resolution: "@babel/helpers@npm:7.25.0"
dependencies:
- "@babel/template": ^7.25.9
- "@babel/types": ^7.26.0
- checksum: d77fe8d45033d6007eadfa440355c1355eed57902d5a302f450827ad3d530343430a21210584d32eef2f216ae463d4591184c6fc60cf205bbf3a884561469200
+ "@babel/template": ^7.25.0
+ "@babel/types": ^7.25.0
+ checksum: 739e3704ff41a30f5eaac469b553f4d3ab02be6ced083f5925851532dfbd9efc5c347728e77b754ed0b262a4e5e384e60932a62c192d338db7e4b7f3adf9f4a7
languageName: node
linkType: hard
-"@babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.2":
- version: 7.26.2
- resolution: "@babel/parser@npm:7.26.2"
+"@babel/highlight@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/highlight@npm:7.24.7"
dependencies:
- "@babel/types": ^7.26.0
+ "@babel/helper-validator-identifier": ^7.24.7
+ chalk: ^2.4.2
+ js-tokens: ^4.0.0
+ picocolors: ^1.0.0
+ checksum: 5cd3a89f143671c4ac129960024ba678b669e6fc673ce078030f5175002d1d3d52bc10b22c5b916a6faf644b5028e9a4bd2bb264d053d9b05b6a98690f1d46f1
+ 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": ^7.25.4
bin:
parser: ./bin/babel-parser.js
- checksum: c88b5ea0adf357ef909cdc2c31e284a154943edc59f63f6e8a4c20bf773a1b2f3d8c2205e59c09ca7cdad91e7466300114548876529277a80651b6436a48d5d9
+ checksum: fe4f083d4ad34f019dd7fad672cd007003004fb0a3df9b7315a5da9a5e8e56c1fed95acab6862e7d76cfccb2e8e364bcc307e9117718e6bb6dfb2e87ad065abf
languageName: node
linkType: hard
-"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/traverse": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.8
+ "@babel/traverse": ^7.25.3
peerDependencies:
"@babel/core": ^7.0.0
- checksum: b33d37dacf98a9c74f53959999adc37a258057668b62dba557e6865689433c53764673109eaba9102bf73b2ac4db162f0d9b89a6cca6f1b71d12f5908ec11da9
+ checksum: d3dba60f360defe70eb43e35a1b17ea9dd4a99e734249e15be3d5c288019644f96f88d7ff51990118fda0845b4ad50f6d869e0382232b1d8b054d113d4eea7e2
languageName: node
linkType: hard
-"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.8
peerDependencies:
"@babel/core": ^7.0.0
- checksum: d3e14ab1cb9cb50246d20cab9539f2fbd1e7ef1ded73980c8ad7c0561b4d5e0b144d362225f0976d47898e04cbd40f2000e208b0913bd788346cf7791b96af91
+ checksum: fd56d1e6435f2c008ca9050ea906ff7eedcbec43f532f2bf2e7e905d8bf75bf5e4295ea9593f060394e2c8e45737266ccbf718050bad2dd7be4e7613c60d1b5b
languageName: node
linkType: hard
-"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.8
peerDependencies:
"@babel/core": ^7.0.0
- checksum: a9d1ee3fd100d3eb6799a2f2bbd785296f356c531d75c9369f71541811fa324270258a374db103ce159156d006da2f33370330558d0133e6f7584152c34997ca
+ checksum: 13ed301b108d85867d64226bbc4032b07dd1a23aab68e9e32452c4fe3930f2198bb65bdae9c262c4104bd5e45647bc1830d25d43d356ee9a137edd8d5fab8350
languageName: node
linkType: hard
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9
- "@babel/plugin-transform-optional-chaining": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
+ "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7
+ "@babel/plugin-transform-optional-chaining": ^7.24.7
peerDependencies:
"@babel/core": ^7.13.0
- checksum: 5b298b28e156f64de51cdb03a2c5b80c7f978815ef1026f3ae8b9fc48d28bf0a83817d8fbecb61ef8fb94a7201f62cca5103cc6e7b9e8f28e38f766d7905b378
+ checksum: 07b92878ac58a98ea1fdf6a8b4ec3413ba4fa66924e28b694d63ec5b84463123fbf4d7153b56cf3cedfef4a3482c082fe3243c04f8fb2c041b32b0e29b4a9e21
languageName: node
linkType: hard
-"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/traverse": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.8
+ "@babel/traverse": ^7.25.0
peerDependencies:
"@babel/core": ^7.0.0
- checksum: c684593952ab1b40dfa4e64e98a07e7227c6db175c21bd0e6d71d2ad5d240fef4e4a984d56f05a494876542a022244fe1c1098f4116109fd90d06615e8a269b1
+ checksum: c8d08b8d6cc71451ad2a50cf7db72ab5b41c1e5e2e4d56cf6837a25a61270abd682c6b8881ab025f11a552d2024b3780519bb051459ebb71c27aed13d9917663
languageName: node
linkType: hard
@@ -544,6 +570,39 @@ __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": ^7.8.0
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 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": ^7.12.13
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 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": ^7.14.5
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 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"
@@ -555,47 +614,168 @@ __metadata:
languageName: node
linkType: hard
-"@babel/plugin-syntax-import-assertions@npm:^7.26.0":
- version: 7.26.0
- resolution: "@babel/plugin-syntax-import-assertions@npm:7.26.0"
+"@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"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.8.3
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: b58f2306df4a690ca90b763d832ec05202c50af787158ff8b50cdf3354359710bce2e1eb2b5135fcabf284756ac8eadf09ca74764aa7e76d12a5cac5f6b21e67
+ checksum: 85740478be5b0de185228e7814451d74ab8ce0a26fcca7613955262a26e99e8e15e9da58f60c754b84515d4c679b590dbd3f2148f0f58025f4ae706f1c5a5d4a
languageName: node
linkType: hard
-"@babel/plugin-syntax-import-attributes@npm:^7.26.0":
- version: 7.26.0
- resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0"
+"@babel/plugin-syntax-import-assertions@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.7"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: c122aa577166c80ee67f75aebebeef4150a132c4d3109d25d7fc058bf802946f883e330f20b78c1d3e3a5ada631c8780c263d2d01b5dbaecc69efefeedd42916
+ checksum: c4d67be4eb1d4637e361477dbe01f5b392b037d17c1f861cfa0faa120030e137aab90a9237931b8040fd31d1e5d159e11866fa1165f78beef7a3be876a391a17
languageName: node
linkType: hard
-"@babel/plugin-syntax-jsx@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-syntax-jsx@npm:7.25.9"
+"@babel/plugin-syntax-import-attributes@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.7"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: bb609d1ffb50b58f0c1bac8810d0e46a4f6c922aa171c458f3a19d66ee545d36e782d3bffbbc1fed0dc65a558bdce1caf5279316583c0fff5a2c1658982a8563
+ checksum: 590dbb5d1a15264f74670b427b8d18527672c3d6c91d7bae7e65f80fd810edbc83d90e68065088644cbad3f2457ed265a54a9956fb789fcb9a5b521822b3a275
languageName: node
linkType: hard
-"@babel/plugin-syntax-typescript@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-syntax-typescript@npm:7.25.9"
+"@babel/plugin-syntax-import-meta@npm:^7.10.4":
+ version: 7.10.4
+ resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.10.4
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 0e9821e8ba7d660c36c919654e4144a70546942ae184e85b8102f2322451eae102cbfadbcadd52ce077a2b44b400ee52394c616feab7b5b9f791b910e933fd33
+ checksum: 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": ^7.8.0
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 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": ^7.24.7
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 7a5ca629d8ca1e1ee78705a78e58c12920d07ed8006d7e7232b31296a384ff5e41d7b649bde5561196041037bbb9f9715be1d1c20975df87ca204f34ad15b965
+ 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": ^7.10.4
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 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": ^7.8.0
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 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": ^7.10.4
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 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": ^7.8.0
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 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": ^7.8.0
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 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": ^7.8.0
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 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": ^7.14.5
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 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": ^7.14.5
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 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": ^7.24.8
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 9b89b8930cd5983f64251d75c9fcdc17a8dc73837d6de12220ff972888ecff4054a6467cf0c423cad242aa96c0f0564a39a0823073728cc02239b80d13f02230
languageName: node
linkType: hard
@@ -611,454 +791,466 @@ __metadata:
languageName: node
linkType: hard
-"@babel/plugin-transform-arrow-functions@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.9"
+"@babel/plugin-transform-arrow-functions@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.7"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: c29f081224859483accf55fb4d091db2aac0dcd0d7954bac5ca889030cc498d3f771aa20eb2e9cd8310084ec394d85fa084b97faf09298b6bc9541182b3eb5bb
+ checksum: 707c209b5331c7dc79bd326128c6a6640dbd62a78da1653c844db20c4f36bf7b68454f1bc4d2d051b3fde9136fa291f276ec03a071bb00ee653069ff82f91010
languageName: node
linkType: hard
-"@babel/plugin-transform-async-generator-functions@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/helper-remap-async-to-generator": ^7.25.9
- "@babel/traverse": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.8
+ "@babel/helper-remap-async-to-generator": ^7.25.0
+ "@babel/plugin-syntax-async-generators": ^7.8.4
+ "@babel/traverse": ^7.25.4
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 41e02c18c2a57de9f274fa2c5a1bf81a20ab5f321db29cc3051512b9c5bdf3f1a8c42f1fc282cb62343c6d50849f992eede954d5f7fb5e7df48ae0c59ea7e054
+ checksum: 4235444735a1946f8766fe56564a8134c2c36c73e6cf83b3f2ed5624ebc84ff5979506a6a5b39acdb23aa09d442a6af471710ed408ccce533a2c4d2990b9df6a
languageName: node
linkType: hard
-"@babel/plugin-transform-async-to-generator@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-async-to-generator@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-module-imports": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/helper-remap-async-to-generator": ^7.25.9
+ "@babel/helper-module-imports": ^7.24.7
+ "@babel/helper-plugin-utils": ^7.24.7
+ "@babel/helper-remap-async-to-generator": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: b3ad50fb93c171644d501864620ed23952a46648c4df10dc9c62cc9ad08031b66bd272cfdd708faeee07c23b6251b16f29ce0350473e4c79f0c32178d38ce3a6
+ checksum: 13704fb3b83effc868db2b71bfb2c77b895c56cb891954fc362e95e200afd523313b0e7cf04ce02f45b05e76017c5b5fa8070c92613727a35131bb542c253a36
languageName: node
linkType: hard
-"@babel/plugin-transform-block-scoped-functions@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: bf31896556b33a80f017af3d445ceb532ec0f5ca9d69bc211a963ac92514d172d5c24c5ac319f384d9dfa7f1a4d8dc23032c2fe3e74f98a59467ecd86f7033ae
+ checksum: 249cdcbff4e778b177245f9652b014ea4f3cd245d83297f10a7bf6d97790074089aa62bcde8c08eb299c5e68f2faed346b587d3ebac44d625ba9a83a4ee27028
languageName: node
linkType: hard
-"@babel/plugin-transform-block-scoping@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-block-scoping@npm:7.25.9"
+"@babel/plugin-transform-block-scoping@npm:^7.25.0":
+ version: 7.25.0
+ resolution: "@babel/plugin-transform-block-scoping@npm:7.25.0"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.8
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: e869500cfb1995e06e64c9608543b56468639809febfcdd6fcf683bc0bf1be2431cacf2981a168a1a14f4766393e37bc9f7c96d25bc5b5f39a64a8a8ad0bf8e0
+ checksum: b1a8f932f69ad2a47ae3e02b4cedd2a876bfc2ac9cf72a503fd706cdc87272646fe9eed81e068c0fc639647033de29f7fa0c21cddd1da0026f83dbaac97316a8
languageName: node
linkType: hard
-"@babel/plugin-transform-class-properties@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-class-properties@npm:7.25.9"
+"@babel/plugin-transform-class-properties@npm:^7.25.4":
+ version: 7.25.4
+ resolution: "@babel/plugin-transform-class-properties@npm:7.25.4"
dependencies:
- "@babel/helper-create-class-features-plugin": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-create-class-features-plugin": ^7.25.4
+ "@babel/helper-plugin-utils": ^7.24.8
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: a8d69e2c285486b63f49193cbcf7a15e1d3a5f632c1c07d7a97f65306df7f554b30270b7378dde143f8b557d1f8f6336c643377943dec8ec405e4cd11e90b9ea
+ checksum: b73f7d968639c6c2dfc13f4c5a8fe45cefd260f0faa7890ae12e65d41211072544ff5e128c8b61a86887b29ffd3df8422dbdfbf61648488e71d4bb599c41f4a5
languageName: node
linkType: hard
-"@babel/plugin-transform-class-static-block@npm:^7.26.0":
- version: 7.26.0
- resolution: "@babel/plugin-transform-class-static-block@npm:7.26.0"
+"@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"
dependencies:
- "@babel/helper-create-class-features-plugin": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-create-class-features-plugin": ^7.24.7
+ "@babel/helper-plugin-utils": ^7.24.7
+ "@babel/plugin-syntax-class-static-block": ^7.14.5
peerDependencies:
"@babel/core": ^7.12.0
- checksum: d779d4d3a6f8d363f67fcbd928c15baa72be8d3b86c6d05e0300b50e66e2c4be9e99398b803d13064bc79d90ae36e37a505e3dc8af11904459804dec07660246
+ checksum: 324049263504f18416f1c3e24033baebfafd05480fdd885c8ebe6f2b415b0fc8e0b98d719360f9e30743cc78ac387fabc0b3c6606d2b54135756ffb92963b382
languageName: node
linkType: hard
-"@babel/plugin-transform-classes@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-classes@npm:7.25.9"
+"@babel/plugin-transform-classes@npm:^7.25.4":
+ version: 7.25.4
+ resolution: "@babel/plugin-transform-classes@npm:7.25.4"
dependencies:
- "@babel/helper-annotate-as-pure": ^7.25.9
- "@babel/helper-compilation-targets": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/helper-replace-supers": ^7.25.9
- "@babel/traverse": ^7.25.9
+ "@babel/helper-annotate-as-pure": ^7.24.7
+ "@babel/helper-compilation-targets": ^7.25.2
+ "@babel/helper-plugin-utils": ^7.24.8
+ "@babel/helper-replace-supers": ^7.25.0
+ "@babel/traverse": ^7.25.4
globals: ^11.1.0
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: d12584f72125314cc0fa8c77586ece2888d677788ac75f7393f5da574dfe4e45a556f7e3488fab29c8777ab3e5856d7a2d79f6df02834083aaa9d766440e3c68
+ checksum: 0bf20e46eeb691bd60cee5d1b01950fc37accec88018ecace25099f7c8d8509c1ac54d11b8caf9f2157c6945969520642a3bc421159c1a14e80224dc9a7611de
languageName: node
linkType: hard
-"@babel/plugin-transform-computed-properties@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-computed-properties@npm:7.25.9"
+"@babel/plugin-transform-computed-properties@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-computed-properties@npm:7.24.7"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/template": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
+ "@babel/template": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: f77fa4bc0c1e0031068172df28852388db6b0f91c268d037905f459607cf1e8ebab00015f9f179f4ad96e11c5f381b635cd5dc4e147a48c7ac79d195ae7542de
+ checksum: 0cf8c1b1e4ea57dec8d4612460d84fd4cdbf71a7499bb61ee34632cf89018a59eee818ffca88a8d99ee7057c20a4257044d7d463fda6daef9bf1db9fa81563cb
languageName: node
linkType: hard
-"@babel/plugin-transform-destructuring@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-destructuring@npm:7.25.9"
+"@babel/plugin-transform-destructuring@npm:^7.24.8":
+ version: 7.24.8
+ resolution: "@babel/plugin-transform-destructuring@npm:7.24.8"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.8
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 965f63077a904828f4adee91393f83644098533442b8217d5a135c23a759a4c252c714074c965676a60d2c33f610f579a4eeb59ffd783724393af61c0ca45fef
+ checksum: 0b4bd3d608979a1e5bd97d9d42acd5ad405c7fffa61efac4c7afd8e86ea6c2d91ab2d94b6a98d63919571363fe76e0b03c4ff161f0f60241b895842596e4a999
languageName: node
linkType: hard
-"@babel/plugin-transform-dotall-regex@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-dotall-regex@npm:7.25.9"
+"@babel/plugin-transform-dotall-regex@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.7"
dependencies:
- "@babel/helper-create-regexp-features-plugin": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-create-regexp-features-plugin": ^7.24.7
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 8bdf1bb9e6e3a2cc8154ae88a3872faa6dc346d6901994505fb43ac85f858728781f1219f40b67f7bb0687c507450236cb7838ac68d457e65637f98500aa161b
+ checksum: 67b10fc6abb1f61f0e765288eb4c6d63d1d0f9fc0660e69f6f2170c56fa16bc74e49857afc644beda112b41771cd90cf52df0940d11e97e52617c77c7dcff171
languageName: node
linkType: hard
-"@babel/plugin-transform-duplicate-keys@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-duplicate-keys@npm:7.25.9"
+"@babel/plugin-transform-duplicate-keys@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.7"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: b553eebc328797ead6be5ba5bdaf2f1222cea8a5bd33fb4ed625975d4f9b510bfb0d688d97e314cd4b4a48b279bea7b3634ad68c1b41ee143c3082db0ae74037
+ checksum: d1da2ff85ecb56a63f4ccfd9dc9ae69400d85f0dadf44ecddd9e71c6e5c7a9178e74e3a9637555f415a2bb14551e563f09f98534ab54f53d25e8439fdde6ba2d
languageName: node
linkType: hard
-"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-create-regexp-features-plugin": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-create-regexp-features-plugin": ^7.25.0
+ "@babel/helper-plugin-utils": ^7.24.8
peerDependencies:
"@babel/core": ^7.0.0
- checksum: f7233cf596be8c6843d31951afaf2464a62a610cb89c72c818c044765827fab78403ab8a7d3a6386f838c8df574668e2a48f6c206b1d7da965aff9c6886cb8e6
+ checksum: 608d6b0e77341189508880fd1a9f605a38d0803dd6f678ea3920ab181b17b377f6d5221ae8cf0104c7a044d30d4ddb0366bd064447695671d78457a656bb264f
languageName: node
linkType: hard
-"@babel/plugin-transform-dynamic-import@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-dynamic-import@npm:7.25.9"
+"@babel/plugin-transform-dynamic-import@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.7"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
+ "@babel/plugin-syntax-dynamic-import": ^7.8.3
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: aaca1ccda819be9b2b85af47ba08ddd2210ff2dbea222f26e4cd33f97ab020884bf81a66197e50872721e9daf36ceb5659502c82199884ea74d5d75ecda5c58b
+ checksum: 776509ff62ab40c12be814a342fc56a5cc09b91fb63032b2633414b635875fd7da03734657be0f6db2891fe6e3033b75d5ddb6f2baabd1a02e4443754a785002
languageName: node
linkType: hard
-"@babel/plugin-transform-exponentiation-operator@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.25.9"
+"@babel/plugin-transform-exponentiation-operator@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.7"
dependencies:
- "@babel/helper-builder-binary-assignment-operator-visitor": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-builder-binary-assignment-operator-visitor": ^7.24.7
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 57e1bb4135dd16782fe84b49dd360cce8f9bf5f62eb10424dcdaf221e54a8bacdf50f2541c5ac01dea9f833a6c628613d71be915290938a93454389cba4de06b
+ checksum: 23c84a23eb56589fdd35a3540f9a1190615be069110a2270865223c03aee3ba4e0fc68fe14850800cf36f0712b26e4964d3026235261f58f0405a29fe8dac9b1
languageName: node
linkType: hard
-"@babel/plugin-transform-export-namespace-from@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-export-namespace-from@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
+ "@babel/plugin-syntax-export-namespace-from": ^7.8.3
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 4dfe8df86c5b1d085d591290874bb2d78a9063090d71567ed657a418010ad333c3f48af2c974b865f53bbb718987a065f89828d43279a7751db1a56c9229078d
+ checksum: 3bd3a10038f10ae0dea1ee42137f3edcf7036b5e9e570a0d1cbd0865f03658990c6c2d84fa2475f87a754e7dc5b46766c16f7ce5c9b32c3040150b6a21233a80
languageName: node
linkType: hard
-"@babel/plugin-transform-for-of@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-for-of@npm:7.25.9"
+"@babel/plugin-transform-for-of@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-for-of@npm:7.24.7"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
+ "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 41b56e70256a29fc26ed7fb95ece062d7ec2f3b6ea8f0686349ffd004cd4816132085ee21165b89c502ee7161cb7cfb12510961638851357945dc7bc546475b7
+ checksum: a53b42dc93ab4b7d1ebd3c695b52be22b3d592f6a3dbdb3dc2fea2c8e0a7e1508fe919864c455cde552aec44ce7518625fccbb70c7063373ca228d884f4f49ea
languageName: node
linkType: hard
-"@babel/plugin-transform-function-name@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-function-name@npm:7.25.9"
+"@babel/plugin-transform-function-name@npm:^7.25.1":
+ version: 7.25.1
+ resolution: "@babel/plugin-transform-function-name@npm:7.25.1"
dependencies:
- "@babel/helper-compilation-targets": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/traverse": ^7.25.9
+ "@babel/helper-compilation-targets": ^7.24.8
+ "@babel/helper-plugin-utils": ^7.24.8
+ "@babel/traverse": ^7.25.1
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: a8d7c8d019a6eb57eab5ca1be3e3236f175557d55b1f3b11f8ad7999e3fbb1cf37905fd8cb3a349bffb4163a558e9f33b63f631597fdc97c858757deac1b2fd7
+ checksum: 743f3ea03bbc5a90944849d5a880b6bd9243dddbde581a46952da76e53a0b74c1e2424133fe8129d7a152c1f8c872bcd27e0b6728d7caadabd1afa7bb892e1e0
languageName: node
linkType: hard
-"@babel/plugin-transform-json-strings@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-json-strings@npm:7.25.9"
+"@babel/plugin-transform-json-strings@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-json-strings@npm:7.24.7"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
+ "@babel/plugin-syntax-json-strings": ^7.8.3
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: e2498d84761cfd05aaea53799933d55af309c9d6204e66b38778792d171e4d1311ad34f334259a3aa3407dd0446f6bd3e390a1fcb8ce2e42fe5aabed0e41bee1
+ checksum: 88874d0b7a1ddea66c097fc0abb68801ffae194468aa44b828dde9a0e20ac5d8647943793de86092eabaa2911c96f67a6b373793d4bb9c932ef81b2711c06c2e
languageName: node
linkType: hard
-"@babel/plugin-transform-literals@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-literals@npm:7.25.9"
+"@babel/plugin-transform-literals@npm:^7.25.2":
+ version: 7.25.2
+ resolution: "@babel/plugin-transform-literals@npm:7.25.2"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.8
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 3cca75823a38aab599bc151b0fa4d816b5e1b62d6e49c156aa90436deb6e13649f5505973151a10418b64f3f9d1c3da53e38a186402e0ed7ad98e482e70c0c14
+ checksum: 70c9bb40e377a306bd8f500899fb72127e527517914466e95dc6bb53fa7a0f51479db244a54a771b5780fc1eab488fedd706669bf11097b81a23c81ab7423eb1
languageName: node
linkType: hard
-"@babel/plugin-transform-logical-assignment-operators@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
+ "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 8c6febb4ac53852314d28b5e2c23d5dbbff7bf1e57d61f9672e0d97531ef7778b3f0ad698dcf1179f5486e626c77127508916a65eb846a89e98a92f70ed3537b
+ checksum: 3367ce0be243704dc6fce23e86a592c4380f01998ee5dd9f94c54b1ef7b971ac6f8a002901eb51599ac6cbdc0d067af8d1a720224fca1c40fde8bb8aab804aac
languageName: node
linkType: hard
-"@babel/plugin-transform-member-expression-literals@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-member-expression-literals@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: db92041ae87b8f59f98b50359e0bb172480f6ba22e5e76b13bdfe07122cbf0daa9cd8ad2e78dcb47939938fed88ad57ab5989346f64b3a16953fc73dea3a9b1f
+ checksum: 2720c57aa3bf70576146ba7d6ea03227f4611852122d76d237924f7b008dafc952e6ae61a19e5024f26c665f44384bbd378466f01b6bd1305b3564a3b7fb1a5d
languageName: node
linkType: hard
-"@babel/plugin-transform-modules-amd@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-modules-amd@npm:7.25.9"
+"@babel/plugin-transform-modules-amd@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-modules-amd@npm:7.24.7"
dependencies:
- "@babel/helper-module-transforms": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-module-transforms": ^7.24.7
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: baad1f6fd0e0d38e9a9c1086a06abdc014c4c653fd452337cadfe23fb5bd8bf4368d1bc433a5ac8e6421bc0732ebb7c044cf3fb39c1b7ebe967d66e26c4e5cec
+ checksum: f1dd0fb2f46c0f8f21076b8c7ccd5b33a85ce6dcb31518ea4c648d9a5bb2474cd4bd87c9b1b752e68591e24b022e334ba0d07631fef2b6b4d8a4b85cf3d581f5
languageName: node
linkType: hard
-"@babel/plugin-transform-modules-commonjs@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-modules-commonjs@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-module-transforms": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/helper-simple-access": ^7.25.9
+ "@babel/helper-module-transforms": ^7.24.8
+ "@babel/helper-plugin-utils": ^7.24.8
+ "@babel/helper-simple-access": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 4f101f0ea4a57d1d27a7976d668c63a7d0bbb0d9c1909d8ac43c785fd1496c31e6552ffd9673730c088873df1bc64f1cc4aad7c3c90413ac5e80b33e336d80e4
+ checksum: a4cf95b1639c33382064b44558f73ee5fac023f2a94d16e549d2bb55ceebd5cbc10fcddd505d08cd5bc97f5a64af9fd155512358b7dcf7b1a0082e8945cf21c5
languageName: node
linkType: hard
-"@babel/plugin-transform-modules-systemjs@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.9"
+"@babel/plugin-transform-modules-systemjs@npm:^7.25.0":
+ version: 7.25.0
+ resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.0"
dependencies:
- "@babel/helper-module-transforms": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/helper-validator-identifier": ^7.25.9
- "@babel/traverse": ^7.25.9
+ "@babel/helper-module-transforms": ^7.25.0
+ "@babel/helper-plugin-utils": ^7.24.8
+ "@babel/helper-validator-identifier": ^7.24.7
+ "@babel/traverse": ^7.25.0
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: bf446202f372ba92dc0db32b24b56225b6e3ad3b227e31074de8b86fdec01c273ae2536873e38dbe3ceb1cd0894209343adeaa37df208e3fa88c0c7dffec7924
+ checksum: fe673bec08564e491847324bb80a1e6edfb229f5c37e58a094d51e95306e7b098e1d130fc43e992d22debd93b9beac74441ffc3f6ea5d78f6b2535896efa0728
languageName: node
linkType: hard
-"@babel/plugin-transform-modules-umd@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-modules-umd@npm:7.25.9"
+"@babel/plugin-transform-modules-umd@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-modules-umd@npm:7.24.7"
dependencies:
- "@babel/helper-module-transforms": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-module-transforms": ^7.24.7
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 946db66be5f04ab9ee56c424b00257276ec094aa2f148508927e6085239f76b00304fa1e33026d29eccdbe312efea15ca3d92e74a12689d7f0cdd9a7ba1a6c54
+ checksum: 9ff1c464892efe042952ba778468bda6131b196a2729615bdcc3f24cdc94014f016a4616ee5643c5845bade6ba698f386833e61056d7201314b13a7fd69fac88
languageName: node
linkType: hard
-"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-create-regexp-features-plugin": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-create-regexp-features-plugin": ^7.24.7
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0
- checksum: 434346ba05cf74e3f4704b3bdd439287b95cd2a8676afcdc607810b8c38b6f4798cd69c1419726b2e4c7204e62e4a04d31b0360e91ca57a930521c9211e07789
+ checksum: f1c6c7b5d60a86b6d7e4dd098798e1d393d55e993a0b57a73b53640c7a94985b601a96bdacee063f809a9a700bcea3a2ff18e98fa561554484ac56b761d774bd
languageName: node
linkType: hard
-"@babel/plugin-transform-new-target@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-new-target@npm:7.25.9"
+"@babel/plugin-transform-new-target@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-new-target@npm:7.24.7"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: f8113539919aafce52f07b2bd182c771a476fe1d5d96d813460b33a16f173f038929369c595572cadc1f7bd8cb816ce89439d056e007770ddd7b7a0878e7895f
+ checksum: 3cb94cd1076b270f768f91fdcf9dd2f6d487f8dbfff3df7ca8d07b915900b86d02769a35ba1407d16fe49499012c8f055e1741299e2c880798b953d942a8fa1b
languageName: node
linkType: hard
-"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
+ "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 26e03b1c2c0408cc300e46d8f8cb639653ff3a7b03456d0d8afbb53c44f33a89323f51d99991dade3a5676921119bbdf869728bb7911799b5ef99ffafa2cdd24
+ checksum: 4a9221356401d87762afbc37a9e8e764afc2daf09c421117537820f8cfbed6876888372ad3a7bcfae2d45c95f026651f050ab4020b777be31d3ffb00908dbdd3
languageName: node
linkType: hard
-"@babel/plugin-transform-numeric-separator@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-numeric-separator@npm:7.25.9"
+"@babel/plugin-transform-numeric-separator@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.7"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
+ "@babel/plugin-syntax-numeric-separator": ^7.10.4
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 0528ef041ed88e8c3f51624ee87b8182a7f246fe4013f0572788e0727d20795b558f2b82e3989b5dd416cbd339500f0d88857de41b6d3b6fdacb1d5344bcc5b1
+ checksum: 561b5f1d08b2c3f92ce849f092751558b5e6cfeb7eb55c79e7375c34dd9c3066dce5e630bb439affef6adcf202b6cbcaaa23870070276fa5bb429c8f5b8c7514
languageName: node
linkType: hard
-"@babel/plugin-transform-object-rest-spread@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-object-rest-spread@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-compilation-targets": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/plugin-transform-parameters": ^7.25.9
+ "@babel/helper-compilation-targets": ^7.24.7
+ "@babel/helper-plugin-utils": ^7.24.7
+ "@babel/plugin-syntax-object-rest-spread": ^7.8.3
+ "@babel/plugin-transform-parameters": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: a8ff73e1c46a03056b3a2236bafd6b3a4b83da93afe7ee24a50d0a8088150bf85bc5e5977daa04e66ff5fb7613d02d63ad49b91ebb64cf3f3022598d722e3a7a
+ checksum: 169d257b9800c13e1feb4c37fb05dae84f702e58b342bb76e19e82e6692b7b5337c9923ee89e3916a97c0dd04a3375bdeca14f5e126f110bbacbeb46d1886ca2
languageName: node
linkType: hard
-"@babel/plugin-transform-object-super@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-object-super@npm:7.25.9"
+"@babel/plugin-transform-object-super@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-object-super@npm:7.24.7"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/helper-replace-supers": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
+ "@babel/helper-replace-supers": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 1817b5d8b80e451ae1ad9080cca884f4f16df75880a158947df76a2ed8ab404d567a7dce71dd8051ef95f90fbe3513154086a32aba55cc76027f6cbabfbd7f98
+ checksum: f71e607a830ee50a22fa1a2686524d3339440cf9dea63032f6efbd865cfe4e35000e1e3f3492459e5c986f7c0c07dc36938bf3ce61fc9ba5f8ab732d0b64ab37
languageName: node
linkType: hard
-"@babel/plugin-transform-optional-catch-binding@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
+ "@babel/plugin-syntax-optional-catch-binding": ^7.8.3
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: b46a8d1e91829f3db5c252583eb00d05a779b4660abeea5500fda0f8ffa3584fd18299443c22f7fddf0ed9dfdb73c782c43b445dc468d4f89803f2356963b406
+ checksum: 7229f3a5a4facaab40f4fdfc7faabc157dc38a67d66bed7936599f4bc509e0bff636f847ac2aa45294881fce9cf8a0a460b85d2a465b7b977de9739fce9b18f6
languageName: node
linkType: hard
-"@babel/plugin-transform-optional-chaining@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-optional-chaining@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.8
+ "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7
+ "@babel/plugin-syntax-optional-chaining": ^7.8.3
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: f1642a7094456067e82b176e1e9fd426fda7ed9df54cb6d10109fc512b622bf4b3c83acc5875125732b8622565107fdbe2d60fe3ec8685e1d1c22c38c1b57782
+ checksum: 45e55e3a2fffb89002d3f89aef59c141610f23b60eee41e047380bffc40290b59f64fc649aa7ec5281f73d41b2065410d788acc6afaad2a9f44cad6e8af04442
languageName: node
linkType: hard
-"@babel/plugin-transform-parameters@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-parameters@npm:7.25.9"
+"@babel/plugin-transform-parameters@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-parameters@npm:7.24.7"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: d7ba2a7d05edbc85aed741289b0ff3d6289a1c25d82ac4be32c565f88a66391f46631aad59ceeed40824037f7eeaa7a0de1998db491f50e65a565cd964f78786
+ checksum: ab534b03ac2eff94bc79342b8f39a4584666f5305a6c63c1964afda0b1b004e6b861e49d1683548030defe248e3590d3ff6338ee0552cb90c064f7e1479968c3
languageName: node
linkType: hard
-"@babel/plugin-transform-private-methods@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-private-methods@npm:7.25.9"
+"@babel/plugin-transform-private-methods@npm:^7.25.4":
+ version: 7.25.4
+ resolution: "@babel/plugin-transform-private-methods@npm:7.25.4"
dependencies:
- "@babel/helper-create-class-features-plugin": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-create-class-features-plugin": ^7.25.4
+ "@babel/helper-plugin-utils": ^7.24.8
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 6e3671b352c267847c53a170a1937210fa8151764d70d25005e711ef9b21969aaf422acc14f9f7fb86bc0e4ec43e7aefcc0ad9196ae02d262ec10f509f126a58
+ checksum: cb1dabfc03e2977990263d65bc8f43a9037dffbb5d9a5f825c00d05447ff68015099408c1531d9dd88f18a41a90f5062dc48f3a1d52b415d2d2ee4827dedff09
languageName: node
linkType: hard
-"@babel/plugin-transform-private-property-in-object@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-private-property-in-object@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-annotate-as-pure": ^7.25.9
- "@babel/helper-create-class-features-plugin": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-annotate-as-pure": ^7.24.7
+ "@babel/helper-create-class-features-plugin": ^7.24.7
+ "@babel/helper-plugin-utils": ^7.24.7
+ "@babel/plugin-syntax-private-property-in-object": ^7.14.5
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 9ce3e983fea9b9ba677c192aa065c0b42ebdc7774be4c02135df09029ad92a55c35b004650c75952cb64d650872ed18f13ab64422c6fc891d06333762caa8a0a
+ checksum: 8cee9473095305cc787bb653fd681719b49363281feabf677db8a552e8e41c94441408055d7e5fd5c7d41b315e634fa70b145ad0c7c54456216049df4ed57350
languageName: node
linkType: hard
-"@babel/plugin-transform-property-literals@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-property-literals@npm:7.25.9"
+"@babel/plugin-transform-property-literals@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-property-literals@npm:7.24.7"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 436046ab07d54a9b44a384eeffec701d4e959a37a7547dda72e069e751ca7ff753d1782a8339e354b97c78a868b49ea97bf41bf5a44c6d7a3c0a05ad40eeb49c
+ checksum: 9aeefc3aab6c6bf9d1fae1cf3a2d38c7d886fd3c6c81b7c608c477f5758aee2e7abf52f32724310fe861da61af934ee2508b78a5b5f234b9740c9134e1c14437
languageName: node
linkType: hard
@@ -1073,300 +1265,302 @@ __metadata:
languageName: node
linkType: hard
-"@babel/plugin-transform-react-display-name@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-react-display-name@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.22.5
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: cd7020494e6f31c287834e8929e6a718d5b0ace21232fa30feb48622c2312045504c34b347dcff9e88145c349882b296a7d6b6cc3d3447d8c85502f16471747c
+ checksum: a12bfd1e4e93055efca3ace3c34722571bda59d9740dca364d225d9c6e3ca874f134694d21715c42cc63d79efd46db9665bd4a022998767f9245f1e29d5d204d
languageName: node
linkType: hard
-"@babel/plugin-transform-react-jsx-development@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-react-jsx-development@npm:7.25.9"
+"@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"
dependencies:
- "@babel/plugin-transform-react-jsx": ^7.25.9
+ "@babel/plugin-transform-react-jsx": ^7.22.5
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 537d38369537f1eb56041c4b770bc0733fde1801a7f5ffef40a1217ea448f33ee2fa8e6098a58a82fd00e432c1b9426a66849496da419020c9eca3b1b1a23779
+ checksum: 36bc3ff0b96bb0ef4723070a50cfdf2e72cfd903a59eba448f9fe92fea47574d6f22efd99364413719e1f3fb3c51b6c9b2990b87af088f8486a84b2a5f9e4560
languageName: node
linkType: hard
-"@babel/plugin-transform-react-jsx@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-react-jsx@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-annotate-as-pure": ^7.25.9
- "@babel/helper-module-imports": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/plugin-syntax-jsx": ^7.25.9
- "@babel/types": ^7.25.9
+ "@babel/helper-annotate-as-pure": ^7.22.5
+ "@babel/helper-module-imports": ^7.22.15
+ "@babel/helper-plugin-utils": ^7.22.5
+ "@babel/plugin-syntax-jsx": ^7.22.5
+ "@babel/types": ^7.22.15
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 5c6523c3963e3c6cf4c3cc2768a3766318af05b8f6c17aff52a4010e2c170e87b2fcdc94e9c9223ae12158664df4852ce81b9c8d042c15ea8fd83d6375f9f30f
+ checksum: 3899054e89550c3a0ef041af7c47ee266e2e934f498ee80fefeda778a6aa177b48aa8b4d2a8bf5848de977fec564571699ab952d9fa089c4c19b45ddb121df09
languageName: node
linkType: hard
-"@babel/plugin-transform-react-pure-annotations@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-annotate-as-pure": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-annotate-as-pure": ^7.22.5
+ "@babel/helper-plugin-utils": ^7.22.5
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 9995c0fc7c25d3aaaa0ce84233de02eab2564ea111d0813ec5baa538eb21520402879cc787ad1ad4c2061b99cebc3beb09910e64c9592e8ccb42ae62d9e4fd9a
+ checksum: 092021c4f404e267002099ec20b3f12dd730cb90b0d83c5feed3dc00dbe43b9c42c795a18e7c6c7d7bddea20c7dd56221b146aec81b37f2e7eb5137331c61120
languageName: node
linkType: hard
-"@babel/plugin-transform-regenerator@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-regenerator@npm:7.25.9"
+"@babel/plugin-transform-regenerator@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-regenerator@npm:7.24.7"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
regenerator-transform: ^0.15.2
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 1c09e8087b476c5967282c9790fb8710e065eda77c60f6cb5da541edd59ded9d003d96f8ef640928faab4a0b35bf997673499a194973da4f0c97f0935807a482
+ checksum: 20c6c3fb6fc9f407829087316653388d311e8c1816b007609bb09aeef254092a7157adace8b3aaa8f34be752503717cb85c88a5fe482180a9b11bcbd676063be
languageName: node
linkType: hard
-"@babel/plugin-transform-regexp-modifiers@npm:^7.26.0":
- version: 7.26.0
- resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.26.0"
+"@babel/plugin-transform-reserved-words@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-reserved-words@npm:7.24.7"
dependencies:
- "@babel/helper-create-regexp-features-plugin": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
- peerDependencies:
- "@babel/core": ^7.0.0
- checksum: 726deca486bbd4b176f8a966eb0f4aabc19d9def3b8dabb8b3a656778eca0df1fda3f3c92b213aa5a184232fdafd5b7bd73b4e24ca4345c498ef6baff2bda4e1
- languageName: node
- linkType: hard
-
-"@babel/plugin-transform-reserved-words@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-reserved-words@npm:7.25.9"
- dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 8beda04481b25767acbd1f6b9ef7b3a9c12fbd9dcb24df45a6ad120e1dc4b247c073db60ac742f9093657d6d8c050501fc0606af042f81a3bb6a3ff862cddc47
+ checksum: 3d5876954d5914d7270819479504f30c4bf5452a65c677f44e2dab2db50b3c9d4b47793c45dfad7abf4f377035dd79e4b3f554ae350df9f422201d370ce9f8dd
languageName: node
linkType: hard
-"@babel/plugin-transform-runtime@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-runtime@npm:7.25.9"
+"@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": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
- babel-plugin-polyfill-corejs2: ^0.4.10
- babel-plugin-polyfill-corejs3: ^0.10.6
- babel-plugin-polyfill-regenerator: ^0.6.1
+ "@babel/helper-module-imports": ^7.22.15
+ "@babel/helper-plugin-utils": ^7.22.5
+ babel-plugin-polyfill-corejs2: ^0.4.5
+ babel-plugin-polyfill-corejs3: ^0.8.3
+ babel-plugin-polyfill-regenerator: ^0.5.2
semver: ^6.3.1
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: db7f20a7a7324dbfe3b43a09f0095c69dadcf8b08567fa7c7fa6e245d97c66cdcdc330e97733b7589261c0e1046bc5cc36741b932ac5dd7757374495b57e7b02
+ checksum: 7edf20b13d02f856276221624abf3b8084daa3f265a6e5c70ee0d0c63087fcf726dc8756a9c8bb3d25a1ce8697ab66ec8cdd15be992c21aed9971cb5bfe80a5b
languageName: node
linkType: hard
-"@babel/plugin-transform-shorthand-properties@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-shorthand-properties@npm:7.25.9"
+"@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": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: f774995d58d4e3a992b732cf3a9b8823552d471040e280264dd15e0735433d51b468fef04d75853d061309389c66bda10ce1b298297ce83999220eb0ad62741d
+ checksum: 7b524245814607188212b8eb86d8c850e5974203328455a30881b4a92c364b93353fae14bc2af5b614ef16300b75b8c1d3b8f3a08355985b4794a7feb240adc3
languageName: node
linkType: hard
-"@babel/plugin-transform-spread@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-spread@npm:7.25.9"
+"@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": ^7.25.9
- "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
+ "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 2403a5d49171b7714d5e5ecb1f598c61575a4dbe5e33e5a5f08c0ea990b75e693ca1ea983b6a96b2e3e5e7da48c8238333f525e47498c53b577c5d094d964c06
+ checksum: 4c4254c8b9cceb1a8f975fa9b92257ddb08380a35c0a3721b8f4b9e13a3d82e403af2e0fba577b9f2452dd8f06bc3dea71cc53b1e2c6af595af5db52a13429d6
languageName: node
linkType: hard
-"@babel/plugin-transform-sticky-regex@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-sticky-regex@npm:7.25.9"
+"@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": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 7454b00844dbe924030dd15e2b3615b36e196500c4c47e98dabc6b37a054c5b1038ecd437e910aabf0e43bf56b973cb148d3437d50f6e2332d8309568e3e979b
+ checksum: 118fc7a7ebf7c20411b670c8a030535fdfe4a88bc5643bb625a584dbc4c8a468da46430a20e6bf78914246962b0f18f1b9d6a62561a7762c4f34a038a5a77179
languageName: node
linkType: hard
-"@babel/plugin-transform-template-literals@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-template-literals@npm:7.25.9"
+"@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": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 92eb1d6e2d95bd24abbb74fa7640d02b66ff6214e0bb616d7fda298a7821ce15132a4265d576a3502a347a3c9e94b6c69ed265bb0784664592fa076785a3d16a
+ checksum: ad44e5826f5a98c1575832dbdbd033adfe683cdff195e178528ead62507564bf02f479b282976cfd3caebad8b06d5fd7349c1cdb880dec3c56daea4f1f179619
languageName: node
linkType: hard
-"@babel/plugin-transform-typeof-symbol@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-typeof-symbol@npm:7.25.9"
+"@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": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.8
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 3f9458840d96f61502f0e9dfaae3efe8325fa0b2151e24ea0d41307f28cdd166905419f5a43447ce0f1ae4bfd001f3906b658839a60269c254168164090b4c73
+ checksum: 8663a8e7347cedf181001d99c88cf794b6598c3d82f324098510fe8fb8bd22113995526a77aa35a3cc5d70ffd0617a59dd0d10311a9bf0e1a3a7d3e59b900c00
languageName: node
linkType: hard
-"@babel/plugin-transform-typescript@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-typescript@npm:7.25.9"
+"@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": ^7.25.9
- "@babel/helper-create-class-features-plugin": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/helper-skip-transparent-expression-wrappers": ^7.25.9
- "@babel/plugin-syntax-typescript": ^7.25.9
+ "@babel/helper-annotate-as-pure": ^7.24.7
+ "@babel/helper-create-class-features-plugin": ^7.25.0
+ "@babel/helper-plugin-utils": ^7.24.8
+ "@babel/helper-skip-transparent-expression-wrappers": ^7.24.7
+ "@babel/plugin-syntax-typescript": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 6dd1303f1b9f314e22c6c54568a8b9709a081ce97be757d4004f960e3e73d6b819e6b49cee6cf1fc8455511e41127a8b580fa34602de62d17ab8a0b2d0ccf183
+ checksum: b0267128d93560a4350919f7230a3b497e20fb8611d9f04bb3560d6b38877305ccad4c40903160263361c6930a84dbcb5b21b8ea923531bda51f67bffdc2dd0b
languageName: node
linkType: hard
-"@babel/plugin-transform-unicode-escapes@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-unicode-escapes@npm:7.25.9"
+"@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": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: be067e07488d804e3e82d7771f23666539d2ae5af03bf6eb8480406adf3dabd776e60c1fd5c6078dc5714b73cd80bbaca70e71d4f5d154c5c57200581602ca2f
+ checksum: 4af0a193e1ddea6ff82b2b15cc2501b872728050bd625740b813c8062fec917d32d530ff6b41de56c15e7296becdf3336a58db81f5ca8e7c445c1306c52f3e01
languageName: node
linkType: hard
-"@babel/plugin-transform-unicode-property-regex@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.25.9"
+"@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": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-create-regexp-features-plugin": ^7.24.7
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 201f6f46c1beb399e79aa208b94c5d54412047511795ce1e790edcd189cef73752e6a099fdfc01b3ad12205f139ae344143b62f21f44bbe02338a95e8506a911
+ checksum: aae13350c50973f5802ca7906d022a6a0cc0e3aebac9122d0450bbd51e78252d4c2032ad69385e2759fcbdd3aac5d571bd7e26258907f51f8e1a51b53be626c2
languageName: node
linkType: hard
-"@babel/plugin-transform-unicode-regex@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-unicode-regex@npm:7.25.9"
+"@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": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-create-regexp-features-plugin": ^7.24.7
+ "@babel/helper-plugin-utils": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: e8baae867526e179467c6ef5280d70390fa7388f8763a19a27c21302dd59b121032568be080749514b097097ceb9af716bf4b90638f1b3cf689aa837ba20150f
+ checksum: 1cb4e70678906e431da0a05ac3f8350025fee290304ad7482d9cfaa1ca67b2e898654de537c9268efbdad5b80d3ebadf42b4a88ea84609bd8a4cce7b11b48afd
languageName: node
linkType: hard
-"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.9"
+"@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": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
+ "@babel/helper-create-regexp-features-plugin": ^7.25.2
+ "@babel/helper-plugin-utils": ^7.24.8
peerDependencies:
"@babel/core": ^7.0.0
- checksum: 4445ef20de687cb4dcc95169742a8d9013d680aa5eee9186d8e25875bbfa7ee5e2de26a91177ccf70b1db518e36886abcd44750d28db5d7a9539f0efa6839f4b
+ checksum: 6d1a7e9fdde4ffc9a81c0e3f261b96a9a0dfe65da282ec96fe63b36c597a7389feac638f1df2a8a4f8c9128337bba8e984f934e9f19077930f33abf1926759ea
languageName: node
linkType: hard
-"@babel/preset-env@npm:^7.20.2, @babel/preset-env@npm:^7.25.9":
- version: 7.26.0
- resolution: "@babel/preset-env@npm:7.26.0"
+"@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"
dependencies:
- "@babel/compat-data": ^7.26.0
- "@babel/helper-compilation-targets": ^7.25.9
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/helper-validator-option": ^7.25.9
- "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ^7.25.9
- "@babel/plugin-bugfix-safari-class-field-initializer-scope": ^7.25.9
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.25.9
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.25.9
- "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ^7.25.9
+ "@babel/compat-data": ^7.25.4
+ "@babel/helper-compilation-targets": ^7.25.2
+ "@babel/helper-plugin-utils": ^7.24.8
+ "@babel/helper-validator-option": ^7.24.8
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ^7.25.3
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": ^7.25.0
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.25.0
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.24.7
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ^7.25.0
"@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2
- "@babel/plugin-syntax-import-assertions": ^7.26.0
- "@babel/plugin-syntax-import-attributes": ^7.26.0
+ "@babel/plugin-syntax-async-generators": ^7.8.4
+ "@babel/plugin-syntax-class-properties": ^7.12.13
+ "@babel/plugin-syntax-class-static-block": ^7.14.5
+ "@babel/plugin-syntax-dynamic-import": ^7.8.3
+ "@babel/plugin-syntax-export-namespace-from": ^7.8.3
+ "@babel/plugin-syntax-import-assertions": ^7.24.7
+ "@babel/plugin-syntax-import-attributes": ^7.24.7
+ "@babel/plugin-syntax-import-meta": ^7.10.4
+ "@babel/plugin-syntax-json-strings": ^7.8.3
+ "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4
+ "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3
+ "@babel/plugin-syntax-numeric-separator": ^7.10.4
+ "@babel/plugin-syntax-object-rest-spread": ^7.8.3
+ "@babel/plugin-syntax-optional-catch-binding": ^7.8.3
+ "@babel/plugin-syntax-optional-chaining": ^7.8.3
+ "@babel/plugin-syntax-private-property-in-object": ^7.14.5
+ "@babel/plugin-syntax-top-level-await": ^7.14.5
"@babel/plugin-syntax-unicode-sets-regex": ^7.18.6
- "@babel/plugin-transform-arrow-functions": ^7.25.9
- "@babel/plugin-transform-async-generator-functions": ^7.25.9
- "@babel/plugin-transform-async-to-generator": ^7.25.9
- "@babel/plugin-transform-block-scoped-functions": ^7.25.9
- "@babel/plugin-transform-block-scoping": ^7.25.9
- "@babel/plugin-transform-class-properties": ^7.25.9
- "@babel/plugin-transform-class-static-block": ^7.26.0
- "@babel/plugin-transform-classes": ^7.25.9
- "@babel/plugin-transform-computed-properties": ^7.25.9
- "@babel/plugin-transform-destructuring": ^7.25.9
- "@babel/plugin-transform-dotall-regex": ^7.25.9
- "@babel/plugin-transform-duplicate-keys": ^7.25.9
- "@babel/plugin-transform-duplicate-named-capturing-groups-regex": ^7.25.9
- "@babel/plugin-transform-dynamic-import": ^7.25.9
- "@babel/plugin-transform-exponentiation-operator": ^7.25.9
- "@babel/plugin-transform-export-namespace-from": ^7.25.9
- "@babel/plugin-transform-for-of": ^7.25.9
- "@babel/plugin-transform-function-name": ^7.25.9
- "@babel/plugin-transform-json-strings": ^7.25.9
- "@babel/plugin-transform-literals": ^7.25.9
- "@babel/plugin-transform-logical-assignment-operators": ^7.25.9
- "@babel/plugin-transform-member-expression-literals": ^7.25.9
- "@babel/plugin-transform-modules-amd": ^7.25.9
- "@babel/plugin-transform-modules-commonjs": ^7.25.9
- "@babel/plugin-transform-modules-systemjs": ^7.25.9
- "@babel/plugin-transform-modules-umd": ^7.25.9
- "@babel/plugin-transform-named-capturing-groups-regex": ^7.25.9
- "@babel/plugin-transform-new-target": ^7.25.9
- "@babel/plugin-transform-nullish-coalescing-operator": ^7.25.9
- "@babel/plugin-transform-numeric-separator": ^7.25.9
- "@babel/plugin-transform-object-rest-spread": ^7.25.9
- "@babel/plugin-transform-object-super": ^7.25.9
- "@babel/plugin-transform-optional-catch-binding": ^7.25.9
- "@babel/plugin-transform-optional-chaining": ^7.25.9
- "@babel/plugin-transform-parameters": ^7.25.9
- "@babel/plugin-transform-private-methods": ^7.25.9
- "@babel/plugin-transform-private-property-in-object": ^7.25.9
- "@babel/plugin-transform-property-literals": ^7.25.9
- "@babel/plugin-transform-regenerator": ^7.25.9
- "@babel/plugin-transform-regexp-modifiers": ^7.26.0
- "@babel/plugin-transform-reserved-words": ^7.25.9
- "@babel/plugin-transform-shorthand-properties": ^7.25.9
- "@babel/plugin-transform-spread": ^7.25.9
- "@babel/plugin-transform-sticky-regex": ^7.25.9
- "@babel/plugin-transform-template-literals": ^7.25.9
- "@babel/plugin-transform-typeof-symbol": ^7.25.9
- "@babel/plugin-transform-unicode-escapes": ^7.25.9
- "@babel/plugin-transform-unicode-property-regex": ^7.25.9
- "@babel/plugin-transform-unicode-regex": ^7.25.9
- "@babel/plugin-transform-unicode-sets-regex": ^7.25.9
+ "@babel/plugin-transform-arrow-functions": ^7.24.7
+ "@babel/plugin-transform-async-generator-functions": ^7.25.4
+ "@babel/plugin-transform-async-to-generator": ^7.24.7
+ "@babel/plugin-transform-block-scoped-functions": ^7.24.7
+ "@babel/plugin-transform-block-scoping": ^7.25.0
+ "@babel/plugin-transform-class-properties": ^7.25.4
+ "@babel/plugin-transform-class-static-block": ^7.24.7
+ "@babel/plugin-transform-classes": ^7.25.4
+ "@babel/plugin-transform-computed-properties": ^7.24.7
+ "@babel/plugin-transform-destructuring": ^7.24.8
+ "@babel/plugin-transform-dotall-regex": ^7.24.7
+ "@babel/plugin-transform-duplicate-keys": ^7.24.7
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": ^7.25.0
+ "@babel/plugin-transform-dynamic-import": ^7.24.7
+ "@babel/plugin-transform-exponentiation-operator": ^7.24.7
+ "@babel/plugin-transform-export-namespace-from": ^7.24.7
+ "@babel/plugin-transform-for-of": ^7.24.7
+ "@babel/plugin-transform-function-name": ^7.25.1
+ "@babel/plugin-transform-json-strings": ^7.24.7
+ "@babel/plugin-transform-literals": ^7.25.2
+ "@babel/plugin-transform-logical-assignment-operators": ^7.24.7
+ "@babel/plugin-transform-member-expression-literals": ^7.24.7
+ "@babel/plugin-transform-modules-amd": ^7.24.7
+ "@babel/plugin-transform-modules-commonjs": ^7.24.8
+ "@babel/plugin-transform-modules-systemjs": ^7.25.0
+ "@babel/plugin-transform-modules-umd": ^7.24.7
+ "@babel/plugin-transform-named-capturing-groups-regex": ^7.24.7
+ "@babel/plugin-transform-new-target": ^7.24.7
+ "@babel/plugin-transform-nullish-coalescing-operator": ^7.24.7
+ "@babel/plugin-transform-numeric-separator": ^7.24.7
+ "@babel/plugin-transform-object-rest-spread": ^7.24.7
+ "@babel/plugin-transform-object-super": ^7.24.7
+ "@babel/plugin-transform-optional-catch-binding": ^7.24.7
+ "@babel/plugin-transform-optional-chaining": ^7.24.8
+ "@babel/plugin-transform-parameters": ^7.24.7
+ "@babel/plugin-transform-private-methods": ^7.25.4
+ "@babel/plugin-transform-private-property-in-object": ^7.24.7
+ "@babel/plugin-transform-property-literals": ^7.24.7
+ "@babel/plugin-transform-regenerator": ^7.24.7
+ "@babel/plugin-transform-reserved-words": ^7.24.7
+ "@babel/plugin-transform-shorthand-properties": ^7.24.7
+ "@babel/plugin-transform-spread": ^7.24.7
+ "@babel/plugin-transform-sticky-regex": ^7.24.7
+ "@babel/plugin-transform-template-literals": ^7.24.7
+ "@babel/plugin-transform-typeof-symbol": ^7.24.8
+ "@babel/plugin-transform-unicode-escapes": ^7.24.7
+ "@babel/plugin-transform-unicode-property-regex": ^7.24.7
+ "@babel/plugin-transform-unicode-regex": ^7.24.7
+ "@babel/plugin-transform-unicode-sets-regex": ^7.25.4
"@babel/preset-modules": 0.1.6-no-external-plugins
babel-plugin-polyfill-corejs2: ^0.4.10
babel-plugin-polyfill-corejs3: ^0.10.6
babel-plugin-polyfill-regenerator: ^0.6.1
- core-js-compat: ^3.38.1
+ core-js-compat: ^3.37.1
semver: ^6.3.1
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 0c3e2b3758cc0347dcf5551b5209db702764183dce66ff20bffceff6486c090bef9175f5f7d1e68cfe5584f0d817b2aab25ab5992058a7998f061f244c8caf5f
+ checksum: 752be43f0b78a2eefe5007076aed3d21b505e1c09d134b61e7de8838f1bbb1e7af81023d39adb14b6eae23727fb5a9fd23f8115a44df043319be22319be17913
languageName: node
linkType: hard
@@ -1383,89 +1577,97 @@ __metadata:
languageName: node
linkType: hard
-"@babel/preset-react@npm:^7.18.6, @babel/preset-react@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/preset-react@npm:7.25.9"
+"@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"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/helper-validator-option": ^7.25.9
- "@babel/plugin-transform-react-display-name": ^7.25.9
- "@babel/plugin-transform-react-jsx": ^7.25.9
- "@babel/plugin-transform-react-jsx-development": ^7.25.9
- "@babel/plugin-transform-react-pure-annotations": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.22.5
+ "@babel/helper-validator-option": ^7.22.15
+ "@babel/plugin-transform-react-display-name": ^7.22.5
+ "@babel/plugin-transform-react-jsx": ^7.22.15
+ "@babel/plugin-transform-react-jsx-development": ^7.22.5
+ "@babel/plugin-transform-react-pure-annotations": ^7.22.5
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: b5650c07a744ab4024c04fae002c9043235b4ad8687de8bf759135b9c6186553f4f53fde0a4583ce4c019560b79c176f39c745cdf77645af07071d26d8ba84ce
+ checksum: c3ef99dfa2e9f57d2e08603e883aa20f47630a826c8e413888a93ae6e0084b5016871e463829be125329d40a1ba0a89f7c43d77b6dab52083c225cb43e63d10e
languageName: node
linkType: hard
-"@babel/preset-typescript@npm:^7.21.0, @babel/preset-typescript@npm:^7.25.9":
- version: 7.26.0
- resolution: "@babel/preset-typescript@npm:7.26.0"
+"@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"
dependencies:
- "@babel/helper-plugin-utils": ^7.25.9
- "@babel/helper-validator-option": ^7.25.9
- "@babel/plugin-syntax-jsx": ^7.25.9
- "@babel/plugin-transform-modules-commonjs": ^7.25.9
- "@babel/plugin-transform-typescript": ^7.25.9
+ "@babel/helper-plugin-utils": ^7.24.7
+ "@babel/helper-validator-option": ^7.24.7
+ "@babel/plugin-syntax-jsx": ^7.24.7
+ "@babel/plugin-transform-modules-commonjs": ^7.24.7
+ "@babel/plugin-transform-typescript": ^7.24.7
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 6d8641fa6efd0e10eec5e8f92cd164b916a06d57131cfa5216c281404289c87d2b4995140a1c1d9c3bad171ff6ef2226be5f0585e09577ffff349706e991ec71
+ checksum: 12929b24757f3bd6548103475f86478eda4c872bc7cefd920b29591eee8f4a4f350561d888e133d632d0c9402b8615fdcec9138e5127a6567dcb22f804ff207f
languageName: node
linkType: hard
-"@babel/runtime-corejs3@npm:^7.25.9":
- version: 7.26.0
- resolution: "@babel/runtime-corejs3@npm:7.26.0"
+"@babel/regjsgen@npm:^0.8.0":
+ version: 0.8.0
+ resolution: "@babel/regjsgen@npm:0.8.0"
+ checksum: 89c338fee774770e5a487382170711014d49a68eb281e74f2b5eac88f38300a4ad545516a7786a8dd5702e9cf009c94c2f582d200f077ac5decd74c56b973730
+ languageName: node
+ linkType: hard
+
+"@babel/runtime-corejs3@npm:^7.22.6":
+ version: 7.23.1
+ resolution: "@babel/runtime-corejs3@npm:7.23.1"
dependencies:
core-js-pure: ^3.30.2
regenerator-runtime: ^0.14.0
- checksum: c6c5adac03e33aa4b5bb636a677aa2a6e400b91d91aac5674448d20af4100b80a8bedfb742338e4236e22c092d3edeb27210efdf48bd13ec353bd899f097ff41
+ checksum: 5d52b0cc8b5d243e67cf29c584d15acdc0c89b64de4a3fe1cb8a83b84b64a5621802e36931f93ca696cb637884abd11c8514615d890a4edf057ec4464f73915d
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.25.9, @babel/runtime@npm:^7.8.4":
- version: 7.26.0
- resolution: "@babel/runtime@npm:7.26.0"
+"@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.22.6, @babel/runtime@npm:^7.8.4":
+ version: 7.23.1
+ resolution: "@babel/runtime@npm:7.23.1"
dependencies:
regenerator-runtime: ^0.14.0
- checksum: c8e2c0504ab271b3467a261a8f119bf2603eb857a0d71e37791f4e3fae00f681365073cc79f141ddaa90c6077c60ba56448004ad5429d07ac73532be9f7cf28a
+ checksum: 0cd0d43e6e7dc7f9152fda8c8312b08321cda2f56ef53d6c22ebdd773abdc6f5d0a69008de90aa41908d00e2c1facb24715ff121274e689305c858355ff02c70
languageName: node
linkType: hard
-"@babel/template@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/template@npm:7.25.9"
+"@babel/template@npm:^7.24.7, @babel/template@npm:^7.25.0":
+ version: 7.25.0
+ resolution: "@babel/template@npm:7.25.0"
dependencies:
- "@babel/code-frame": ^7.25.9
- "@babel/parser": ^7.25.9
- "@babel/types": ^7.25.9
- checksum: 103641fea19c7f4e82dc913aa6b6ac157112a96d7c724d513288f538b84bae04fb87b1f1e495ac1736367b1bc30e10f058b30208fb25f66038e1f1eb4e426472
+ "@babel/code-frame": ^7.24.7
+ "@babel/parser": ^7.25.0
+ "@babel/types": ^7.25.0
+ checksum: 3f2db568718756d0daf2a16927b78f00c425046b654cd30b450006f2e84bdccaf0cbe6dc04994aa1f5f6a4398da2f11f3640a4d3ee31722e43539c4c919c817b
languageName: node
linkType: hard
-"@babel/traverse@npm:^7.25.9":
- version: 7.25.9
- resolution: "@babel/traverse@npm:7.25.9"
+"@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"
dependencies:
- "@babel/code-frame": ^7.25.9
- "@babel/generator": ^7.25.9
- "@babel/parser": ^7.25.9
- "@babel/template": ^7.25.9
- "@babel/types": ^7.25.9
+ "@babel/code-frame": ^7.24.7
+ "@babel/generator": ^7.25.4
+ "@babel/parser": ^7.25.4
+ "@babel/template": ^7.25.0
+ "@babel/types": ^7.25.4
debug: ^4.3.1
globals: ^11.1.0
- checksum: 901d325662ff1dd9bc51de00862e01055fa6bc374f5297d7e3731f2f0e268bbb1d2141f53fa82860aa308ee44afdcf186a948f16c83153927925804b95a9594d
+ checksum: 3b6d879b9d843b119501585269b3599f047011ae21eb7820d00aef62fc3a2bcdaf6f4cdf2679795a2d7c0b6b5d218974916e422f08dea08613dc42188ef21e4b
languageName: node
linkType: hard
-"@babel/types@npm:^7.21.3, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.4.4":
- version: 7.26.0
- resolution: "@babel/types@npm:7.26.0"
+"@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"
dependencies:
- "@babel/helper-string-parser": ^7.25.9
- "@babel/helper-validator-identifier": ^7.25.9
- checksum: a3dd37dabac693018872da96edb8c1843a605c1bfacde6c3f504fba79b972426a6f24df70aa646356c0c1b19bdd2c722c623c684a996c002381071680602280d
+ "@babel/helper-string-parser": ^7.24.8
+ "@babel/helper-validator-identifier": ^7.24.7
+ to-fast-properties: ^2.0.0
+ checksum: 497f8b583c54a92a59c3ec542144695064cd5c384fcca46ba1aa301d5e5dd6c1d011f312ca024cb0f9c956da07ae82fb4c348c31a30afa31a074c027720d2aa8
languageName: node
linkType: hard
@@ -1516,96 +1718,57 @@ __metadata:
languageName: node
linkType: hard
-"@docusaurus/babel@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/babel@npm:3.6.0"
+"@docusaurus/core@npm:3.5.2, @docusaurus/core@npm:^3.1.1":
+ version: 3.5.2
+ resolution: "@docusaurus/core@npm:3.5.2"
dependencies:
- "@babel/core": ^7.25.9
- "@babel/generator": ^7.25.9
+ "@babel/core": ^7.23.3
+ "@babel/generator": ^7.23.3
"@babel/plugin-syntax-dynamic-import": ^7.8.3
- "@babel/plugin-transform-runtime": ^7.25.9
- "@babel/preset-env": ^7.25.9
- "@babel/preset-react": ^7.25.9
- "@babel/preset-typescript": ^7.25.9
- "@babel/runtime": ^7.25.9
- "@babel/runtime-corejs3": ^7.25.9
- "@babel/traverse": ^7.25.9
- "@docusaurus/logger": 3.6.0
- "@docusaurus/utils": 3.6.0
- babel-plugin-dynamic-import-node: ^2.3.3
- fs-extra: ^11.1.1
- tslib: ^2.6.0
- checksum: 4e1d8ff4b065508d26cd62a3f95fd94d00c450d41cef568d65696aee764e95e7f7d3e4849b441315fde18a1be5d891a28eef93c770910723a9f003eddeb0449c
- languageName: node
- linkType: hard
-
-"@docusaurus/bundler@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/bundler@npm:3.6.0"
- dependencies:
- "@babel/core": ^7.25.9
- "@docusaurus/babel": 3.6.0
- "@docusaurus/cssnano-preset": 3.6.0
- "@docusaurus/logger": 3.6.0
- "@docusaurus/types": 3.6.0
- "@docusaurus/utils": 3.6.0
+ "@babel/plugin-transform-runtime": ^7.22.9
+ "@babel/preset-env": ^7.22.9
+ "@babel/preset-react": ^7.22.5
+ "@babel/preset-typescript": ^7.22.5
+ "@babel/runtime": ^7.22.6
+ "@babel/runtime-corejs3": ^7.22.6
+ "@babel/traverse": ^7.22.8
+ "@docusaurus/cssnano-preset": 3.5.2
+ "@docusaurus/logger": 3.5.2
+ "@docusaurus/mdx-loader": 3.5.2
+ "@docusaurus/utils": 3.5.2
+ "@docusaurus/utils-common": 3.5.2
+ "@docusaurus/utils-validation": 3.5.2
autoprefixer: ^10.4.14
- babel-loader: ^9.2.1
- clean-css: ^5.3.2
- copy-webpack-plugin: ^11.0.0
- css-loader: ^6.8.1
- css-minimizer-webpack-plugin: ^5.0.1
- cssnano: ^6.1.2
- file-loader: ^6.2.0
- html-minifier-terser: ^7.2.0
- mini-css-extract-plugin: ^2.9.1
- null-loader: ^4.0.1
- postcss: ^8.4.26
- postcss-loader: ^7.3.3
- react-dev-utils: ^12.0.1
- terser-webpack-plugin: ^5.3.9
- tslib: ^2.6.0
- url-loader: ^4.1.1
- webpack: ^5.95.0
- webpackbar: ^6.0.1
- peerDependencies:
- "@docusaurus/faster": 3.5.2
- peerDependenciesMeta:
- "@docusaurus/faster":
- optional: true
- checksum: 410d1ea38b3f788f17ac07c6e6ecfae7c47d235a467d9ebf7111e5945f574b12f61ce25d59c2197d7143ce7f8f4fb388d52ec4cd25b0ff23bece0a6ad6fad840
- languageName: node
- linkType: hard
-
-"@docusaurus/core@npm:3.6.0, @docusaurus/core@npm:^3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/core@npm:3.6.0"
- dependencies:
- "@docusaurus/babel": 3.6.0
- "@docusaurus/bundler": 3.6.0
- "@docusaurus/logger": 3.6.0
- "@docusaurus/mdx-loader": 3.6.0
- "@docusaurus/utils": 3.6.0
- "@docusaurus/utils-common": 3.6.0
- "@docusaurus/utils-validation": 3.6.0
+ babel-loader: ^9.1.3
+ babel-plugin-dynamic-import-node: ^2.3.3
boxen: ^6.2.1
chalk: ^4.1.2
chokidar: ^3.5.3
+ clean-css: ^5.3.2
cli-table3: ^0.6.3
combine-promises: ^1.1.0
commander: ^5.1.0
+ copy-webpack-plugin: ^11.0.0
core-js: ^3.31.1
+ css-loader: ^6.8.1
+ css-minimizer-webpack-plugin: ^5.0.1
+ cssnano: ^6.1.2
del: ^6.1.1
detect-port: ^1.5.1
escape-html: ^1.0.3
eta: ^2.2.0
eval: ^0.1.8
+ file-loader: ^6.2.0
fs-extra: ^11.1.1
+ html-minifier-terser: ^7.2.0
html-tags: ^3.3.1
- html-webpack-plugin: ^5.6.0
+ html-webpack-plugin: ^5.5.3
leven: ^3.1.0
lodash: ^4.17.21
+ mini-css-extract-plugin: ^2.7.6
p-map: ^4.0.0
+ postcss: ^8.4.26
+ postcss-loader: ^7.3.3
prompts: ^2.4.2
react-dev-utils: ^12.0.1
react-helmet-async: ^1.3.0
@@ -1616,71 +1779,56 @@ __metadata:
react-router-dom: ^5.3.4
rtl-detect: ^1.0.4
semver: ^7.5.4
- serve-handler: ^6.1.6
+ serve-handler: ^6.1.5
shelljs: ^0.8.5
+ terser-webpack-plugin: ^5.3.9
tslib: ^2.6.0
update-notifier: ^6.0.2
- webpack: ^5.95.0
- webpack-bundle-analyzer: ^4.10.2
- webpack-dev-server: ^4.15.2
- webpack-merge: ^6.0.1
+ url-loader: ^4.1.1
+ webpack: ^5.88.1
+ webpack-bundle-analyzer: ^4.9.0
+ webpack-dev-server: ^4.15.1
+ webpack-merge: ^5.9.0
+ webpackbar: ^5.0.2
peerDependencies:
"@mdx-js/react": ^3.0.0
react: ^18.0.0
react-dom: ^18.0.0
bin:
docusaurus: bin/docusaurus.mjs
- checksum: cbf28e5c3d710c8e24da2e434347417789bea058aab56efa6b33e43555b84ab168eaf79f947c86edf3e417fa3e2607212c8585559d1fa099f19fc018d437a912
+ checksum: 6c6282a75931f0f8f8f8768232b4436ff8679ae12b619f7bd01e0d83aa346e24ab0d9cecac034f9dc95c55059997efdd963d052d3e429583bfb8d3b54ab750d3
languageName: node
linkType: hard
-"@docusaurus/cssnano-preset@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/cssnano-preset@npm:3.6.0"
+"@docusaurus/cssnano-preset@npm:3.5.2":
+ version: 3.5.2
+ resolution: "@docusaurus/cssnano-preset@npm:3.5.2"
dependencies:
cssnano-preset-advanced: ^6.1.2
postcss: ^8.4.38
postcss-sort-media-queries: ^5.2.0
tslib: ^2.6.0
- checksum: 957c646df1b8593292d667e1b5e4abdce8d3bef484050885a88533560dffb778dafbb355c1a7fc30c4fe0f2be0321c518eb00e982db10ca1db067692c523f1be
+ checksum: 4bb1fae3741e14cbbdb64c1b0707435970838bf219831234a70cf382e6811ffac1cadf733d5e1fe7c278e7b2a9e533bfa802a5212b22ec46edd703208cf49f92
languageName: node
linkType: hard
-"@docusaurus/faster@npm:^3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/faster@npm:3.6.0"
- dependencies:
- "@rspack/core": ^1.0.14
- "@swc/core": ^1.7.39
- "@swc/html": ^1.7.39
- browserslist: ^4.24.2
- lightningcss: ^1.27.0
- swc-loader: ^0.2.6
- tslib: ^2.6.0
- webpack: ^5.95.0
- peerDependencies:
- "@docusaurus/types": "*"
- checksum: eedf4ba04f43b2cc8e10d9f3b1b6c6254cafad64d76456361adfe7c14641a6d43fb24c41fe853b59e5bfe55131807d95f05b6e17e575958bdc6575f1e0d794a5
- languageName: node
- linkType: hard
-
-"@docusaurus/logger@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/logger@npm:3.6.0"
+"@docusaurus/logger@npm:3.5.2":
+ version: 3.5.2
+ resolution: "@docusaurus/logger@npm:3.5.2"
dependencies:
chalk: ^4.1.2
tslib: ^2.6.0
- checksum: 36a02ac7d5c7f2140405c7adb032081dadb827fdb2ab45cf9fde938a37a2f47eded0564efb1c40b0ac16e58bb7300a9193c4bcdd2037cd495f4cc05c653192be
+ checksum: 7cbdcf54acd6e7787ca5a10b9c884be4b9e8fdae837862c66550a0bf3d02737f72c3188b2bddd61da6d8530eb2eb2b646ea599a79416e33c4998f1a87d2f6a8c
languageName: node
linkType: hard
-"@docusaurus/mdx-loader@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/mdx-loader@npm:3.6.0"
+"@docusaurus/mdx-loader@npm:3.5.2":
+ version: 3.5.2
+ resolution: "@docusaurus/mdx-loader@npm:3.5.2"
dependencies:
- "@docusaurus/logger": 3.6.0
- "@docusaurus/utils": 3.6.0
- "@docusaurus/utils-validation": 3.6.0
+ "@docusaurus/logger": 3.5.2
+ "@docusaurus/utils": 3.5.2
+ "@docusaurus/utils-validation": 3.5.2
"@mdx-js/mdx": ^3.0.0
"@slorber/remark-comment": ^1.0.0
escape-html: ^1.0.3
@@ -1705,15 +1853,15 @@ __metadata:
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- checksum: f44c1c650e30f53cc514662aa7dac9c3fc1781dac271faf38e31ac528330f4650e4e7547b592a34680e26c284d171ab8feed5571d2506f9f6392ebbbdfbb8ba2
+ checksum: 36186c2f3487631757b24ba3a21575d2253ca1e6ada82d556bf323da7ae7637c0880eb388bf375e207bc5f26dcd8b58cc76d763e6c2caf6ed80f88748444ce8d
languageName: node
linkType: hard
-"@docusaurus/module-type-aliases@npm:3.6.0, @docusaurus/module-type-aliases@npm:^3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/module-type-aliases@npm:3.6.0"
+"@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"
dependencies:
- "@docusaurus/types": 3.6.0
+ "@docusaurus/types": 3.5.2
"@types/history": ^4.7.11
"@types/react": "*"
"@types/react-router-config": "*"
@@ -1723,19 +1871,19 @@ __metadata:
peerDependencies:
react: "*"
react-dom: "*"
- checksum: 58e086a4e45f61c3b17faf98c6e5e8f42a97c56c15010f7dac84e72d6bbc3a8094349ce473cf906bbc56a532b32882e90e5f980584d31deb2d25780798c48a42
+ checksum: 0161db859d459bb25ac162f0c509fb1316dfb403a9e89f325a9bc7d9f35ae1825b9703a435777903ba93de827d4413b189bbd0c03018ac13d66b50633302ea80
languageName: node
linkType: hard
-"@docusaurus/plugin-client-redirects@npm:^3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/plugin-client-redirects@npm:3.6.0"
+"@docusaurus/plugin-client-redirects@npm:^3.1.1":
+ version: 3.5.2
+ resolution: "@docusaurus/plugin-client-redirects@npm:3.5.2"
dependencies:
- "@docusaurus/core": 3.6.0
- "@docusaurus/logger": 3.6.0
- "@docusaurus/utils": 3.6.0
- "@docusaurus/utils-common": 3.6.0
- "@docusaurus/utils-validation": 3.6.0
+ "@docusaurus/core": 3.5.2
+ "@docusaurus/logger": 3.5.2
+ "@docusaurus/utils": 3.5.2
+ "@docusaurus/utils-common": 3.5.2
+ "@docusaurus/utils-validation": 3.5.2
eta: ^2.2.0
fs-extra: ^11.1.1
lodash: ^4.17.21
@@ -1743,22 +1891,22 @@ __metadata:
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- checksum: e5534884249b9b614d4579e1016988998c4fb1a3b884af223fecc2ffac225e7a5d90db331b0bc0f90b5e6dbeeb9fa1dd911c8ec36dd7486a512be6bcb04c30ab
+ checksum: 040aa829e819a43cb8d30f6c776c27a303080a4cb2fc2c398266fe9ecbd006dc53c6dd862ebcf4f74d0547042c4df6c4bbf080b3702be6df18c95b95c3e38f1d
languageName: node
linkType: hard
-"@docusaurus/plugin-content-blog@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/plugin-content-blog@npm:3.6.0"
+"@docusaurus/plugin-content-blog@npm:3.5.2":
+ version: 3.5.2
+ resolution: "@docusaurus/plugin-content-blog@npm:3.5.2"
dependencies:
- "@docusaurus/core": 3.6.0
- "@docusaurus/logger": 3.6.0
- "@docusaurus/mdx-loader": 3.6.0
- "@docusaurus/theme-common": 3.6.0
- "@docusaurus/types": 3.6.0
- "@docusaurus/utils": 3.6.0
- "@docusaurus/utils-common": 3.6.0
- "@docusaurus/utils-validation": 3.6.0
+ "@docusaurus/core": 3.5.2
+ "@docusaurus/logger": 3.5.2
+ "@docusaurus/mdx-loader": 3.5.2
+ "@docusaurus/theme-common": 3.5.2
+ "@docusaurus/types": 3.5.2
+ "@docusaurus/utils": 3.5.2
+ "@docusaurus/utils-common": 3.5.2
+ "@docusaurus/utils-validation": 3.5.2
cheerio: 1.0.0-rc.12
feed: ^4.2.2
fs-extra: ^11.1.1
@@ -1773,23 +1921,23 @@ __metadata:
"@docusaurus/plugin-content-docs": "*"
react: ^18.0.0
react-dom: ^18.0.0
- checksum: 50581141a6610dc72a0cc8752efa8b1672157e5c604abd37da25a8bfdab4b3136f886cd61004a076315e65e75b11c53b12c84bdb50f2a6734c22845e35ff3551
+ checksum: c5997b9d86ccf939998f9d56e65491ecf9e677d8425e95a79b3b428041d4dfc4ecb03a18ef595777c3ad5bd65f4a2dd30d99cb6f1b411161bf7cd32027ecc6d5
languageName: node
linkType: hard
-"@docusaurus/plugin-content-docs@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/plugin-content-docs@npm:3.6.0"
+"@docusaurus/plugin-content-docs@npm:3.5.2":
+ version: 3.5.2
+ resolution: "@docusaurus/plugin-content-docs@npm:3.5.2"
dependencies:
- "@docusaurus/core": 3.6.0
- "@docusaurus/logger": 3.6.0
- "@docusaurus/mdx-loader": 3.6.0
- "@docusaurus/module-type-aliases": 3.6.0
- "@docusaurus/theme-common": 3.6.0
- "@docusaurus/types": 3.6.0
- "@docusaurus/utils": 3.6.0
- "@docusaurus/utils-common": 3.6.0
- "@docusaurus/utils-validation": 3.6.0
+ "@docusaurus/core": 3.5.2
+ "@docusaurus/logger": 3.5.2
+ "@docusaurus/mdx-loader": 3.5.2
+ "@docusaurus/module-type-aliases": 3.5.2
+ "@docusaurus/theme-common": 3.5.2
+ "@docusaurus/types": 3.5.2
+ "@docusaurus/utils": 3.5.2
+ "@docusaurus/utils-common": 3.5.2
+ "@docusaurus/utils-validation": 3.5.2
"@types/react-router-config": ^5.0.7
combine-promises: ^1.1.0
fs-extra: ^11.1.1
@@ -1801,157 +1949,156 @@ __metadata:
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- checksum: 47264764fbea004f539e57b31171a3d6802dd8481601d3ace9a82db4f43083cb428c1a7a235227b14b84e0be49b02169599b70ac83be928a428da2871e31d501
+ checksum: fb7ba7f8a6741b14bbe8db0bf1b12ff7a24d12c40d8276f32b9b393881d74bfed3bed4f1e5b0756cac0e43c4bd8106094d5cf6a3c527400e9713283fc3832dab
languageName: node
linkType: hard
-"@docusaurus/plugin-content-pages@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/plugin-content-pages@npm:3.6.0"
+"@docusaurus/plugin-content-pages@npm:3.5.2":
+ version: 3.5.2
+ resolution: "@docusaurus/plugin-content-pages@npm:3.5.2"
dependencies:
- "@docusaurus/core": 3.6.0
- "@docusaurus/mdx-loader": 3.6.0
- "@docusaurus/types": 3.6.0
- "@docusaurus/utils": 3.6.0
- "@docusaurus/utils-validation": 3.6.0
+ "@docusaurus/core": 3.5.2
+ "@docusaurus/mdx-loader": 3.5.2
+ "@docusaurus/types": 3.5.2
+ "@docusaurus/utils": 3.5.2
+ "@docusaurus/utils-validation": 3.5.2
fs-extra: ^11.1.1
tslib: ^2.6.0
webpack: ^5.88.1
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- checksum: 26d889fa3155b171ab878902b1da9fc675ee5ff816027ec43853ac4daeacb02fd55abaf503e5d6019cf7e25ba718a0efccb8dd91e970f4d880323b8151246a75
+ checksum: 8b3f1040e8ec006c9431508e73ef3f61cd5759bece3770189f7d52609f91bd156c9b18d0608f9cb14c456a1d1823be6633c573d5eee7cf9bd142b0f978c7a745
languageName: node
linkType: hard
-"@docusaurus/plugin-debug@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/plugin-debug@npm:3.6.0"
+"@docusaurus/plugin-debug@npm:3.5.2":
+ version: 3.5.2
+ resolution: "@docusaurus/plugin-debug@npm:3.5.2"
dependencies:
- "@docusaurus/core": 3.6.0
- "@docusaurus/types": 3.6.0
- "@docusaurus/utils": 3.6.0
+ "@docusaurus/core": 3.5.2
+ "@docusaurus/types": 3.5.2
+ "@docusaurus/utils": 3.5.2
fs-extra: ^11.1.1
react-json-view-lite: ^1.2.0
tslib: ^2.6.0
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- checksum: d0bb5a7fbf1594d540512a5e9b0f588dc1d4d5190b98f93a861437126ccf2a274e09d6aa4080906637a8401c85f8c2d018bd00fa2707f3d7d307e5769b2f5fba
+ checksum: a839e6c3a595ea202fdd7fbce638ab8df26ba73a8c7ead8c04d1bbb509ebe34e9633e7fe9eb54a7a733e93a03d74a60df4d9f6597b9621ff464280d4dd71db34
languageName: node
linkType: hard
-"@docusaurus/plugin-google-analytics@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/plugin-google-analytics@npm:3.6.0"
+"@docusaurus/plugin-google-analytics@npm:3.5.2":
+ version: 3.5.2
+ resolution: "@docusaurus/plugin-google-analytics@npm:3.5.2"
dependencies:
- "@docusaurus/core": 3.6.0
- "@docusaurus/types": 3.6.0
- "@docusaurus/utils-validation": 3.6.0
+ "@docusaurus/core": 3.5.2
+ "@docusaurus/types": 3.5.2
+ "@docusaurus/utils-validation": 3.5.2
tslib: ^2.6.0
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- checksum: aa9c96099723be7454d6209973ebe14265c6e35c99d8231568c5c5ee47fc6c6ab11c826522ce0356fd52012acb11eae00df520ddb41504d8b02a0031f28b98f0
+ checksum: 0b8c4d21333d40c2509d6ef807caaf69f085010c5deac514ab34f53b5486fd76766c90213dc98976a6c4d66fdfa14bf6b05594e51e8a53ec60c2a3fa08fd9a83
languageName: node
linkType: hard
-"@docusaurus/plugin-google-gtag@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/plugin-google-gtag@npm:3.6.0"
+"@docusaurus/plugin-google-gtag@npm:3.5.2":
+ version: 3.5.2
+ resolution: "@docusaurus/plugin-google-gtag@npm:3.5.2"
dependencies:
- "@docusaurus/core": 3.6.0
- "@docusaurus/types": 3.6.0
- "@docusaurus/utils-validation": 3.6.0
+ "@docusaurus/core": 3.5.2
+ "@docusaurus/types": 3.5.2
+ "@docusaurus/utils-validation": 3.5.2
"@types/gtag.js": ^0.0.12
tslib: ^2.6.0
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- checksum: 300bdc62ab115caef46498cc9c376ef4c79e48c1c0cc1f31c0c22ba54823801e1143d6e7447103815333bf47eacb3bf34baa1d3e809645ec233f3e743e8f2b1f
+ checksum: 5d53c2483c8c7e3a8e842bd091a774d4041f0e165d216b3c02f031a224a77258c9456e8b2acd0500b4a0eff474a83c1b82803628db9d4b132514409936c68ac4
languageName: node
linkType: hard
-"@docusaurus/plugin-google-tag-manager@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/plugin-google-tag-manager@npm:3.6.0"
+"@docusaurus/plugin-google-tag-manager@npm:3.5.2":
+ version: 3.5.2
+ resolution: "@docusaurus/plugin-google-tag-manager@npm:3.5.2"
dependencies:
- "@docusaurus/core": 3.6.0
- "@docusaurus/types": 3.6.0
- "@docusaurus/utils-validation": 3.6.0
+ "@docusaurus/core": 3.5.2
+ "@docusaurus/types": 3.5.2
+ "@docusaurus/utils-validation": 3.5.2
tslib: ^2.6.0
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- checksum: 37546382bf6edf17490b4d7a416e7c00cf3f09c591a402ba3d5519fe3c97bbfe54bc039964d0878677570fca82105b4e44ca8c80c29d6e43d94342568bdb865d
+ checksum: 9a6fc2ca54ea677c6edfd78f4f392d7d9ae86afd085fcda96d5ac41efa441352c25a2519595d9d15fb9b838e2ae39837f0daf02e2406c5cd56199ae237bd7b7a
languageName: node
linkType: hard
-"@docusaurus/plugin-sitemap@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/plugin-sitemap@npm:3.6.0"
+"@docusaurus/plugin-sitemap@npm:3.5.2":
+ version: 3.5.2
+ resolution: "@docusaurus/plugin-sitemap@npm:3.5.2"
dependencies:
- "@docusaurus/core": 3.6.0
- "@docusaurus/logger": 3.6.0
- "@docusaurus/types": 3.6.0
- "@docusaurus/utils": 3.6.0
- "@docusaurus/utils-common": 3.6.0
- "@docusaurus/utils-validation": 3.6.0
+ "@docusaurus/core": 3.5.2
+ "@docusaurus/logger": 3.5.2
+ "@docusaurus/types": 3.5.2
+ "@docusaurus/utils": 3.5.2
+ "@docusaurus/utils-common": 3.5.2
+ "@docusaurus/utils-validation": 3.5.2
fs-extra: ^11.1.1
sitemap: ^7.1.1
tslib: ^2.6.0
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- checksum: 7ece4a146f0b8fe663004f57bddd4568829e261d616ddafb3c83408121d881cc482d751cf88084ef43aed9103f8bb09602472f5b349b880f83c0101a4b123ce2
+ checksum: 26b6bceb7ab87fe7f6f666742d1e81de32cdacc5aaa3d45d91002c7d64e3258f3d0aac87c6b0d442eaf34ede2af4b7521b50737f2e8e2718daff6fce10230213
languageName: node
linkType: hard
-"@docusaurus/preset-classic@npm:^3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/preset-classic@npm:3.6.0"
+"@docusaurus/preset-classic@npm:^3.1.1":
+ version: 3.5.2
+ resolution: "@docusaurus/preset-classic@npm:3.5.2"
dependencies:
- "@docusaurus/core": 3.6.0
- "@docusaurus/plugin-content-blog": 3.6.0
- "@docusaurus/plugin-content-docs": 3.6.0
- "@docusaurus/plugin-content-pages": 3.6.0
- "@docusaurus/plugin-debug": 3.6.0
- "@docusaurus/plugin-google-analytics": 3.6.0
- "@docusaurus/plugin-google-gtag": 3.6.0
- "@docusaurus/plugin-google-tag-manager": 3.6.0
- "@docusaurus/plugin-sitemap": 3.6.0
- "@docusaurus/theme-classic": 3.6.0
- "@docusaurus/theme-common": 3.6.0
- "@docusaurus/theme-search-algolia": 3.6.0
- "@docusaurus/types": 3.6.0
+ "@docusaurus/core": 3.5.2
+ "@docusaurus/plugin-content-blog": 3.5.2
+ "@docusaurus/plugin-content-docs": 3.5.2
+ "@docusaurus/plugin-content-pages": 3.5.2
+ "@docusaurus/plugin-debug": 3.5.2
+ "@docusaurus/plugin-google-analytics": 3.5.2
+ "@docusaurus/plugin-google-gtag": 3.5.2
+ "@docusaurus/plugin-google-tag-manager": 3.5.2
+ "@docusaurus/plugin-sitemap": 3.5.2
+ "@docusaurus/theme-classic": 3.5.2
+ "@docusaurus/theme-common": 3.5.2
+ "@docusaurus/theme-search-algolia": 3.5.2
+ "@docusaurus/types": 3.5.2
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- checksum: f32c335c2cec0f3a906aa8cb3fa97e6c1c5a2998a1926cc0b17f3de8ab5f1ad67bd938cce4d1884a32b46fa4f0191568b84511685c546bb3752ceef5be42142a
+ checksum: ec578e62b3b13b1874b14235a448a913c2d2358ea9b9d9c60bb250be468ab62387c88ec44e1ee82ad5b3d7243306e31919888a80eae62e5e8eab0ae12194bf69
languageName: node
linkType: hard
-"@docusaurus/theme-classic@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/theme-classic@npm:3.6.0"
+"@docusaurus/theme-classic@npm:3.5.2":
+ version: 3.5.2
+ resolution: "@docusaurus/theme-classic@npm:3.5.2"
dependencies:
- "@docusaurus/core": 3.6.0
- "@docusaurus/logger": 3.6.0
- "@docusaurus/mdx-loader": 3.6.0
- "@docusaurus/module-type-aliases": 3.6.0
- "@docusaurus/plugin-content-blog": 3.6.0
- "@docusaurus/plugin-content-docs": 3.6.0
- "@docusaurus/plugin-content-pages": 3.6.0
- "@docusaurus/theme-common": 3.6.0
- "@docusaurus/theme-translations": 3.6.0
- "@docusaurus/types": 3.6.0
- "@docusaurus/utils": 3.6.0
- "@docusaurus/utils-common": 3.6.0
- "@docusaurus/utils-validation": 3.6.0
+ "@docusaurus/core": 3.5.2
+ "@docusaurus/mdx-loader": 3.5.2
+ "@docusaurus/module-type-aliases": 3.5.2
+ "@docusaurus/plugin-content-blog": 3.5.2
+ "@docusaurus/plugin-content-docs": 3.5.2
+ "@docusaurus/plugin-content-pages": 3.5.2
+ "@docusaurus/theme-common": 3.5.2
+ "@docusaurus/theme-translations": 3.5.2
+ "@docusaurus/types": 3.5.2
+ "@docusaurus/utils": 3.5.2
+ "@docusaurus/utils-common": 3.5.2
+ "@docusaurus/utils-validation": 3.5.2
"@mdx-js/react": ^3.0.0
clsx: ^2.0.0
copy-text-to-clipboard: ^3.2.0
- infima: 0.2.0-alpha.45
+ infima: 0.2.0-alpha.44
lodash: ^4.17.21
nprogress: ^0.2.0
postcss: ^8.4.26
@@ -1964,18 +2111,18 @@ __metadata:
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- checksum: d44c7a5c44608dff740e5a81f51c589c7be2784565d69e63a1592225af9317f7282fd853d198187b9971f19fe5006973e733e2697cfd3121350aba982fe20ed1
+ checksum: 6c415b01ad24bb43eb166e2b780a84356ff14a627627f6a541c2803832d56c4f9409a5636048693d2d24804f59c2cc7bda925d9ef999a8276fe125477d2b2e1e
languageName: node
linkType: hard
-"@docusaurus/theme-common@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/theme-common@npm:3.6.0"
+"@docusaurus/theme-common@npm:3.5.2":
+ version: 3.5.2
+ resolution: "@docusaurus/theme-common@npm:3.5.2"
dependencies:
- "@docusaurus/mdx-loader": 3.6.0
- "@docusaurus/module-type-aliases": 3.6.0
- "@docusaurus/utils": 3.6.0
- "@docusaurus/utils-common": 3.6.0
+ "@docusaurus/mdx-loader": 3.5.2
+ "@docusaurus/module-type-aliases": 3.5.2
+ "@docusaurus/utils": 3.5.2
+ "@docusaurus/utils-common": 3.5.2
"@types/history": ^4.7.11
"@types/react": "*"
"@types/react-router-config": "*"
@@ -1988,22 +2135,22 @@ __metadata:
"@docusaurus/plugin-content-docs": "*"
react: ^18.0.0
react-dom: ^18.0.0
- checksum: f65410f3b959d0fed7a91883c99bab1637cd5ff7b05df2e957ee01feca0d52f21e623a58d17950fc78380bcbeb04140cd230876a1a240723c13ec205cae5e608
+ checksum: c78ec7f6035abc920a2a0bc1ad78920178a5452538a3a70794eca8d4b976725f6ccc464ee3092afd31ca59b4e061ad4c21cdce7f5e10b06567075814b2fc2002
languageName: node
linkType: hard
-"@docusaurus/theme-search-algolia@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/theme-search-algolia@npm:3.6.0"
+"@docusaurus/theme-search-algolia@npm:3.5.2":
+ version: 3.5.2
+ resolution: "@docusaurus/theme-search-algolia@npm:3.5.2"
dependencies:
"@docsearch/react": ^3.5.2
- "@docusaurus/core": 3.6.0
- "@docusaurus/logger": 3.6.0
- "@docusaurus/plugin-content-docs": 3.6.0
- "@docusaurus/theme-common": 3.6.0
- "@docusaurus/theme-translations": 3.6.0
- "@docusaurus/utils": 3.6.0
- "@docusaurus/utils-validation": 3.6.0
+ "@docusaurus/core": 3.5.2
+ "@docusaurus/logger": 3.5.2
+ "@docusaurus/plugin-content-docs": 3.5.2
+ "@docusaurus/theme-common": 3.5.2
+ "@docusaurus/theme-translations": 3.5.2
+ "@docusaurus/utils": 3.5.2
+ "@docusaurus/utils-validation": 3.5.2
algoliasearch: ^4.18.0
algoliasearch-helper: ^3.13.3
clsx: ^2.0.0
@@ -2015,30 +2162,30 @@ __metadata:
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- checksum: 599f2cb0944fc955d5116270cd6ec3347df34a4e4285d0c90ca19e11802c880c53b27dd8687e0f6c35972578a623f1d9f5e0334e28740d027d627647bd5ca5a7
+ checksum: e945e3001996477597bfad074eaef074cf4c5365ed3076c3109130a2252b266e4e2fac46904a0626eedeff23b9ac11e7b985cc71f5485ede52d3ddf379b7959b
languageName: node
linkType: hard
-"@docusaurus/theme-translations@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/theme-translations@npm:3.6.0"
+"@docusaurus/theme-translations@npm:3.5.2":
+ version: 3.5.2
+ resolution: "@docusaurus/theme-translations@npm:3.5.2"
dependencies:
fs-extra: ^11.1.1
tslib: ^2.6.0
- checksum: 962c1366173bdf9f66e4a8a309fd70c7434caf1638cf1c6112ee05cf102d9ae719ec5edeec663bb90607749e98fa7e040362f2f512388cea44d255c519a3bcf0
+ checksum: dc523c74a13fb8552c03e547c6de1c21881d899cc74bf088a2bed716e0ef1a4ceba2726c43656d87fff60413ca191f5ea946b182e4ae4129c14da832b5194d82
languageName: node
linkType: hard
-"@docusaurus/tsconfig@npm:^3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/tsconfig@npm:3.6.0"
- checksum: 98d32f16fb015b299518ba1f7fa76be8d2faf6788a076c35a89f4197f3b8ef57a8524f7bde14a140a4f03e4522c1edba00a79d3e4573536d4c9d101742baa586
+"@docusaurus/tsconfig@npm:^3.1.1":
+ version: 3.5.2
+ resolution: "@docusaurus/tsconfig@npm:3.5.2"
+ checksum: 808a17eaf422ae9a948c6558dd1e92d4700b067ead3a63a84049c6845bf94f84e311cd0e4d517047fe9ea057efe393bb22c2d5c92d727d06c9f895e971f2c3ea
languageName: node
linkType: hard
-"@docusaurus/types@npm:3.6.0, @docusaurus/types@npm:^3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/types@npm:3.6.0"
+"@docusaurus/types@npm:3.5.2, @docusaurus/types@npm:^3.1.1":
+ version: 3.5.2
+ resolution: "@docusaurus/types@npm:3.5.2"
dependencies:
"@mdx-js/mdx": ^3.0.0
"@types/history": ^4.7.11
@@ -2047,18 +2194,18 @@ __metadata:
joi: ^17.9.2
react-helmet-async: ^1.3.0
utility-types: ^3.10.0
- webpack: ^5.95.0
+ webpack: ^5.88.1
webpack-merge: ^5.9.0
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
- checksum: 0599cc5311f96487230759f6186bba57f2ef5e7bd0a37d2d57d5a02c53c579e341ca1aca4c8075111352191f7dc25c9411533c34a344a42727dc88626b30d28c
+ checksum: e39451b7b08673ad5e1551ee6e4286f90f2554cf9ba245abfa56670550f48afca9c57b01c10ffa21dacb734c0fcd067150eeb2b1c1ebb1692f1f538b1eed0029
languageName: node
linkType: hard
-"@docusaurus/utils-common@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/utils-common@npm:3.6.0"
+"@docusaurus/utils-common@npm:3.5.2":
+ version: 3.5.2
+ resolution: "@docusaurus/utils-common@npm:3.5.2"
dependencies:
tslib: ^2.6.0
peerDependencies:
@@ -2066,32 +2213,32 @@ __metadata:
peerDependenciesMeta:
"@docusaurus/types":
optional: true
- checksum: 473056b9a6e3fd7592698ca26cf4b4a4f2e1cbdf672b66c6d1cbeffd390e41081b8b44ccf93bb12ec279461a7163f37870b4b0d51630215d7f1f89865b7595a3
+ checksum: 9d550c89663d4271456ae0832c82a1691207ccc95e21df3a05a4bd6bbd2624bb9e3ab7327d939c04b2023378987bcf99321b2c37be1af214852832f65d6db14a
languageName: node
linkType: hard
-"@docusaurus/utils-validation@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/utils-validation@npm:3.6.0"
+"@docusaurus/utils-validation@npm:3.5.2":
+ version: 3.5.2
+ resolution: "@docusaurus/utils-validation@npm:3.5.2"
dependencies:
- "@docusaurus/logger": 3.6.0
- "@docusaurus/utils": 3.6.0
- "@docusaurus/utils-common": 3.6.0
+ "@docusaurus/logger": 3.5.2
+ "@docusaurus/utils": 3.5.2
+ "@docusaurus/utils-common": 3.5.2
fs-extra: ^11.2.0
joi: ^17.9.2
js-yaml: ^4.1.0
lodash: ^4.17.21
tslib: ^2.6.0
- checksum: 8e340d8dc12809dbcf307a97c6e1307d1134600a2492b6028aa603b1b84e4b31e6444cee509372f44c98b3e838323baa5b2f3a34e41c0152ec72c7a2e543cd60
+ checksum: 5966e6d0e8f26292c629899f13b545501b53b345b0e2291bb47aaa80d7c9c5cf155e15a4ecd073a4095ee7c83c6db3612e0a34f81a8187fd20410b1aeb92d731
languageName: node
linkType: hard
-"@docusaurus/utils@npm:3.6.0":
- version: 3.6.0
- resolution: "@docusaurus/utils@npm:3.6.0"
+"@docusaurus/utils@npm:3.5.2":
+ version: 3.5.2
+ resolution: "@docusaurus/utils@npm:3.5.2"
dependencies:
- "@docusaurus/logger": 3.6.0
- "@docusaurus/utils-common": 3.6.0
+ "@docusaurus/logger": 3.5.2
+ "@docusaurus/utils-common": 3.5.2
"@svgr/webpack": ^8.1.0
escape-string-regexp: ^4.0.0
file-loader: ^6.2.0
@@ -2115,7 +2262,7 @@ __metadata:
peerDependenciesMeta:
"@docusaurus/types":
optional: true
- checksum: 054b8414eccdd08f1145521ea7c32895b4036a95613b8f88cdb608a4b9bebee9911be724537d620c084383644366529d6174515b20f4da89b66f2e9e90ac1679
+ checksum: 0e0f4fc65ed076d4e4b551ecb61447b7c2468060d1655afff314515844ae34dc0546f467f53bff535f3144afc109e974da27fadb7c678a5d19966bed9e7a27c4
languageName: node
linkType: hard
@@ -2267,42 +2414,6 @@ __metadata:
languageName: node
linkType: hard
-"@module-federation/runtime-tools@npm:0.5.1":
- version: 0.5.1
- resolution: "@module-federation/runtime-tools@npm:0.5.1"
- dependencies:
- "@module-federation/runtime": 0.5.1
- "@module-federation/webpack-bundler-runtime": 0.5.1
- checksum: 651051fb6e2e63915b408547b7d6bdea06338857e293e293b088e330dbb78e147df1b74c5e1f9d1e93ea6e61706f2d4511b8a0dc487703b5615db9695ee9e8ad
- languageName: node
- linkType: hard
-
-"@module-federation/runtime@npm:0.5.1":
- version: 0.5.1
- resolution: "@module-federation/runtime@npm:0.5.1"
- dependencies:
- "@module-federation/sdk": 0.5.1
- checksum: 810e350dbd12a7f4bffb860375fd28a26a560669128f5339d729bc40810ae9b503b4034cbbb90e7105fd1df5544c3bc9cf11dfd2a47e2eaa2c50d00ad759b1e2
- languageName: node
- linkType: hard
-
-"@module-federation/sdk@npm:0.5.1":
- version: 0.5.1
- resolution: "@module-federation/sdk@npm:0.5.1"
- checksum: 75f225926564779db3113aae9cd1b89d303b753026c84945a5225b496554db9e3a2fe2e1d594af4357708853337f161235f46ed5e6320592ac1e8b07756bf918
- languageName: node
- linkType: hard
-
-"@module-federation/webpack-bundler-runtime@npm:0.5.1":
- version: 0.5.1
- resolution: "@module-federation/webpack-bundler-runtime@npm:0.5.1"
- dependencies:
- "@module-federation/runtime": 0.5.1
- "@module-federation/sdk": 0.5.1
- checksum: a84a7b9482f133eba0fb8fd77ea87310a1028b7d5fc3da4a17b2bb5fc3fc9fc440cb32ed927f74e1bfe61925eec361512884d84b236b3cdab74276c0dcfff840
- languageName: node
- linkType: hard
-
"@nodelib/fs.scandir@npm:2.1.5":
version: 2.1.5
resolution: "@nodelib/fs.scandir@npm:2.1.5"
@@ -2518,129 +2629,6 @@ __metadata:
languageName: node
linkType: hard
-"@rspack/binding-darwin-arm64@npm:1.0.14":
- version: 1.0.14
- resolution: "@rspack/binding-darwin-arm64@npm:1.0.14"
- conditions: os=darwin & cpu=arm64
- languageName: node
- linkType: hard
-
-"@rspack/binding-darwin-x64@npm:1.0.14":
- version: 1.0.14
- resolution: "@rspack/binding-darwin-x64@npm:1.0.14"
- conditions: os=darwin & cpu=x64
- languageName: node
- linkType: hard
-
-"@rspack/binding-linux-arm64-gnu@npm:1.0.14":
- version: 1.0.14
- resolution: "@rspack/binding-linux-arm64-gnu@npm:1.0.14"
- conditions: os=linux & cpu=arm64 & libc=glibc
- languageName: node
- linkType: hard
-
-"@rspack/binding-linux-arm64-musl@npm:1.0.14":
- version: 1.0.14
- resolution: "@rspack/binding-linux-arm64-musl@npm:1.0.14"
- conditions: os=linux & cpu=arm64 & libc=musl
- languageName: node
- linkType: hard
-
-"@rspack/binding-linux-x64-gnu@npm:1.0.14":
- version: 1.0.14
- resolution: "@rspack/binding-linux-x64-gnu@npm:1.0.14"
- conditions: os=linux & cpu=x64 & libc=glibc
- languageName: node
- linkType: hard
-
-"@rspack/binding-linux-x64-musl@npm:1.0.14":
- version: 1.0.14
- resolution: "@rspack/binding-linux-x64-musl@npm:1.0.14"
- conditions: os=linux & cpu=x64 & libc=musl
- languageName: node
- linkType: hard
-
-"@rspack/binding-win32-arm64-msvc@npm:1.0.14":
- version: 1.0.14
- resolution: "@rspack/binding-win32-arm64-msvc@npm:1.0.14"
- conditions: os=win32 & cpu=arm64
- languageName: node
- linkType: hard
-
-"@rspack/binding-win32-ia32-msvc@npm:1.0.14":
- version: 1.0.14
- resolution: "@rspack/binding-win32-ia32-msvc@npm:1.0.14"
- conditions: os=win32 & cpu=ia32
- languageName: node
- linkType: hard
-
-"@rspack/binding-win32-x64-msvc@npm:1.0.14":
- version: 1.0.14
- resolution: "@rspack/binding-win32-x64-msvc@npm:1.0.14"
- conditions: os=win32 & cpu=x64
- languageName: node
- linkType: hard
-
-"@rspack/binding@npm:1.0.14":
- version: 1.0.14
- resolution: "@rspack/binding@npm:1.0.14"
- dependencies:
- "@rspack/binding-darwin-arm64": 1.0.14
- "@rspack/binding-darwin-x64": 1.0.14
- "@rspack/binding-linux-arm64-gnu": 1.0.14
- "@rspack/binding-linux-arm64-musl": 1.0.14
- "@rspack/binding-linux-x64-gnu": 1.0.14
- "@rspack/binding-linux-x64-musl": 1.0.14
- "@rspack/binding-win32-arm64-msvc": 1.0.14
- "@rspack/binding-win32-ia32-msvc": 1.0.14
- "@rspack/binding-win32-x64-msvc": 1.0.14
- 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-win32-arm64-msvc":
- optional: true
- "@rspack/binding-win32-ia32-msvc":
- optional: true
- "@rspack/binding-win32-x64-msvc":
- optional: true
- checksum: 0fae05a49eb978cb565ebe78d66a51565fd833ee15b2e1f7739e98ccad706faacdd662c6f10a12d730004f62a8ec3a5e87521746ddc127b0c91116ba751504aa
- languageName: node
- linkType: hard
-
-"@rspack/core@npm:^1.0.14":
- version: 1.0.14
- resolution: "@rspack/core@npm:1.0.14"
- dependencies:
- "@module-federation/runtime-tools": 0.5.1
- "@rspack/binding": 1.0.14
- "@rspack/lite-tapable": 1.0.1
- caniuse-lite: ^1.0.30001616
- peerDependencies:
- "@swc/helpers": ">=0.5.1"
- peerDependenciesMeta:
- "@swc/helpers":
- optional: true
- checksum: 0aeb557b36ba03b0c8a51f5e46d4671c245fb6e3b47c26ecb5c9e0d18afece9c88266c3ff3a809345fc5f6dbdeb63747a2495397a153537531c5224de340c38e
- languageName: node
- linkType: hard
-
-"@rspack/lite-tapable@npm:1.0.1":
- version: 1.0.1
- resolution: "@rspack/lite-tapable@npm:1.0.1"
- checksum: a490aa7868178e7277573293a2b81191513d451c72f4118173f080b5c65a19618e1d37083cffa049b563433a3f772ab2f4424c0a920b04b1347ddb12fe3bcbf8
- languageName: node
- linkType: hard
-
"@sideway/address@npm:^4.1.3":
version: 4.1.4
resolution: "@sideway/address@npm:4.1.4"
@@ -2696,15 +2684,6 @@ __metadata:
languageName: node
linkType: hard
-"@spotify/prettier-config@npm:^15.0.0":
- version: 15.0.0
- resolution: "@spotify/prettier-config@npm:15.0.0"
- peerDependencies:
- prettier: 2.x
- checksum: aa5ec5739427f9acdb9d62ae6c04f04a344898567239f7ee45c75c6205ebdffbc61747ea8de6e83baf0bc3785359967de4b7097a8723c4b4063ff57dc5cb6c44
- 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"
@@ -2861,92 +2840,92 @@ __metadata:
languageName: node
linkType: hard
-"@swc/core-darwin-arm64@npm:1.9.2":
- version: 1.9.2
- resolution: "@swc/core-darwin-arm64@npm:1.9.2"
+"@swc/core-darwin-arm64@npm:1.9.3":
+ version: 1.9.3
+ resolution: "@swc/core-darwin-arm64@npm:1.9.3"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
-"@swc/core-darwin-x64@npm:1.9.2":
- version: 1.9.2
- resolution: "@swc/core-darwin-x64@npm:1.9.2"
+"@swc/core-darwin-x64@npm:1.9.3":
+ version: 1.9.3
+ resolution: "@swc/core-darwin-x64@npm:1.9.3"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
-"@swc/core-linux-arm-gnueabihf@npm:1.9.2":
- version: 1.9.2
- resolution: "@swc/core-linux-arm-gnueabihf@npm:1.9.2"
+"@swc/core-linux-arm-gnueabihf@npm:1.9.3":
+ version: 1.9.3
+ resolution: "@swc/core-linux-arm-gnueabihf@npm:1.9.3"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
-"@swc/core-linux-arm64-gnu@npm:1.9.2":
- version: 1.9.2
- resolution: "@swc/core-linux-arm64-gnu@npm:1.9.2"
+"@swc/core-linux-arm64-gnu@npm:1.9.3":
+ version: 1.9.3
+ resolution: "@swc/core-linux-arm64-gnu@npm:1.9.3"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
-"@swc/core-linux-arm64-musl@npm:1.9.2":
- version: 1.9.2
- resolution: "@swc/core-linux-arm64-musl@npm:1.9.2"
+"@swc/core-linux-arm64-musl@npm:1.9.3":
+ version: 1.9.3
+ resolution: "@swc/core-linux-arm64-musl@npm:1.9.3"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
-"@swc/core-linux-x64-gnu@npm:1.9.2":
- version: 1.9.2
- resolution: "@swc/core-linux-x64-gnu@npm:1.9.2"
+"@swc/core-linux-x64-gnu@npm:1.9.3":
+ version: 1.9.3
+ resolution: "@swc/core-linux-x64-gnu@npm:1.9.3"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
-"@swc/core-linux-x64-musl@npm:1.9.2":
- version: 1.9.2
- resolution: "@swc/core-linux-x64-musl@npm:1.9.2"
+"@swc/core-linux-x64-musl@npm:1.9.3":
+ version: 1.9.3
+ resolution: "@swc/core-linux-x64-musl@npm:1.9.3"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
-"@swc/core-win32-arm64-msvc@npm:1.9.2":
- version: 1.9.2
- resolution: "@swc/core-win32-arm64-msvc@npm:1.9.2"
+"@swc/core-win32-arm64-msvc@npm:1.9.3":
+ version: 1.9.3
+ resolution: "@swc/core-win32-arm64-msvc@npm:1.9.3"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
-"@swc/core-win32-ia32-msvc@npm:1.9.2":
- version: 1.9.2
- resolution: "@swc/core-win32-ia32-msvc@npm:1.9.2"
+"@swc/core-win32-ia32-msvc@npm:1.9.3":
+ version: 1.9.3
+ resolution: "@swc/core-win32-ia32-msvc@npm:1.9.3"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
-"@swc/core-win32-x64-msvc@npm:1.9.2":
- version: 1.9.2
- resolution: "@swc/core-win32-x64-msvc@npm:1.9.2"
+"@swc/core-win32-x64-msvc@npm:1.9.3":
+ version: 1.9.3
+ resolution: "@swc/core-win32-x64-msvc@npm:1.9.3"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
-"@swc/core@npm:^1.3.46, @swc/core@npm:^1.7.39":
- version: 1.9.2
- resolution: "@swc/core@npm:1.9.2"
+"@swc/core@npm:^1.3.46":
+ version: 1.9.3
+ resolution: "@swc/core@npm:1.9.3"
dependencies:
- "@swc/core-darwin-arm64": 1.9.2
- "@swc/core-darwin-x64": 1.9.2
- "@swc/core-linux-arm-gnueabihf": 1.9.2
- "@swc/core-linux-arm64-gnu": 1.9.2
- "@swc/core-linux-arm64-musl": 1.9.2
- "@swc/core-linux-x64-gnu": 1.9.2
- "@swc/core-linux-x64-musl": 1.9.2
- "@swc/core-win32-arm64-msvc": 1.9.2
- "@swc/core-win32-ia32-msvc": 1.9.2
- "@swc/core-win32-x64-msvc": 1.9.2
+ "@swc/core-darwin-arm64": 1.9.3
+ "@swc/core-darwin-x64": 1.9.3
+ "@swc/core-linux-arm-gnueabihf": 1.9.3
+ "@swc/core-linux-arm64-gnu": 1.9.3
+ "@swc/core-linux-arm64-musl": 1.9.3
+ "@swc/core-linux-x64-gnu": 1.9.3
+ "@swc/core-linux-x64-musl": 1.9.3
+ "@swc/core-win32-arm64-msvc": 1.9.3
+ "@swc/core-win32-ia32-msvc": 1.9.3
+ "@swc/core-win32-x64-msvc": 1.9.3
"@swc/counter": ^0.1.3
- "@swc/types": ^0.1.15
+ "@swc/types": ^0.1.17
peerDependencies:
"@swc/helpers": "*"
dependenciesMeta:
@@ -2973,7 +2952,7 @@ __metadata:
peerDependenciesMeta:
"@swc/helpers":
optional: true
- checksum: 325afca1473e371804cc420d096553a0c6b19d01296b46b23e3b75a797c8b139c712ad79bc5c876cfc6d7bd6d60014a9f81286a2e888e94f0dec70903893f0b6
+ checksum: 4d83aee0b4d9c543f247d680796e5b9cb69997369dcd81642c2603e185312dfb1674328a7ceb1d352c21275155a71789f76dafe8853055d076b6241d5760bbed
languageName: node
linkType: hard
@@ -2984,122 +2963,12 @@ __metadata:
languageName: node
linkType: hard
-"@swc/html-darwin-arm64@npm:1.8.0":
- version: 1.8.0
- resolution: "@swc/html-darwin-arm64@npm:1.8.0"
- conditions: os=darwin & cpu=arm64
- languageName: node
- linkType: hard
-
-"@swc/html-darwin-x64@npm:1.8.0":
- version: 1.8.0
- resolution: "@swc/html-darwin-x64@npm:1.8.0"
- conditions: os=darwin & cpu=x64
- languageName: node
- linkType: hard
-
-"@swc/html-linux-arm-gnueabihf@npm:1.8.0":
- version: 1.8.0
- resolution: "@swc/html-linux-arm-gnueabihf@npm:1.8.0"
- conditions: os=linux & cpu=arm
- languageName: node
- linkType: hard
-
-"@swc/html-linux-arm64-gnu@npm:1.8.0":
- version: 1.8.0
- resolution: "@swc/html-linux-arm64-gnu@npm:1.8.0"
- conditions: os=linux & cpu=arm64 & libc=glibc
- languageName: node
- linkType: hard
-
-"@swc/html-linux-arm64-musl@npm:1.8.0":
- version: 1.8.0
- resolution: "@swc/html-linux-arm64-musl@npm:1.8.0"
- conditions: os=linux & cpu=arm64 & libc=musl
- languageName: node
- linkType: hard
-
-"@swc/html-linux-x64-gnu@npm:1.8.0":
- version: 1.8.0
- resolution: "@swc/html-linux-x64-gnu@npm:1.8.0"
- conditions: os=linux & cpu=x64 & libc=glibc
- languageName: node
- linkType: hard
-
-"@swc/html-linux-x64-musl@npm:1.8.0":
- version: 1.8.0
- resolution: "@swc/html-linux-x64-musl@npm:1.8.0"
- conditions: os=linux & cpu=x64 & libc=musl
- languageName: node
- linkType: hard
-
-"@swc/html-win32-arm64-msvc@npm:1.8.0":
- version: 1.8.0
- resolution: "@swc/html-win32-arm64-msvc@npm:1.8.0"
- conditions: os=win32 & cpu=arm64
- languageName: node
- linkType: hard
-
-"@swc/html-win32-ia32-msvc@npm:1.8.0":
- version: 1.8.0
- resolution: "@swc/html-win32-ia32-msvc@npm:1.8.0"
- conditions: os=win32 & cpu=ia32
- languageName: node
- linkType: hard
-
-"@swc/html-win32-x64-msvc@npm:1.8.0":
- version: 1.8.0
- resolution: "@swc/html-win32-x64-msvc@npm:1.8.0"
- conditions: os=win32 & cpu=x64
- languageName: node
- linkType: hard
-
-"@swc/html@npm:^1.7.39":
- version: 1.8.0
- resolution: "@swc/html@npm:1.8.0"
+"@swc/types@npm:^0.1.17":
+ version: 0.1.17
+ resolution: "@swc/types@npm:0.1.17"
dependencies:
"@swc/counter": ^0.1.3
- "@swc/html-darwin-arm64": 1.8.0
- "@swc/html-darwin-x64": 1.8.0
- "@swc/html-linux-arm-gnueabihf": 1.8.0
- "@swc/html-linux-arm64-gnu": 1.8.0
- "@swc/html-linux-arm64-musl": 1.8.0
- "@swc/html-linux-x64-gnu": 1.8.0
- "@swc/html-linux-x64-musl": 1.8.0
- "@swc/html-win32-arm64-msvc": 1.8.0
- "@swc/html-win32-ia32-msvc": 1.8.0
- "@swc/html-win32-x64-msvc": 1.8.0
- 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: c7d74549141a5ccd2bacee4eadeb380808a53f34214f9b31257b92418aabfec8852013c310a893963d8ab4c4fae6195f1ca97ba8b40c8f451f25f6b3704a7cc0
- languageName: node
- linkType: hard
-
-"@swc/types@npm:^0.1.15":
- version: 0.1.15
- resolution: "@swc/types@npm:0.1.15"
- dependencies:
- "@swc/counter": ^0.1.3
- checksum: 19889eed42d28f5dcef7c16f3b0cf4375890984b106aca46d9455d1f5ba364156d206a8e1f73962718ee408ff9e460b84aaa79025bf8dc30e0d6ded471e1e2d2
+ checksum: 6cc87b8ddfb540096abdf40bc29742df0b7d068f97c1ce6c32cd1b7073cde263ed7bc3bae1fba7bf0e1a0f5d63336e9fa092e05a54f6d9b3570df956d2acaff6
languageName: node
linkType: hard
@@ -3182,26 +3051,6 @@ __metadata:
languageName: node
linkType: hard
-"@types/eslint-scope@npm:^3.7.7":
- version: 3.7.7
- resolution: "@types/eslint-scope@npm:3.7.7"
- dependencies:
- "@types/eslint": "*"
- "@types/estree": "*"
- checksum: e2889a124aaab0b89af1bab5959847c5bec09809209255de0e63b9f54c629a94781daa04adb66bffcdd742f5e25a17614fb933965093c0eea64aacda4309380e
- languageName: node
- linkType: hard
-
-"@types/eslint@npm:*":
- version: 9.6.1
- resolution: "@types/eslint@npm:9.6.1"
- dependencies:
- "@types/estree": "*"
- "@types/json-schema": "*"
- checksum: c286e79707ab604b577cf8ce51d9bbb9780e3d6a68b38a83febe13fa05b8012c92de17c28532fac2b03d3c460123f5055d603a579685325246ca1c86828223e0
- languageName: node
- linkType: hard
-
"@types/estree-jsx@npm:^1.0.0":
version: 1.0.0
resolution: "@types/estree-jsx@npm:1.0.0"
@@ -3211,7 +3060,7 @@ __metadata:
languageName: node
linkType: hard
-"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6":
+"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5":
version: 1.0.6
resolution: "@types/estree@npm:1.0.6"
checksum: 8825d6e729e16445d9a1dd2fb1db2edc5ed400799064cd4d028150701031af012ba30d6d03fe9df40f4d7a437d0de6d2b256020152b7b09bde9f2e420afdffd9
@@ -3312,10 +3161,10 @@ __metadata:
languageName: node
linkType: hard
-"@types/json-schema@npm:*, @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":
- version: 7.0.15
- resolution: "@types/json-schema@npm:7.0.15"
- checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98
+"@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":
+ version: 7.0.11
+ resolution: "@types/json-schema@npm:7.0.11"
+ checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d
languageName: node
linkType: hard
@@ -3734,6 +3583,15 @@ __metadata:
languageName: node
linkType: hard
+"acorn-import-attributes@npm:^1.9.5":
+ version: 1.9.5
+ resolution: "acorn-import-attributes@npm:1.9.5"
+ peerDependencies:
+ acorn: ^8
+ checksum: 1c0c49b6a244503964ae46ae850baccf306e84caf99bc2010ed6103c69a423987b07b520a6c619f075d215388bd4923eccac995886a54309eda049ab78a4be95
+ languageName: node
+ linkType: hard
+
"acorn-jsx@npm:^5.0.0":
version: 5.3.2
resolution: "acorn-jsx@npm:5.3.2"
@@ -3750,12 +3608,12 @@ __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.7.1, acorn@npm:^8.8.2":
+ version: 8.10.0
+ resolution: "acorn@npm:8.10.0"
bin:
acorn: bin/acorn
- checksum: 8755074ba55fff94e84e81c72f1013c2d9c78e973c31231c8ae505a5f966859baf654bddd75046bffd73ce816b149298977fff5077a3033dedba0ae2aad152d4
+ checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d
languageName: node
linkType: hard
@@ -3896,15 +3754,6 @@ __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: ^0.21.3
- checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815
- languageName: node
- linkType: hard
-
"ansi-html-community@npm:^0.0.8":
version: 0.0.8
resolution: "ansi-html-community@npm:0.0.8"
@@ -3928,7 +3777,16 @@ __metadata:
languageName: node
linkType: hard
-"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0":
+"ansi-styles@npm:^3.2.1":
+ version: 3.2.1
+ resolution: "ansi-styles@npm:3.2.1"
+ dependencies:
+ color-convert: ^1.9.0
+ checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665
+ languageName: node
+ linkType: hard
+
+"ansi-styles@npm:^4.1.0":
version: 4.3.0
resolution: "ansi-styles@npm:4.3.0"
dependencies:
@@ -4049,16 +3907,16 @@ __metadata:
languageName: node
linkType: hard
-"babel-loader@npm:^9.2.1":
- version: 9.2.1
- resolution: "babel-loader@npm:9.2.1"
+"babel-loader@npm:^9.1.3":
+ version: 9.1.3
+ resolution: "babel-loader@npm:9.1.3"
dependencies:
find-cache-dir: ^4.0.0
schema-utils: ^4.0.0
peerDependencies:
"@babel/core": ^7.12.0
webpack: ">=5"
- checksum: e1858d7625ad7cc8cabe6bbb8657f957041ffb1308375f359e92aa1654f413bfbb86a281bbf7cd4f7fff374d571c637b117551deac0231d779a198d4e4e78331
+ checksum: b168dde5b8cf11206513371a79f86bb3faa7c714e6ec9fffd420876b61f3d7f5f4b976431095ef6a14bc4d324505126deb91045fd41e312ba49f4deaa166fe28
languageName: node
linkType: hard
@@ -4071,7 +3929,7 @@ __metadata:
languageName: node
linkType: hard
-"babel-plugin-polyfill-corejs2@npm:^0.4.10":
+"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"
dependencies:
@@ -4096,6 +3954,29 @@ __metadata:
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"
+ dependencies:
+ "@babel/helper-define-polyfill-provider": ^0.4.2
+ core-js-compat: ^3.32.2
+ peerDependencies:
+ "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0
+ checksum: 7243241a5b978b1335d51bcbd1248d6c4df88f6b3726706e71e0392f111c59bbf01118c85bb0ed42dce65e90e8fc768d19eda0a81a321cbe54abd3df9a285dc8
+ 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": ^0.4.2
+ peerDependencies:
+ "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0
+ checksum: 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"
@@ -4111,15 +3992,13 @@ __metadata:
version: 0.0.0-use.local
resolution: "backstage-microsite@workspace:."
dependencies:
- "@docusaurus/core": ^3.6.0
- "@docusaurus/faster": ^3.6.0
- "@docusaurus/module-type-aliases": ^3.6.0
- "@docusaurus/plugin-client-redirects": ^3.6.0
- "@docusaurus/preset-classic": ^3.6.0
- "@docusaurus/tsconfig": ^3.6.0
- "@docusaurus/types": ^3.6.0
+ "@docusaurus/core": ^3.1.1
+ "@docusaurus/module-type-aliases": ^3.1.1
+ "@docusaurus/plugin-client-redirects": ^3.1.1
+ "@docusaurus/preset-classic": ^3.1.1
+ "@docusaurus/tsconfig": ^3.1.1
+ "@docusaurus/types": ^3.1.1
"@mdx-js/react": ^3.0.0
- "@spotify/prettier-config": ^15.0.0
"@swc/core": ^1.3.46
"@types/luxon": ^3.0.0
"@types/webpack-env": ^1.18.0
@@ -4273,17 +4152,17 @@ __metadata:
languageName: node
linkType: hard
-"browserslist@npm:^4.0.0, browserslist@npm:^4.18.1, browserslist@npm:^4.23.0, browserslist@npm:^4.23.3, browserslist@npm:^4.24.0, browserslist@npm:^4.24.2":
- version: 4.24.2
- resolution: "browserslist@npm:4.24.2"
+"browserslist@npm:^4.0.0, browserslist@npm:^4.18.1, browserslist@npm:^4.21.10, browserslist@npm:^4.23.0, browserslist@npm:^4.23.1, browserslist@npm:^4.23.3":
+ version: 4.24.0
+ resolution: "browserslist@npm:4.24.0"
dependencies:
- caniuse-lite: ^1.0.30001669
- electron-to-chromium: ^1.5.41
+ caniuse-lite: ^1.0.30001663
+ electron-to-chromium: ^1.5.28
node-releases: ^2.0.18
- update-browserslist-db: ^1.1.1
+ update-browserslist-db: ^1.1.0
bin:
browserslist: cli.js
- checksum: cf64085f12132d38638f38937a255edb82c7551b164a98577b055dd79719187a816112f7b97b9739e400c4954cd66479c0d7a843cb816e346f4795dc24fd5d97
+ checksum: de200d3eb8d6ed819dad99719099a28fb6ebeb88016a5ac42fbdc11607e910c236a84ca1b0bbf232477d4b88ab64e8ab6aa67557cdd40a73ca9c2834f92ccce0
languageName: node
linkType: hard
@@ -4412,10 +4291,10 @@ __metadata:
languageName: node
linkType: hard
-"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001616, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001669":
- version: 1.0.30001677
- resolution: "caniuse-lite@npm:1.0.30001677"
- checksum: 34099726620baf4f14fbbe88fec38517208cbe9a47009350b59c7cbbbbd45fcf355afe25d5fa277179660eb0f35f103e68806a07bb33d38bbddb7fde0a4302e4
+"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001663":
+ version: 1.0.30001668
+ resolution: "caniuse-lite@npm:1.0.30001668"
+ checksum: ce6996901b5883454a8ddb3040f82342277b6a6275876dfefcdecb11f7e472e29877f34cae47c2b674f08f2e71971dd4a2acb9bc01adfe8421b7148a7e9e8297
languageName: node
linkType: hard
@@ -4426,6 +4305,17 @@ __metadata:
languageName: node
linkType: hard
+"chalk@npm:^2.4.2":
+ version: 2.4.2
+ resolution: "chalk@npm:2.4.2"
+ dependencies:
+ ansi-styles: ^3.2.1
+ escape-string-regexp: ^1.0.5
+ supports-color: ^5.3.0
+ checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2
+ languageName: node
+ linkType: hard
+
"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.2":
version: 4.1.2
resolution: "chalk@npm:4.1.2"
@@ -4617,6 +4507,15 @@ __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: 1.1.3
+ checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203
+ languageName: node
+ linkType: hard
+
"color-convert@npm:^2.0.1":
version: 2.0.1
resolution: "color-convert@npm:2.0.1"
@@ -4626,6 +4525,13 @@ __metadata:
languageName: node
linkType: hard
+"color-name@npm:1.1.3":
+ version: 1.1.3
+ resolution: "color-name@npm:1.1.3"
+ checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d
+ languageName: node
+ linkType: hard
+
"color-name@npm:~1.1.4":
version: 1.1.4
resolution: "color-name@npm:1.1.4"
@@ -4773,10 +4679,10 @@ __metadata:
languageName: node
linkType: hard
-"consola@npm:^3.2.3":
- version: 3.2.3
- resolution: "consola@npm:3.2.3"
- checksum: 32ec70e177dd2385c42e38078958cc7397be91db21af90c6f9faa0b16168b49b1c61d689338604bbb2d64370b9347a35f42a9197663a913d3a405bb0ce728499
+"consola@npm:^2.15.3":
+ version: 2.15.3
+ resolution: "consola@npm:2.15.3"
+ checksum: 8ef7a09b703ec67ac5c389a372a33b6dc97eda6c9876443a60d76a3076eea0259e7f67a4e54fd5a52f97df73690822d090cf8b7e102b5761348afef7c6d03e28
languageName: node
linkType: hard
@@ -4854,12 +4760,12 @@ __metadata:
languageName: node
linkType: hard
-"core-js-compat@npm:^3.38.0, core-js-compat@npm:^3.38.1":
- version: 3.39.0
- resolution: "core-js-compat@npm:3.39.0"
+"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"
dependencies:
- browserslist: ^4.24.2
- checksum: 2d7d087c3271d711d03a55203d4756f6288317a1ce35cdc8bafaf1833ef21fd67a92a50cff8dcf7df1325ac63720906ab3cf514c85b238c95f65fca1040f6ad6
+ browserslist: ^4.23.3
+ checksum: a0a5673bcd59f588f0cd0b59cdacd4712b82909738a87406d334dd412eb3d273ae72b275bdd8e8fef63fca9ef12b42ed651be139c7c44c8a1acb423c8906992e
languageName: node
linkType: hard
@@ -4915,13 +4821,13 @@ __metadata:
linkType: hard
"cross-spawn@npm:^7.0.3":
- version: 7.0.3
- resolution: "cross-spawn@npm:7.0.3"
+ version: 7.0.6
+ resolution: "cross-spawn@npm:7.0.6"
dependencies:
path-key: ^3.1.0
shebang-command: ^2.0.0
which: ^2.0.1
- checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52
+ checksum: 8d306efacaf6f3f60e0224c287664093fa9185680b2d195852ba9a863f85d02dcc737094c6e512175f8ee0161f9b87c73c6826034c2422e39de7d6569cf4503b
languageName: node
linkType: hard
@@ -5146,13 +5052,6 @@ __metadata:
languageName: node
linkType: hard
-"debounce@npm:^1.2.1":
- version: 1.2.1
- resolution: "debounce@npm:1.2.1"
- checksum: 682a89506d9e54fb109526f4da255c5546102fbb8e3ae75eef3b04effaf5d4853756aee97475cd4650641869794e44f410eeb20ace2b18ea592287ab2038519e
- languageName: node
- linkType: hard
-
"debug@npm:2.6.9, debug@npm:^2.6.0":
version: 2.6.9
resolution: "debug@npm:2.6.9"
@@ -5516,10 +5415,10 @@ __metadata:
languageName: node
linkType: hard
-"electron-to-chromium@npm:^1.5.41":
- version: 1.5.50
- resolution: "electron-to-chromium@npm:1.5.50"
- checksum: 971f49d0c3f8484225a2ee86f86074c2ef1a3c46c2bad9b2151202c03f5de2f6f0fc41029d0bc634e6d01d067673cbf4916a7f9753f5ec1d5b177cbaca9b2e5a
+"electron-to-chromium@npm:^1.5.28":
+ version: 1.5.36
+ resolution: "electron-to-chromium@npm:1.5.36"
+ checksum: 1f83daebdf88dd4817565660fa68a827bdca2866032d4902bfd79c6f16d97acbd731b63c09029dd5aa1af4aadbe567834cf3c89b52a37602d375352185d68cf4
languageName: node
linkType: hard
@@ -5651,10 +5550,10 @@ __metadata:
languageName: node
linkType: hard
-"escalade@npm:^3.1.1, escalade@npm:^3.2.0":
- version: 3.2.0
- resolution: "escalade@npm:3.2.0"
- checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e
+"escalade@npm:^3.1.1, escalade@npm:^3.1.2":
+ version: 3.1.2
+ resolution: "escalade@npm:3.1.2"
+ checksum: 1ec0977aa2772075493002bdbd549d595ff6e9393b1cb0d7d6fcaf78c750da0c158f180938365486f75cb69fba20294351caddfce1b46552a7b6c3cde52eaa02
languageName: node
linkType: hard
@@ -5955,6 +5854,15 @@ __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: ^1.3.2
+ checksum: 5043d0c4a8d775ff58504d56c096563c11b113e4cb8a2668c6f824a1cd4fb3812e2fdf76537eb24a7ce4ae7def6bd9747da630c617cf2a4b6ce0c42514e4f21c
+ languageName: node
+ linkType: hard
+
"fastq@npm:^1.6.0":
version: 1.14.0
resolution: "fastq@npm:1.14.0"
@@ -5991,15 +5899,6 @@ __metadata:
languageName: node
linkType: hard
-"figures@npm:^3.2.0":
- version: 3.2.0
- resolution: "figures@npm:3.2.0"
- dependencies:
- escape-string-regexp: ^1.0.5
- checksum: 85a6ad29e9aca80b49b817e7c89ecc4716ff14e3779d9835af554db91bac41c0f289c418923519392a1e582b4d10482ad282021330cd045bb7b80c84152f2a2b
- languageName: node
- linkType: hard
-
"file-loader@npm:^6.2.0":
version: 6.2.0
resolution: "file-loader@npm:6.2.0"
@@ -6082,15 +5981,6 @@ __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: 12a1536ac746db74881316a181499a78ef953632ddd28050b7a3a43c62ef5462e3357c8c29d76072bb635f147f7a9a1f0c02efef6b4be28f8db62ceb3d5c7f5d
- languageName: node
- linkType: hard
-
"follow-redirects@npm:^1.0.0":
version: 1.15.6
resolution: "follow-redirects@npm:1.15.6"
@@ -6481,6 +6371,13 @@ __metadata:
languageName: node
linkType: hard
+"has-flag@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "has-flag@npm:3.0.0"
+ checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b
+ languageName: node
+ linkType: hard
+
"has-flag@npm:^4.0.0":
version: 4.0.0
resolution: "has-flag@npm:4.0.0"
@@ -6724,13 +6621,6 @@ __metadata:
languageName: node
linkType: hard
-"html-escaper@npm:^2.0.2":
- version: 2.0.2
- resolution: "html-escaper@npm:2.0.2"
- checksum: d2df2da3ad40ca9ee3a39c5cc6475ef67c8f83c234475f24d8e9ce0dc80a2c82df8e1d6fa78ddd1e9022a586ea1bd247a615e80a5cd9273d90111ddda7d9e974
- languageName: node
- linkType: hard
-
"html-minifier-terser@npm:^6.0.2":
version: 6.1.0
resolution: "html-minifier-terser@npm:6.1.0"
@@ -6779,9 +6669,9 @@ __metadata:
languageName: node
linkType: hard
-"html-webpack-plugin@npm:^5.6.0":
- version: 5.6.3
- resolution: "html-webpack-plugin@npm:5.6.3"
+"html-webpack-plugin@npm:^5.5.3":
+ version: 5.5.3
+ resolution: "html-webpack-plugin@npm:5.5.3"
dependencies:
"@types/html-minifier-terser": ^6.0.0
html-minifier-terser: ^6.0.2
@@ -6789,14 +6679,8 @@ __metadata:
pretty-error: ^4.0.0
tapable: ^2.0.0
peerDependencies:
- "@rspack/core": 0.x || 1.x
webpack: ^5.20.0
- peerDependenciesMeta:
- "@rspack/core":
- optional: true
- webpack:
- optional: true
- checksum: 59e7d971b0cfd9ba34c7acaa3c161e43c62596474dd8cd35d7b690498ff5891f21296de0aa1d2e7810348caa657e938461267155dda47913b5eeca7124406270
+ checksum: ccf685195739c372ad641bbd0c9100a847904f34eedc7aff3ece7856cd6c78fd3746d2d615af1bb71e5727993fe711b89e9b744f033ed3fde646540bf5d5e954
languageName: node
linkType: hard
@@ -7043,10 +6927,10 @@ __metadata:
languageName: node
linkType: hard
-"infima@npm:0.2.0-alpha.45":
- version: 0.2.0-alpha.45
- resolution: "infima@npm:0.2.0-alpha.45"
- checksum: 23e5a33b147cb3940194c23e249001e7988327bb27896b121883442bce42a532248387649eec74d008dadadcddc790fb6842f043f33c78fda35e29f0b720cf8c
+"infima@npm:0.2.0-alpha.44":
+ version: 0.2.0-alpha.44
+ resolution: "infima@npm:0.2.0-alpha.44"
+ checksum: e9871f4056c0c8b311fcd32e2864d23a8f6807af5ff32d3c4d8271ad9971b5a7ea5016787a6b215893bb3e9f5f14326816bc05151d576dd375b0d79279cdfa8b
languageName: node
linkType: hard
@@ -7327,6 +7211,13 @@ __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: e32d27061eef62c0847d303125440a38660517e586f2f3db7c9d179ae5b6674ab0f469d519b2e25c147a1a3bc87156d0d5f4d8821e0ce4a9ee7fe1fcf11ce45c
+ languageName: node
+ linkType: hard
+
"is-reference@npm:^3.0.0":
version: 3.0.1
resolution: "is-reference@npm:3.0.1"
@@ -7504,12 +7395,21 @@ __metadata:
languageName: node
linkType: hard
-"jsesc@npm:^3.0.2, jsesc@npm:~3.0.2":
- version: 3.0.2
- resolution: "jsesc@npm:3.0.2"
+"jsesc@npm:^2.5.1":
+ version: 2.5.2
+ resolution: "jsesc@npm:2.5.2"
bin:
jsesc: bin/jsesc
- checksum: a36d3ca40574a974d9c2063bf68c2b6141c20da8f2a36bd3279fc802563f35f0527a6c828801295bdfb2803952cf2cf387786c2c90ed564f88d5782475abfe3c
+ checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d
+ languageName: node
+ linkType: hard
+
+"jsesc@npm:~0.5.0":
+ version: 0.5.0
+ resolution: "jsesc@npm:0.5.0"
+ bin:
+ jsesc: bin/jsesc
+ checksum: b8b44cbfc92f198ad972fba706ee6a1dfa7485321ee8c0b25f5cedd538dcb20cde3197de16a7265430fce8277a12db066219369e3d51055038946039f6e20e17
languageName: node
linkType: hard
@@ -7619,116 +7519,6 @@ __metadata:
languageName: node
linkType: hard
-"lightningcss-darwin-arm64@npm:1.28.1":
- version: 1.28.1
- resolution: "lightningcss-darwin-arm64@npm:1.28.1"
- conditions: os=darwin & cpu=arm64
- languageName: node
- linkType: hard
-
-"lightningcss-darwin-x64@npm:1.28.1":
- version: 1.28.1
- resolution: "lightningcss-darwin-x64@npm:1.28.1"
- conditions: os=darwin & cpu=x64
- languageName: node
- linkType: hard
-
-"lightningcss-freebsd-x64@npm:1.28.1":
- version: 1.28.1
- resolution: "lightningcss-freebsd-x64@npm:1.28.1"
- conditions: os=freebsd & cpu=x64
- languageName: node
- linkType: hard
-
-"lightningcss-linux-arm-gnueabihf@npm:1.28.1":
- version: 1.28.1
- resolution: "lightningcss-linux-arm-gnueabihf@npm:1.28.1"
- conditions: os=linux & cpu=arm
- languageName: node
- linkType: hard
-
-"lightningcss-linux-arm64-gnu@npm:1.28.1":
- version: 1.28.1
- resolution: "lightningcss-linux-arm64-gnu@npm:1.28.1"
- conditions: os=linux & cpu=arm64 & libc=glibc
- languageName: node
- linkType: hard
-
-"lightningcss-linux-arm64-musl@npm:1.28.1":
- version: 1.28.1
- resolution: "lightningcss-linux-arm64-musl@npm:1.28.1"
- conditions: os=linux & cpu=arm64 & libc=musl
- languageName: node
- linkType: hard
-
-"lightningcss-linux-x64-gnu@npm:1.28.1":
- version: 1.28.1
- resolution: "lightningcss-linux-x64-gnu@npm:1.28.1"
- conditions: os=linux & cpu=x64 & libc=glibc
- languageName: node
- linkType: hard
-
-"lightningcss-linux-x64-musl@npm:1.28.1":
- version: 1.28.1
- resolution: "lightningcss-linux-x64-musl@npm:1.28.1"
- conditions: os=linux & cpu=x64 & libc=musl
- languageName: node
- linkType: hard
-
-"lightningcss-win32-arm64-msvc@npm:1.28.1":
- version: 1.28.1
- resolution: "lightningcss-win32-arm64-msvc@npm:1.28.1"
- conditions: os=win32 & cpu=arm64
- languageName: node
- linkType: hard
-
-"lightningcss-win32-x64-msvc@npm:1.28.1":
- version: 1.28.1
- resolution: "lightningcss-win32-x64-msvc@npm:1.28.1"
- conditions: os=win32 & cpu=x64
- languageName: node
- linkType: hard
-
-"lightningcss@npm:^1.27.0":
- version: 1.28.1
- resolution: "lightningcss@npm:1.28.1"
- dependencies:
- detect-libc: ^1.0.3
- lightningcss-darwin-arm64: 1.28.1
- lightningcss-darwin-x64: 1.28.1
- lightningcss-freebsd-x64: 1.28.1
- lightningcss-linux-arm-gnueabihf: 1.28.1
- lightningcss-linux-arm64-gnu: 1.28.1
- lightningcss-linux-arm64-musl: 1.28.1
- lightningcss-linux-x64-gnu: 1.28.1
- lightningcss-linux-x64-musl: 1.28.1
- lightningcss-win32-arm64-msvc: 1.28.1
- lightningcss-win32-x64-msvc: 1.28.1
- dependenciesMeta:
- 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: 6ac8302021b2a917c16991310ff8c588c9163cad1c0abe271a44c2b58c05de03fcbde64d49f53dbe449402def02e4a4e11754da23bcb2a99d86bfbc93424333c
- languageName: node
- linkType: hard
-
"lilconfig@npm:^3.1.1":
version: 3.1.2
resolution: "lilconfig@npm:3.1.2"
@@ -7803,6 +7593,27 @@ __metadata:
languageName: node
linkType: hard
+"lodash.escape@npm:^4.0.1":
+ version: 4.0.1
+ resolution: "lodash.escape@npm:4.0.1"
+ checksum: fcb54f457497256964d619d5cccbd80a961916fca60df3fe0fa3e7f052715c2944c0ed5aefb4f9e047d127d44aa2d55555f3350cb42c6549e9e293fb30b41e7f
+ languageName: node
+ linkType: hard
+
+"lodash.flatten@npm:^4.4.0":
+ version: 4.4.0
+ resolution: "lodash.flatten@npm:4.4.0"
+ checksum: 0ac34a393d4b795d4b7421153d27c13ae67e08786c9cbb60ff5b732210d46f833598eee3fb3844bb10070e8488efe390ea53bb567377e0cb47e9e630bf0811cb
+ languageName: node
+ linkType: hard
+
+"lodash.invokemap@npm:^4.6.0":
+ version: 4.6.0
+ resolution: "lodash.invokemap@npm:4.6.0"
+ checksum: 646ceebbefbcb6da301f8c2868254680fd0bcdc6ada470495d9ae49c9c32938829c1b38a38c95d0258409a9655f85db404b16e648381c7450b7ed3d9c52d8808
+ languageName: node
+ linkType: hard
+
"lodash.memoize@npm:^4.1.2":
version: 4.1.2
resolution: "lodash.memoize@npm:4.1.2"
@@ -7810,6 +7621,13 @@ __metadata:
languageName: node
linkType: hard
+"lodash.pullall@npm:^4.2.0":
+ version: 4.2.0
+ resolution: "lodash.pullall@npm:4.2.0"
+ checksum: 7a5fbaedf186ec197ce1e0b9ba1d88a89773ebaf6a8291c7d273838cac59cb3b339cf36ef00e94172862ee84d2304c38face161846f08f5581d0553dcbdcd090
+ languageName: node
+ linkType: hard
+
"lodash.uniq@npm:^4.5.0":
version: 4.5.0
resolution: "lodash.uniq@npm:4.5.0"
@@ -7817,6 +7635,13 @@ __metadata:
languageName: node
linkType: hard
+"lodash.uniqby@npm:^4.7.0":
+ version: 4.7.0
+ resolution: "lodash.uniqby@npm:4.7.0"
+ checksum: 659264545a95726d1493123345aad8cbf56e17810fa9a0b029852c6d42bc80517696af09d99b23bef1845d10d95e01b8b4a1da578f22aeba7a30d3e0022a4938
+ languageName: node
+ linkType: hard
+
"lodash@npm:^4.17.20, lodash@npm:^4.17.21":
version: 4.17.21
resolution: "lodash@npm:4.17.21"
@@ -7921,15 +7746,6 @@ __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: ^1.0.0
- checksum: 9bb634a9300016cbb41216c1eab44c74b6b7083ac07872e296f900a29449cf0e260ece03fa10c3e9784ab94c61664d1d147da0315f95e1336e2bdcc025615c90
- languageName: node
- linkType: hard
-
"markdown-table@npm:^3.0.0":
version: 3.0.3
resolution: "markdown-table@npm:3.0.3"
@@ -8818,15 +8634,14 @@ __metadata:
languageName: node
linkType: hard
-"mini-css-extract-plugin@npm:^2.9.1":
- version: 2.9.2
- resolution: "mini-css-extract-plugin@npm:2.9.2"
+"mini-css-extract-plugin@npm:^2.7.6":
+ version: 2.7.6
+ resolution: "mini-css-extract-plugin@npm:2.7.6"
dependencies:
schema-utils: ^4.0.0
- tapable: ^2.2.1
peerDependencies:
webpack: ^5.0.0
- checksum: 67a1f75359371a7776108999d472ae0942ccd904401e364e3a2c710d4b6fec61c4f53288594fcac35891f009e6df8825a00dfd3bfe4bcec0f862081d1f7cad50
+ checksum: be6f7cefc6275168eb0a6b8fe977083a18c743c9612c9f00e6c1a62c3393ca7960e93fba1a7ebb09b75f36a0204ad087d772c1ef574bc29c90c0e8175a3c0b83
languageName: node
linkType: hard
@@ -9145,18 +8960,6 @@ __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: ^2.0.0
- schema-utils: ^3.0.0
- peerDependencies:
- webpack: ^4.0.0 || ^5.0.0
- checksum: eeb4c4dd2f8f41e46f5665e4500359109e95ec1028a178a60e0161984906572da7dd87644bcc3cb29f0125d77e2b2508fb4f3813cfb1c6604a15865beb4b987b
- languageName: node
- linkType: hard
-
"object-assign@npm:^4.1.1":
version: 4.1.1
resolution: "object-assign@npm:4.1.1"
@@ -9496,10 +9299,10 @@ __metadata:
languageName: node
linkType: hard
-"path-to-regexp@npm:3.3.0":
- version: 3.3.0
- resolution: "path-to-regexp@npm:3.3.0"
- checksum: bb249d08804f7961dd44fb175466c900b893c56e909db8e2a66ec12b9d9a964af269eb7a50892c933f52b47315953dfdb4279639fbce20977c3625a9ef3055fe
+"path-to-regexp@npm:2.2.1":
+ version: 2.2.1
+ resolution: "path-to-regexp@npm:2.2.1"
+ checksum: b921a74e7576e25b06ad1635abf7e8125a29220d2efc2b71d74b9591f24a27e6f09078fa9a1b27516a097ea0637b7cab79d19b83d7f36a8ef3ef5422770e89d9
languageName: node
linkType: hard
@@ -9530,10 +9333,10 @@ __metadata:
languageName: node
linkType: hard
-"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0":
- version: 1.1.1
- resolution: "picocolors@npm:1.1.1"
- checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045
+"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "picocolors@npm:1.0.1"
+ checksum: fa68166d1f56009fc02a34cdfd112b0dd3cf1ef57667ac57281f714065558c01828cdf4f18600ad6851cbe0093952ed0660b1e0156bddf2184b6aaf5817553a5
languageName: node
linkType: hard
@@ -10120,6 +9923,13 @@ __metadata:
languageName: node
linkType: hard
+"punycode@npm:^1.3.2":
+ version: 1.4.1
+ resolution: "punycode@npm:1.4.1"
+ checksum: fa6e698cb53db45e4628559e557ddaf554103d2a96a1d62892c8f4032cd3bc8871796cae9eabc1bc700e2b6677611521ce5bb1d9a27700086039965d0cf34518
+ languageName: node
+ linkType: hard
+
"punycode@npm:^2.1.0":
version: 2.1.1
resolution: "punycode@npm:2.1.1"
@@ -10454,12 +10264,12 @@ __metadata:
languageName: node
linkType: hard
-"regenerate-unicode-properties@npm:^10.2.0":
- version: 10.2.0
- resolution: "regenerate-unicode-properties@npm:10.2.0"
+"regenerate-unicode-properties@npm:^10.1.0":
+ version: 10.1.0
+ resolution: "regenerate-unicode-properties@npm:10.1.0"
dependencies:
regenerate: ^1.4.2
- checksum: d5c5fc13f8b8d7e16e791637a4bfef741f8d70e267d51845ee7d5404a32fa14c75b181c4efba33e4bff8b0000a2f13e9773593713dfe5b66597df4259275ce63
+ checksum: b1a8929588433ab8b9dc1a34cf3665b3b472f79f2af6ceae00d905fc496b332b9af09c6718fb28c730918f19a00dc1d7310adbaa9b72a2ec7ad2f435da8ace17
languageName: node
linkType: hard
@@ -10486,17 +10296,17 @@ __metadata:
languageName: node
linkType: hard
-"regexpu-core@npm:^6.1.1":
- version: 6.1.1
- resolution: "regexpu-core@npm:6.1.1"
+"regexpu-core@npm:^5.3.1":
+ version: 5.3.2
+ resolution: "regexpu-core@npm:5.3.2"
dependencies:
+ "@babel/regjsgen": ^0.8.0
regenerate: ^1.4.2
- regenerate-unicode-properties: ^10.2.0
- regjsgen: ^0.8.0
- regjsparser: ^0.11.0
+ regenerate-unicode-properties: ^10.1.0
+ regjsparser: ^0.9.1
unicode-match-property-ecmascript: ^2.0.0
unicode-match-property-value-ecmascript: ^2.1.0
- checksum: ed8e3784e81b816b237313688f28b4695d30d4e0f823dfdf130fd4313c629ac6ec67650563867a6ca9a2435f33e79f3a5001c651aee52791e346213a948de0ff
+ checksum: 95bb97088419f5396e07769b7de96f995f58137ad75fac5811fb5fe53737766dfff35d66a0ee66babb1eb55386ef981feaef392f9df6d671f3c124812ba24da2
languageName: node
linkType: hard
@@ -10518,21 +10328,14 @@ __metadata:
languageName: node
linkType: hard
-"regjsgen@npm:^0.8.0":
- version: 0.8.0
- resolution: "regjsgen@npm:0.8.0"
- checksum: a1d925ff14a4b2be774e45775ee6b33b256f89c42d480e6d85152d2133f18bd3d6af662161b226fa57466f7efec367eaf7ccd2a58c0ec2a1306667ba2ad07b0d
- languageName: node
- linkType: hard
-
-"regjsparser@npm:^0.11.0":
- version: 0.11.2
- resolution: "regjsparser@npm:0.11.2"
+"regjsparser@npm:^0.9.1":
+ version: 0.9.1
+ resolution: "regjsparser@npm:0.9.1"
dependencies:
- jsesc: ~3.0.2
+ jsesc: ~0.5.0
bin:
regjsparser: bin/parser
- checksum: 500ab99d6174aef18b43518f4b1f217192459621b0505ad6e8cbbec8135a83e64491077843b4ad06249a207ffecd6566f3db1895a7c5df98f786b4b0edcc9820
+ checksum: 5e1b76afe8f1d03c3beaf9e0d935dd467589c3625f6d65fb8ffa14f224d783a0fed4bf49c2c1b8211043ef92b6117313419edf055a098ed8342e340586741afc
languageName: node
linkType: hard
@@ -10664,13 +10467,6 @@ __metadata:
languageName: node
linkType: hard
-"repeat-string@npm:^1.0.0":
- version: 1.6.1
- resolution: "repeat-string@npm:1.6.1"
- checksum: 1b809fc6db97decdc68f5b12c4d1a671c8e3f65ec4a40c238bc5200e44e85bcc52a54f78268ab9c29fcf5fe4f1343e805420056d1f30fa9a9ee4c2d93e3cc6c0
- languageName: node
- linkType: hard
-
"require-from-string@npm:^2.0.2":
version: 2.0.2
resolution: "require-from-string@npm:2.0.2"
@@ -11008,18 +10804,19 @@ __metadata:
languageName: node
linkType: hard
-"serve-handler@npm:^6.1.6":
- version: 6.1.6
- resolution: "serve-handler@npm:6.1.6"
+"serve-handler@npm:^6.1.5":
+ version: 6.1.5
+ resolution: "serve-handler@npm:6.1.5"
dependencies:
bytes: 3.0.0
content-disposition: 0.5.2
+ fast-url-parser: 1.1.3
mime-types: 2.1.18
minimatch: 3.1.2
path-is-inside: 1.0.2
- path-to-regexp: 3.3.0
+ path-to-regexp: 2.2.1
range-parser: 1.2.0
- checksum: eb26201e699ac4694fb16f9aaf932330f6b1159e9d9496261baa23caf1e81322afcfd2b5f5f2b306b133298c03a8395a3c13b56fde5d70b331014b3a5ab7217f
+ checksum: 7a98ca9cbf8692583b6cde4deb3941cff900fa38bf16adbfccccd8430209bab781e21d9a1f61c9c03e226f9f67689893bbce25941368f3ddaf985fc3858b49dc
languageName: node
linkType: hard
@@ -11369,10 +11166,10 @@ __metadata:
languageName: node
linkType: hard
-"std-env@npm:^3.7.0":
- version: 3.7.0
- resolution: "std-env@npm:3.7.0"
- checksum: 4f489d13ff2ab838c9acd4ed6b786b51aa52ecacdfeaefe9275fcb220ff2ac80c6e95674723508fd29850a694569563a8caaaea738eb82ca16429b3a0b50e510
+"std-env@npm:^3.0.1":
+ version: 3.3.1
+ resolution: "std-env@npm:3.3.1"
+ checksum: c4f59ecd2cb52041ce1785776d28a1aa56d346b6c4efcb8473e7e801eed1ac7612332dcee242d0b35948f35f745cceb6e226b5e825b59e588b262dca6be2b8aa
languageName: node
linkType: hard
@@ -11437,7 +11234,7 @@ __metadata:
languageName: node
linkType: hard
-"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1":
+"strip-ansi@npm:^6.0.1":
version: 6.0.1
resolution: "strip-ansi@npm:6.0.1"
dependencies:
@@ -11513,6 +11310,15 @@ __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: ^3.0.0
+ checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac
+ languageName: node
+ linkType: hard
+
"supports-color@npm:^7.1.0":
version: 7.2.0
resolution: "supports-color@npm:7.2.0"
@@ -11562,7 +11368,7 @@ __metadata:
languageName: node
linkType: hard
-"swc-loader@npm:^0.2.3, swc-loader@npm:^0.2.6":
+"swc-loader@npm:^0.2.3":
version: 0.2.6
resolution: "swc-loader@npm:0.2.6"
dependencies:
@@ -11581,7 +11387,7 @@ __metadata:
languageName: node
linkType: hard
-"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1":
+"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: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51
@@ -11666,6 +11472,13 @@ __metadata:
languageName: node
linkType: hard
+"to-fast-properties@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "to-fast-properties@npm:2.0.0"
+ checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168
+ languageName: node
+ linkType: hard
+
"to-regex-range@npm:^5.0.1":
version: 5.0.1
resolution: "to-regex-range@npm:5.0.1"
@@ -11710,13 +11523,6 @@ __metadata:
languageName: node
linkType: hard
-"type-fest@npm:^0.21.3":
- version: 0.21.3
- resolution: "type-fest@npm:0.21.3"
- checksum: e6b32a3b3877f04339bae01c193b273c62ba7bfc9e325b8703c4ee1b32dc8fe4ef5dfa54bf78265e069f7667d058e360ae0f37be5af9f153b22382cd55a9afe0
- languageName: node
- linkType: hard
-
"type-fest@npm:^1.0.1":
version: 1.4.0
resolution: "type-fest@npm:1.4.0"
@@ -11931,17 +11737,17 @@ __metadata:
languageName: node
linkType: hard
-"update-browserslist-db@npm:^1.1.1":
- version: 1.1.1
- resolution: "update-browserslist-db@npm:1.1.1"
+"update-browserslist-db@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "update-browserslist-db@npm:1.1.0"
dependencies:
- escalade: ^3.2.0
- picocolors: ^1.1.0
+ escalade: ^3.1.2
+ picocolors: ^1.0.1
peerDependencies:
browserslist: ">= 4.21.0"
bin:
update-browserslist-db: cli.js
- checksum: 2ea11bd2562122162c3e438d83a1f9125238c0844b6d16d366e3276d0c0acac6036822dc7df65fc5a89c699cdf9f174acf439c39bedf3f9a2f3983976e4b4c3e
+ checksum: 7b74694d96f0c360f01b702e72353dc5a49df4fe6663d3ee4e5c628f061576cddf56af35a3a886238c01dd3d8f231b7a86a8ceaa31e7a9220ae31c1c1238e562
languageName: node
linkType: hard
@@ -12101,29 +11907,34 @@ __metadata:
languageName: node
linkType: hard
-"webpack-bundle-analyzer@npm:^4.10.2":
- version: 4.10.2
- resolution: "webpack-bundle-analyzer@npm:4.10.2"
+"webpack-bundle-analyzer@npm:^4.9.0":
+ version: 4.9.1
+ resolution: "webpack-bundle-analyzer@npm:4.9.1"
dependencies:
"@discoveryjs/json-ext": 0.5.7
acorn: ^8.0.4
acorn-walk: ^8.0.0
commander: ^7.2.0
- debounce: ^1.2.1
escape-string-regexp: ^4.0.0
gzip-size: ^6.0.0
- html-escaper: ^2.0.2
+ is-plain-object: ^5.0.0
+ lodash.debounce: ^4.0.8
+ lodash.escape: ^4.0.1
+ lodash.flatten: ^4.4.0
+ lodash.invokemap: ^4.6.0
+ lodash.pullall: ^4.2.0
+ lodash.uniqby: ^4.7.0
opener: ^1.5.2
picocolors: ^1.0.0
sirv: ^2.0.3
ws: ^7.3.1
bin:
webpack-bundle-analyzer: lib/bin/analyzer.js
- checksum: 4f0275e7d87bb6203a618ca5d2d4953943979d986fa2b91be1bf1ad0bcd22bec13398803273d11699f9fbcf106896311208a72d63fe5f8a47b687a226e598dc1
+ checksum: 7e891c28d5a903242893e55ecc714fa01d7ad6bedade143235c07091b235915349812fa048968462781d59187507962f38b6c61ed7d25fb836ba0ac0ee919a39
languageName: node
linkType: hard
-"webpack-dev-middleware@npm:^5.3.4":
+"webpack-dev-middleware@npm:^5.3.1":
version: 5.3.4
resolution: "webpack-dev-middleware@npm:5.3.4"
dependencies:
@@ -12138,9 +11949,9 @@ __metadata:
languageName: node
linkType: hard
-"webpack-dev-server@npm:^4.15.2":
- version: 4.15.2
- resolution: "webpack-dev-server@npm:4.15.2"
+"webpack-dev-server@npm:^4.15.1":
+ version: 4.15.1
+ resolution: "webpack-dev-server@npm:4.15.1"
dependencies:
"@types/bonjour": ^3.5.9
"@types/connect-history-api-fallback": ^1.3.5
@@ -12170,7 +11981,7 @@ __metadata:
serve-index: ^1.9.1
sockjs: ^0.3.24
spdy: ^4.0.2
- webpack-dev-middleware: ^5.3.4
+ webpack-dev-middleware: ^5.3.1
ws: ^8.13.0
peerDependencies:
webpack: ^4.37.0 || ^5.0.0
@@ -12181,7 +11992,7 @@ __metadata:
optional: true
bin:
webpack-dev-server: bin/webpack-dev-server.js
- checksum: 123507129cb4d55fdc5fabdd177574f31133605748372bb11353307b7a583ef25c6fd27b6addf56bf070ba44c88d5da861771c2ec55f52405082ec9efd01f039
+ checksum: cd0063b068d2b938fd76c412d555374186ac2fa84bbae098265212ed50a5c15d6f03aa12a5a310c544a242943eb58c0bfde4c296d5c36765c182f53799e1bc71
languageName: node
linkType: hard
@@ -12195,17 +12006,6 @@ __metadata:
languageName: node
linkType: hard
-"webpack-merge@npm:^6.0.1":
- version: 6.0.1
- resolution: "webpack-merge@npm:6.0.1"
- dependencies:
- clone-deep: ^4.0.1
- flat: ^5.0.2
- wildcard: ^2.0.1
- checksum: e8a604c686b944605a1c57cc7b75e886ab902dc5ffdd15259a092c5c2dd5f58868fe39f995ea4bad4f189e38843b061c4ae1eb22822d7169813f4adab571dc3d
- languageName: node
- linkType: hard
-
"webpack-sources@npm:^3.2.3":
version: 3.2.3
resolution: "webpack-sources@npm:3.2.3"
@@ -12213,17 +12013,17 @@ __metadata:
languageName: node
linkType: hard
-"webpack@npm:^5.88.1, webpack@npm:^5.95.0":
- version: 5.96.1
- resolution: "webpack@npm:5.96.1"
+"webpack@npm:^5.88.1":
+ version: 5.95.0
+ resolution: "webpack@npm:5.95.0"
dependencies:
- "@types/eslint-scope": ^3.7.7
- "@types/estree": ^1.0.6
+ "@types/estree": ^1.0.5
"@webassemblyjs/ast": ^1.12.1
"@webassemblyjs/wasm-edit": ^1.12.1
"@webassemblyjs/wasm-parser": ^1.12.1
- acorn: ^8.14.0
- browserslist: ^4.24.0
+ acorn: ^8.7.1
+ acorn-import-attributes: ^1.9.5
+ browserslist: ^4.21.10
chrome-trace-event: ^1.0.2
enhanced-resolve: ^5.17.1
es-module-lexer: ^1.2.1
@@ -12245,25 +12045,21 @@ __metadata:
optional: true
bin:
webpack: bin/webpack.js
- checksum: ec3662f64895fae408440a997f87299e374c9d9f911f77b880bab46402f52221c7836bdf101fc2556338d07fc7cb86da50661f944eb1d1041a8361a5b9247876
+ checksum: 0c3dfe288de4d62f8f3dc25478a618894883cab739121330763b7847e43304630ea2815ae2351a5f8ff6ab7c9642caf530d503d89bda261fe2cd220e524dd5d1
languageName: node
linkType: hard
-"webpackbar@npm:^6.0.1":
- version: 6.0.1
- resolution: "webpackbar@npm:6.0.1"
+"webpackbar@npm:^5.0.2":
+ version: 5.0.2
+ resolution: "webpackbar@npm:5.0.2"
dependencies:
- ansi-escapes: ^4.3.2
- chalk: ^4.1.2
- consola: ^3.2.3
- figures: ^3.2.0
- markdown-table: ^2.0.0
+ chalk: ^4.1.0
+ consola: ^2.15.3
pretty-time: ^1.1.0
- std-env: ^3.7.0
- wrap-ansi: ^7.0.0
+ std-env: ^3.0.1
peerDependencies:
webpack: 3 || 4 || 5
- checksum: e9ba314452486230668ab34aea7c3494866dbe29e327e9201551a839000ee7e878d8a47b8977acb76ec9443b4257dfcdb05bae9bbc27ffb21793d2bed7907687
+ checksum: 214a734b1d4d391eb8271ed1b11085f0efe6831e93f641229b292abfd6fea871422dce121612511c17ae8047522be6d65c1a2666cabb396c79549816a3612338
languageName: node
linkType: hard
@@ -12325,21 +12121,10 @@ __metadata:
languageName: node
linkType: hard
-"wildcard@npm:^2.0.0, wildcard@npm:^2.0.1":
- version: 2.0.1
- resolution: "wildcard@npm:2.0.1"
- checksum: e0c60a12a219e4b12065d1199802d81c27b841ed6ad6d9d28240980c73ceec6f856771d575af367cbec2982d9ae7838759168b551776577f155044f5a5ba843c
- languageName: node
- linkType: hard
-
-"wrap-ansi@npm:^7.0.0":
- version: 7.0.0
- resolution: "wrap-ansi@npm:7.0.0"
- dependencies:
- ansi-styles: ^4.0.0
- string-width: ^4.1.0
- strip-ansi: ^6.0.0
- checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b
+"wildcard@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "wildcard@npm:2.0.0"
+ checksum: 1f4fe4c03dfc492777c60f795bbba597ac78794f1b650d68f398fbee9adb765367c516ebd4220889b6a81e9626e7228bbe0d66237abb311573c2ee1f4902a5ad
languageName: node
linkType: hard
diff --git a/mkdocs.yml b/mkdocs.yml
index 76467e9476..748cdd8232 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -30,12 +30,16 @@ nav:
- Configuring App with plugins: 'getting-started/configure-app-with-plugins.md'
- Customize the look-and-feel of your App: 'getting-started/app-custom-theme.md'
- Customizing your Homepage: 'getting-started/homepage.md'
+ - Deployment:
+ - Deploying Backstage: 'deployment/index.md'
+ - Scaling: 'deployment/scaling.md'
+ - Docker: 'deployment/docker.md'
+ - Kubernetes: 'deployment/k8s.md'
- Using Backstage:
- Logging in: 'getting-started/logging-in.md'
- Register a component: 'getting-started/register-a-component.md'
- Create a component: 'getting-started/create-a-component.md'
- Keeping Backstage Updated: 'getting-started/keeping-backstage-updated.md'
- - Key Concepts: 'getting-started/concepts.md'
- Core Features:
- Software Catalog:
- Overview: 'features/software-catalog/index.md'
@@ -189,13 +193,6 @@ nav:
- Debugging Backstage: 'tooling/local-dev/debugging.md'
- Profiling Backstage: 'tooling/local-dev/profiling.md'
- Package Metadata: 'tooling/package-metadata.md'
- - Deployment:
- - Deploying Backstage: 'deployment/index.md'
- - Scaling: 'deployment/scaling.md'
- - Docker: 'deployment/docker.md'
- - Kubernetes: 'deployment/k8s.md'
- - Heroku: 'deployment/heroku.md'
- - Koyeb: 'deployment/koyeb.md'
- Designing for Backstage:
- Design: 'dls/design.md'
- Component Design Guidelines: 'dls/component-design-guidelines.md'
@@ -230,6 +227,7 @@ nav:
- ADR011 - Plugin Package Structure: 'architecture-decisions/adr011-plugin-package-structure.md'
- ADR012 - Use Luxon Locale: 'architecture-decisions/adr012-use-luxon-locale-and-date-presets.md'
- ADR013 - Use node-fetch: 'architecture-decisions/adr013-use-node-fetch.md'
+ - ADR014 - Use fetch: 'architecture-decisions/adr014-use-fetch.md'
- FAQ:
- Overview: 'faq/index.md'
- Product FAQ: 'faq/product.md'
diff --git a/package.json b/package.json
index 0e63c3c09f..82038342d0 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "root",
- "version": "1.33.0-next.3",
+ "version": "1.34.0-next.1",
"private": true,
"repository": {
"type": "git",
@@ -49,9 +49,9 @@
"storybook": "yarn ./storybook run storybook",
"techdocs-cli": "node scripts/techdocs-cli.js",
"techdocs-cli:dev": "cross-env TECHDOCS_CLI_DEV_MODE=true node scripts/techdocs-cli.js",
- "test": "backstage-cli repo test",
- "test:all": "backstage-cli repo test --coverage",
- "test:e2e": "playwright test",
+ "test": "NODE_OPTIONS=--no-node-snapshot backstage-cli repo test",
+ "test:all": "NODE_OPTIONS=--no-node-snapshot backstage-cli repo test --coverage",
+ "test:e2e": "NODE_OPTIONS=--no-node-snapshot playwright test",
"tsc": "tsc",
"tsc:full": "backstage-cli repo clean && tsc --skipLibCheck false --incremental false"
},
@@ -83,7 +83,7 @@
"node ./scripts/verify-lockfile-duplicates --fix"
]
},
- "prettier": "@spotify/prettier-config",
+ "prettier": "@backstage/cli/config/prettier",
"resolutions": {
"@changesets/assemble-release-plan@^6.0.0": "patch:@changesets/assemble-release-plan@npm%3A6.0.0#./.yarn/patches/@changesets-assemble-release-plan-npm-6.0.0-f7b3005037.patch",
"@material-ui/pickers@^3.2.10": "patch:@material-ui/pickers@npm%3A3.3.11#./.yarn/patches/@material-ui-pickers-npm-3.3.11-1c8f68ea20.patch",
@@ -108,8 +108,9 @@
"@octokit/rest": "^19.0.3",
"@playwright/test": "^1.32.3",
"@spotify/eslint-plugin": "^15.0.0",
- "@spotify/prettier-config": "^15.0.0",
"@techdocs/cli": "workspace:*",
+ "@types/cacheable-request": "^8.3.6",
+ "@types/memjs": "^1.3.3",
"@types/node": "^20.16.0",
"@types/webpack": "^5.28.0",
"array-to-table": "^1.0.1",
diff --git a/packages/app-defaults/CHANGELOG.md b/packages/app-defaults/CHANGELOG.md
index 3b95e8aefd..fae2ed578e 100644
--- a/packages/app-defaults/CHANGELOG.md
+++ b/packages/app-defaults/CHANGELOG.md
@@ -1,5 +1,38 @@
# @backstage/app-defaults
+## 1.5.15-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/plugin-permission-react@0.4.28
+
+## 1.5.15-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/plugin-permission-react@0.4.28
+
+## 1.5.13
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/theme@0.6.1
+ - @backstage/core-components@0.16.0
+ - @backstage/core-app-api@1.15.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/plugin-permission-react@0.4.28
+
## 1.5.13-next.2
### Patch Changes
diff --git a/packages/app-defaults/package.json b/packages/app-defaults/package.json
index fbf6eabeae..32e11099bb 100644
--- a/packages/app-defaults/package.json
+++ b/packages/app-defaults/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/app-defaults",
- "version": "1.5.13-next.2",
+ "version": "1.5.15-next.1",
"description": "Provides the default wiring of a Backstage App",
"backstage": {
"role": "web-library"
diff --git a/packages/app-next-example-plugin/CHANGELOG.md b/packages/app-next-example-plugin/CHANGELOG.md
index f00bc15813..c3ff62c4c9 100644
--- a/packages/app-next-example-plugin/CHANGELOG.md
+++ b/packages/app-next-example-plugin/CHANGELOG.md
@@ -1,5 +1,29 @@
# app-next-example-plugin
+## 0.0.18-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+
+## 0.0.18-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/core-components@0.16.2-next.0
+
+## 0.0.17
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.0
+ - @backstage/frontend-plugin-api@0.9.1
+
## 0.0.17-next.2
### Patch Changes
diff --git a/packages/app-next-example-plugin/package.json b/packages/app-next-example-plugin/package.json
index 07d3c80ff2..a70e35d2d2 100644
--- a/packages/app-next-example-plugin/package.json
+++ b/packages/app-next-example-plugin/package.json
@@ -1,6 +1,6 @@
{
"name": "app-next-example-plugin",
- "version": "0.0.17-next.2",
+ "version": "0.0.18-next.1",
"description": "Backstage internal example plugin",
"backstage": {
"role": "frontend-plugin",
diff --git a/packages/app-next/CHANGELOG.md b/packages/app-next/CHANGELOG.md
index 1a05132568..6c9e385cdc 100644
--- a/packages/app-next/CHANGELOG.md
+++ b/packages/app-next/CHANGELOG.md
@@ -1,5 +1,140 @@
# example-app-next
+## 0.0.18-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-compat-api@0.3.4-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-app-api@0.10.3-next.1
+ - @backstage/frontend-defaults@0.1.4-next.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/plugin-app@0.1.4-next.1
+ - @backstage/plugin-app-visualizer@0.1.14-next.1
+ - @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-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.0.18-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/cli@0.29.3-next.0
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/plugin-app@0.1.4-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/frontend-plugin-api@0.9.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-compat-api@0.3.4-next.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/frontend-defaults@0.1.4-next.0
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/plugin-app-visualizer@0.1.14-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-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.0.17
+
+### 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/plugin-app-visualizer@0.1.12
+ - @backstage/core-app-api@1.15.2
+ - @backstage/frontend-defaults@0.1.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-compat-api@0.3.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-app-api@0.10.1
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/integration-react@1.2.1
+ - @backstage/plugin-app@0.1.2
+ - @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-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.0.17-next.3
### Patch Changes
diff --git a/packages/app-next/package.json b/packages/app-next/package.json
index 75fc296ede..98b633f13f 100644
--- a/packages/app-next/package.json
+++ b/packages/app-next/package.json
@@ -1,6 +1,6 @@
{
"name": "example-app-next",
- "version": "0.0.17-next.3",
+ "version": "0.0.18-next.1",
"backstage": {
"role": "frontend"
},
diff --git a/packages/app/CHANGELOG.md b/packages/app/CHANGELOG.md
index 0abd04bf1a..ae9fb7b63b 100644
--- a/packages/app/CHANGELOG.md
+++ b/packages/app/CHANGELOG.md
@@ -1,5 +1,128 @@
# example-app
+## 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
diff --git a/packages/app/package.json b/packages/app/package.json
index a0607e9bb8..b73a936a84 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -1,6 +1,6 @@
{
"name": "example-app",
- "version": "0.2.103-next.3",
+ "version": "0.2.104-next.1",
"backstage": {
"role": "frontend"
},
diff --git a/packages/app/src/apis.ts b/packages/app/src/apis.ts
index 0c2ccbad22..e39122337f 100644
--- a/packages/app/src/apis.ts
+++ b/packages/app/src/apis.ts
@@ -26,6 +26,9 @@ import {
discoveryApiRef,
} from '@backstage/core-plugin-api';
import { AuthProxyDiscoveryApi } from './AuthProxyDiscoveryApi';
+import { formDecoratorsApiRef } from '@backstage/plugin-scaffolder/alpha';
+import { DefaultScaffolderFormDecoratorsApi } from '@backstage/plugin-scaffolder/alpha';
+import { mockDecorator } from './components/scaffolder/decorators';
export const apis: AnyApiFactory[] = [
createApiFactory({
@@ -39,5 +42,14 @@ export const apis: AnyApiFactory[] = [
factory: ({ configApi }) => ScmIntegrationsApi.fromConfig(configApi),
}),
+ createApiFactory({
+ api: formDecoratorsApiRef,
+ deps: {},
+ factory: () =>
+ DefaultScaffolderFormDecoratorsApi.create({
+ decorators: [mockDecorator],
+ }),
+ }),
+
ScmAuth.createDefaultApiFactory(),
];
diff --git a/packages/app/src/components/scaffolder/decorators.ts b/packages/app/src/components/scaffolder/decorators.ts
new file mode 100644
index 0000000000..ffb78562f8
--- /dev/null
+++ b/packages/app/src/components/scaffolder/decorators.ts
@@ -0,0 +1,36 @@
+/*
+ * 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 { githubAuthApiRef } from '@backstage/core-plugin-api';
+import { createScaffolderFormDecorator } from '@backstage/plugin-scaffolder-react/alpha';
+
+export const mockDecorator = createScaffolderFormDecorator({
+ id: 'mock-decorator',
+ schema: {
+ input: {
+ test: z => z.string(),
+ },
+ },
+ deps: {
+ githubApi: githubAuthApiRef,
+ },
+ decorator: async (
+ { setSecrets, setFormState, input: { test } },
+ { githubApi: _githubApi },
+ ) => {
+ setFormState(state => ({ ...state, test, mock: 'MOCK' }));
+ setSecrets(state => ({ ...state, GITHUB_TOKEN: 'MOCK_TOKEN' }));
+ },
+});
diff --git a/packages/app/src/components/search/SearchPage.tsx b/packages/app/src/components/search/SearchPage.tsx
index fe96e506eb..5a520e9211 100644
--- a/packages/app/src/components/search/SearchPage.tsx
+++ b/packages/app/src/components/search/SearchPage.tsx
@@ -117,7 +117,7 @@ const SearchPage = () => {
name="kind"
values={['Component', 'Template']}
/>
- {
await init.start();
});
+
+ it('should properly add plugins + modules to the instance metadata service', async () => {
+ expect.assertions(1);
+ const backend = new BackendInitializer(baseFactories);
+ const plugin = createBackendPlugin({
+ pluginId: 'test',
+ register(reg) {
+ reg.registerInit({
+ deps: {},
+ async init() {},
+ });
+ },
+ });
+ const instanceMetadataPlugin = createBackendPlugin({
+ pluginId: 'instance-metadata',
+ register(reg) {
+ reg.registerInit({
+ deps: {
+ instanceMetadata: instanceMetadataServiceRef,
+ },
+ async init({ instanceMetadata }) {
+ expect(instanceMetadata.getInstalledFeatures()).toEqual([
+ {
+ pluginId: 'test',
+ type: 'plugin',
+ },
+ {
+ pluginId: 'test',
+ moduleId: 'test',
+ type: 'module',
+ },
+ {
+ pluginId: 'instance-metadata',
+ type: 'plugin',
+ },
+ ]);
+ },
+ });
+ },
+ });
+ const module = createBackendModule({
+ pluginId: 'test',
+ moduleId: 'test',
+ register(reg) {
+ reg.registerInit({
+ deps: {},
+ async init() {},
+ });
+ },
+ });
+ backend.add(plugin);
+ backend.add(module);
+ backend.add(instanceMetadataPlugin);
+ await backend.start();
+ });
});
diff --git a/packages/backend-app-api/src/wiring/BackendInitializer.ts b/packages/backend-app-api/src/wiring/BackendInitializer.ts
index 3ea1200898..3e7b46fc9e 100644
--- a/packages/backend-app-api/src/wiring/BackendInitializer.ts
+++ b/packages/backend-app-api/src/wiring/BackendInitializer.ts
@@ -22,6 +22,7 @@ import {
ServiceFactory,
LifecycleService,
RootLifecycleService,
+ createServiceFactory,
} from '@backstage/backend-plugin-api';
import { ServiceOrExtensionPoint } from './types';
// Direct internal import to avoid duplication
@@ -34,7 +35,11 @@ import type {
// eslint-disable-next-line @backstage/no-relative-monorepo-imports
import type { InternalServiceFactory } from '../../../backend-plugin-api/src/services/system/types';
import { ForwardedError, ConflictError } from '@backstage/errors';
-import { featureDiscoveryServiceRef } from '@backstage/backend-plugin-api/alpha';
+import {
+ instanceMetadataServiceRef,
+ featureDiscoveryServiceRef,
+ BackendFeatureMeta,
+} from '@backstage/backend-plugin-api/alpha';
import { DependencyGraph } from '../lib/DependencyGraph';
import { ServiceRegistry } from './ServiceRegistry';
import { createInitializationLogger } from './createInitializationLogger';
@@ -96,6 +101,39 @@ const instanceRegistry = new (class InstanceRegistry {
};
})();
+function createInstanceMetadataServiceFactory(
+ registrations: InternalBackendRegistrations[],
+) {
+ const installedFeatures = registrations
+ .map(registration => {
+ if (registration.featureType === 'registrations') {
+ return registration
+ .getRegistrations()
+ .map(feature => {
+ if (feature.type === 'plugin') {
+ return { type: 'plugin', pluginId: feature.pluginId };
+ } else if (feature.type === 'module') {
+ return {
+ type: 'module',
+ pluginId: feature.pluginId,
+ moduleId: feature.moduleId,
+ };
+ }
+ // Ignore unknown feature types.
+ return undefined;
+ })
+ .filter(Boolean) as BackendFeatureMeta[];
+ }
+ return [];
+ })
+ .flat();
+ return createServiceFactory({
+ service: instanceMetadataServiceRef,
+ deps: {},
+ factory: async () => ({ getInstalledFeatures: () => installedFeatures }),
+ });
+}
+
export class BackendInitializer {
#startPromise?: Promise;
#stopPromise?: Promise;
@@ -210,6 +248,10 @@ export class BackendInitializer {
await this.#applyBackendFeatureLoaders(this.#registeredFeatureLoaders);
+ this.#serviceRegistry.add(
+ createInstanceMetadataServiceFactory(this.#registrations),
+ );
+
// Initialize all root scoped services
await this.#serviceRegistry.initializeEagerServicesWithScope('root');
diff --git a/packages/backend-defaults/CHANGELOG.md b/packages/backend-defaults/CHANGELOG.md
index 1f64b8f4c9..693ece9cd0 100644
--- a/packages/backend-defaults/CHANGELOG.md
+++ b/packages/backend-defaults/CHANGELOG.md
@@ -1,5 +1,98 @@
# @backstage/backend-defaults
+## 0.6.0-next.1
+
+### Patch Changes
+
+- fe87fbf: Add task metrics as two gauges that track the last start and end timestamps as epoch seconds.
+- 1ac6b72: Support `connection.type: cloudsql` in database client for usage with `@google-cloud/cloud-sql-connector` and `iam` auth
+- 5c9cc05: Use native fetch instead of node-fetch
+- cf627c6: Fixed an issue in the WinstonLogger where Errors thrown and given to logger.error with field values that could not be cast to a string would throw a TypeError
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.5-next.1
+ - @backstage/backend-app-api@1.1.0-next.1
+ - @backstage/config-loader@1.9.3-next.0
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-permission-node@0.8.6-next.1
+ - @backstage/backend-dev-utils@0.1.5
+ - @backstage/cli-common@0.1.15
+ - @backstage/cli-node@0.2.11-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/types@1.2.0
+ - @backstage/plugin-events-node@0.4.6-next.1
+
+## 0.6.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
+ ```
+
+- 277092a: Implemented `AzureBlobStorageUrlReader` to read from the url of committed location from the entity provider
+- 18a2c00: All middleware used by the default `coreServices.http` is now exported for use by custom implementations.
+
+### Patch Changes
+
+- 8863b38: Export `PluginTokenHandler` and `pluginTokenHandlerDecoratorServiceRef` to allow for custom decoration of the plugin token handler without having to re-implement the entire handler.
+- 97c6837: Export `DefaultHttpAuthService` to allow for custom token extraction logic.
+- e5255f1: Log request and response metadata so it can be used for filtering log messages.
+ The format of the request date was also changed from `clf` to `utc`.
+- Updated dependencies
+ - @backstage/integration@1.16.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/cli-node@0.2.11-next.0
+ - @backstage/plugin-auth-node@0.5.5-next.0
+ - @backstage/backend-dev-utils@0.1.5
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.0
+ - @backstage/config-loader@1.9.2
+ - @backstage/errors@1.2.5
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/types@1.2.0
+ - @backstage/plugin-permission-node@0.8.6-next.0
+
+## 0.5.3
+
+### Patch Changes
+
+- bf306cb: Removed dependency `@backstage/backend-common`.
+- e30bb46: Disabling database migrations now correctly uses the `backend.default.skipMigrations` config value.
+- d52d7f9: Support ISO and ms string forms of durations in config too
+- f6eaec2: Link to proper package in `rootLoggerServiceFactory` doc string.
+- ecf6b39: Use `node-fetch` instead of native fetch, as per https://backstage.io/docs/architecture-decisions/adrs-adr013
+- 4e58bc7: Upgrade to uuid v11 internally
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/types@1.2.0
+ - @backstage/integration-aws-node@0.1.13
+ - @backstage/config-loader@1.9.2
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/backend-app-api@1.0.2
+ - @backstage/cli-common@0.1.15
+ - @backstage/backend-dev-utils@0.1.5
+ - @backstage/cli-node@0.2.10
+ - @backstage/errors@1.2.5
+ - @backstage/integration@1.15.2
+ - @backstage/plugin-permission-node@0.8.5
+
## 0.5.3-next.3
### Patch Changes
diff --git a/packages/backend-defaults/config.d.ts b/packages/backend-defaults/config.d.ts
index 649846697f..0f7f9906f8 100644
--- a/packages/backend-defaults/config.d.ts
+++ b/packages/backend-defaults/config.d.ts
@@ -384,6 +384,16 @@ export interface Config {
*/
connection:
| string
+ | {
+ /**
+ * The specific config for cloudsql connections
+ */
+ type: 'cloudsql';
+ /**
+ * The instance connection name for the cloudsql instance, e.g. `project:region:instance`
+ */
+ instance: string;
+ }
| {
/**
* Password that belongs to the client User
@@ -441,7 +451,30 @@ export interface Config {
* Database connection string or Knex object override
* @visibility secret
*/
- connection?: string | object;
+ connection?:
+ | string
+ | {
+ /**
+ * The specific config for cloudsql connections
+ */
+ type: 'cloudsql';
+ /**
+ * The instance connection name for the cloudsql instance, e.g. `project:region:instance`
+ */
+ instance: string;
+ }
+ | {
+ /**
+ * Password that belongs to the client User
+ * @visibility secret
+ */
+ password?: string;
+ /**
+ * Other connection settings
+ */
+ [key: string]: unknown;
+ };
+
/**
* Whether to ensure the given database exists by creating it if it does not.
* Defaults to base config if unspecified.
@@ -486,11 +519,6 @@ export interface Config {
connection: string;
/** An optional default TTL (in milliseconds, if given as a number). */
defaultTtl?: number | HumanDuration | string;
- /**
- * Whether or not [useRedisSets](https://github.com/jaredwray/keyv/tree/main/packages/redis#useredissets) should be configured to this redis cache.
- * Defaults to true if unspecified.
- */
- useRedisSets?: boolean;
}
| {
store: 'memcache';
@@ -524,6 +552,23 @@ export interface Config {
*/
csp?: { [policyId: string]: string[] | false };
+ /**
+ * Options for the health check service and endpoint.
+ */
+ health?: {
+ /**
+ * Additional headers to always include in the health check response.
+ *
+ * It can be a good idea to set a header that uniquely identifies your service
+ * in a multi-service environment. This ensures that the health check that is
+ * configured for your service is actually hitting your service and not another.
+ *
+ * For example, if using Envoy you can use the `service_name_matcher` configuration
+ * and set the `x-envoy-upstream-healthchecked-cluster` header to a matching value.
+ */
+ headers?: { [name: string]: string };
+ };
+
/**
* Configuration related to URL reading, used for example for reading catalog info
* files, scaffolder templates, and techdocs content.
diff --git a/packages/backend-defaults/package.json b/packages/backend-defaults/package.json
index ef9be4a842..d8240c429c 100644
--- a/packages/backend-defaults/package.json
+++ b/packages/backend-defaults/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-defaults",
- "version": "0.5.3-next.3",
+ "version": "0.6.0-next.1",
"description": "Backend defaults used by Backstage backend apps",
"backstage": {
"role": "node-library"
@@ -119,6 +119,8 @@
"@aws-sdk/client-s3": "^3.350.0",
"@aws-sdk/credential-providers": "^3.350.0",
"@aws-sdk/types": "^3.347.0",
+ "@azure/identity": "^4.0.0",
+ "@azure/storage-blob": "^12.5.0",
"@backstage/backend-app-api": "workspace:^",
"@backstage/backend-dev-utils": "workspace:^",
"@backstage/backend-plugin-api": "workspace:^",
@@ -134,11 +136,11 @@
"@backstage/plugin-permission-node": "workspace:^",
"@backstage/types": "workspace:^",
"@google-cloud/storage": "^7.0.0",
- "@keyv/memcache": "^1.3.5",
- "@keyv/redis": "^2.5.3",
+ "@keyv/memcache": "^2.0.1",
+ "@keyv/redis": "^4.0.1",
"@manypkg/get-packages": "^1.1.3",
"@octokit/rest": "^19.0.3",
- "@opentelemetry/api": "^1.3.0",
+ "@opentelemetry/api": "^1.9.0",
"@types/cors": "^2.8.6",
"@types/express": "^4.17.6",
"archiver": "^7.0.0",
@@ -156,14 +158,13 @@
"helmet": "^6.0.0",
"isomorphic-git": "^1.23.0",
"jose": "^5.0.0",
- "keyv": "^4.5.2",
+ "keyv": "^5.2.1",
"knex": "^3.0.0",
"lodash": "^4.17.21",
"logform": "^2.3.2",
"luxon": "^3.0.0",
"minimatch": "^9.0.0",
"minimist": "^1.2.5",
- "morgan": "^1.10.0",
"mysql2": "^3.0.0",
"node-fetch": "^2.7.0",
"node-forge": "^1.3.1",
@@ -184,16 +185,24 @@
"yn": "^4.0.0",
"zod": "^3.22.4"
},
+ "peerDependencies": {
+ "@google-cloud/cloud-sql-connector": "^1.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@google-cloud/cloud-sql-connector": {
+ "optional": true
+ }
+ },
"devDependencies": {
"@aws-sdk/util-stream-node": "^3.350.0",
"@backstage/backend-plugin-api": "workspace:^",
"@backstage/backend-test-utils": "workspace:^",
"@backstage/cli": "workspace:^",
+ "@google-cloud/cloud-sql-connector": "^1.4.0",
"@types/archiver": "^6.0.0",
"@types/base64-stream": "^1.0.2",
"@types/concat-stream": "^2.0.0",
"@types/http-errors": "^2.0.0",
- "@types/morgan": "^1.9.0",
"@types/node-forge": "^1.3.0",
"@types/pg-format": "^1.0.5",
"@types/stoppable": "^1.1.0",
@@ -201,6 +210,7 @@
"aws-sdk-client-mock": "^4.0.0",
"http-errors": "^2.0.0",
"msw": "^1.0.0",
+ "node-mocks-http": "^1.0.0",
"supertest": "^7.0.0",
"wait-for-expect": "^3.0.2"
},
diff --git a/packages/backend-defaults/report-auth.api.md b/packages/backend-defaults/report-auth.api.md
index 2f201e4573..1883e65a6a 100644
--- a/packages/backend-defaults/report-auth.api.md
+++ b/packages/backend-defaults/report-auth.api.md
@@ -5,6 +5,7 @@
```ts
import { AuthService } from '@backstage/backend-plugin-api';
import { ServiceFactory } from '@backstage/backend-plugin-api';
+import { ServiceRef } from '@backstage/backend-plugin-api';
// @public
export const authServiceFactory: ServiceFactory<
@@ -13,5 +14,35 @@ export const authServiceFactory: ServiceFactory<
'singleton'
>;
+// @public
+export interface PluginTokenHandler {
+ // (undocumented)
+ issueToken(options: {
+ pluginId: string;
+ targetPluginId: string;
+ onBehalfOf?: {
+ limitedUserToken: string;
+ expiresAt: Date;
+ };
+ }): Promise<{
+ token: string;
+ }>;
+ // (undocumented)
+ verifyToken(token: string): Promise<
+ | {
+ subject: string;
+ limitedUserToken?: string;
+ }
+ | undefined
+ >;
+}
+
+// @public
+export const pluginTokenHandlerDecoratorServiceRef: ServiceRef<
+ (defaultImplementation: PluginTokenHandler) => PluginTokenHandler,
+ 'plugin',
+ 'singleton'
+>;
+
// (No @packageDocumentation comment for this package)
```
diff --git a/packages/backend-defaults/report-httpAuth.api.md b/packages/backend-defaults/report-httpAuth.api.md
index 6c08a6f4d0..b3843beb3d 100644
--- a/packages/backend-defaults/report-httpAuth.api.md
+++ b/packages/backend-defaults/report-httpAuth.api.md
@@ -3,9 +3,51 @@
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
+import { AuthService } from '@backstage/backend-plugin-api';
+import { BackstageCredentials } from '@backstage/backend-plugin-api';
+import { BackstagePrincipalTypes } from '@backstage/backend-plugin-api';
+import { DiscoveryService } from '@backstage/backend-plugin-api';
import { HttpAuthService } from '@backstage/backend-plugin-api';
+import { Request as Request_2 } from 'express';
+import { Response as Response_2 } from 'express';
import { ServiceFactory } from '@backstage/backend-plugin-api';
+// @public
+export class DefaultHttpAuthService implements HttpAuthService {
+ // (undocumented)
+ static create(options: DefaultHttpAuthServiceOptions): DefaultHttpAuthService;
+ // (undocumented)
+ credentials(
+ req: Request_2,
+ options?: {
+ allow?: Array;
+ allowLimitedAccess?: boolean;
+ },
+ ): Promise>;
+ // (undocumented)
+ issueUserCookie(
+ res: Response_2,
+ options?: {
+ credentials?: BackstageCredentials;
+ },
+ ): Promise<{
+ expiresAt: Date;
+ }>;
+}
+
+// @public
+export interface DefaultHttpAuthServiceOptions {
+ // (undocumented)
+ auth: AuthService;
+ // (undocumented)
+ discovery: DiscoveryService;
+ getTokenFromRequest?: (req: Request_2) => {
+ token?: string;
+ };
+ // (undocumented)
+ pluginId: string;
+}
+
// @public
export const httpAuthServiceFactory: ServiceFactory<
HttpAuthService,
diff --git a/packages/backend-defaults/report-httpRouter.api.md b/packages/backend-defaults/report-httpRouter.api.md
index 97805bc926..4f6c6f06dc 100644
--- a/packages/backend-defaults/report-httpRouter.api.md
+++ b/packages/backend-defaults/report-httpRouter.api.md
@@ -3,9 +3,45 @@
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
+///
+
+import { AuthService } from '@backstage/backend-plugin-api';
+import express from 'express';
+import { HttpAuthService } from '@backstage/backend-plugin-api';
import { HttpRouterService } from '@backstage/backend-plugin-api';
+import { HttpRouterServiceAuthPolicy } from '@backstage/backend-plugin-api';
+import { HumanDuration } from '@backstage/types';
+import { LifecycleService } from '@backstage/backend-plugin-api';
+import { RequestHandler } from 'express';
+import { RootConfigService } from '@backstage/backend-plugin-api';
+import { Router } from 'express';
import { ServiceFactory } from '@backstage/backend-plugin-api';
+// @public (undocumented)
+export function createAuthIntegrationRouter(options: {
+ auth: AuthService;
+}): express.Router;
+
+// @public
+export function createCookieAuthRefreshMiddleware(options: {
+ auth: AuthService;
+ httpAuth: HttpAuthService;
+}): Router;
+
+// @public (undocumented)
+export function createCredentialsBarrier(options: {
+ httpAuth: HttpAuthService;
+ config: RootConfigService;
+}): {
+ middleware: RequestHandler;
+ addAuthPolicy: (policy: HttpRouterServiceAuthPolicy) => void;
+};
+
+// @public
+export function createLifecycleMiddleware(
+ options: LifecycleMiddlewareOptions,
+): RequestHandler;
+
// @public
export const httpRouterServiceFactory: ServiceFactory<
HttpRouterService,
@@ -13,5 +49,12 @@ export const httpRouterServiceFactory: ServiceFactory<
'singleton'
>;
+// @public
+export interface LifecycleMiddlewareOptions {
+ // (undocumented)
+ lifecycle: LifecycleService;
+ startupRequestPauseTimeout?: HumanDuration;
+}
+
// (No @packageDocumentation comment for this package)
```
diff --git a/packages/backend-defaults/report-rootHttpRouter.api.md b/packages/backend-defaults/report-rootHttpRouter.api.md
index 3686f25a12..41830ebf17 100644
--- a/packages/backend-defaults/report-rootHttpRouter.api.md
+++ b/packages/backend-defaults/report-rootHttpRouter.api.md
@@ -27,6 +27,7 @@ import { ServiceFactory } from '@backstage/backend-plugin-api';
// @public (undocumented)
export function createHealthRouter(options: {
health: RootHealthService;
+ config: RootConfigService;
}): Router;
// @public
diff --git a/packages/backend-defaults/report-urlReader.api.md b/packages/backend-defaults/report-urlReader.api.md
index f8b8db2954..efe4a9ae47 100644
--- a/packages/backend-defaults/report-urlReader.api.md
+++ b/packages/backend-defaults/report-urlReader.api.md
@@ -7,6 +7,8 @@
import { AwsCredentialsManager } from '@backstage/integration-aws-node';
import { AwsS3Integration } from '@backstage/integration';
+import { AzureBlobStorageIntergation } from '@backstage/integration';
+import { AzureCredentialsManager } from '@backstage/integration';
import { AzureDevOpsCredentialsProvider } from '@backstage/integration';
import { AzureIntegration } from '@backstage/integration';
import { BitbucketCloudIntegration } from '@backstage/integration';
@@ -60,6 +62,35 @@ export class AwsS3UrlReader implements UrlReaderService {
toString(): string;
}
+// @public
+export class AzureBlobStorageUrlReader implements UrlReaderService {
+ constructor(
+ credsManager: AzureCredentialsManager,
+ integration: AzureBlobStorageIntergation,
+ deps: {
+ treeResponseFactory: ReadTreeResponseFactory;
+ },
+ );
+ // (undocumented)
+ static factory: ReaderFactory;
+ // (undocumented)
+ read(url: string): Promise;
+ // (undocumented)
+ readTree(
+ url: string,
+ options?: UrlReaderServiceReadTreeOptions,
+ ): Promise;
+ // (undocumented)
+ readUrl(
+ url: string,
+ options?: UrlReaderServiceReadUrlOptions,
+ ): Promise;
+ // (undocumented)
+ search(): Promise;
+ // (undocumented)
+ toString(): string;
+}
+
// @public
export class AzureUrlReader implements UrlReaderService {
constructor(
@@ -384,17 +415,29 @@ export interface ReadTreeResponseFactory {
}
// @public
-export type ReadTreeResponseFactoryOptions = {
- stream: Readable;
- subpath?: string;
- etag: string;
- filter?: (
- path: string,
- info?: {
- size: number;
- },
- ) => boolean;
-};
+export type ReadTreeResponseFactoryOptions =
+ | {
+ stream: Readable;
+ subpath?: string;
+ etag: string;
+ filter?: (
+ path: string,
+ info?: {
+ size: number;
+ },
+ ) => boolean;
+ }
+ | {
+ response: Response;
+ subpath?: string;
+ etag?: string;
+ filter?: (
+ path: string,
+ info?: {
+ size: number;
+ },
+ ) => boolean;
+ };
// @public
export class ReadUrlResponseFactory {
@@ -406,6 +449,9 @@ export class ReadUrlResponseFactory {
stream: Readable,
options?: ReadUrlResponseFactoryFromStreamOptions,
): Promise;
+ static fromResponse(
+ response: Response,
+ ): Promise;
}
// @public
diff --git a/packages/backend-defaults/src/entrypoints/auth/DefaultAuthService.ts b/packages/backend-defaults/src/entrypoints/auth/DefaultAuthService.ts
index 05d62a54a2..a81a99fec7 100644
--- a/packages/backend-defaults/src/entrypoints/auth/DefaultAuthService.ts
+++ b/packages/backend-defaults/src/entrypoints/auth/DefaultAuthService.ts
@@ -169,7 +169,10 @@ export class DefaultAuthService implements AuthService {
return this.pluginTokenHandler.issueToken({
pluginId: this.pluginId,
targetPluginId,
- onBehalfOf,
+ onBehalfOf: {
+ limitedUserToken: onBehalfOf.token,
+ expiresAt: onBehalfOf.expiresAt,
+ },
});
}
default:
diff --git a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts
index cb672ed7f1..a244614135 100644
--- a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts
+++ b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.test.ts
@@ -19,12 +19,17 @@ import {
mockServices,
registerMswTestHooks,
} from '@backstage/backend-test-utils';
-import { authServiceFactory } from './authServiceFactory';
+import {
+ authServiceFactory,
+ pluginTokenHandlerDecoratorServiceRef,
+} from './authServiceFactory';
import { base64url, decodeJwt } from 'jose';
import { discoveryServiceFactory } from '../discovery';
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import { toInternalBackstageCredentials } from './helpers';
+import { PluginTokenHandler } from './plugin/PluginTokenHandler';
+import { createServiceFactory } from '@backstage/backend-plugin-api';
const server = setupServer();
@@ -104,8 +109,9 @@ describe('authServiceFactory', () => {
});
it('should authenticate issued tokens with new auth', async () => {
+ const logger = mockServices.logger.mock();
const tester = ServiceFactoryTester.from(authServiceFactory, {
- dependencies: mockDeps,
+ dependencies: [...mockDeps, logger.factory],
});
const searchAuth = await tester.getSubject('search');
@@ -129,8 +135,13 @@ describe('authServiceFactory', () => {
targetPluginId: 'catalog',
});
+ expect(logger.warn).not.toHaveBeenCalled();
await expect(searchAuth.authenticate(searchToken)).rejects.toThrow(
- 'Invalid plugin token',
+ 'Failed plugin token verification',
+ );
+ expect(logger.warn).toHaveBeenCalledWith(
+ 'Failed to verify incoming plugin token',
+ expect.any(Error),
);
await expect(catalogAuth.authenticate(searchToken)).resolves.toEqual(
expect.objectContaining({
@@ -407,4 +418,40 @@ describe('authServiceFactory', () => {
principal: { subject: 'unlimited-static-subject' },
});
});
+
+ describe('decorate PluginTokenHandler', () => {
+ it('should allow custom logic to be injected into the plugin token handler', async () => {
+ const customLogic = jest.fn();
+ const customPluginTokenHandler = createServiceFactory({
+ service: pluginTokenHandlerDecoratorServiceRef,
+ deps: {},
+ async factory() {
+ return (defaultImplementation: PluginTokenHandler) =>
+ new (class CustomHandler implements PluginTokenHandler {
+ verifyToken(
+ token: string,
+ ): Promise<
+ { subject: string; limitedUserToken?: string } | undefined
+ > {
+ customLogic(token);
+ return defaultImplementation.verifyToken(token);
+ }
+ issueToken(options: {
+ pluginId: string;
+ targetPluginId: string;
+ limitedUserToken?: { token: string; expiresAt: Date };
+ }): Promise<{ token: string }> {
+ return defaultImplementation.issueToken(options);
+ }
+ })();
+ },
+ });
+ const tester = ServiceFactoryTester.from(authServiceFactory, {
+ dependencies: [...mockDeps, customPluginTokenHandler],
+ });
+ const searchAuth = await tester.getSubject('search');
+ searchAuth.authenticate('unlimited-static-token');
+ expect(customLogic).toHaveBeenCalledWith('unlimited-static-token');
+ });
+ });
});
diff --git a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts
index 34071ca541..91910292e6 100644
--- a/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts
+++ b/packages/backend-defaults/src/entrypoints/auth/authServiceFactory.ts
@@ -17,13 +17,35 @@
import {
coreServices,
createServiceFactory,
+ createServiceRef,
} from '@backstage/backend-plugin-api';
import { DefaultAuthService } from './DefaultAuthService';
import { ExternalTokenHandler } from './external/ExternalTokenHandler';
-import { PluginTokenHandler } from './plugin/PluginTokenHandler';
+import {
+ DefaultPluginTokenHandler,
+ PluginTokenHandler,
+} from './plugin/PluginTokenHandler';
import { createPluginKeySource } from './plugin/keys/createPluginKeySource';
import { UserTokenHandler } from './user/UserTokenHandler';
+/**
+ * @public
+ * This service is used to decorate the default plugin token handler with custom logic.
+ */
+export const pluginTokenHandlerDecoratorServiceRef = createServiceRef<
+ (defaultImplementation: PluginTokenHandler) => PluginTokenHandler
+>({
+ id: 'core.auth.pluginTokenHandlerDecorator',
+ defaultFactory: async service =>
+ createServiceFactory({
+ service,
+ deps: {},
+ factory: async () => {
+ return impl => impl;
+ },
+ }),
+});
+
/**
* Handles token authentication and credentials management.
*
@@ -37,12 +59,20 @@ export const authServiceFactory = createServiceFactory({
service: coreServices.auth,
deps: {
config: coreServices.rootConfig,
- logger: coreServices.rootLogger,
+ logger: coreServices.logger,
discovery: coreServices.discovery,
plugin: coreServices.pluginMetadata,
database: coreServices.database,
+ pluginTokenHandlerDecorator: pluginTokenHandlerDecoratorServiceRef,
},
- async factory({ config, discovery, plugin, logger, database }) {
+ async factory({
+ config,
+ discovery,
+ plugin,
+ logger,
+ database,
+ pluginTokenHandlerDecorator,
+ }) {
const disableDefaultAuthPolicy =
config.getOptionalBoolean(
'backend.auth.dangerouslyDisableDefaultAuthPolicy',
@@ -59,15 +89,18 @@ export const authServiceFactory = createServiceFactory({
const userTokens = UserTokenHandler.create({
discovery,
+ logger,
});
- const pluginTokens = PluginTokenHandler.create({
- ownPluginId: plugin.getId(),
- logger,
- keySource,
- keyDuration,
- discovery,
- });
+ const pluginTokens = pluginTokenHandlerDecorator(
+ DefaultPluginTokenHandler.create({
+ ownPluginId: plugin.getId(),
+ logger,
+ keySource,
+ keyDuration,
+ discovery,
+ }),
+ );
const externalTokens = ExternalTokenHandler.create({
ownPluginId: plugin.getId(),
diff --git a/packages/backend-defaults/src/entrypoints/auth/index.ts b/packages/backend-defaults/src/entrypoints/auth/index.ts
index 1b55d46a83..e48926f0ce 100644
--- a/packages/backend-defaults/src/entrypoints/auth/index.ts
+++ b/packages/backend-defaults/src/entrypoints/auth/index.ts
@@ -14,4 +14,9 @@
* limitations under the License.
*/
-export { authServiceFactory } from './authServiceFactory';
+export {
+ authServiceFactory,
+ pluginTokenHandlerDecoratorServiceRef,
+} from './authServiceFactory';
+
+export type { PluginTokenHandler } from './plugin/PluginTokenHandler';
diff --git a/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.test.ts b/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.test.ts
index ce470eff04..558bc5d0da 100644
--- a/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.test.ts
+++ b/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.test.ts
@@ -15,7 +15,7 @@
*/
import { mockServices } from '@backstage/backend-test-utils';
-import { PluginTokenHandler } from './PluginTokenHandler';
+import { DefaultPluginTokenHandler } from './PluginTokenHandler';
import { decodeJwt } from 'jose';
describe('PluginTokenHandler', () => {
@@ -42,7 +42,7 @@ describe('PluginTokenHandler', () => {
});
const getKeyMock = jest.fn(async () => mockPrivateKey);
- const handler = PluginTokenHandler.create({
+ const handler = DefaultPluginTokenHandler.create({
discovery: mockServices.discovery(),
keyDuration: { seconds: 10 },
logger: mockServices.logger.mock(),
diff --git a/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.ts b/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.ts
index 4bea74e3af..9aec52bc08 100644
--- a/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.ts
+++ b/packages/backend-defaults/src/entrypoints/auth/plugin/PluginTokenHandler.ts
@@ -16,13 +16,12 @@
import { DiscoveryService, LoggerService } from '@backstage/backend-plugin-api';
import { decodeJwt, importJWK, SignJWT, decodeProtectedHeader } from 'jose';
-import { AuthenticationError } from '@backstage/errors';
+import { assertError, AuthenticationError } from '@backstage/errors';
import { jwtVerify } from 'jose';
import { tokenTypes } from '@backstage/plugin-auth-node';
import { JwksClient } from '../JwksClient';
import { HumanDuration, durationToMilliseconds } from '@backstage/types';
import { PluginKeySource } from './keys/types';
-import fetch from 'node-fetch';
const SECONDS_IN_MS = 1000;
@@ -45,7 +44,22 @@ type Options = {
algorithm?: string;
};
-export class PluginTokenHandler {
+/**
+ * @public
+ * Issues and verifies {@link https://backstage.iceio/docs/auth/service-to-service-auth | service-to-service tokens}.
+ */
+export interface PluginTokenHandler {
+ verifyToken(
+ token: string,
+ ): Promise<{ subject: string; limitedUserToken?: string } | undefined>;
+ issueToken(options: {
+ pluginId: string;
+ targetPluginId: string;
+ onBehalfOf?: { limitedUserToken: string; expiresAt: Date };
+ }): Promise<{ token: string }>;
+}
+
+export class DefaultPluginTokenHandler implements PluginTokenHandler {
private jwksMap = new Map();
// Tracking state for isTargetPluginSupported
@@ -53,7 +67,7 @@ export class PluginTokenHandler {
private targetPluginInflightChecks = new Map>();
static create(options: Options) {
- return new PluginTokenHandler(
+ return new DefaultPluginTokenHandler(
options.logger,
options.ownPluginId,
options.keySource,
@@ -106,7 +120,8 @@ export class PluginTokenHandler {
requiredClaims: ['iat', 'exp', 'sub', 'aud'],
},
).catch(e => {
- throw new AuthenticationError('Invalid plugin token', e);
+ this.logger.warn('Failed to verify incoming plugin token', e);
+ throw new AuthenticationError('Failed plugin token verification');
});
return { subject: `plugin:${payload.sub}`, limitedUserToken: payload.obo };
@@ -115,7 +130,7 @@ export class PluginTokenHandler {
async issueToken(options: {
pluginId: string;
targetPluginId: string;
- onBehalfOf?: { token: string; expiresAt: Date };
+ onBehalfOf?: { limitedUserToken: string; expiresAt: Date };
}): Promise<{ token: string }> {
const { pluginId, targetPluginId, onBehalfOf } = options;
const key = await this.keySource.getPrivateSigningKey();
@@ -131,7 +146,7 @@ export class PluginTokenHandler {
)
: ourExp;
- const claims = { sub, aud, iat, exp, obo: onBehalfOf?.token };
+ const claims = { sub, aud, iat, exp, obo: onBehalfOf?.limitedUserToken };
const token = await new SignJWT(claims)
.setProtectedHeader({
typ: tokenTypes.plugin.typParam,
@@ -181,6 +196,7 @@ export class PluginTokenHandler {
this.supportedTargetPlugins.add(targetPluginId);
return true;
} catch (error) {
+ assertError(error);
this.logger.error('Unexpected failure for target JWKS check', error);
return false;
} finally {
diff --git a/packages/backend-defaults/src/entrypoints/auth/user/UserTokenHandler.test.ts b/packages/backend-defaults/src/entrypoints/auth/user/UserTokenHandler.test.ts
index e85ec8db63..251e4c3adf 100644
--- a/packages/backend-defaults/src/entrypoints/auth/user/UserTokenHandler.test.ts
+++ b/packages/backend-defaults/src/entrypoints/auth/user/UserTokenHandler.test.ts
@@ -64,13 +64,17 @@ async function createToken(options: {
describe('UserTokenHandler', () => {
let userTokenHandler: UserTokenHandler;
+ const logger = mockServices.logger.mock();
+
registerMswTestHooks(server);
beforeEach(() => {
jest.useRealTimers();
+ jest.resetAllMocks();
userTokenHandler = UserTokenHandler.create({
discovery: mockServices.discovery(),
+ logger,
});
server.use(
@@ -120,7 +124,7 @@ describe('UserTokenHandler', () => {
signature: 'sig',
}),
),
- ).rejects.toThrow('signature verification failed');
+ ).rejects.toThrow('Failed user token verification');
await expect(
userTokenHandler.verifyToken(
@@ -130,7 +134,7 @@ describe('UserTokenHandler', () => {
signature: 'sig',
}),
),
- ).rejects.toThrow('signature verification failed');
+ ).rejects.toThrow('Failed user token verification');
});
it('should fail to verify tokens that have a bad alg', async () => {
@@ -156,8 +160,13 @@ describe('UserTokenHandler', () => {
});
const token = `${header}.${payload}.`;
+ expect(logger.warn).not.toHaveBeenCalled();
await expect(userTokenHandler.verifyToken(token)).rejects.toThrow(
- /Unsupported "alg" value/,
+ 'Failed user token verification',
+ );
+ expect(logger.warn).toHaveBeenCalledWith(
+ 'Failed to verify incoming user token',
+ expect.any(Error),
);
});
diff --git a/packages/backend-defaults/src/entrypoints/auth/user/UserTokenHandler.ts b/packages/backend-defaults/src/entrypoints/auth/user/UserTokenHandler.ts
index 4dd1874843..d205fa6b82 100644
--- a/packages/backend-defaults/src/entrypoints/auth/user/UserTokenHandler.ts
+++ b/packages/backend-defaults/src/entrypoints/auth/user/UserTokenHandler.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import { DiscoveryService } from '@backstage/backend-plugin-api';
+import { DiscoveryService, LoggerService } from '@backstage/backend-plugin-api';
import { AuthenticationError } from '@backstage/errors';
import { tokenTypes } from '@backstage/plugin-auth-node';
import {
@@ -33,15 +33,21 @@ import { JwksClient } from '../JwksClient';
* @internal
*/
export class UserTokenHandler {
- static create(options: { discovery: DiscoveryService }): UserTokenHandler {
+ static create(options: {
+ discovery: DiscoveryService;
+ logger: LoggerService;
+ }): UserTokenHandler {
const jwksClient = new JwksClient(async () => {
const url = await options.discovery.getBaseUrl('auth');
return new URL(`${url}/.well-known/jwks.json`);
});
- return new UserTokenHandler(jwksClient);
+ return new UserTokenHandler(jwksClient, options.logger);
}
- constructor(private readonly jwksClient: JwksClient) {}
+ constructor(
+ private readonly jwksClient: JwksClient,
+ private readonly logger: LoggerService,
+ ) {}
async verifyToken(token: string) {
const verifyOpts = this.#getTokenVerificationOptions(token);
@@ -57,7 +63,8 @@ export class UserTokenHandler {
this.jwksClient.getKey,
verifyOpts,
).catch(e => {
- throw new AuthenticationError('Invalid token', e);
+ this.logger.warn('Failed to verify incoming user token', e);
+ throw new AuthenticationError('Failed user token verification');
});
const userEntityRef = payload.sub;
diff --git a/packages/backend-defaults/src/entrypoints/cache/CacheManager.test.ts b/packages/backend-defaults/src/entrypoints/cache/CacheManager.test.ts
index c075bccaa1..d15671d5d2 100644
--- a/packages/backend-defaults/src/entrypoints/cache/CacheManager.test.ts
+++ b/packages/backend-defaults/src/entrypoints/cache/CacheManager.test.ts
@@ -25,15 +25,21 @@ import { CacheManager } from './CacheManager';
// Contrived code because it's hard to spy on a default export
jest.mock('@keyv/redis', () => {
const Actual = jest.requireActual('@keyv/redis');
- return jest.fn((...args: any[]) => {
- return new Actual(...args);
- });
+ const DefaultConstructor = Actual.default;
+ return {
+ ...Actual,
+ __esModule: true,
+ default: jest.fn((...args: any[]) => new DefaultConstructor(...args)),
+ };
});
jest.mock('@keyv/memcache', () => {
const Actual = jest.requireActual('@keyv/memcache');
- return jest.fn((...args: any[]) => {
- return new Actual(...args);
- });
+ const DefaultConstructor = Actual.default;
+ return {
+ ...Actual,
+ __esModule: true,
+ default: jest.fn((...args: any[]) => new DefaultConstructor(...args)),
+ };
});
describe('CacheManager integration', () => {
@@ -42,7 +48,7 @@ describe('CacheManager integration', () => {
afterEach(jest.clearAllMocks);
it.each(caches.eachSupportedId())(
- 'only creates one underlying connection, %p',
+ 'only creates one underlying connection per plugin, %p',
async cacheId => {
const { store, connection } = await caches.init(cacheId);
@@ -59,10 +65,10 @@ describe('CacheManager integration', () => {
if (store === 'redis') {
// eslint-disable-next-line jest/no-conditional-expect
- expect(KeyvRedis).toHaveBeenCalledTimes(1);
+ expect(KeyvRedis).toHaveBeenCalledTimes(3);
} else if (store === 'memcache') {
// eslint-disable-next-line jest/no-conditional-expect
- expect(KeyvMemcache).toHaveBeenCalledTimes(1);
+ expect(KeyvMemcache).toHaveBeenCalledTimes(3);
}
},
);
diff --git a/packages/backend-defaults/src/entrypoints/cache/CacheManager.ts b/packages/backend-defaults/src/entrypoints/cache/CacheManager.ts
index 2bc3d2afdb..57c326f00d 100644
--- a/packages/backend-defaults/src/entrypoints/cache/CacheManager.ts
+++ b/packages/backend-defaults/src/entrypoints/cache/CacheManager.ts
@@ -49,7 +49,6 @@ export class CacheManager {
private readonly logger?: LoggerService;
private readonly store: keyof CacheManager['storeFactories'];
private readonly connection: string;
- private readonly useRedisSets: boolean;
private readonly errorHandler: CacheManagerOptions['onError'];
private readonly defaultTtl?: number;
@@ -69,12 +68,16 @@ export class CacheManager {
const defaultTtlConfig = config.getOptional('backend.cache.defaultTtl');
const connectionString =
config.getOptionalString('backend.cache.connection') || '';
- const useRedisSets =
- config.getOptionalBoolean('backend.cache.useRedisSets') ?? true;
const logger = options.logger?.child({
type: 'cacheManager',
});
+ if (config.has('backend.cache.useRedisSets')) {
+ logger?.warn(
+ "The 'backend.cache.useRedisSets' configuration key is deprecated and no longer has any effect. The underlying '@keyv/redis' library no longer supports redis sets.",
+ );
+ }
+
let defaultTtl: number | undefined;
if (defaultTtlConfig !== undefined) {
if (typeof defaultTtlConfig === 'number') {
@@ -89,7 +92,6 @@ export class CacheManager {
return new CacheManager(
store,
connectionString,
- useRedisSets,
options.onError,
logger,
defaultTtl,
@@ -100,7 +102,6 @@ export class CacheManager {
constructor(
store: string,
connectionString: string,
- useRedisSets: boolean,
errorHandler: CacheManagerOptions['onError'],
logger?: LoggerService,
defaultTtl?: number,
@@ -111,7 +112,6 @@ export class CacheManager {
this.logger = logger;
this.store = store as keyof CacheManager['storeFactories'];
this.connection = connectionString;
- this.useRedisSets = useRedisSets;
this.errorHandler = errorHandler;
this.defaultTtl = defaultTtl;
}
@@ -139,15 +139,16 @@ export class CacheManager {
}
private createRedisStoreFactory(): StoreFactory {
- const KeyvRedis = require('@keyv/redis');
- let store: typeof KeyvRedis | undefined;
+ const KeyvRedis = require('@keyv/redis').default;
+ const stores: Record = {};
+
return (pluginId, defaultTtl) => {
- if (!store) {
- store = new KeyvRedis(this.connection, {
- useRedisSets: this.useRedisSets,
+ if (!stores[pluginId]) {
+ stores[pluginId] = new KeyvRedis(this.connection, {
+ keyPrefixSeparator: ':',
});
// Always provide an error handler to avoid stopping the process
- store.on('error', (err: Error) => {
+ stores[pluginId].on('error', (err: Error) => {
this.logger?.error('Failed to create redis cache client', err);
this.errorHandler?.(err);
});
@@ -155,21 +156,22 @@ export class CacheManager {
return new Keyv({
namespace: pluginId,
ttl: defaultTtl,
- store,
+ store: stores[pluginId],
emitErrors: false,
- useRedisSets: this.useRedisSets,
+ useKeyPrefix: false,
});
};
}
private createMemcacheStoreFactory(): StoreFactory {
- const KeyvMemcache = require('@keyv/memcache');
- let store: typeof KeyvMemcache | undefined;
+ const KeyvMemcache = require('@keyv/memcache').default;
+ const stores: Record = {};
+
return (pluginId, defaultTtl) => {
- if (!store) {
- store = new KeyvMemcache(this.connection);
+ if (!stores[pluginId]) {
+ stores[pluginId] = new KeyvMemcache(this.connection);
// Always provide an error handler to avoid stopping the process
- store.on('error', (err: Error) => {
+ stores[pluginId].on('error', (err: Error) => {
this.logger?.error('Failed to create memcache cache client', err);
this.errorHandler?.(err);
});
@@ -178,7 +180,7 @@ export class CacheManager {
namespace: pluginId,
ttl: defaultTtl,
emitErrors: false,
- store,
+ store: stores[pluginId],
});
};
}
diff --git a/packages/backend-defaults/src/entrypoints/database/connectors/postgres.test.ts b/packages/backend-defaults/src/entrypoints/database/connectors/postgres.test.ts
index 1e07984967..1a3691c83b 100644
--- a/packages/backend-defaults/src/entrypoints/database/connectors/postgres.test.ts
+++ b/packages/backend-defaults/src/entrypoints/database/connectors/postgres.test.ts
@@ -22,6 +22,8 @@ import {
parsePgConnectionString,
} from './postgres';
+jest.mock('@google-cloud/cloud-sql-connector');
+
describe('postgres', () => {
const createMockConnection = () => ({
host: 'acme',
@@ -37,33 +39,35 @@ describe('postgres', () => {
new ConfigReader({ client: 'pg', connection });
describe('buildPgDatabaseConfig', () => {
- it('builds a postgres config', () => {
+ it('builds a postgres config', async () => {
const mockConnection = createMockConnection();
- expect(buildPgDatabaseConfig(createConfig(mockConnection))).toEqual({
- client: 'pg',
- connection: mockConnection,
- useNullAsDefault: true,
- });
- });
-
- it('builds a connection string config', () => {
- const mockConnectionString = createMockConnectionString();
-
- expect(buildPgDatabaseConfig(createConfig(mockConnectionString))).toEqual(
+ expect(await buildPgDatabaseConfig(createConfig(mockConnection))).toEqual(
{
client: 'pg',
- connection: mockConnectionString,
+ connection: mockConnection,
useNullAsDefault: true,
},
);
});
- it('overrides the database name', () => {
+ it('builds a connection string config', async () => {
+ const mockConnectionString = createMockConnectionString();
+
+ expect(
+ await buildPgDatabaseConfig(createConfig(mockConnectionString)),
+ ).toEqual({
+ client: 'pg',
+ connection: mockConnectionString,
+ useNullAsDefault: true,
+ });
+ });
+
+ it('overrides the database name', async () => {
const mockConnection = createMockConnection();
expect(
- buildPgDatabaseConfig(createConfig(mockConnection), {
+ await buildPgDatabaseConfig(createConfig(mockConnection), {
connection: { database: 'other_db' },
}),
).toEqual({
@@ -76,14 +80,14 @@ describe('postgres', () => {
});
});
- it('overrides the schema name', () => {
+ it('overrides the schema name', async () => {
const mockConnection = {
...createMockConnection(),
schema: 'schemaName',
};
expect(
- buildPgDatabaseConfig(createConfig(mockConnection), {
+ await buildPgDatabaseConfig(createConfig(mockConnection), {
searchPath: ['schemaName'],
}),
).toEqual({
@@ -94,11 +98,11 @@ describe('postgres', () => {
});
});
- it('adds additional config settings', () => {
+ it('adds additional config settings', async () => {
const mockConnection = createMockConnection();
expect(
- buildPgDatabaseConfig(createConfig(mockConnection), {
+ await buildPgDatabaseConfig(createConfig(mockConnection), {
connection: { database: 'other_db' },
pool: { min: 0, max: 7 },
debug: true,
@@ -115,12 +119,12 @@ describe('postgres', () => {
});
});
- it('overrides the database from connection string', () => {
+ it('overrides the database from connection string', async () => {
const mockConnectionString = createMockConnectionString();
const mockConnection = createMockConnection();
expect(
- buildPgDatabaseConfig(createConfig(mockConnectionString), {
+ await buildPgDatabaseConfig(createConfig(mockConnectionString), {
connection: { database: 'other_db' },
}),
).toEqual({
@@ -133,6 +137,124 @@ describe('postgres', () => {
useNullAsDefault: true,
});
});
+
+ it('uses the correct config when using cloudsql', async () => {
+ expect(
+ await buildPgDatabaseConfig(
+ new ConfigReader({
+ client: 'pg',
+ connection: {
+ type: 'cloudsql',
+ user: 'ben@gke.com',
+ instance: 'project:region:instance',
+ port: 5423,
+ },
+ }),
+ { connection: { database: 'other_db' } },
+ ),
+ ).toEqual({
+ client: 'pg',
+ connection: {
+ user: 'ben@gke.com',
+ port: 5423,
+ database: 'other_db',
+ },
+ useNullAsDefault: true,
+ });
+ });
+
+ it('should throw with incorrect config', async () => {
+ await expect(
+ buildPgDatabaseConfig(
+ new ConfigReader({
+ client: 'pg',
+ connection: {
+ type: 'cloudsql',
+ },
+ }),
+ ),
+ ).rejects.toThrow(/Missing instance connection name for Cloud SQL/);
+
+ await expect(
+ buildPgDatabaseConfig(
+ new ConfigReader({
+ client: 'not-pg',
+ connection: {
+ type: 'cloudsql',
+ instance: 'asd:asd:asd',
+ },
+ }),
+ ),
+ ).rejects.toThrow(/Cloud SQL only supports the pg client/);
+ });
+
+ it('adds the settings from cloud-sql-connector', async () => {
+ const { Connector } = jest.requireMock(
+ '@google-cloud/cloud-sql-connector',
+ ) as jest.Mocked;
+
+ const mockStream = (): any => {};
+ Connector.prototype.getOptions.mockResolvedValue({ stream: mockStream });
+
+ expect(
+ await buildPgDatabaseConfig(
+ new ConfigReader({
+ client: 'pg',
+ connection: {
+ type: 'cloudsql',
+ user: 'ben@gke.com',
+ instance: 'project:region:instance',
+ port: 5423,
+ },
+ }),
+ { connection: { database: 'other_db' } },
+ ),
+ ).toEqual({
+ client: 'pg',
+ connection: {
+ user: 'ben@gke.com',
+ port: 5423,
+ stream: mockStream,
+ database: 'other_db',
+ },
+ useNullAsDefault: true,
+ });
+ });
+
+ it('throws an error when the connection type is not supported', async () => {
+ await expect(
+ buildPgDatabaseConfig(
+ new ConfigReader({
+ client: 'pg',
+ connection: {
+ type: 'not-supported',
+ },
+ }),
+ ),
+ ).rejects.toThrow('Unknown connection type: not-supported');
+ });
+
+ it('supports default as the default connection type', async () => {
+ await expect(
+ buildPgDatabaseConfig(
+ new ConfigReader({
+ client: 'pg',
+ connection: {
+ type: 'default',
+ port: '5432',
+ database: 'other_db',
+ },
+ }),
+ ),
+ ).resolves.toEqual({
+ client: 'pg',
+ connection: {
+ port: '5432',
+ database: 'other_db',
+ },
+ useNullAsDefault: true,
+ });
+ });
});
describe('getPgConnectionConfig', () => {
@@ -174,9 +296,9 @@ describe('postgres', () => {
});
describe('createPgDatabaseClient', () => {
- it('creates a postgres knex instance', () => {
+ it('creates a postgres knex instance', async () => {
expect(
- createPgDatabaseClient(
+ await createPgDatabaseClient(
createConfig({
host: 'acme',
user: 'foo',
@@ -187,14 +309,14 @@ describe('postgres', () => {
).toBeTruthy();
});
- it('attempts to read an ssl cert', () => {
- expect(() =>
+ it('attempts to read an ssl cert', async () => {
+ await expect(() =>
createPgDatabaseClient(
createConfig(
'postgresql://postgres:pass@localhost:5432/dbname?sslrootcert=/path/to/file',
),
),
- ).toThrow(/no such file or directory/);
+ ).rejects.toThrow(/no such file or directory/);
});
});
diff --git a/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts b/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts
index b5cfffd1f4..e7e973ae4b 100644
--- a/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts
+++ b/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts
@@ -37,11 +37,11 @@ const ddlLimiter = limiterFactory(1);
* @param dbConfig - The database config
* @param overrides - Additional options to merge with the config
*/
-export function createPgDatabaseClient(
+export async function createPgDatabaseClient(
dbConfig: Config,
overrides?: Knex.Config,
) {
- const knexConfig = buildPgDatabaseConfig(dbConfig, overrides);
+ const knexConfig = await buildPgDatabaseConfig(dbConfig, overrides);
const database = knexFactory(knexConfig);
const role = dbConfig.getOptionalString('role');
@@ -64,11 +64,11 @@ export function createPgDatabaseClient(
* @param dbConfig - The database config
* @param overrides - Additional options to merge with the config
*/
-export function buildPgDatabaseConfig(
+export async function buildPgDatabaseConfig(
dbConfig: Config,
overrides?: Knex.Config,
) {
- return mergeDatabaseConfig(
+ const config = mergeDatabaseConfig(
dbConfig.get(),
{
connection: getPgConnectionConfig(dbConfig, !!overrides),
@@ -76,6 +76,49 @@ export function buildPgDatabaseConfig(
},
overrides,
);
+
+ const sanitizedConfig = JSON.parse(JSON.stringify(config));
+
+ // Trim additional properties from the connection object passed to knex
+ delete sanitizedConfig.connection.type;
+ delete sanitizedConfig.connection.instance;
+
+ if (config.connection.type === 'default' || !config.connection.type) {
+ return sanitizedConfig;
+ }
+
+ if (config.connection.type !== 'cloudsql') {
+ throw new Error(`Unknown connection type: ${config.connection.type}`);
+ }
+
+ if (config.client !== 'pg') {
+ throw new Error('Cloud SQL only supports the pg client');
+ }
+
+ if (!config.connection.instance) {
+ throw new Error('Missing instance connection name for Cloud SQL');
+ }
+
+ const {
+ Connector: CloudSqlConnector,
+ IpAddressTypes,
+ AuthTypes,
+ } = await import('@google-cloud/cloud-sql-connector');
+ const connector = new CloudSqlConnector();
+ const clientOpts = await connector.getOptions({
+ instanceConnectionName: config.connection.instance,
+ ipType: IpAddressTypes.PUBLIC,
+ authType: AuthTypes.IAM,
+ });
+
+ return {
+ ...sanitizedConfig,
+ client: 'pg',
+ connection: {
+ ...sanitizedConfig.connection,
+ ...clientOpts,
+ },
+ };
}
/**
@@ -130,7 +173,7 @@ export async function ensurePgDatabaseExists(
dbConfig: Config,
...databases: Array
) {
- const admin = createPgDatabaseClient(dbConfig, {
+ const admin = await createPgDatabaseClient(dbConfig, {
connection: {
database: 'postgres',
},
@@ -186,7 +229,7 @@ export async function ensurePgSchemaExists(
dbConfig: Config,
...schemas: Array
): Promise {
- const admin = createPgDatabaseClient(dbConfig);
+ const admin = await createPgDatabaseClient(dbConfig);
const role = dbConfig.getOptionalString('role');
try {
@@ -219,7 +262,7 @@ export async function dropPgDatabase(
dbConfig: Config,
...databases: Array
) {
- const admin = createPgDatabaseClient(dbConfig);
+ const admin = await createPgDatabaseClient(dbConfig);
try {
await Promise.all(
databases.map(async database => {
diff --git a/packages/backend-defaults/src/entrypoints/httpAuth/DefaultHttpAuthService.test.ts b/packages/backend-defaults/src/entrypoints/httpAuth/DefaultHttpAuthService.test.ts
new file mode 100644
index 0000000000..e314564b59
--- /dev/null
+++ b/packages/backend-defaults/src/entrypoints/httpAuth/DefaultHttpAuthService.test.ts
@@ -0,0 +1,42 @@
+/*
+ * 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 { DefaultHttpAuthService } from './httpAuthServiceFactory';
+import { mockServices } from '@backstage/backend-test-utils';
+import { createRequest } from 'node-mocks-http';
+
+describe('DefaultHttpAuthService', () => {
+ it('should extract token from custom header', async () => {
+ const auth = mockServices.auth.mock();
+ const httpAuthService = DefaultHttpAuthService.create({
+ discovery: mockServices.discovery(),
+ auth,
+ pluginId: 'test',
+ getTokenFromRequest: req => {
+ let token: string | undefined;
+ const header = req.headers.test;
+ if (typeof header === 'string') {
+ token = header;
+ }
+ return { token };
+ },
+ });
+ await httpAuthService.credentials(
+ createRequest({ headers: { test: 'mock-user-token' } }),
+ );
+ expect(auth.authenticate).toHaveBeenCalledWith('mock-user-token');
+ });
+});
diff --git a/packages/backend-defaults/src/entrypoints/httpAuth/httpAuthServiceFactory.ts b/packages/backend-defaults/src/entrypoints/httpAuth/httpAuthServiceFactory.ts
index 76550873f6..4bc6b3b1fc 100644
--- a/packages/backend-defaults/src/entrypoints/httpAuth/httpAuthServiceFactory.ts
+++ b/packages/backend-defaults/src/entrypoints/httpAuth/httpAuthServiceFactory.ts
@@ -33,17 +33,14 @@ const FIVE_MINUTES_MS = 5 * 60 * 1000;
const BACKSTAGE_AUTH_COOKIE = 'backstage-auth';
function getTokenFromRequest(req: Request) {
- // TODO: support multiple auth headers (iterate rawHeaders)
+ let token: string | undefined;
const authHeader = req.headers.authorization;
if (typeof authHeader === 'string') {
const matches = authHeader.match(/^Bearer[ ]+(\S+)$/i);
- const token = matches?.[1];
- if (token) {
- return token;
- }
+ token = matches?.[1];
}
- return undefined;
+ return { token };
}
function getCookieFromRequest(req: Request) {
@@ -71,23 +68,55 @@ type RequestWithCredentials = Request & {
[limitedCredentialsSymbol]?: Promise;
};
-class DefaultHttpAuthService implements HttpAuthService {
+/**
+ * @public
+ * Options for creating a DefaultHttpAuthService.
+ */
+export interface DefaultHttpAuthServiceOptions {
+ auth: AuthService;
+ discovery: DiscoveryService;
+ pluginId: string;
+ /**
+ * Optionally override logic for extracting the token from the request.
+ */
+ getTokenFromRequest?: (req: Request) => { token?: string };
+}
+
+/**
+ * @public
+ * DefaultHttpAuthService is the default implementation of the HttpAuthService
+ */
+export class DefaultHttpAuthService implements HttpAuthService {
readonly #auth: AuthService;
readonly #discovery: DiscoveryService;
readonly #pluginId: string;
+ readonly #getToken: (req: Request) => { token?: string };
- constructor(
+ private constructor(
auth: AuthService,
discovery: DiscoveryService,
pluginId: string,
+ getToken?: (req: Request) => { token?: string },
) {
this.#auth = auth;
this.#discovery = discovery;
this.#pluginId = pluginId;
+ this.#getToken = getToken ?? getTokenFromRequest;
+ }
+
+ static create(
+ options: DefaultHttpAuthServiceOptions,
+ ): DefaultHttpAuthService {
+ return new DefaultHttpAuthService(
+ options.auth,
+ options.discovery,
+ options.pluginId,
+ options.getTokenFromRequest,
+ );
}
async #extractCredentialsFromRequest(req: Request) {
- const token = getTokenFromRequest(req);
+ const { token } = this.#getToken(req);
if (!token) {
return await this.#auth.getNoneCredentials();
}
@@ -96,7 +125,7 @@ class DefaultHttpAuthService implements HttpAuthService {
}
async #extractLimitedCredentialsFromRequest(req: Request) {
- const token = getTokenFromRequest(req);
+ const { token } = this.#getToken(req);
if (token) {
return await this.#auth.authenticate(token, {
allowLimitedAccess: true,
@@ -289,6 +318,10 @@ export const httpAuthServiceFactory = createServiceFactory({
plugin: coreServices.pluginMetadata,
},
async factory({ auth, discovery, plugin }) {
- return new DefaultHttpAuthService(auth, discovery, plugin.getId());
+ return DefaultHttpAuthService.create({
+ auth,
+ discovery,
+ pluginId: plugin.getId(),
+ });
},
});
diff --git a/packages/backend-defaults/src/entrypoints/httpAuth/index.ts b/packages/backend-defaults/src/entrypoints/httpAuth/index.ts
index edd7e53026..9afe06ae0e 100644
--- a/packages/backend-defaults/src/entrypoints/httpAuth/index.ts
+++ b/packages/backend-defaults/src/entrypoints/httpAuth/index.ts
@@ -14,4 +14,8 @@
* limitations under the License.
*/
-export { httpAuthServiceFactory } from './httpAuthServiceFactory';
+export {
+ httpAuthServiceFactory,
+ DefaultHttpAuthService,
+} from './httpAuthServiceFactory';
+export type { DefaultHttpAuthServiceOptions } from './httpAuthServiceFactory';
diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/createAuthIntegrationRouter.ts b/packages/backend-defaults/src/entrypoints/httpRouter/http/createAuthIntegrationRouter.ts
similarity index 98%
rename from packages/backend-defaults/src/entrypoints/httpRouter/createAuthIntegrationRouter.ts
rename to packages/backend-defaults/src/entrypoints/httpRouter/http/createAuthIntegrationRouter.ts
index ef36e7ba2d..3d36ef8e34 100644
--- a/packages/backend-defaults/src/entrypoints/httpRouter/createAuthIntegrationRouter.ts
+++ b/packages/backend-defaults/src/entrypoints/httpRouter/http/createAuthIntegrationRouter.ts
@@ -18,6 +18,9 @@ import { AuthService } from '@backstage/backend-plugin-api';
import express from 'express';
import Router from 'express-promise-router';
+/**
+ * @public
+ */
export function createAuthIntegrationRouter(options: {
auth: AuthService;
}): express.Router {
diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/createCookieAuthRefreshMiddleware.test.ts b/packages/backend-defaults/src/entrypoints/httpRouter/http/createCookieAuthRefreshMiddleware.test.ts
similarity index 100%
rename from packages/backend-defaults/src/entrypoints/httpRouter/createCookieAuthRefreshMiddleware.test.ts
rename to packages/backend-defaults/src/entrypoints/httpRouter/http/createCookieAuthRefreshMiddleware.test.ts
diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/createCookieAuthRefreshMiddleware.ts b/packages/backend-defaults/src/entrypoints/httpRouter/http/createCookieAuthRefreshMiddleware.ts
similarity index 100%
rename from packages/backend-defaults/src/entrypoints/httpRouter/createCookieAuthRefreshMiddleware.ts
rename to packages/backend-defaults/src/entrypoints/httpRouter/http/createCookieAuthRefreshMiddleware.ts
diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/createCredentialsBarrier.test.ts b/packages/backend-defaults/src/entrypoints/httpRouter/http/createCredentialsBarrier.test.ts
similarity index 100%
rename from packages/backend-defaults/src/entrypoints/httpRouter/createCredentialsBarrier.test.ts
rename to packages/backend-defaults/src/entrypoints/httpRouter/http/createCredentialsBarrier.test.ts
diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/createCredentialsBarrier.ts b/packages/backend-defaults/src/entrypoints/httpRouter/http/createCredentialsBarrier.ts
similarity index 99%
rename from packages/backend-defaults/src/entrypoints/httpRouter/createCredentialsBarrier.ts
rename to packages/backend-defaults/src/entrypoints/httpRouter/http/createCredentialsBarrier.ts
index dd6c95ca82..f6332c6d28 100644
--- a/packages/backend-defaults/src/entrypoints/httpRouter/createCredentialsBarrier.ts
+++ b/packages/backend-defaults/src/entrypoints/httpRouter/http/createCredentialsBarrier.ts
@@ -36,6 +36,9 @@ export function createPathPolicyPredicate(policyPath: string) {
};
}
+/**
+ * @public
+ */
export function createCredentialsBarrier(options: {
httpAuth: HttpAuthService;
config: RootConfigService;
diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/createLifecycleMiddleware.test.ts b/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.test.ts
similarity index 96%
rename from packages/backend-defaults/src/entrypoints/httpRouter/createLifecycleMiddleware.test.ts
rename to packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.test.ts
index 31eecf14bb..3b85c8cb92 100644
--- a/packages/backend-defaults/src/entrypoints/httpRouter/createLifecycleMiddleware.test.ts
+++ b/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.test.ts
@@ -15,7 +15,7 @@
*/
import { createLifecycleMiddleware } from './createLifecycleMiddleware';
-import { BackendLifecycleImpl } from '../rootLifecycle/rootLifecycleServiceFactory';
+import { BackendLifecycleImpl } from '../../rootLifecycle/rootLifecycleServiceFactory';
import { mockServices } from '@backstage/backend-test-utils';
import { ServiceUnavailableError } from '@backstage/errors';
diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/createLifecycleMiddleware.ts b/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.ts
similarity index 99%
rename from packages/backend-defaults/src/entrypoints/httpRouter/createLifecycleMiddleware.ts
rename to packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.ts
index 18ff2f0840..3f8ee3ea69 100644
--- a/packages/backend-defaults/src/entrypoints/httpRouter/createLifecycleMiddleware.ts
+++ b/packages/backend-defaults/src/entrypoints/httpRouter/http/createLifecycleMiddleware.ts
@@ -23,7 +23,7 @@ export const DEFAULT_TIMEOUT = { seconds: 5 };
/**
* Options for {@link createLifecycleMiddleware}.
- * @internal
+ * @public
*/
export interface LifecycleMiddlewareOptions {
lifecycle: LifecycleService;
@@ -47,7 +47,7 @@ export interface LifecycleMiddlewareOptions {
* If the service is shutting down, all requests will be rejected with a
* {@link @backstage/errors#ServiceUnavailableError}.
*
- * @internal
+ * @public
*/
export function createLifecycleMiddleware(
options: LifecycleMiddlewareOptions,
diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/http/index.ts b/packages/backend-defaults/src/entrypoints/httpRouter/http/index.ts
new file mode 100644
index 0000000000..d31ea74fe8
--- /dev/null
+++ b/packages/backend-defaults/src/entrypoints/httpRouter/http/index.ts
@@ -0,0 +1,20 @@
+/*
+ * 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 { createAuthIntegrationRouter } from './createAuthIntegrationRouter';
+export { createCredentialsBarrier } from './createCredentialsBarrier';
+export { createLifecycleMiddleware } from './createLifecycleMiddleware';
+export type { LifecycleMiddlewareOptions } from './createLifecycleMiddleware';
+export { createCookieAuthRefreshMiddleware } from './createCookieAuthRefreshMiddleware';
diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/httpRouterServiceFactory.ts b/packages/backend-defaults/src/entrypoints/httpRouter/httpRouterServiceFactory.ts
index fb2646580b..0557cb636d 100644
--- a/packages/backend-defaults/src/entrypoints/httpRouter/httpRouterServiceFactory.ts
+++ b/packages/backend-defaults/src/entrypoints/httpRouter/httpRouterServiceFactory.ts
@@ -21,10 +21,12 @@ import {
createServiceFactory,
HttpRouterServiceAuthPolicy,
} from '@backstage/backend-plugin-api';
-import { createLifecycleMiddleware } from './createLifecycleMiddleware';
-import { createCredentialsBarrier } from './createCredentialsBarrier';
-import { createAuthIntegrationRouter } from './createAuthIntegrationRouter';
-import { createCookieAuthRefreshMiddleware } from './createCookieAuthRefreshMiddleware';
+import {
+ createLifecycleMiddleware,
+ createCookieAuthRefreshMiddleware,
+ createCredentialsBarrier,
+ createAuthIntegrationRouter,
+} from './http';
/**
* HTTP route registration for plugins.
diff --git a/packages/backend-defaults/src/entrypoints/httpRouter/index.ts b/packages/backend-defaults/src/entrypoints/httpRouter/index.ts
index 15bced5ef3..fc9752bdc1 100644
--- a/packages/backend-defaults/src/entrypoints/httpRouter/index.ts
+++ b/packages/backend-defaults/src/entrypoints/httpRouter/index.ts
@@ -15,3 +15,4 @@
*/
export { httpRouterServiceFactory } from './httpRouterServiceFactory';
+export * from './http';
diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/createHealthRouter.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/createHealthRouter.ts
index 3772ab0fab..a22f4f32a0 100644
--- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/createHealthRouter.ts
+++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/createHealthRouter.ts
@@ -14,20 +14,50 @@
* limitations under the License.
*/
-import { RootHealthService } from '@backstage/backend-plugin-api';
+import {
+ RootConfigService,
+ RootHealthService,
+} from '@backstage/backend-plugin-api';
import Router from 'express-promise-router';
import { Request, Response } from 'express';
+const HEADER_CONFIG_KEY = 'backend.health.headers';
+
/**
* @public
*/
-export function createHealthRouter(options: { health: RootHealthService }) {
+export function createHealthRouter(options: {
+ health: RootHealthService;
+ config: RootConfigService;
+}) {
+ const headersConfig = options.config
+ .getOptionalConfig(HEADER_CONFIG_KEY)
+ ?.get();
+ if (headersConfig) {
+ for (const [key, value] of Object.entries(headersConfig)) {
+ if (!key || typeof key !== 'string') {
+ throw new Error(
+ `Invalid header name in at ${HEADER_CONFIG_KEY}, must be a non-empty string`,
+ );
+ }
+ if (!value || typeof value !== 'string') {
+ throw new Error(
+ `Invalid header value in at ${HEADER_CONFIG_KEY}, must be a non-empty string`,
+ );
+ }
+ }
+ }
+ const headers = headersConfig && new Headers(headersConfig as HeadersInit);
+
const router = Router();
router.get(
'/.backstage/health/v1/readiness',
async (_request: Request, response: Response) => {
const { status, payload } = await options.health.getReadiness();
+ if (headers) {
+ response.setHeaders(headers);
+ }
response.status(status).json(payload);
},
);
@@ -36,6 +66,9 @@ export function createHealthRouter(options: { health: RootHealthService }) {
'/.backstage/health/v1/liveness',
async (_request: Request, response: Response) => {
const { status, payload } = await options.health.getLiveness();
+ if (headers) {
+ response.setHeaders(headers);
+ }
response.status(status).json(payload);
},
);
diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/MiddlewareFactory.test.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/MiddlewareFactory.test.ts
index 418d170365..1c140791b6 100644
--- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/MiddlewareFactory.test.ts
+++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/MiddlewareFactory.test.ts
@@ -27,33 +27,22 @@ import express from 'express';
import createError from 'http-errors';
import request from 'supertest';
import { MiddlewareFactory } from './MiddlewareFactory';
-import { ConfigReader } from '@backstage/config';
+import { mockServices } from '@backstage/backend-test-utils';
+
+jest.useFakeTimers({ now: new Date('2024-11-20T00:00:00Z') });
describe('MiddlewareFactory', () => {
describe('middleware.error', () => {
- const childLogger = {
- info: jest.fn(),
- warn: jest.fn(),
- error: jest.fn(),
- debug: jest.fn(),
- child: jest.fn(),
- };
-
- const logger = {
- info: jest.fn(),
- warn: jest.fn(),
- error: jest.fn(),
- debug: jest.fn(),
- child: () => childLogger,
- };
+ const childLogger = mockServices.logger.mock();
+ const logger = mockServices.logger.mock({ child: () => childLogger });
const middleware = MiddlewareFactory.create({
logger,
- config: new ConfigReader({}),
+ config: mockServices.rootConfig.mock(),
});
beforeEach(() => {
- jest.resetAllMocks();
+ jest.clearAllMocks();
});
it('gives default code and message', async () => {
@@ -195,9 +184,7 @@ describe('MiddlewareFactory', () => {
it('should filter out internal errors', async () => {
const app = express();
- const grandChildLogger = {
- error: jest.fn(),
- };
+ const grandChildLogger = mockServices.logger.mock();
childLogger.child.mockReturnValue(grandChildLogger);
class DatabaseError extends Error {}
@@ -254,5 +241,57 @@ describe('MiddlewareFactory', () => {
expect(childLogger.error).toHaveBeenCalled();
});
+
+ it('should log incoming requests', async () => {
+ const app = express();
+ app.use(middleware.logging());
+ app.get('/', (_req, res) => res.send(''));
+
+ await request(app).get('/').expect(200);
+
+ expect(logger.info).toHaveBeenCalledWith(
+ expect.stringContaining(
+ '[2024-11-20T00:00:00.000Z] "GET / HTTP/1.1" 200 0 "-" "-"',
+ ),
+ {
+ type: 'incomingRequest',
+ date: '2024-11-20T00:00:00.000Z',
+ method: 'GET',
+ url: '/',
+ status: 200,
+ httpVersion: '1.1',
+ contentLength: 0,
+ },
+ );
+ });
+
+ it('should log request with all data fields', async () => {
+ const app = express();
+ app.use(middleware.logging());
+ app.get('/', (_req, res) => res.send('Hello World'));
+
+ await request(app)
+ .get('/')
+ .set('User-Agent', 'test-agent')
+ .set('referrer', 'test-referrer')
+ .expect(200);
+
+ expect(logger.info).toHaveBeenCalledWith(
+ expect.stringContaining(
+ '[2024-11-20T00:00:00.000Z] "GET / HTTP/1.1" 200 11 "test-referrer" "test-agent"',
+ ),
+ {
+ type: 'incomingRequest',
+ date: '2024-11-20T00:00:00.000Z',
+ method: 'GET',
+ url: '/',
+ status: 200,
+ httpVersion: '1.1',
+ userAgent: 'test-agent',
+ referrer: 'test-referrer',
+ contentLength: 11,
+ },
+ );
+ });
});
});
diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/MiddlewareFactory.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/MiddlewareFactory.ts
index f38c10820a..1ff9bd15d1 100644
--- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/MiddlewareFactory.ts
+++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/http/MiddlewareFactory.ts
@@ -27,7 +27,6 @@ import {
} from 'express';
import cors from 'cors';
import helmet from 'helmet';
-import morgan from 'morgan';
import compression from 'compression';
import { readHelmetOptions } from './readHelmetOptions';
import { readCorsOptions } from './readCorsOptions';
@@ -45,6 +44,45 @@ import {
import { NotImplementedError } from '@backstage/errors';
import { applyInternalErrorFilter } from './applyInternalErrorFilter';
+type LogMeta = {
+ date: string;
+ method: string;
+ url: string;
+ status: number;
+ httpVersion: string;
+ userAgent?: string;
+ contentLength?: number;
+ referrer?: string;
+};
+
+function getLogMeta(req: Request, res: Response): LogMeta {
+ const referrer = req.headers.referer ?? req.headers.referrer;
+ const userAgent = req.headers['user-agent'];
+ const contentLength = Number(res.getHeader('content-length'));
+
+ const meta: LogMeta = {
+ date: new Date().toISOString(),
+ method: req.method,
+ url: req.originalUrl ?? req.url,
+ status: res.statusCode,
+ httpVersion: `${req.httpVersionMajor}.${req.httpVersionMinor}`,
+ };
+
+ if (userAgent) {
+ meta.userAgent = userAgent;
+ }
+
+ if (isFinite(contentLength)) {
+ meta.contentLength = contentLength;
+ }
+
+ if (referrer) {
+ meta.referrer = Array.isArray(referrer) ? referrer.join(', ') : referrer;
+ }
+
+ return meta;
+}
+
/**
* Options used to create a {@link MiddlewareFactory}.
*
@@ -137,18 +175,24 @@ export class MiddlewareFactory {
* @returns An Express request handler
*/
logging(): RequestHandler {
- const logger = this.#logger.child({
- type: 'incomingRequest',
- });
- const customMorganFormat =
- '[:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"';
- return morgan(customMorganFormat, {
- stream: {
- write(message: string) {
- logger.info(message.trimEnd());
- },
- },
- });
+ const logger = this.#logger;
+ return (req: Request, res: Response, next: NextFunction) => {
+ res.on('finish', () => {
+ const meta = getLogMeta(req, res);
+ logger.info(
+ `[${meta.date}] "${meta.method} ${meta.url} HTTP/${
+ meta.httpVersion
+ }" ${meta.status} ${meta.contentLength ?? 0} "${
+ meta.referrer ?? '-'
+ }" "${meta.userAgent ?? '-'}"`,
+ {
+ type: 'incomingRequest',
+ ...meta,
+ },
+ );
+ });
+ next();
+ };
}
/**
diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts
index dea0159dff..f058c87900 100644
--- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts
+++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.test.ts
@@ -21,42 +21,50 @@ import {
import { Express } from 'express';
import request from 'supertest';
import { rootHttpRouterServiceFactory } from './rootHttpRouterServiceFactory';
-import { coreServices } from '@backstage/backend-plugin-api';
+import { ServiceFactory, coreServices } from '@backstage/backend-plugin-api';
+
+async function createExpressApp(...dependencies: ServiceFactory[]) {
+ let app: Express | undefined = undefined;
+
+ const tester = ServiceFactoryTester.from(
+ rootHttpRouterServiceFactory({
+ configure(options) {
+ options.applyDefaults();
+ app = options.app;
+ },
+ }),
+ {
+ dependencies,
+ },
+ );
+
+ // Trigger creation of the http service, accessing the app instance through the configure callback
+ await tester.getSubject();
+
+ if (!app) {
+ throw new Error('App not yet created');
+ }
+
+ return { app, tester };
+}
describe('rootHttpRouterServiceFactory', () => {
it('should make the health endpoints available', async () => {
- let app: Express | undefined = undefined;
-
- const tester = ServiceFactoryTester.from(
- rootHttpRouterServiceFactory({
- configure(options) {
- options.applyDefaults();
- app = options.app;
+ const { app, tester } = await createExpressApp(
+ mockServices.rootConfig.factory({
+ data: {
+ backend: {
+ listen: { port: 0 },
+ },
},
}),
- {
- dependencies: [
- mockServices.rootConfig.factory({
- data: {
- app: { baseUrl: 'http://localhost' },
- backend: {
- baseUrl: 'http://localhost',
- listen: { host: '', port: 0 },
- },
- },
- }),
- ],
- },
);
- // Trigger creation of the http service, accessing the app instance through the configure callback
- await tester.getSubject();
-
- await request(app!)
+ await request(app)
.get('/.backstage/health/v1/liveness')
.expect(200, { status: 'ok' });
- await request(app!).get('/.backstage/health/v1/readiness').expect(503, {
+ await request(app).get('/.backstage/health/v1/readiness').expect(503, {
message: 'Backend has not started yet',
status: 'error',
});
@@ -65,10 +73,129 @@ describe('rootHttpRouterServiceFactory', () => {
await (lifecycle as any).startup(); // Trigger startup by calling the private startup method
- await request(app!).get('/.backstage/health/v1/readiness').expect(200, {
+ await request(app).get('/.backstage/health/v1/readiness').expect(200, {
status: 'ok',
});
expect('test').toBe('test');
});
+
+ it('should include custom headers for health endpoint', async () => {
+ const { app, tester } = await createExpressApp(
+ mockServices.rootConfig.factory({
+ data: {
+ backend: {
+ listen: { port: 0 },
+ health: {
+ headers: {
+ 'x-test-header': 'test',
+ },
+ },
+ },
+ },
+ }),
+ );
+
+ const lRes = await request(app).get('/.backstage/health/v1/liveness');
+
+ expect(lRes.status).toBe(200);
+ expect(lRes.get('x-test-header')).toBe('test');
+
+ const r1Res = await request(app).get('/.backstage/health/v1/readiness');
+
+ expect(r1Res.status).toBe(503);
+ expect(r1Res.get('x-test-header')).toBe('test');
+
+ await request(app)
+ .get('/.backstage/health/v1/liveness')
+ .expect(200, { status: 'ok' });
+
+ await request(app).get('/.backstage/health/v1/readiness').expect(503, {
+ message: 'Backend has not started yet',
+ status: 'error',
+ });
+
+ const lifecycle = await tester.getService(coreServices.rootLifecycle);
+
+ await (lifecycle as any).startup(); // Trigger startup by calling the private startup method
+
+ const r2Res = await request(app).get('/.backstage/health/v1/readiness');
+
+ expect(r2Res.status).toBe(200);
+ expect(r2Res.get('x-test-header')).toBe('test');
+ });
+
+ it('should reject invalid health headers config', async () => {
+ await expect(
+ createExpressApp(
+ mockServices.rootConfig.factory({
+ data: {
+ backend: {
+ listen: { port: 0 },
+ health: {
+ headers: 'not-an-object',
+ },
+ },
+ },
+ }),
+ ),
+ ).rejects.toThrow(
+ "Invalid type in config for key 'backend.health.headers' in 'mock-config', got string, wanted object",
+ );
+
+ await expect(
+ createExpressApp(
+ mockServices.rootConfig.factory({
+ data: {
+ backend: {
+ listen: { port: 0 },
+ health: {
+ headers: [],
+ },
+ },
+ },
+ }),
+ ),
+ ).rejects.toThrow(
+ "Invalid type in config for key 'backend.health.headers' in 'mock-config', got array, wanted object",
+ );
+
+ await expect(
+ createExpressApp(
+ mockServices.rootConfig.factory({
+ data: {
+ backend: {
+ listen: { port: 0 },
+ health: {
+ headers: {
+ 'invalid-header': {},
+ },
+ },
+ },
+ },
+ }),
+ ),
+ ).rejects.toThrow(
+ 'Invalid header value in at backend.health.headers, must be a non-empty string',
+ );
+
+ await expect(
+ createExpressApp(
+ mockServices.rootConfig.factory({
+ data: {
+ backend: {
+ listen: { port: 0 },
+ health: {
+ headers: {
+ 'invalid-header': '',
+ },
+ },
+ },
+ },
+ }),
+ ),
+ ).rejects.toThrow(
+ 'Invalid header value in at backend.health.headers, must be a non-empty string',
+ );
+ });
});
diff --git a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts
index 59811c15d4..4e3483d67e 100644
--- a/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts
+++ b/packages/backend-defaults/src/entrypoints/rootHttpRouter/rootHttpRouterServiceFactory.ts
@@ -89,7 +89,7 @@ const rootHttpRouterServiceFactoryWithOptions = (
const middleware = MiddlewareFactory.create({ config, logger });
const routes = router.handler();
- const healthRouter = createHealthRouter({ health });
+ const healthRouter = createHealthRouter({ config, health });
const server = await createHttpServer(
app,
readHttpServerOptions(config.getOptionalConfig('backend')),
diff --git a/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.test.ts b/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.test.ts
index 0f9e079943..ec46f22759 100644
--- a/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.test.ts
+++ b/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.test.ts
@@ -93,4 +93,28 @@ describe('WinstonLogger', () => {
expect.any(Function),
);
});
+
+ it('gracefully handles fields that are not castable to a string', () => {
+ const mockTransport = new Transport({
+ log: jest.fn(),
+ logv: jest.fn(),
+ });
+
+ const logger = WinstonLogger.create({
+ transports: [mockTransport],
+ });
+
+ logger.error('something went wrong', {
+ field: Object.create(null),
+ });
+
+ expect(mockTransport.log).toHaveBeenCalledWith(
+ expect.objectContaining({
+ [MESSAGE]: expect.stringContaining(
+ '[field value not castable to string]',
+ ),
+ }),
+ expect.any(Function),
+ );
+ });
});
diff --git a/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.ts b/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.ts
index 38d05f6511..9f7532e66b 100644
--- a/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.ts
+++ b/packages/backend-defaults/src/entrypoints/rootLogger/WinstonLogger.ts
@@ -147,10 +147,17 @@ export class WinstonLogger implements RootLoggerService {
const prefixColor = colorizer.colorize('prefix', prefix);
const extraFields = Object.entries(fields)
- .map(
- ([key, value]) =>
- `${colorizer.colorize('field', `${key}`)}=${value}`,
- )
+ .map(([key, value]) => {
+ let stringValue = '';
+
+ try {
+ stringValue = `${value}`;
+ } catch (e) {
+ stringValue = '[field value not castable to string]';
+ }
+
+ return `${colorizer.colorize('field', `${key}`)}=${stringValue}`;
+ })
.join(' ');
return `${timestampColor} ${prefixColor} ${level} ${message} ${extraFields}`;
diff --git a/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.ts b/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.ts
index 5c04521149..ce1ff823cf 100644
--- a/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.ts
+++ b/packages/backend-defaults/src/entrypoints/scheduler/lib/PluginTaskSchedulerImpl.ts
@@ -24,7 +24,7 @@ import {
SchedulerServiceTaskRunner,
SchedulerServiceTaskScheduleDefinition,
} from '@backstage/backend-plugin-api';
-import { Counter, Histogram, metrics, trace } from '@opentelemetry/api';
+import { Counter, Histogram, Gauge, metrics, trace } from '@opentelemetry/api';
import { Knex } from 'knex';
import { Duration } from 'luxon';
import { LocalTaskWorker } from './LocalTaskWorker';
@@ -44,6 +44,8 @@ export class PluginTaskSchedulerImpl implements SchedulerService {
private readonly counter: Counter;
private readonly duration: Histogram;
+ private readonly lastStarted: Gauge;
+ private readonly lastCompleted: Gauge;
constructor(
private readonly databaseFactory: () => Promise,
@@ -58,6 +60,17 @@ export class PluginTaskSchedulerImpl implements SchedulerService {
description: 'Histogram of task run durations',
unit: 'seconds',
});
+ this.lastStarted = meter.createGauge('backend_tasks.task.runs.started', {
+ description: 'Epoch timestamp seconds when the task was last started',
+ unit: 'seconds',
+ });
+ this.lastCompleted = meter.createGauge(
+ 'backend_tasks.task.runs.completed',
+ {
+ description: 'Epoch timestamp seconds when the task was last completed',
+ unit: 'seconds',
+ },
+ );
this.shutdownInitiated = new Promise(shutdownInitiated => {
rootLifecycle?.addShutdownHook(() => shutdownInitiated(true));
});
@@ -144,6 +157,7 @@ export class PluginTaskSchedulerImpl implements SchedulerService {
scope,
};
this.counter.add(1, { ...labels, result: 'started' });
+ this.lastStarted.record(Date.now() / 1000, { taskId: task.id });
const startTime = process.hrtime();
@@ -170,6 +184,7 @@ export class PluginTaskSchedulerImpl implements SchedulerService {
const endTime = delta[0] + delta[1] / 1e9;
this.counter.add(1, labels);
this.duration.record(endTime, labels);
+ this.lastCompleted.record(Date.now() / 1000, labels);
}
};
}
diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts
new file mode 100644
index 0000000000..069b772a15
--- /dev/null
+++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureBlobStorageUrlReader.ts
@@ -0,0 +1,235 @@
+/*
+ * 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 {
+ BlobDownloadOptions,
+ BlobServiceClient,
+ ContainerClient,
+ StorageSharedKeyCredential,
+} from '@azure/storage-blob';
+import { ReaderFactory, ReadTreeResponseFactory } from './types';
+import { ForwardedError, NotModifiedError } from '@backstage/errors';
+import { Readable } from 'stream';
+import { relative } from 'path/posix';
+import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
+import {
+ AzureBlobStorageIntergation,
+ AzureCredentialsManager,
+ DefaultAzureCredentialsManager,
+ ScmIntegrations,
+} from '@backstage/integration';
+import {
+ UrlReaderService,
+ UrlReaderServiceReadTreeOptions,
+ UrlReaderServiceReadTreeResponse,
+ UrlReaderServiceReadUrlOptions,
+ UrlReaderServiceReadUrlResponse,
+ UrlReaderServiceSearchResponse,
+} from '@backstage/backend-plugin-api';
+
+export function parseUrl(url: string): { path: string; container: string } {
+ const parsedUrl = new URL(url);
+ const pathSegments = parsedUrl.pathname.split('/').filter(Boolean);
+
+ if (pathSegments.length < 2) {
+ throw new Error(`Invalid Azure Blob Storage URL format: ${url}`);
+ }
+
+ // First segment is the container name, rest is the blob path
+ const container = pathSegments[0];
+ const path = pathSegments.slice(1).join('/');
+
+ return { path, container };
+}
+
+/**
+ * Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for Azure storage accounts urls.
+ *
+ * @public
+ */
+export class AzureBlobStorageUrlReader implements UrlReaderService {
+ static factory: ReaderFactory = ({ config, treeResponseFactory }) => {
+ const integrations = ScmIntegrations.fromConfig(config);
+
+ const credsManager =
+ DefaultAzureCredentialsManager.fromIntegrations(integrations);
+
+ return integrations.azureBlobStorage.list().map(integrationConfig => {
+ const reader = new AzureBlobStorageUrlReader(
+ credsManager,
+ integrationConfig,
+ {
+ treeResponseFactory,
+ },
+ );
+
+ const predicate = (url: URL) =>
+ url.host.endsWith(
+ `${integrationConfig.config.accountName}.${integrationConfig.config.host}`,
+ );
+ return { reader, predicate };
+ });
+ };
+
+ // private readonly blobServiceClient: BlobServiceClient;
+
+ constructor(
+ private readonly credsManager: AzureCredentialsManager,
+ private readonly integration: AzureBlobStorageIntergation,
+ private readonly deps: {
+ treeResponseFactory: ReadTreeResponseFactory;
+ },
+ ) {}
+
+ private async createContainerClient(
+ containerName: string,
+ ): Promise {
+ const accountName = this.integration.config.accountName; // Use the account name from the integration config
+ const accountKey = this.integration.config.accountKey; // Get the account key if it exists
+
+ if (accountKey && accountName) {
+ const creds = new StorageSharedKeyCredential(accountName, accountKey);
+ const blobServiceClient = new BlobServiceClient(
+ `https://${accountName}.${this.integration.config.host}`,
+ creds,
+ );
+ return blobServiceClient.getContainerClient(containerName);
+ }
+ // Use the credentials manager to get the correct credentials
+ const credential = await this.credsManager.getCredentials(
+ accountName as string,
+ );
+
+ let blobServiceClientUrl: string;
+
+ if (this.integration.config.endpoint) {
+ if (this.integration.config.sasToken) {
+ blobServiceClientUrl = `${this.integration.config.endpoint}?${this.integration.config.sasToken}`;
+ } else {
+ blobServiceClientUrl = `${this.integration.config.endpoint}`;
+ }
+ } else {
+ blobServiceClientUrl = `https://${this.integration.config.accountName}.${this.integration.config.host}`;
+ }
+
+ const blobServiceClient = new BlobServiceClient(
+ blobServiceClientUrl,
+ credential,
+ );
+ return blobServiceClient.getContainerClient(containerName);
+ }
+
+ async read(url: string): Promise {
+ const response = await this.readUrl(url);
+ return response.buffer();
+ }
+
+ async readUrl(
+ url: string,
+ options?: UrlReaderServiceReadUrlOptions,
+ ): Promise {
+ const { etag, lastModifiedAfter } = options ?? {};
+
+ try {
+ const { path, container } = parseUrl(url);
+
+ const containerClient = await this.createContainerClient(container);
+ const blobClient = containerClient.getBlobClient(path);
+
+ const getBlobOptions: BlobDownloadOptions = {
+ abortSignal: options?.signal,
+ conditions: {
+ ...(etag && { ifNoneMatch: etag }),
+ ...(lastModifiedAfter && { ifModifiedSince: lastModifiedAfter }),
+ },
+ };
+
+ const downloadBlockBlobResponse = await blobClient.download(
+ 0,
+ undefined,
+ getBlobOptions,
+ );
+
+ return ReadUrlResponseFactory.fromReadable(
+ downloadBlockBlobResponse.readableStreamBody as Readable,
+ {
+ etag: downloadBlockBlobResponse.etag,
+ lastModifiedAt: downloadBlockBlobResponse.lastModified,
+ },
+ );
+ } catch (e) {
+ if (e.$metadata && e.$metadata.httpStatusCode === 304) {
+ throw new NotModifiedError();
+ }
+
+ throw new ForwardedError(
+ 'Could not retrieve file from Azure Blob Storage',
+ e,
+ );
+ }
+ }
+
+ async readTree(
+ url: string,
+ options?: UrlReaderServiceReadTreeOptions,
+ ): Promise {
+ try {
+ const { path, container } = parseUrl(url);
+
+ const containerClient = await this.createContainerClient(container);
+
+ const blobs = containerClient.listBlobsFlat({ prefix: path });
+
+ const responses = [];
+
+ for await (const blob of blobs) {
+ const blobClient = containerClient.getBlobClient(blob.name);
+ const downloadBlockBlobResponse = await blobClient.download(
+ undefined,
+ undefined,
+ { abortSignal: options?.signal },
+ );
+
+ responses.push({
+ data: Readable.from(
+ downloadBlockBlobResponse.readableStreamBody as Readable,
+ ),
+ path: relative(path, blob.name),
+ lastModifiedAt: blob.properties.lastModified,
+ });
+ }
+
+ return this.deps.treeResponseFactory.fromReadableArray(responses);
+ } catch (e) {
+ throw new ForwardedError(
+ 'Could not retrieve file tree from Azure Blob Storage',
+ e,
+ );
+ }
+ }
+
+ async search(): Promise {
+ throw new Error('AzureBlobStorageUrlReader does not implement search');
+ }
+
+ toString() {
+ const accountName = this.integration.config.accountName;
+ const accountKey = this.integration.config.accountKey;
+ return `azureBlobStorage{accountName=${accountName},authed=${Boolean(
+ accountKey,
+ )}}`;
+ }
+}
diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureUrlReader.ts
index 50513fcdcc..b46e7c20cd 100644
--- a/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureUrlReader.ts
+++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/AzureUrlReader.ts
@@ -32,9 +32,7 @@ import {
ScmIntegrations,
AzureIntegration,
} from '@backstage/integration';
-import fetch, { Response } from 'node-fetch';
import { Minimatch } from 'minimatch';
-import { Readable } from 'stream';
import { NotFoundError, NotModifiedError } from '@backstage/errors';
import { ReadTreeResponseFactory, ReaderFactory } from './types';
import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
@@ -101,7 +99,7 @@ export class AzureUrlReader implements UrlReaderService {
// for private repos when PAT is not valid, Azure API returns a http status code 203 with sign in page html
if (response.ok && response.status !== 203) {
- return ReadUrlResponseFactory.fromNodeJSReadable(response.body);
+ return ReadUrlResponseFactory.fromResponse(response);
}
const message = `${url} could not be read as ${builtUrl}, ${response.status} ${response.statusText}`;
@@ -172,7 +170,7 @@ export class AzureUrlReader implements UrlReaderService {
}
return await this.deps.treeResponseFactory.fromZipArchive({
- stream: Readable.from(archiveAzureResponse.body),
+ response: archiveAzureResponse,
etag: commitSha,
filter,
subpath,
diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.ts
index b7b733867e..f6742c7423 100644
--- a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.ts
+++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketCloudUrlReader.ts
@@ -32,14 +32,11 @@ import {
getBitbucketCloudRequestOptions,
ScmIntegrations,
} from '@backstage/integration';
-import fetch, { Response } from 'node-fetch';
import parseGitUrl from 'git-url-parse';
import { trimEnd } from 'lodash';
import { Minimatch } from 'minimatch';
-import { Readable } from 'stream';
import { ReaderFactory, ReadTreeResponseFactory } from './types';
import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
-import { parseLastModified } from './util';
/**
* Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for files from Bitbucket Cloud.
@@ -116,12 +113,7 @@ export class BitbucketCloudUrlReader implements UrlReaderService {
}
if (response.ok) {
- return ReadUrlResponseFactory.fromNodeJSReadable(response.body, {
- etag: response.headers.get('ETag') ?? undefined,
- lastModifiedAt: parseLastModified(
- response.headers.get('Last-Modified'),
- ),
- });
+ return ReadUrlResponseFactory.fromResponse(response);
}
const message = `${url} could not be read as ${bitbucketUrl}, ${response.status} ${response.statusText}`;
@@ -159,7 +151,7 @@ export class BitbucketCloudUrlReader implements UrlReaderService {
}
return await this.deps.treeResponseFactory.fromTarArchive({
- stream: Readable.from(archiveResponse.body),
+ response: archiveResponse,
subpath: filepath,
etag: lastCommitShortHash,
filter: options?.filter,
diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.ts
index 332e300cb8..c37cb59308 100644
--- a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.ts
+++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketServerUrlReader.ts
@@ -31,14 +31,11 @@ import {
getBitbucketServerRequestOptions,
ScmIntegrations,
} from '@backstage/integration';
-import fetch, { Response } from 'node-fetch';
import parseGitUrl from 'git-url-parse';
import { trimEnd } from 'lodash';
import { Minimatch } from 'minimatch';
-import { Readable } from 'stream';
import { ReaderFactory, ReadTreeResponseFactory } from './types';
import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
-import { parseLastModified } from './util';
/**
* Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for files from Bitbucket Server APIs.
@@ -107,12 +104,7 @@ export class BitbucketServerUrlReader implements UrlReaderService {
}
if (response.ok) {
- return ReadUrlResponseFactory.fromNodeJSReadable(response.body, {
- etag: response.headers.get('ETag') ?? undefined,
- lastModifiedAt: parseLastModified(
- response.headers.get('Last-Modified'),
- ),
- });
+ return ReadUrlResponseFactory.fromResponse(response);
}
const message = `${url} could not be read as ${bitbucketUrl}, ${response.status} ${response.statusText}`;
@@ -150,7 +142,7 @@ export class BitbucketServerUrlReader implements UrlReaderService {
}
return await this.deps.treeResponseFactory.fromTarArchive({
- stream: Readable.from(archiveResponse.body),
+ response: archiveResponse,
subpath: filepath,
etag: lastCommitShortHash,
filter: options?.filter,
diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketUrlReader.ts
index 55d676ed91..c12998509e 100644
--- a/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketUrlReader.ts
+++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/BitbucketUrlReader.ts
@@ -32,15 +32,12 @@ import {
getBitbucketRequestOptions,
ScmIntegrations,
} from '@backstage/integration';
-import fetch, { Response } from 'node-fetch';
import parseGitUrl from 'git-url-parse';
import { trimEnd } from 'lodash';
import { Minimatch } from 'minimatch';
-import { Readable } from 'stream';
import { LoggerService } from '@backstage/backend-plugin-api';
import { ReaderFactory, ReadTreeResponseFactory } from './types';
import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
-import { parseLastModified } from './util';
/**
* Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for files from Bitbucket v1 and v2 APIs, such
@@ -127,12 +124,7 @@ export class BitbucketUrlReader implements UrlReaderService {
}
if (response.ok) {
- return ReadUrlResponseFactory.fromNodeJSReadable(response.body, {
- etag: response.headers.get('ETag') ?? undefined,
- lastModifiedAt: parseLastModified(
- response.headers.get('Last-Modified'),
- ),
- });
+ return ReadUrlResponseFactory.fromResponse(response);
}
const message = `${url} could not be read as ${bitbucketUrl}, ${response.status} ${response.statusText}`;
@@ -170,7 +162,7 @@ export class BitbucketUrlReader implements UrlReaderService {
}
return await this.deps.treeResponseFactory.fromTarArchive({
- stream: Readable.from(archiveBitbucketResponse.body),
+ response: archiveBitbucketResponse,
subpath: filepath,
etag: lastCommitShortHash,
filter: options?.filter,
diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/FetchUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/FetchUrlReader.ts
index 55041cf036..0e5a279c4d 100644
--- a/packages/backend-defaults/src/entrypoints/urlReader/lib/FetchUrlReader.ts
+++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/FetchUrlReader.ts
@@ -22,11 +22,9 @@ import {
UrlReaderServiceSearchResponse,
} from '@backstage/backend-plugin-api';
import { NotFoundError, NotModifiedError } from '@backstage/errors';
-import fetch, { Response } from 'node-fetch';
import { ReaderFactory } from './types';
import path from 'path';
import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
-import { parseLastModified } from './util';
const isInRange = (num: number, [start, end]: [number, number]) => {
return num >= start && num <= end;
@@ -150,12 +148,7 @@ export class FetchUrlReader implements UrlReaderService {
}
if (response.ok) {
- return ReadUrlResponseFactory.fromNodeJSReadable(response.body, {
- etag: response.headers.get('ETag') ?? undefined,
- lastModifiedAt: parseLastModified(
- response.headers.get('Last-Modified'),
- ),
- });
+ return ReadUrlResponseFactory.fromResponse(response);
}
const message = `could not read ${url}, ${response.status} ${response.statusText}`;
diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.ts
index d8471c43f3..502c2d2ff9 100644
--- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.ts
+++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GiteaUrlReader.ts
@@ -32,7 +32,6 @@ import {
ScmIntegrations,
} from '@backstage/integration';
import { ReaderFactory, ReadTreeResponseFactory } from './types';
-import fetch, { Response } from 'node-fetch';
import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
import {
AuthenticationError,
@@ -149,7 +148,7 @@ export class GiteaUrlReader implements UrlReaderService {
const parsedUri = parseGiteaUrl(this.integration.config, url);
return this.deps.treeResponseFactory.fromTarArchive({
- stream: Readable.from(response.body),
+ response: response,
subpath: parsedUri.path,
etag: lastCommitHash,
filter: options?.filter,
diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.ts
index f5050cca5e..c1d8c02a53 100644
--- a/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.ts
+++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/GitlabUrlReader.ts
@@ -34,11 +34,8 @@ import {
import parseGitUrl from 'git-url-parse';
import { trimEnd, trimStart } from 'lodash';
import { Minimatch } from 'minimatch';
-import fetch, { Response } from 'node-fetch';
-import { Readable } from 'stream';
import { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
import { ReadTreeResponseFactory, ReaderFactory } from './types';
-import { parseLastModified } from './util';
/**
* Implements a {@link @backstage/backend-plugin-api#UrlReaderService} for files on GitLab.
@@ -101,12 +98,7 @@ export class GitlabUrlReader implements UrlReaderService {
}
if (response.ok) {
- return ReadUrlResponseFactory.fromNodeJSReadable(response.body, {
- etag: response.headers.get('ETag') ?? undefined,
- lastModifiedAt: parseLastModified(
- response.headers.get('Last-Modified'),
- ),
- });
+ return ReadUrlResponseFactory.fromResponse(response);
}
const message = `${url} could not be read as ${builtUrl}, ${response.status} ${response.statusText}`;
@@ -228,7 +220,7 @@ export class GitlabUrlReader implements UrlReaderService {
}
return await this.deps.treeResponseFactory.fromTarArchive({
- stream: Readable.from(archiveGitLabResponse.body),
+ response: archiveGitLabResponse,
subpath: filepath,
etag: commitSha,
filter: options?.filter,
diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/ReadUrlResponseFactory.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/ReadUrlResponseFactory.ts
index ecc1bd6101..1f4f297c5a 100644
--- a/packages/backend-defaults/src/entrypoints/urlReader/lib/ReadUrlResponseFactory.ts
+++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/ReadUrlResponseFactory.ts
@@ -19,6 +19,7 @@ import { UrlReaderServiceReadUrlResponse } from '@backstage/backend-plugin-api';
import getRawBody from 'raw-body';
import { Readable } from 'stream';
import { ReadUrlResponseFactoryFromStreamOptions } from './types';
+import { parseLastModified, responseToReadable } from './util';
/**
* Utility class for UrlReader implementations to create valid ReadUrlResponse
@@ -28,7 +29,7 @@ import { ReadUrlResponseFactoryFromStreamOptions } from './types';
*/
export class ReadUrlResponseFactory {
/**
- * Resolves a ReadUrlResponse from a Readable stream.
+ * Resolves a UrlReaderServiceReadUrlResponse from a Readable stream.
*/
static async fromReadable(
stream: Readable,
@@ -64,7 +65,7 @@ export class ReadUrlResponseFactory {
}
/**
- * Resolves a ReadUrlResponse from an old-style NodeJS.ReadableStream.
+ * Resolves a UrlReaderServiceReadUrlResponse from an old-style NodeJS.ReadableStream.
*/
static async fromNodeJSReadable(
oldStyleStream: NodeJS.ReadableStream,
@@ -73,4 +74,21 @@ export class ReadUrlResponseFactory {
const readable = Readable.from(oldStyleStream);
return ReadUrlResponseFactory.fromReadable(readable, options);
}
+
+ /**
+ * Resolves a UrlReaderServiceReadUrlResponse from a native fetch response body.
+ */
+ static async fromResponse(
+ response: Response,
+ ): Promise {
+ const etag = response.headers.get('etag') || undefined;
+ const lastModifiedAt = parseLastModified(
+ response.headers.get('last-modified'),
+ );
+
+ return ReadUrlResponseFactory.fromReadable(responseToReadable(response), {
+ etag,
+ lastModifiedAt,
+ });
+ }
}
diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/UrlReaders.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/UrlReaders.ts
index 96e9ed6509..229bdd4903 100644
--- a/packages/backend-defaults/src/entrypoints/urlReader/lib/UrlReaders.ts
+++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/UrlReaders.ts
@@ -35,6 +35,7 @@ import { AwsS3UrlReader } from './AwsS3UrlReader';
import { GiteaUrlReader } from './GiteaUrlReader';
import { AwsCodeCommitUrlReader } from './AwsCodeCommitUrlReader';
import { HarnessUrlReader } from './HarnessUrlReader';
+import { AzureBlobStorageUrlReader } from './AzureBlobStorageUrlReader';
/**
* Creation options for {@link @backstage/backend-plugin-api#UrlReaderService}.
@@ -99,6 +100,7 @@ export class UrlReaders {
GoogleGcsUrlReader.factory,
HarnessUrlReader.factory,
AwsS3UrlReader.factory,
+ AzureBlobStorageUrlReader.factory,
AwsCodeCommitUrlReader.factory,
FetchUrlReader.factory,
]),
diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/index.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/index.ts
index 678c6ef64b..fc33efbc3a 100644
--- a/packages/backend-defaults/src/entrypoints/urlReader/lib/index.ts
+++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/index.ts
@@ -24,6 +24,7 @@ export { GitlabUrlReader } from './GitlabUrlReader';
export { GiteaUrlReader } from './GiteaUrlReader';
export { HarnessUrlReader } from './HarnessUrlReader';
export { AwsS3UrlReader } from './AwsS3UrlReader';
+export { AzureBlobStorageUrlReader } from './AzureBlobStorageUrlReader';
export { FetchUrlReader } from './FetchUrlReader';
export { ReadUrlResponseFactory } from './ReadUrlResponseFactory';
export type {
diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/ReadTreeResponseFactory.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/ReadTreeResponseFactory.ts
index 1973b2158f..a8f187d7b8 100644
--- a/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/ReadTreeResponseFactory.ts
+++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/tree/ReadTreeResponseFactory.ts
@@ -15,6 +15,7 @@
*/
import os from 'os';
+import { Readable } from 'stream';
import { Config } from '@backstage/config';
import {
ReadTreeResponseFactoryOptions,
@@ -25,6 +26,7 @@ import { TarArchiveResponse } from './TarArchiveResponse';
import { ZipArchiveResponse } from './ZipArchiveResponse';
import { ReadableArrayResponse } from './ReadableArrayResponse';
import { UrlReaderServiceReadTreeResponse } from '@backstage/backend-plugin-api';
+import { responseToReadable } from '../util';
export class DefaultReadTreeResponseFactory implements ReadTreeResponseFactory {
static create(options: { config: Config }): DefaultReadTreeResponseFactory {
@@ -41,11 +43,21 @@ export class DefaultReadTreeResponseFactory implements ReadTreeResponseFactory {
stripFirstDirectory?: boolean;
},
): Promise {
+ let stream: Readable;
+ let etag: string;
+ if ('stream' in options) {
+ stream = options.stream;
+ etag = options.etag;
+ } else {
+ stream = responseToReadable(options.response);
+ etag = (options.etag ?? options.response.headers.get('etag')) || '';
+ }
+
return new TarArchiveResponse(
- options.stream,
+ stream,
options.subpath ?? '',
this.workDir,
- options.etag,
+ etag,
options.filter,
options.stripFirstDirectory ?? true,
);
@@ -54,11 +66,21 @@ export class DefaultReadTreeResponseFactory implements ReadTreeResponseFactory {
async fromZipArchive(
options: ReadTreeResponseFactoryOptions,
): Promise {
+ let stream: Readable;
+ let etag: string;
+ if ('stream' in options) {
+ stream = options.stream;
+ etag = options.etag;
+ } else {
+ stream = responseToReadable(options.response);
+ etag = (options.etag ?? options.response.headers.get('etag')) || '';
+ }
+
return new ZipArchiveResponse(
- options.stream,
+ stream,
options.subpath ?? '',
this.workDir,
- options.etag,
+ etag,
options.filter,
);
}
diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/types.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/types.ts
index 5afbed178f..f8f03a6f3b 100644
--- a/packages/backend-defaults/src/entrypoints/urlReader/lib/types.ts
+++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/types.ts
@@ -60,17 +60,28 @@ export type ReadUrlResponseFactoryFromStreamOptions = {
*
* @public
*/
-export type ReadTreeResponseFactoryOptions = {
- // A binary stream of a tar archive.
- stream: Readable;
- // If unset, the files at the root of the tree will be read.
- // subpath must not contain the name of the top level directory.
- subpath?: string;
- // etag of the blob
- etag: string;
- // Filter passed on from the ReadTreeOptions
- filter?: (path: string, info?: { size: number }) => boolean;
-};
+export type ReadTreeResponseFactoryOptions =
+ | {
+ // A binary stream of a tar archive.
+ stream: Readable;
+ // If unset, the files at the root of the tree will be read.
+ // subpath must not contain the name of the top level directory.
+ subpath?: string;
+ // etag of the blob
+ etag: string;
+ // Filter passed on from the ReadTreeOptions
+ filter?: (path: string, info?: { size: number }) => boolean;
+ }
+ | {
+ /** A response from a fetch request */
+ response: Response;
+ /** If unset, the files at the root of the tree will be read. Subpath must not contain the name of the top level directory. */
+ subpath?: string;
+ /** etag of the blob, to optionally override what the response header may or may not say */
+ etag?: string;
+ /** Filter passed on from the ReadTreeOptions */
+ filter?: (path: string, info?: { size: number }) => boolean;
+ };
/**
* Options that control {@link ReadTreeResponseFactory.fromReadableArray}
diff --git a/packages/backend-defaults/src/entrypoints/urlReader/lib/util.ts b/packages/backend-defaults/src/entrypoints/urlReader/lib/util.ts
index 3d65c2c527..bd19feef2d 100644
--- a/packages/backend-defaults/src/entrypoints/urlReader/lib/util.ts
+++ b/packages/backend-defaults/src/entrypoints/urlReader/lib/util.ts
@@ -14,10 +14,47 @@
* limitations under the License.
*/
-export function parseLastModified(value: string | null | undefined) {
+import { PassThrough, Readable } from 'stream';
+import { ReadableStream as WebReadableStream } from 'stream/web';
+
+export function parseLastModified(
+ value: string | null | undefined,
+): Date | undefined {
if (!value) {
return undefined;
}
- return new Date(value);
+ try {
+ const result = new Date(value);
+ result.toISOString(); // triggers exception if input was invalid
+ return result;
+ } catch {
+ return undefined;
+ }
+}
+
+export function responseToReadable(response: Response): Readable {
+ return response.body
+ ? Readable.from(toWeb(response.body))
+ : new PassThrough().end();
+}
+
+// The NodeJS ReadableStream is that fetch returns is super basic and not even
+// iterable. This function converts it to the smarter, iterable stream/web
+// variant instead.
+export function toWeb(
+ responseBody: ReadableStream,
+): WebReadableStream {
+ const reader = responseBody.getReader();
+ return new WebReadableStream({
+ async pull(controller) {
+ const { value, done } = await reader.read();
+ if (value) {
+ controller.enqueue(value);
+ }
+ if (done) {
+ controller.close();
+ }
+ },
+ });
}
diff --git a/packages/backend-defaults/src/entrypoints/userInfo/DefaultUserInfoService.ts b/packages/backend-defaults/src/entrypoints/userInfo/DefaultUserInfoService.ts
index 83bbba89b7..21f8de5631 100644
--- a/packages/backend-defaults/src/entrypoints/userInfo/DefaultUserInfoService.ts
+++ b/packages/backend-defaults/src/entrypoints/userInfo/DefaultUserInfoService.ts
@@ -22,7 +22,6 @@ import {
} from '@backstage/backend-plugin-api';
import { ResponseError } from '@backstage/errors';
import { decodeJwt } from 'jose';
-import fetch from 'node-fetch';
import { toInternalBackstageCredentials } from '../auth/helpers';
export type Options = {
diff --git a/packages/backend-dynamic-feature-service/CHANGELOG.md b/packages/backend-dynamic-feature-service/CHANGELOG.md
index 290db959be..7d12dd6d13 100644
--- a/packages/backend-dynamic-feature-service/CHANGELOG.md
+++ b/packages/backend-dynamic-feature-service/CHANGELOG.md
@@ -1,5 +1,94 @@
# @backstage/backend-dynamic-feature-service
+## 0.5.2-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.5-next.1
+ - @backstage/plugin-catalog-backend@1.29.0-next.1
+ - @backstage/backend-defaults@0.6.0-next.1
+ - @backstage/plugin-events-backend@0.4.0-next.1
+ - @backstage/plugin-scaffolder-node@0.6.2-next.1
+ - @backstage/plugin-search-backend-node@1.3.6-next.1
+ - @backstage/backend-app-api@1.1.0-next.1
+ - @backstage/config-loader@1.9.3-next.0
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-permission-node@0.8.6-next.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/cli-node@0.2.11-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-app-node@0.1.28-next.1
+ - @backstage/plugin-events-node@0.4.6-next.1
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-search-common@1.2.15
+
+## 0.5.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-app-api@1.0.3-next.0
+ - @backstage/plugin-catalog-backend@1.28.1-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
+ - @backstage/cli-node@0.2.11-next.0
+ - @backstage/plugin-auth-node@0.5.5-next.0
+ - @backstage/plugin-events-backend@0.3.17-next.0
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.0
+ - @backstage/config-loader@1.9.2
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-app-node@0.1.28-next.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
+
+## 0.5.0
+
+### Minor Changes
+
+- e939cd7: **BREAKING** The `dynamicPluginsFeatureLoader` options related to the root logger behavior (`transports`, `level`, `format`) are now gathered under a single `logger` option which is a function taking an optional `Config` argument and returning the logger options.
+
+ This breaking change is required for 2 reasons:
+
+ - it's totally possible that the current `Config` would be required to provide the logger options,
+ - the logger-related options should be gathered under a common `logger` option because, when the root auditing service is introduced, distinct but similarly-named options would be required for the auditor as well.
+
+### Patch Changes
+
+- 1aeec12: Enhance the `CommonJSModuleLoader` to add support for `resolvePackagePath` calls from backend dynamic plugins, with customizable package resolution, and make the `CommonJSModuleLoader` public API.
+ Fixing this backend dynamic plugin limitation related to `resolvePackagePath` is important for backend dynamic plugins which use the database, since database migration scripts systematically use `resolvePackagePath`.
+- 8593dfa: Improve the way alpha packages are supported when loading dynamic backend plugins.
+ The `ScannedPluginPackage` descriptor of dynamic backend plugins loaded from their alpha `package.json` now contain both the main package manifest and the alpha manifest. Previously it used to contain only the content of the alpha `package.json`, which is nearly empty.
+ This will make it easier to use or display metadata of loaded dynamic backend plugins, which is contained in the main manifest.
+- 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-catalog-backend@1.28.0
+ - @backstage/plugin-events-backend@0.3.16
+ - @backstage/config-loader@1.9.2
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-search-backend-node@1.3.5
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/backend-app-api@1.0.2
+ - @backstage/cli-common@0.1.15
+ - @backstage/plugin-scaffolder-node@0.6.0
+ - @backstage/cli-node@0.2.10
+ - @backstage/errors@1.2.5
+ - @backstage/plugin-app-node@0.1.27
+ - @backstage/plugin-permission-node@0.8.5
+ - @backstage/plugin-search-common@1.2.15
+
## 0.5.0-next.3
### Patch Changes
diff --git a/packages/backend-dynamic-feature-service/package.json b/packages/backend-dynamic-feature-service/package.json
index a2047e1efe..49b7e73a68 100644
--- a/packages/backend-dynamic-feature-service/package.json
+++ b/packages/backend-dynamic-feature-service/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-dynamic-feature-service",
- "version": "0.5.0-next.3",
+ "version": "0.5.2-next.1",
"description": "Backstage dynamic feature service",
"backstage": {
"role": "node-library"
diff --git a/packages/backend-legacy/CHANGELOG.md b/packages/backend-legacy/CHANGELOG.md
index 89475b83e5..45577af311 100644
--- a/packages/backend-legacy/CHANGELOG.md
+++ b/packages/backend-legacy/CHANGELOG.md
@@ -1,5 +1,127 @@
# example-backend-legacy
+## 0.2.105-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-search-backend-module-elasticsearch@1.6.3-next.1
+ - @backstage/plugin-auth-backend@0.24.1-next.1
+ - @backstage/plugin-auth-node@0.5.5-next.1
+ - @backstage/plugin-catalog-backend@1.29.0-next.1
+ - @backstage/backend-defaults@0.6.0-next.1
+ - @backstage/plugin-catalog-node@1.15.0-next.1
+ - @backstage/catalog-client@1.9.0-next.1
+ - @backstage/plugin-events-backend@0.4.0-next.1
+ - @backstage/plugin-search-backend@1.8.0-next.1
+ - @backstage/plugin-search-backend-node@1.3.6-next.1
+ - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.1
+ - @backstage/plugin-search-backend-module-explore@0.2.6-next.1
+ - @backstage/plugin-permission-backend@0.5.52-next.1
+ - @backstage/plugin-techdocs-backend@1.11.4-next.1
+ - @backstage/plugin-signals-backend@0.2.4-next.1
+ - @backstage/plugin-proxy-backend@0.5.9-next.1
+ - @backstage/plugin-app-backend@0.4.3-next.1
+ - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.4-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.1
+ - @backstage/plugin-kubernetes-backend@0.19.1-next.1
+ - @backstage/plugin-permission-node@0.8.6-next.1
+ - @backstage/plugin-scaffolder-backend@1.28.0-next.1
+ - @backstage/plugin-signals-node@0.1.15-next.1
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.1
+ - @backstage/plugin-search-backend-module-catalog@0.2.6-next.1
+ - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0-next.1
+ - @backstage/plugin-scaffolder-backend-module-rails@0.5.4-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/plugin-events-node@0.4.6-next.1
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-search-backend-module-pg@0.5.39-next.1
+
+## 0.2.105-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.6.0-next.0
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/plugin-scaffolder-backend@1.28.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.0
+ - @backstage/plugin-search-backend-module-catalog@0.2.6-next.0
+ - @backstage/plugin-search-backend-module-explore@0.2.6-next.0
+ - @backstage/plugin-app-backend@0.4.3-next.0
+ - @backstage/plugin-catalog-backend@1.28.1-next.0
+ - @backstage/plugin-events-node@0.4.6-next.0
+ - @backstage/plugin-scaffolder-backend-module-gitlab@0.7.0-next.0
+ - @backstage/plugin-auth-node@0.5.5-next.0
+ - @backstage/plugin-permission-backend@0.5.52-next.0
+ - @backstage/plugin-devtools-backend@0.4.3-next.0
+ - @backstage/plugin-signals-backend@0.2.4-next.0
+ - @backstage/plugin-events-backend@0.3.17-next.0
+ - @backstage/plugin-kubernetes-backend@0.19.1-next.0
+ - @backstage/catalog-client@1.8.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/config@1.3.0
+ - @backstage/plugin-auth-backend@0.24.1-next.0
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.0
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.0
+ - @backstage/plugin-catalog-node@1.14.1-next.0
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-permission-node@0.8.6-next.0
+ - @backstage/plugin-proxy-backend@0.5.9-next.0
+ - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.3-next.0
+ - @backstage/plugin-scaffolder-backend-module-rails@0.5.3-next.0
+ - @backstage/plugin-search-backend@1.7.1-next.0
+ - @backstage/plugin-search-backend-module-elasticsearch@1.6.3-next.0
+ - @backstage/plugin-search-backend-module-pg@0.5.39-next.0
+ - @backstage/plugin-search-backend-node@1.3.6-next.0
+ - @backstage/plugin-signals-node@0.1.15-next.0
+ - @backstage/plugin-techdocs-backend@1.11.4-next.0
+
+## 0.2.104
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-client@1.8.0
+ - @backstage/config@1.3.0
+ - @backstage/plugin-events-node@0.4.5
+ - @backstage/backend-defaults@0.5.3
+ - @backstage/plugin-app-backend@0.4.0
+ - @backstage/plugin-search-backend-module-catalog@0.2.5
+ - @backstage/plugin-scaffolder-backend@1.27.0
+ - @backstage/plugin-auth-backend@0.24.0
+ - @backstage/plugin-catalog-backend@1.28.0
+ - @backstage/plugin-search-backend@1.7.0
+ - @backstage/plugin-events-backend@0.3.16
+ - @backstage/plugin-scaffolder-backend-module-gitlab@0.6.1
+ - @backstage/plugin-kubernetes-backend@0.19.0
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/plugin-search-backend-module-elasticsearch@1.6.2
+ - @backstage/plugin-search-backend-module-explore@0.2.5
+ - @backstage/plugin-catalog-node@1.14.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-signals-backend@0.2.3
+ - @backstage/plugin-search-backend-module-pg@0.5.38
+ - @backstage/plugin-search-backend-node@1.3.5
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-proxy-backend@0.5.8
+ - @backstage/plugin-signals-node@0.1.14
+ - @backstage/plugin-scaffolder-backend-module-rails@0.5.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/integration@1.15.2
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.2
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.5.2
+ - @backstage/plugin-devtools-backend@0.4.2
+ - @backstage/plugin-permission-backend@0.5.51
+ - @backstage/plugin-permission-node@0.8.5
+ - @backstage/plugin-scaffolder-backend-module-confluence-to-markdown@0.3.2
+ - @backstage/plugin-search-backend-module-techdocs@0.3.2
+ - @backstage/plugin-techdocs-backend@1.11.2
+
## 0.2.104-next.3
### Patch Changes
diff --git a/packages/backend-legacy/package.json b/packages/backend-legacy/package.json
index 9f94bd30de..09157adb3a 100644
--- a/packages/backend-legacy/package.json
+++ b/packages/backend-legacy/package.json
@@ -1,6 +1,6 @@
{
"name": "example-backend-legacy",
- "version": "0.2.104-next.3",
+ "version": "0.2.105-next.1",
"backstage": {
"role": "backend"
},
@@ -42,7 +42,6 @@
"@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "workspace:^",
"@backstage/plugin-catalog-backend-module-unprocessed": "workspace:^",
"@backstage/plugin-catalog-node": "workspace:^",
- "@backstage/plugin-devtools-backend": "workspace:^",
"@backstage/plugin-events-backend": "workspace:^",
"@backstage/plugin-events-node": "workspace:^",
"@backstage/plugin-kubernetes-backend": "workspace:^",
diff --git a/packages/backend-legacy/src/index.ts b/packages/backend-legacy/src/index.ts
index 23f71baba5..8ef969ff2b 100644
--- a/packages/backend-legacy/src/index.ts
+++ b/packages/backend-legacy/src/index.ts
@@ -48,7 +48,6 @@ import techdocs from './plugins/techdocs';
import app from './plugins/app';
import permission from './plugins/permission';
import signals from './plugins/signals';
-import devtools from './plugins/devtools';
import { PluginEnvironment } from './types';
import { ServerPermissionClient } from '@backstage/plugin-permission-node';
import { DefaultIdentityClient } from '@backstage/plugin-auth-node';
@@ -138,7 +137,6 @@ async function main() {
const appEnv = useHotMemoize(module, () => createEnv('app'));
const permissionEnv = useHotMemoize(module, () => createEnv('permission'));
const eventsEnv = useHotMemoize(module, () => createEnv('events'));
- const devToolsEnv = useHotMemoize(module, () => createEnv('devtools'));
const signalsEnv = useHotMemoize(module, () => createEnv('signals'));
const apiRouter = Router();
@@ -151,7 +149,6 @@ async function main() {
apiRouter.use('/kubernetes', await kubernetes(kubernetesEnv));
apiRouter.use('/proxy', await proxy(proxyEnv));
apiRouter.use('/permission', await permission(permissionEnv));
- apiRouter.use('/devtools', await devtools(devToolsEnv));
apiRouter.use('/signals', await signals(signalsEnv));
apiRouter.use(notFoundHandler());
diff --git a/packages/backend-openapi-utils/CHANGELOG.md b/packages/backend-openapi-utils/CHANGELOG.md
index dd268da771..d2d2cabc79 100644
--- a/packages/backend-openapi-utils/CHANGELOG.md
+++ b/packages/backend-openapi-utils/CHANGELOG.md
@@ -1,5 +1,37 @@
# @backstage/backend-openapi-utils
+## 0.3.1-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+
+## 0.3.1-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+
+## 0.3.0
+
+### Minor Changes
+
+- 1440232: Adds a new `createValidatedOpenApiRouterFromGeneratedEndpointMap` function that uses the new static server generation in `backstage-cli package schema openapi generate --server` to create a typed express router.
+
+### Patch Changes
+
+- f01787a: Moves msw from dependencies to devDependencies
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/errors@1.2.5
+
## 0.3.0-next.2
### Minor Changes
diff --git a/packages/backend-openapi-utils/README.md b/packages/backend-openapi-utils/README.md
index 3d3f40682e..33f2200f81 100644
--- a/packages/backend-openapi-utils/README.md
+++ b/packages/backend-openapi-utils/README.md
@@ -1,4 +1,4 @@
-# @backstage/openapi-utils
+# @backstage/backend-openapi-utils
## Summary
diff --git a/packages/backend-openapi-utils/package.json b/packages/backend-openapi-utils/package.json
index bb06c18740..fdb597abd3 100644
--- a/packages/backend-openapi-utils/package.json
+++ b/packages/backend-openapi-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-openapi-utils",
- "version": "0.3.0-next.2",
+ "version": "0.3.1-next.1",
"description": "OpenAPI typescript support.",
"backstage": {
"role": "node-library"
diff --git a/packages/backend-openapi-utils/report.api.md b/packages/backend-openapi-utils/report.api.md
index 399705a9e4..22913eb321 100644
--- a/packages/backend-openapi-utils/report.api.md
+++ b/packages/backend-openapi-utils/report.api.md
@@ -530,7 +530,6 @@ declare namespace internal {
DocEndpointTemplate,
TemplateToDocEndpoint,
EndpointMapRequestMatcher,
- TypedRouter,
};
}
export { internal };
@@ -902,7 +901,8 @@ type TuplifyUnion<
> = true extends N ? [] : Push>, L>;
// @public (undocumented)
-interface TypedRouter extends Router {
+export interface TypedRouter
+ extends Router {
// (undocumented)
delete: EndpointMapRequestMatcher;
// (undocumented)
diff --git a/packages/backend-openapi-utils/src/index.ts b/packages/backend-openapi-utils/src/index.ts
index a66894d473..9389fe3be6 100644
--- a/packages/backend-openapi-utils/src/index.ts
+++ b/packages/backend-openapi-utils/src/index.ts
@@ -30,7 +30,7 @@ export type {
CookieParameters,
PathParameters,
} from './utility';
-export type { ApiRouter } from './router';
+export type { ApiRouter, TypedRouter } from './router';
export type { PathTemplate } from './types/common';
export { wrapInOpenApiTestServer, wrapServer } from './testUtils';
export {
diff --git a/packages/backend-openapi-utils/src/router.ts b/packages/backend-openapi-utils/src/router.ts
index 253fc1596e..48d89054ba 100644
--- a/packages/backend-openapi-utils/src/router.ts
+++ b/packages/backend-openapi-utils/src/router.ts
@@ -14,7 +14,12 @@
* limitations under the License.
*/
import { Router } from 'express';
-import { DocRequestMatcher, RequiredDoc } from './types';
+import {
+ DocRequestMatcher,
+ EndpointMap,
+ EndpointMapRequestMatcher,
+ RequiredDoc,
+} from './types';
/**
* Typed Express router based on an OpenAPI 3.1 spec.
@@ -37,3 +42,14 @@ export interface ApiRouter extends Router {
head: DocRequestMatcher;
}
+
+/**
+ * @public
+ */
+export interface TypedRouter
+ extends Router {
+ get: EndpointMapRequestMatcher;
+ post: EndpointMapRequestMatcher;
+ put: EndpointMapRequestMatcher;
+ delete: EndpointMapRequestMatcher;
+}
diff --git a/packages/backend-openapi-utils/src/stub.ts b/packages/backend-openapi-utils/src/stub.ts
index 615c32cb31..8ab00c4df4 100644
--- a/packages/backend-openapi-utils/src/stub.ts
+++ b/packages/backend-openapi-utils/src/stub.ts
@@ -15,8 +15,8 @@
*/
import PromiseRouter from 'express-promise-router';
-import { ApiRouter } from './router';
-import { EndpointMap, RequiredDoc, TypedRouter } from './types';
+import { ApiRouter, TypedRouter } from './router';
+import { EndpointMap, RequiredDoc } from './types';
import {
ErrorRequestHandler,
RequestHandler,
diff --git a/packages/backend-openapi-utils/src/types/generated.ts b/packages/backend-openapi-utils/src/types/generated.ts
index b0b80f45fb..e4d5dada72 100644
--- a/packages/backend-openapi-utils/src/types/generated.ts
+++ b/packages/backend-openapi-utils/src/types/generated.ts
@@ -13,7 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-import { Router } from 'express';
import type core from 'express-serve-static-core';
import { PathTemplate, ValueOf } from './common';
@@ -209,14 +208,3 @@ export interface EndpointMapRequestMatcher<
>
): T;
}
-
-/**
- * @public
- */
-export interface TypedRouter
- extends Router {
- get: EndpointMapRequestMatcher;
- post: EndpointMapRequestMatcher;
- put: EndpointMapRequestMatcher;
- delete: EndpointMapRequestMatcher;
-}
diff --git a/packages/backend-plugin-api/CHANGELOG.md b/packages/backend-plugin-api/CHANGELOG.md
index 7aa27f59a0..592188d929 100644
--- a/packages/backend-plugin-api/CHANGELOG.md
+++ b/packages/backend-plugin-api/CHANGELOG.md
@@ -1,5 +1,47 @@
# @backstage/backend-plugin-api
+## 1.1.0-next.1
+
+### Minor Changes
+
+- 12eac85: **EXPERIMENTAL**: Adds a new `instanceMetadataService` to hold information about a specific backend instance.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.5-next.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-permission-common@0.8.2
+
+## 1.0.3-next.0
+
+### Patch Changes
+
+- eef3ef1: Removed unused `express` dependencies.
+- Updated dependencies
+ - @backstage/plugin-auth-node@0.5.5-next.0
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+ - @backstage/plugin-permission-common@0.8.2
+
+## 1.0.2
+
+### Patch Changes
+
+- d52d7f9: Support ISO and ms string forms of durations in config too
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/cli-common@0.1.15
+ - @backstage/errors@1.2.5
+
## 1.0.2-next.2
### Patch Changes
diff --git a/packages/backend-plugin-api/package.json b/packages/backend-plugin-api/package.json
index 0bbab5a913..25983cafac 100644
--- a/packages/backend-plugin-api/package.json
+++ b/packages/backend-plugin-api/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-plugin-api",
- "version": "1.0.2-next.2",
+ "version": "1.1.0-next.1",
"description": "Core API used by Backstage backend plugins",
"backstage": {
"role": "node-library"
@@ -61,7 +61,6 @@
"@backstage/types": "workspace:^",
"@types/express": "^4.17.6",
"@types/luxon": "^3.0.0",
- "express": "^4.17.1",
"knex": "^3.0.0",
"luxon": "^3.0.0"
},
diff --git a/packages/backend-plugin-api/report-alpha.api.md b/packages/backend-plugin-api/report-alpha.api.md
index dea357502e..8509d1196d 100644
--- a/packages/backend-plugin-api/report-alpha.api.md
+++ b/packages/backend-plugin-api/report-alpha.api.md
@@ -6,6 +6,18 @@
import { BackendFeature } from '@backstage/backend-plugin-api';
import { ServiceRef } from '@backstage/backend-plugin-api';
+// @alpha (undocumented)
+export type BackendFeatureMeta =
+ | {
+ type: 'plugin';
+ pluginId: string;
+ }
+ | {
+ type: 'module';
+ pluginId: string;
+ moduleId: string;
+ };
+
// @alpha (undocumented)
export interface FeatureDiscoveryService {
// (undocumented)
@@ -21,5 +33,18 @@ export const featureDiscoveryServiceRef: ServiceRef<
'singleton'
>;
+// @alpha (undocumented)
+export interface InstanceMetadataService {
+ // (undocumented)
+ getInstalledFeatures: () => BackendFeatureMeta[];
+}
+
+// @alpha
+export const instanceMetadataServiceRef: ServiceRef<
+ InstanceMetadataService,
+ 'plugin',
+ 'singleton'
+>;
+
// (No @packageDocumentation comment for this package)
```
diff --git a/packages/backend-plugin-api/report.api.md b/packages/backend-plugin-api/report.api.md
index 89dfe40dd9..a886ba4271 100644
--- a/packages/backend-plugin-api/report.api.md
+++ b/packages/backend-plugin-api/report.api.md
@@ -10,7 +10,7 @@ import { AuthorizePermissionResponse } from '@backstage/plugin-permission-common
import { Config } from '@backstage/config';
import { Duration } from 'luxon';
import { EvaluatorRequestOptions } from '@backstage/plugin-permission-common';
-import { Handler } from 'express';
+import type { Handler } from 'express';
import { HumanDuration } from '@backstage/types';
import { isChildPath } from '@backstage/cli-common';
import { JsonObject } from '@backstage/types';
@@ -21,8 +21,8 @@ import { PermissionEvaluator } from '@backstage/plugin-permission-common';
import { QueryPermissionRequest } from '@backstage/plugin-permission-common';
import { QueryPermissionResponse } from '@backstage/plugin-permission-common';
import { Readable } from 'stream';
-import { Request as Request_2 } from 'express';
-import { Response as Response_2 } from 'express';
+import type { Request as Request_2 } from 'express';
+import type { Response as Response_2 } from 'express';
// @public
export interface AuthService {
diff --git a/packages/backend-plugin-api/src/alpha.ts b/packages/backend-plugin-api/src/alpha.ts
index 3f26c66fe9..1a39fe6c23 100644
--- a/packages/backend-plugin-api/src/alpha.ts
+++ b/packages/backend-plugin-api/src/alpha.ts
@@ -34,3 +34,19 @@ export const featureDiscoveryServiceRef =
id: 'core.featureDiscovery',
scope: 'root',
});
+
+/**
+ * EXPERIMENTAL: Instance metadata service.
+ *
+ * @alpha
+ */
+export const instanceMetadataServiceRef = createServiceRef<
+ import('./services/definitions/InstanceMetadataService').InstanceMetadataService
+>({
+ id: 'core.instanceMetadata',
+});
+
+export type {
+ BackendFeatureMeta,
+ InstanceMetadataService,
+} from './services/definitions/InstanceMetadataService';
diff --git a/packages/backend-plugin-api/src/services/definitions/HttpAuthService.ts b/packages/backend-plugin-api/src/services/definitions/HttpAuthService.ts
index 718aa9b532..152bb205de 100644
--- a/packages/backend-plugin-api/src/services/definitions/HttpAuthService.ts
+++ b/packages/backend-plugin-api/src/services/definitions/HttpAuthService.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import { Request, Response } from 'express';
+import type { Request, Response } from 'express';
import { BackstageCredentials, BackstagePrincipalTypes } from './AuthService';
/**
diff --git a/packages/backend-plugin-api/src/services/definitions/HttpRouterService.ts b/packages/backend-plugin-api/src/services/definitions/HttpRouterService.ts
index 92f7e950f9..529d7481f1 100644
--- a/packages/backend-plugin-api/src/services/definitions/HttpRouterService.ts
+++ b/packages/backend-plugin-api/src/services/definitions/HttpRouterService.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import { Handler } from 'express';
+import type { Handler } from 'express';
/**
* Options for {@link HttpRouterService.addAuthPolicy}.
diff --git a/packages/backend-plugin-api/src/services/definitions/InstanceMetadataService.ts b/packages/backend-plugin-api/src/services/definitions/InstanceMetadataService.ts
new file mode 100644
index 0000000000..869d361343
--- /dev/null
+++ b/packages/backend-plugin-api/src/services/definitions/InstanceMetadataService.ts
@@ -0,0 +1,32 @@
+/*
+ * 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.
+ */
+
+/** @alpha */
+export type BackendFeatureMeta =
+ | {
+ type: 'plugin';
+ pluginId: string;
+ }
+ | {
+ type: 'module';
+ pluginId: string;
+ moduleId: string;
+ };
+
+/** @alpha */
+export interface InstanceMetadataService {
+ getInstalledFeatures: () => BackendFeatureMeta[];
+}
diff --git a/packages/backend-plugin-api/src/services/definitions/RootHttpRouterService.ts b/packages/backend-plugin-api/src/services/definitions/RootHttpRouterService.ts
index a1006b749b..8bd0cad874 100644
--- a/packages/backend-plugin-api/src/services/definitions/RootHttpRouterService.ts
+++ b/packages/backend-plugin-api/src/services/definitions/RootHttpRouterService.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import { Handler } from 'express';
+import type { Handler } from 'express';
/**
* HTTP route registration for root services.
diff --git a/packages/backend-test-utils/CHANGELOG.md b/packages/backend-test-utils/CHANGELOG.md
index b18ccbd3be..9e90f4f006 100644
--- a/packages/backend-test-utils/CHANGELOG.md
+++ b/packages/backend-test-utils/CHANGELOG.md
@@ -1,5 +1,70 @@
# @backstage/backend-test-utils
+## 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
diff --git a/packages/backend-test-utils/package.json b/packages/backend-test-utils/package.json
index a214a19525..6ff84c0664 100644
--- a/packages/backend-test-utils/package.json
+++ b/packages/backend-test-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/backend-test-utils",
- "version": "1.1.0-next.3",
+ "version": "1.2.0-next.1",
"description": "Test helpers library for Backstage backends",
"backstage": {
"role": "node-library"
@@ -53,8 +53,8 @@
"@backstage/plugin-auth-node": "workspace:^",
"@backstage/plugin-events-node": "workspace:^",
"@backstage/types": "workspace:^",
- "@keyv/memcache": "^1.3.5",
- "@keyv/redis": "^2.5.3",
+ "@keyv/memcache": "^2.0.1",
+ "@keyv/redis": "^4.0.1",
"@types/express": "^4.17.6",
"@types/express-serve-static-core": "^4.17.5",
"@types/keyv": "^4.2.0",
@@ -63,7 +63,7 @@
"cookie": "^0.7.0",
"express": "^4.17.1",
"fs-extra": "^11.0.0",
- "keyv": "^4.5.2",
+ "keyv": "^5.2.1",
"knex": "^3.0.0",
"mysql2": "^3.0.0",
"pg": "^8.11.3",
diff --git a/packages/backend-test-utils/src/next/wiring/TestBackend.ts b/packages/backend-test-utils/src/next/wiring/TestBackend.ts
index 96bf0f7dc1..42b46f4de7 100644
--- a/packages/backend-test-utils/src/next/wiring/TestBackend.ts
+++ b/packages/backend-test-utils/src/next/wiring/TestBackend.ts
@@ -251,7 +251,7 @@ export async function startTestBackend(
const app = express();
const middleware = MiddlewareFactory.create({ config, logger });
- const healthRouter = createHealthRouter({ health });
+ const healthRouter = createHealthRouter({ config, health });
app.use(healthRouter);
app.use(router.handler());
diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md
index 43eebd51e3..ddca06959f 100644
--- a/packages/backend/CHANGELOG.md
+++ b/packages/backend/CHANGELOG.md
@@ -1,5 +1,119 @@
# example-backend
+## 0.0.33-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/plugin-catalog-backend@1.29.0-next.1
+ - @backstage/backend-defaults@0.6.0-next.1
+ - @backstage/plugin-events-backend@0.4.0-next.1
+ - @backstage/plugin-search-backend@1.8.0-next.1
+ - @backstage/plugin-devtools-backend@0.5.0-next.1
+ - @backstage/plugin-search-backend-node@1.3.6-next.1
+ - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.1
+ - @backstage/plugin-search-backend-module-explore@0.2.6-next.1
+ - @backstage/plugin-notifications-backend@0.4.4-next.1
+ - @backstage/plugin-permission-backend@0.5.52-next.1
+ - @backstage/plugin-techdocs-backend@1.11.4-next.1
+ - @backstage/plugin-signals-backend@0.2.4-next.1
+ - @backstage/plugin-proxy-backend@0.5.9-next.1
+ - @backstage/plugin-app-backend@0.4.3-next.1
+ - @backstage/backend-plugin-api@1.1.0-next.1
+ - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.1
+ - @backstage/plugin-auth-backend-module-guest-provider@0.2.3-next.1
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.1
+ - @backstage/plugin-kubernetes-backend@0.19.1-next.1
+ - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3-next.1
+ - @backstage/plugin-permission-node@0.8.6-next.1
+ - @backstage/plugin-scaffolder-backend@1.28.0-next.1
+ - @backstage/plugin-catalog-backend-module-openapi@0.2.5-next.1
+ - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3-next.1
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.1
+ - @backstage/plugin-search-backend-module-catalog@0.2.6-next.1
+ - @backstage/plugin-scaffolder-backend-module-github@0.5.4-next.1
+ - @backstage/plugin-scaffolder-backend-module-notifications@0.1.5-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/plugin-permission-common@0.8.2
+
+## 0.0.33-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.6.0-next.0
+ - @backstage/plugin-scaffolder-backend@1.28.0-next.0
+ - @backstage/backend-plugin-api@1.0.3-next.0
+ - @backstage/plugin-search-backend-module-techdocs@0.3.4-next.0
+ - @backstage/plugin-search-backend-module-catalog@0.2.6-next.0
+ - @backstage/plugin-search-backend-module-explore@0.2.6-next.0
+ - @backstage/plugin-app-backend@0.4.3-next.0
+ - @backstage/plugin-catalog-backend@1.28.1-next.0
+ - @backstage/plugin-auth-node@0.5.5-next.0
+ - @backstage/plugin-permission-backend@0.5.52-next.0
+ - @backstage/plugin-devtools-backend@0.4.3-next.0
+ - @backstage/plugin-signals-backend@0.2.4-next.0
+ - @backstage/plugin-events-backend@0.3.17-next.0
+ - @backstage/plugin-kubernetes-backend@0.19.1-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/plugin-auth-backend@0.24.1-next.0
+ - @backstage/plugin-auth-backend-module-github-provider@0.2.3-next.0
+ - @backstage/plugin-auth-backend-module-guest-provider@0.2.3-next.0
+ - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.3-next.0
+ - @backstage/plugin-catalog-backend-module-openapi@0.2.5-next.0
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.3-next.0
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.5.3-next.0
+ - @backstage/plugin-notifications-backend@0.4.4-next.0
+ - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.3-next.0
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-permission-node@0.8.6-next.0
+ - @backstage/plugin-proxy-backend@0.5.9-next.0
+ - @backstage/plugin-scaffolder-backend-module-github@0.5.3-next.0
+ - @backstage/plugin-scaffolder-backend-module-notifications@0.1.4-next.0
+ - @backstage/plugin-search-backend@1.7.1-next.0
+ - @backstage/plugin-search-backend-node@1.3.6-next.0
+ - @backstage/plugin-techdocs-backend@1.11.4-next.0
+
+## 0.0.32
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/backend-defaults@0.5.3
+ - @backstage/plugin-app-backend@0.4.0
+ - @backstage/plugin-search-backend-module-catalog@0.2.5
+ - @backstage/plugin-scaffolder-backend@1.27.0
+ - @backstage/plugin-auth-backend@0.24.0
+ - @backstage/plugin-catalog-backend@1.28.0
+ - @backstage/plugin-search-backend@1.7.0
+ - @backstage/plugin-events-backend@0.3.16
+ - @backstage/plugin-kubernetes-backend@0.19.0
+ - @backstage/plugin-auth-node@0.5.4
+ - @backstage/plugin-search-backend-module-explore@0.2.5
+ - @backstage/plugin-catalog-backend-module-openapi@0.2.4
+ - @backstage/backend-plugin-api@1.0.2
+ - @backstage/plugin-notifications-backend@0.4.3
+ - @backstage/plugin-signals-backend@0.2.3
+ - @backstage/plugin-catalog-backend-module-backstage-openapi@0.4.2
+ - @backstage/plugin-search-backend-node@1.3.5
+ - @backstage/plugin-permission-common@0.8.2
+ - @backstage/plugin-proxy-backend@0.5.8
+ - @backstage/plugin-scaffolder-backend-module-notifications@0.1.3
+ - @backstage/plugin-auth-backend-module-guest-provider@0.2.2
+ - @backstage/catalog-model@1.7.1
+ - @backstage/plugin-auth-backend-module-github-provider@0.2.2
+ - @backstage/plugin-catalog-backend-module-scaffolder-entity-model@0.2.2
+ - @backstage/plugin-catalog-backend-module-unprocessed@0.5.2
+ - @backstage/plugin-devtools-backend@0.4.2
+ - @backstage/plugin-permission-backend@0.5.51
+ - @backstage/plugin-permission-backend-module-allow-all-policy@0.2.2
+ - @backstage/plugin-permission-node@0.8.5
+ - @backstage/plugin-scaffolder-backend-module-github@0.5.2
+ - @backstage/plugin-search-backend-module-techdocs@0.3.2
+ - @backstage/plugin-techdocs-backend@1.11.2
+
## 0.0.32-next.3
### Patch Changes
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 255fc68a0e..fb7e396397 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "example-backend",
- "version": "0.0.32-next.3",
+ "version": "0.0.33-next.1",
"backstage": {
"role": "backend"
},
diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts
index d8a4bcb98f..8ae9864a4a 100644
--- a/packages/backend/src/index.ts
+++ b/packages/backend/src/index.ts
@@ -59,5 +59,6 @@ backend.add(searchLoader);
backend.add(import('@backstage/plugin-techdocs-backend'));
backend.add(import('@backstage/plugin-signals-backend'));
backend.add(import('@backstage/plugin-notifications-backend'));
+backend.add(import('./instanceMetadata'));
backend.start();
diff --git a/packages/backend/src/instanceMetadata.ts b/packages/backend/src/instanceMetadata.ts
new file mode 100644
index 0000000000..dd499aa40a
--- /dev/null
+++ b/packages/backend/src/instanceMetadata.ts
@@ -0,0 +1,38 @@
+/*
+ * 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 {
+ coreServices,
+ createBackendPlugin,
+} from '@backstage/backend-plugin-api';
+import { instanceMetadataServiceRef } from '@backstage/backend-plugin-api/alpha';
+
+// Example usage of the instance metadata service to log the installed features.
+export default createBackendPlugin({
+ pluginId: 'instance-metadata-logging',
+ register(env) {
+ env.registerInit({
+ deps: {
+ instanceMetadata: instanceMetadataServiceRef,
+ logger: coreServices.logger,
+ },
+ async init({ instanceMetadata, logger }) {
+ logger.info(
+ `Installed features on this instance: ${instanceMetadata.getInstalledFeatures()}`,
+ );
+ },
+ });
+ },
+});
diff --git a/packages/canon/.eslintrc.js b/packages/canon/.eslintrc.js
new file mode 100644
index 0000000000..f7c0e8cbd1
--- /dev/null
+++ b/packages/canon/.eslintrc.js
@@ -0,0 +1,8 @@
+module.exports = {
+ ...require('@backstage/cli/config/eslint-factory')(__dirname),
+ extends: ['plugin:storybook/recommended'],
+ rules: {
+ 'react/forbid-elements': 'off',
+ },
+};
+
diff --git a/packages/canon/.gitignore b/packages/canon/.gitignore
new file mode 100644
index 0000000000..86fa479d2f
--- /dev/null
+++ b/packages/canon/.gitignore
@@ -0,0 +1,2 @@
+# Build output
+storybook-static
diff --git a/packages/canon/.storybook/main.ts b/packages/canon/.storybook/main.ts
new file mode 100644
index 0000000000..41df32404b
--- /dev/null
+++ b/packages/canon/.storybook/main.ts
@@ -0,0 +1,40 @@
+import type { StorybookConfig } from '@storybook/react-webpack5';
+import { VanillaExtractPlugin } from '@vanilla-extract/webpack-plugin';
+import { merge } from 'webpack-merge';
+
+import { join, dirname } from 'path';
+
+/**
+ * This function is used to resolve the absolute path of a package.
+ * It is needed in projects that use Yarn PnP or are set up within a monorepo.
+ */
+function getAbsolutePath(value: string): any {
+ return dirname(require.resolve(join(value, 'package.json')));
+}
+const config: StorybookConfig = {
+ stories: [
+ '../docs/**/*.mdx',
+ '../src/components/**/*.mdx',
+ '../src/components/**/*.stories.@(js|jsx|mjs|ts|tsx)',
+ ],
+ staticDirs: ['../static'],
+ addons: [
+ getAbsolutePath('@storybook/addon-webpack5-compiler-swc'),
+ getAbsolutePath('@storybook/addon-essentials'),
+ getAbsolutePath('@chromatic-com/storybook'),
+ getAbsolutePath('@storybook/addon-interactions'),
+ getAbsolutePath('@storybook/addon-themes'),
+ ],
+ framework: {
+ name: getAbsolutePath('@storybook/react-webpack5'),
+ options: {
+ plugins: [new VanillaExtractPlugin()],
+ },
+ },
+ webpackFinal: config => {
+ return merge(config, {
+ plugins: [new VanillaExtractPlugin()],
+ });
+ },
+};
+export default config;
diff --git a/packages/canon/.storybook/manager.ts b/packages/canon/.storybook/manager.ts
new file mode 100644
index 0000000000..c88b10b392
--- /dev/null
+++ b/packages/canon/.storybook/manager.ts
@@ -0,0 +1,12 @@
+import { addons } from '@storybook/manager-api';
+import { create } from '@storybook/theming';
+
+const theme = create({
+ base: 'light',
+ brandTitle: 'Canon',
+ brandImage: 'logo.svg',
+});
+
+addons.setConfig({
+ theme,
+});
diff --git a/packages/canon/.storybook/preview.tsx b/packages/canon/.storybook/preview.tsx
new file mode 100644
index 0000000000..bb0c497d2d
--- /dev/null
+++ b/packages/canon/.storybook/preview.tsx
@@ -0,0 +1,45 @@
+import React from 'react';
+import type { Preview, ReactRenderer } from '@storybook/react';
+import { withThemeByDataAttribute } from '@storybook/addon-themes';
+
+// Storybook specific styles
+import '../docs/components/styles.css';
+
+// Canon specific styles
+import '../src/theme/styles.css';
+
+const preview: Preview = {
+ parameters: {
+ controls: {
+ matchers: {
+ color: /(background|color)$/i,
+ date: /Date$/i,
+ },
+ },
+ backgrounds: {
+ disable: true,
+ },
+ },
+ decorators: [
+ withThemeByDataAttribute({
+ themes: {
+ light: 'light',
+ dark: 'dark',
+ },
+ defaultTheme: 'light',
+ }),
+ (Story, context) => {
+ document.body.style.backgroundColor = 'var(--canon-background)';
+
+ const docsStoryElements = document.getElementsByClassName('docs-story');
+ Array.from(docsStoryElements).forEach(element => {
+ (element as HTMLElement).style.backgroundColor =
+ 'var(--canon-background)';
+ });
+
+ return ;
+ },
+ ],
+};
+
+export default preview;
diff --git a/packages/canon/README.md b/packages/canon/README.md
new file mode 100644
index 0000000000..a8bf36d7be
--- /dev/null
+++ b/packages/canon/README.md
@@ -0,0 +1,12 @@
+# @backstage/canon
+
+_This package was created through the Backstage CLI_.
+
+## Installation
+
+Install the package via Yarn:
+
+```sh
+cd # if within a monorepo
+yarn add @backstage/canon
+```
diff --git a/packages/canon/catalog-info.yaml b/packages/canon/catalog-info.yaml
new file mode 100644
index 0000000000..37aa7b1caf
--- /dev/null
+++ b/packages/canon/catalog-info.yaml
@@ -0,0 +1,9 @@
+apiVersion: backstage.io/v1alpha1
+kind: Component
+metadata:
+ name: backstage-canon
+ title: '@backstage/canon'
+spec:
+ lifecycle: experimental
+ type: backstage-web-library
+ owner: maintainers
diff --git a/packages/canon/docs/Home.mdx b/packages/canon/docs/Home.mdx
new file mode 100644
index 0000000000..5b85ab15ad
--- /dev/null
+++ b/packages/canon/docs/Home.mdx
@@ -0,0 +1,91 @@
+import { Unstyled } from '@storybook/blocks';
+import {
+ Columns,
+ Text,
+ ComponentStatus,
+ Banner,
+ Title,
+ Roadmap,
+} from './components';
+import { list } from './components/Roadmap/list';
+
+
+
+
+
+
+ Welcome to the Canon, the new design library for Backstage plugins. This
+ project is still under active development but we will make sure to document
+ the API as we go. We are aiming to improve the general UI of Backstage and
+ plugins across Backstage. This new library will take time to build but we are
+ building it incrementally with not conflict with the existing theming system.
+
+
+
+ This library is still under heavy construction. Please be aware that the API
+ will change until we reach a stable release.
+
+
+
+ Component Status
+
+
+ We are still in the process of documenting the API and building the
+ components. You can use the statuses below to see what is ready and what is
+ coming soon. If there is a component missing that you need, please let us know
+ by opening an issue on GitHub.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Roadmap
+
+
+
+
+
diff --git a/packages/canon/docs/Iconography.mdx b/packages/canon/docs/Iconography.mdx
new file mode 100644
index 0000000000..48cbd2e431
--- /dev/null
+++ b/packages/canon/docs/Iconography.mdx
@@ -0,0 +1,20 @@
+import { Unstyled, Source } from '@storybook/blocks';
+import { Title, Text, IconLibrary } from './components';
+
+
+
+Iconography
+
+
+ All our default icons are provided by [Remix Icon](https://remixicon.com/). We
+ don't import all icons to reduce the bundle size but we cherry pick a nice
+ selection for you to use in your application. The list of names is set down
+ below. To use an icon, you can use the `Icon` component and pass the name of
+ the icon you want to use.
+
+
+`} language="tsx" dark />
+
+
+
+
diff --git a/packages/canon/docs/Layout.mdx b/packages/canon/docs/Layout.mdx
new file mode 100644
index 0000000000..72344672b6
--- /dev/null
+++ b/packages/canon/docs/Layout.mdx
@@ -0,0 +1,52 @@
+import { Unstyled, Source } from '@storybook/blocks';
+import { Title, Text, LayoutComponents } from './components';
+import * as Table from './components/Table';
+
+
+
+Layout
+
+ Canon is made for extensibility. We built this library to make it easy for any
+ Backstage plugin creator to be able to build their ideas at speed ensuring
+ consistency across the rest of your ecosystem. Each component is designed to
+ be editable to match your need but sometimes you want to have more control
+ over the layout of your page. To help you with that, we created a set of
+ layout components that you can use to build your own layouts. All of these
+ components are built to extend on our theming system, making it easy for you
+ to build your own layouts. Sometimes these components are not enough so we
+ created a set of helpers to be used with any CSS-in-JS library.
+
+
+Layout Components
+
+
+ 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
+
+`}
+ language="tsx"
+ dark
+/>
+
+
+
+Layout Helpers
+
+
+ Sometimes you want to use global tokens dynamically outside of React
+ components. To help you with that we would like to provide a set of helpers
+ that you can use in your code. These helpers are not available just yet but we
+ are working on it.
+
+
+
diff --git a/packages/canon/docs/Theme.mdx b/packages/canon/docs/Theme.mdx
new file mode 100644
index 0000000000..3d76b4e998
--- /dev/null
+++ b/packages/canon/docs/Theme.mdx
@@ -0,0 +1,229 @@
+import { Unstyled, Source } from '@storybook/blocks';
+import { Title, Text, Chip } from './components';
+import * as Table from './components/Table';
+
+
+
+Theming
+
+ Backstage ships with a default theme with a light and dark mode variant. The
+ themes are provided as a part of the `@backstage/canon` package, which also
+ includes utilities for customizing the default theme, or creating completely
+ new themes.
+
+
+Light & Dark modes
+
+ By default we are supporting both light and dark modes. Each user can opt to
+ choose what theme they want to use or to use their system decide what theme to
+ use. If you want to create your own theme, you will have to set both light and
+ dark themes following the instructions below. If you only set one of them, the
+ other mode will fallback to the default theme.
+
+
+How to create your own theme
+
+ To create your own theme, you will have to define the variables below. To do
+ that, create a theme.css file and import it in your application. Here's an
+ example below on how to set your light and dark mode.
+
+
+
+Colors
+
+ We provide a set of generic colours tokens that we use across Canon. By
+ changing these colours you can easily change the look and feel of your
+ application to match your brand.
+
+
+
+
+ Prop
+ Description
+
+
+
+
+
+ --canon-accent
+
+ The accent color for the theme.
+
+
+
+ --canon-bg
+
+ The background color for the theme.
+
+
+
+ --canon-surface-1
+
+ The first surface color for the theme.
+
+
+
+ --canon-surface-2
+
+ The second surface color for the theme.
+
+
+
+ --canon-outline
+
+ The outline color for the theme.
+
+
+
+ --canon-outline-focus
+
+ The outline focus color for the theme.
+
+
+
+ --canon-text-primary
+
+ The primary text color for the theme.
+
+
+
+ --canon-text-secondary
+
+ The secondary text color for the theme.
+
+
+
+
+Typography
+
+ We have two fonts that we use across Canon. The first one is the sans-serif
+ font that we use for the body of the application. The second one is the
+ monospace font that we use for code blocks and tables.
+
+
+
+
+
+ Prop
+ Description
+
+
+
+
+
+ --canon-font-regular
+
+ The sans-serif font for the theme.
+
+
+
+ --canon-font-mono
+
+ The monospace font for the theme.
+
+
+
+
+Spacing
+
+ Our default spacing system is made to work in most scenarios. We have 7 scale
+ values from `xxs` to `xxl`. We use the values on padding and margin in our
+ layout components mostly. If you prefer to use a different spacing system, you
+ can do that by changing the values below.
+
+
+
+
+
+ Prop
+ Description
+
+
+
+
+
+ --canon-space-unit
+
+
+ The base unit for the spacing system. Default value is `1em`
+
+
+
+
+ --canon-space-xxs
+
+ Default value is `0.25 x space unit`
+
+
+
+ --canon-space-xs
+
+ Default value is `0.5 x space unit`
+
+
+
+ --canon-space-sm
+
+ Default value is `0.75 x space unit`
+
+
+
+ --canon-space-md
+
+ Default value is `1.25 x space unit`
+
+
+
+ --canon-space-lg
+
+ Default value is `2 x space unit`
+
+
+
+ --canon-space-xl
+
+ Default value is `3.25 x space unit`
+
+
+
+ --canon-space-xxl
+
+ Default value is `5.25 x space unit`
+
+
+
+
+
diff --git a/packages/canon/docs/components/Banner/banner.css.ts b/packages/canon/docs/components/Banner/banner.css.ts
new file mode 100644
index 0000000000..2dfe443f41
--- /dev/null
+++ b/packages/canon/docs/components/Banner/banner.css.ts
@@ -0,0 +1,61 @@
+/*
+ * 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 { recipe } from '@vanilla-extract/recipes';
+import { globalStyle, style } from '@vanilla-extract/css';
+
+export const bannerStyles = recipe({
+ base: {
+ display: 'flex',
+ alignItems: 'center',
+ fontFamily: '"Geist", sans-serif',
+ fontSize: '16px',
+ lineHeight: '28px',
+ padding: '16px',
+ borderRadius: '6px',
+ marginBottom: '16px',
+ border: '1px solid #e0e0e0',
+ },
+ variants: {
+ variant: {
+ info: {
+ backgroundColor: '#F2F2F2',
+ borderColor: '#CDCDCD',
+ color: '#888888',
+ },
+ warning: {
+ backgroundColor: '#FFF2B9',
+ borderColor: '#FFD000',
+ color: '#D79927',
+ },
+ },
+ },
+});
+
+globalStyle(`${bannerStyles.classNames.base} p`, {
+ margin: '0',
+});
+
+export const bannerIconStyles = style({
+ width: '32px',
+ height: '32px',
+ backgroundColor: 'rgba(215, 153, 39, 0.2)',
+ borderRadius: '6px',
+ marginRight: '16px',
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+});
diff --git a/packages/canon/docs/components/Banner/index.tsx b/packages/canon/docs/components/Banner/index.tsx
new file mode 100644
index 0000000000..c3036eac03
--- /dev/null
+++ b/packages/canon/docs/components/Banner/index.tsx
@@ -0,0 +1,42 @@
+/*
+ * 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 React from 'react';
+import { bannerIconStyles, bannerStyles } from './banner.css';
+
+export const Banner = ({
+ children,
+ variant = 'info',
+}: {
+ children: React.ReactNode;
+ variant?: 'info' | 'warning';
+}) => {
+ return (
+
+
+
+
+ {children}
+
+ );
+};
diff --git a/packages/canon/docs/components/Chip/chip.css.ts b/packages/canon/docs/components/Chip/chip.css.ts
new file mode 100644
index 0000000000..027a722f84
--- /dev/null
+++ b/packages/canon/docs/components/Chip/chip.css.ts
@@ -0,0 +1,42 @@
+/*
+ * 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 { recipe } from '@vanilla-extract/recipes';
+
+export const chipStyles = recipe({
+ base: {
+ display: 'inline-flex',
+ alignItems: 'center',
+ fontFamily: 'Geist Mono, monospace',
+ fontSize: '13px',
+ borderRadius: '6px',
+ padding: '0px 8px',
+ height: '24px',
+ marginRight: '4px',
+ },
+ variants: {
+ head: {
+ true: {
+ backgroundColor: '#eaf2fd',
+ color: '#2563eb',
+ },
+ false: {
+ backgroundColor: '#f0f0f0',
+ color: '#5d5d5d',
+ },
+ },
+ },
+});
diff --git a/packages/canon/docs/components/Chip/index.tsx b/packages/canon/docs/components/Chip/index.tsx
new file mode 100644
index 0000000000..81609dda61
--- /dev/null
+++ b/packages/canon/docs/components/Chip/index.tsx
@@ -0,0 +1,28 @@
+/*
+ * 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 React from 'react';
+import { chipStyles } from './chip.css';
+
+export const Chip = ({
+ children,
+ head = false,
+}: {
+ children: React.ReactNode;
+ head?: boolean;
+}) => {
+ return {children};
+};
diff --git a/packages/canon/docs/components/Columns/columns.css.ts b/packages/canon/docs/components/Columns/columns.css.ts
new file mode 100644
index 0000000000..0b5ec18aef
--- /dev/null
+++ b/packages/canon/docs/components/Columns/columns.css.ts
@@ -0,0 +1,24 @@
+/*
+ * 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 { style } from '@vanilla-extract/css';
+
+export const styles = style({
+ display: 'grid',
+ gridTemplateColumns: 'repeat(3, 1fr)',
+ rowGap: '20px',
+ columnGap: '80px',
+});
diff --git a/packages/canon/docs/components/Columns/index.tsx b/packages/canon/docs/components/Columns/index.tsx
new file mode 100644
index 0000000000..0d6f27f04d
--- /dev/null
+++ b/packages/canon/docs/components/Columns/index.tsx
@@ -0,0 +1,32 @@
+/*
+ * 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 React from 'react';
+import { styles } from './columns.css';
+
+export const Columns = ({
+ children,
+ style,
+}: {
+ children: React.ReactNode;
+ style?: React.CSSProperties;
+}) => {
+ return (
+
+ {children}
+
+ );
+};
diff --git a/packages/canon/docs/components/ComponentStatus/component-status.css.ts b/packages/canon/docs/components/ComponentStatus/component-status.css.ts
new file mode 100644
index 0000000000..5cce5adb5d
--- /dev/null
+++ b/packages/canon/docs/components/ComponentStatus/component-status.css.ts
@@ -0,0 +1,77 @@
+/*
+ * 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 { style } from '@vanilla-extract/css';
+import { recipe } from '@vanilla-extract/recipes';
+
+export const container = style({
+ display: 'flex',
+ justifyContent: 'space-between',
+});
+
+export const title = style({
+ color: '#3b59ff',
+ fontFamily: '"Geist", sans-serif',
+ fontSize: '16px',
+ fontWeight: 400,
+ textDecoration: 'none',
+});
+
+export const pill = recipe({
+ base: {
+ fontFamily: '"Geist", sans-serif',
+ display: 'inline-flex',
+ alignItems: 'center',
+ color: '#000',
+ borderRadius: '40px',
+ padding: '0px 8px',
+ height: '24px',
+ fontSize: '12px',
+ fontWeight: 600,
+ borderStyle: 'solid',
+ borderWidth: '1px',
+ marginLeft: '8px',
+ },
+ variants: {
+ status: {
+ notStarted: {
+ backgroundColor: '#F2F2F2',
+ borderColor: '#CDCDCD',
+ color: '#888888',
+ },
+ inProgress: {
+ backgroundColor: '#FFF2B9',
+ borderColor: '#FFD000',
+ color: '#D79927',
+ },
+ alpha: {
+ backgroundColor: '#D7F9D7',
+ borderColor: '#4ED14A',
+ color: '#3A9837',
+ },
+ beta: {
+ backgroundColor: '#D7F9D7',
+ borderColor: '#4ED14A',
+ color: '#3A9837',
+ },
+ stable: {
+ backgroundColor: '#D7F9D7',
+ borderColor: '#4ED14A',
+ color: '#3A9837',
+ },
+ },
+ },
+});
diff --git a/packages/canon/docs/components/ComponentStatus/index.tsx b/packages/canon/docs/components/ComponentStatus/index.tsx
new file mode 100644
index 0000000000..64d552ea97
--- /dev/null
+++ b/packages/canon/docs/components/ComponentStatus/index.tsx
@@ -0,0 +1,49 @@
+/*
+ * 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 React from 'react';
+import { container, pill, title } from './component-status.css';
+
+export const ComponentStatus = ({
+ name,
+ status = 'notStarted',
+ style,
+ link,
+}: {
+ name: string;
+ status: 'notStarted' | 'inProgress' | 'alpha' | 'beta' | 'stable';
+ style?: React.CSSProperties;
+ link?: string;
+}) => {
+ return (
+
+ );
+};
diff --git a/packages/canon/docs/components/IconLibrary/index.tsx b/packages/canon/docs/components/IconLibrary/index.tsx
new file mode 100644
index 0000000000..6e94c2c777
--- /dev/null
+++ b/packages/canon/docs/components/IconLibrary/index.tsx
@@ -0,0 +1,37 @@
+/*
+ * 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 React from 'react';
+import { Icon } from '@backstage/canon';
+import type { IconNames } from '@backstage/canon';
+import { defaultIcons } from '../../../src/components/Icon/icons';
+import { Text } from '../Text';
+
+export const IconLibrary = () => {
+ const icons = Object.keys(defaultIcons);
+
+ return (
+
+ {icons.map(icon => (
+
+
+
+
+ {icon}
+
+ ))}
+
+ );
+};
diff --git a/packages/canon/docs/components/IconLibrary/styles.css b/packages/canon/docs/components/IconLibrary/styles.css
new file mode 100644
index 0000000000..1a6f63ca79
--- /dev/null
+++ b/packages/canon/docs/components/IconLibrary/styles.css
@@ -0,0 +1,22 @@
+.icon-library {
+ display: grid;
+ grid-template-columns: repeat(6, 1fr);
+ gap: 1rem;
+}
+
+.icon-library-item {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 8px;
+}
+
+.icon-library-item-icon {
+ display: flex;
+ width: 100%;
+ justify-content: center;
+ align-items: center;
+ height: 80px;
+ border: 1px solid #d3d3d3;
+ border-radius: 0.5rem;
+}
diff --git a/packages/canon/docs/components/LayoutComponents/box.tsx b/packages/canon/docs/components/LayoutComponents/box.tsx
new file mode 100644
index 0000000000..1749b38c6f
--- /dev/null
+++ b/packages/canon/docs/components/LayoutComponents/box.tsx
@@ -0,0 +1,54 @@
+/*
+ * 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 React from 'react';
+
+export const BoxSvg = () => {
+ return (
+
+ );
+};
diff --git a/packages/canon/docs/components/LayoutComponents/container.tsx b/packages/canon/docs/components/LayoutComponents/container.tsx
new file mode 100644
index 0000000000..62fe4ce266
--- /dev/null
+++ b/packages/canon/docs/components/LayoutComponents/container.tsx
@@ -0,0 +1,373 @@
+/*
+ * 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 React from 'react';
+
+export const ContainerSvg = () => {
+ return (
+
+ );
+};
diff --git a/packages/canon/docs/components/LayoutComponents/grid.tsx b/packages/canon/docs/components/LayoutComponents/grid.tsx
new file mode 100644
index 0000000000..5527d1f3e2
--- /dev/null
+++ b/packages/canon/docs/components/LayoutComponents/grid.tsx
@@ -0,0 +1,91 @@
+/*
+ * 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 React from 'react';
+
+export const GridSvg = () => {
+ return (
+
+ );
+};
diff --git a/packages/canon/docs/components/LayoutComponents/index.tsx b/packages/canon/docs/components/LayoutComponents/index.tsx
new file mode 100644
index 0000000000..92fab7c47f
--- /dev/null
+++ b/packages/canon/docs/components/LayoutComponents/index.tsx
@@ -0,0 +1,71 @@
+/*
+ * 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 React from 'react';
+import {
+ container,
+ box,
+ content,
+ title,
+ description,
+} from './layout-components.css';
+import { BoxSvg } from './box';
+import { StackSvg } from './stack';
+import { GridSvg } from './grid';
+import { InlineSvg } from './inline';
+import { ContainerSvg } from './container';
+
+export const LayoutComponents = () => {
+ return (
+
+ );
+};
diff --git a/packages/canon/docs/components/LayoutComponents/inline.tsx b/packages/canon/docs/components/LayoutComponents/inline.tsx
new file mode 100644
index 0000000000..fadb9bfc1b
--- /dev/null
+++ b/packages/canon/docs/components/LayoutComponents/inline.tsx
@@ -0,0 +1,92 @@
+/*
+ * 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 React from 'react';
+
+export const InlineSvg = () => {
+ return (
+
+ );
+};
diff --git a/packages/canon/docs/components/LayoutComponents/layout-components.css.ts b/packages/canon/docs/components/LayoutComponents/layout-components.css.ts
new file mode 100644
index 0000000000..47d9a13111
--- /dev/null
+++ b/packages/canon/docs/components/LayoutComponents/layout-components.css.ts
@@ -0,0 +1,63 @@
+/*
+ * 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 { style } from '@vanilla-extract/css';
+
+export const container = style({
+ display: 'flex',
+ justifyContent: 'flex-start',
+ gap: '1rem',
+ flexWrap: 'wrap',
+});
+
+export const box = style({
+ display: 'flex',
+ flexDirection: 'column',
+ width: 'calc(33.33% - 0.67rem)',
+ marginBottom: '1rem',
+ alignItems: 'flex-start',
+});
+
+export const content = style({
+ flex: 'none',
+ background: 'linear-gradient(180deg, #F3F3F3 0%, #FFF 100%)',
+ borderRadius: '4px',
+ width: '100%',
+ height: '180px',
+ transition: 'all 0.2s ease-in-out',
+ marginBottom: '0.75rem',
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+ selectors: {
+ [`${box}:hover &`]: {
+ transform: 'translateY(-4px)',
+ },
+ },
+});
+
+export const title = style({
+ fontSize: '16px',
+ fontFamily: 'var(--canon-font-regular)',
+ transition: 'color 0.2s ease-in-out',
+ marginBottom: '0.25rem',
+});
+
+export const description = style({
+ fontSize: '16px',
+ fontFamily: 'var(--canon-font-regular)',
+ color: '#9e9e9e',
+});
diff --git a/packages/canon/docs/components/LayoutComponents/stack.tsx b/packages/canon/docs/components/LayoutComponents/stack.tsx
new file mode 100644
index 0000000000..aeda998d2e
--- /dev/null
+++ b/packages/canon/docs/components/LayoutComponents/stack.tsx
@@ -0,0 +1,82 @@
+/*
+ * 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 React from 'react';
+
+export const StackSvg = () => {
+ return (
+
+ );
+};
diff --git a/packages/canon/docs/components/PropsTable/PropsTable.tsx b/packages/canon/docs/components/PropsTable/PropsTable.tsx
new file mode 100644
index 0000000000..a3dc9e271c
--- /dev/null
+++ b/packages/canon/docs/components/PropsTable/PropsTable.tsx
@@ -0,0 +1,57 @@
+/*
+ * 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 React from 'react';
+import * as Table from '..';
+import { Chip } from '..';
+
+// Modify the PropsTable component to accept a generic type
+export const PropsTable = >({
+ data,
+}: {
+ data: T;
+}) => {
+ return (
+
+
+
+ Prop
+ Type
+ Responsive
+
+
+
+ {Object.keys(data).map(n => (
+
+
+ {n}
+
+
+ {Array.isArray(data[n].type) ? (
+ data[n].type.map((t: any) => {t})
+ ) : (
+ {data[n].type}
+ )}
+
+
+ {data[n].responsive ? 'Yes' : 'No'}
+
+
+ ))}
+
+
+ );
+};
diff --git a/packages/canon/docs/components/PropsTable/getProps.ts b/packages/canon/docs/components/PropsTable/getProps.ts
new file mode 100644
index 0000000000..866dcb9d10
--- /dev/null
+++ b/packages/canon/docs/components/PropsTable/getProps.ts
@@ -0,0 +1,43 @@
+/*
+ * 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 function getBoxProps(styles: Record) {
+ return Object.keys(styles).reduce(
+ (acc: Record, n) => {
+ const style = styles[n];
+
+ let values: string[] = [];
+
+ if (style.values) {
+ // If values exist, use them
+ values = Object.keys(style.values);
+ } else if (style.mappings && style.mappings.length > 0) {
+ // If mappings exist, use the first mapping's values
+ const firstMapping = style.mappings[0];
+ values = Object.keys(styles[firstMapping].values);
+ } else {
+ // Default to an empty array if neither values nor mappings exist
+ values = [];
+ }
+
+ acc[n] = {
+ type: values,
+ responsive: true,
+ };
+ return acc;
+ },
+ {} as Record,
+ );
+}
diff --git a/packages/canon/docs/components/PropsTable/index.ts b/packages/canon/docs/components/PropsTable/index.ts
new file mode 100644
index 0000000000..010452ee2a
--- /dev/null
+++ b/packages/canon/docs/components/PropsTable/index.ts
@@ -0,0 +1,17 @@
+/*
+ * 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 { PropsTable } from './PropsTable';
+export { getBoxProps } from './getProps';
diff --git a/packages/canon/docs/components/Roadmap/index.tsx b/packages/canon/docs/components/Roadmap/index.tsx
new file mode 100644
index 0000000000..2177ea558f
--- /dev/null
+++ b/packages/canon/docs/components/Roadmap/index.tsx
@@ -0,0 +1,53 @@
+/*
+ * 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 React from 'react';
+import { RoadmapItem } from './list';
+
+export const Roadmap = ({ list }: { list: RoadmapItem[] }) => {
+ const orderList = ['inProgress', 'notStarted', 'completed'];
+ return (
+
;
+};
diff --git a/packages/canon/docs/components/Table/table.css.ts b/packages/canon/docs/components/Table/table.css.ts
new file mode 100644
index 0000000000..b01373ee04
--- /dev/null
+++ b/packages/canon/docs/components/Table/table.css.ts
@@ -0,0 +1,83 @@
+/*
+ * 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 { style, globalStyle } from '@vanilla-extract/css';
+
+export const wrapperStyles = style({
+ border: '1px solid #e7e7e7',
+ borderRadius: '4px',
+ overflow: 'hidden',
+});
+
+export const tableStyles = style({
+ width: '100%',
+ margin: '0 !important',
+ padding: '0 !important',
+ borderSpacing: '0px',
+ borderCollapse: 'collapse',
+});
+
+export const cellStyles = style({
+ padding: '12px 16px !important',
+ border: 'none !important',
+ textAlign: 'left',
+ backgroundColor: 'white !important',
+ fontFamily: '"Geist", sans-serif',
+ fontSize: '16px',
+ fontWeight: 300,
+});
+
+// Apply global styles to
elements inside cellStyles
+globalStyle(`${cellStyles} p`, {
+ margin: '0',
+});
+
+export const headerRowStyles = style({
+ borderBottom: '1px solid #e7e7e7',
+});
+
+export const headerCellStyles = style({
+ backgroundColor: '#f5f5f5 !important',
+ borderBottom: '1px solid #e7e7e7 !important',
+ fontWeight: 500,
+ fontSize: '14px',
+});
+
+export const rowStyles = style({
+ border: 'none',
+ borderBottom: '1px solid #e7e7e7',
+ selectors: {
+ '&:last-child': {
+ borderBottom: 'none',
+ },
+ },
+});
+
+export const chipStyles = style({
+ display: 'inline-block',
+ fontSize: '14px !important',
+ border: '1px solid #e7e7e7',
+ borderRadius: '6px',
+ padding: '0px 6px',
+ height: '24px',
+});
+
+export const typeStyles = style({
+ display: 'flex',
+ flexWrap: 'wrap',
+ flexDirection: 'row',
+ gap: '8px',
+});
diff --git a/packages/canon/docs/components/Text/index.tsx b/packages/canon/docs/components/Text/index.tsx
new file mode 100644
index 0000000000..be882c0a81
--- /dev/null
+++ b/packages/canon/docs/components/Text/index.tsx
@@ -0,0 +1,32 @@
+/*
+ * 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 React from 'react';
+import { textStyles } from './text.css';
+
+export const Text = ({
+ children,
+ style,
+}: {
+ children: React.ReactNode;
+ style?: React.CSSProperties;
+}) => {
+ return (
+
+ {children}
+
+ );
+};
diff --git a/packages/canon/docs/components/Text/text.css.ts b/packages/canon/docs/components/Text/text.css.ts
new file mode 100644
index 0000000000..fbbc427362
--- /dev/null
+++ b/packages/canon/docs/components/Text/text.css.ts
@@ -0,0 +1,34 @@
+/*
+ * 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 { globalStyle, style } from '@vanilla-extract/css';
+
+export const textStyles = style({
+ fontFamily: '"Geist", sans-serif',
+ fontSize: '16px',
+ lineHeight: '28px',
+ margin: '0',
+ fontWeight: 300,
+ marginBottom: '16px',
+});
+
+globalStyle(`${textStyles} p`, {
+ fontFamily: '"Geist", sans-serif',
+ fontSize: '16px',
+ lineHeight: '28px',
+ margin: '0',
+ fontWeight: 300,
+});
diff --git a/packages/canon/docs/components/Title/index.tsx b/packages/canon/docs/components/Title/index.tsx
new file mode 100644
index 0000000000..13e5b964bb
--- /dev/null
+++ b/packages/canon/docs/components/Title/index.tsx
@@ -0,0 +1,39 @@
+/*
+ * 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 React from 'react';
+import { titleStyles } from './title.css';
+
+export const Title = ({
+ children,
+ style,
+ type = 'h1',
+}: {
+ children: React.ReactNode;
+ style?: React.CSSProperties;
+ type?: 'h1' | 'h2' | 'h3';
+}) => {
+ let Component = 'h1';
+ if (type === 'h1') Component = 'h1';
+ if (type === 'h2') Component = 'h2';
+ if (type === 'h3') Component = 'h3';
+
+ return React.createElement(Component, {
+ className: titleStyles({ type }),
+ style,
+ children,
+ });
+};
diff --git a/packages/canon/docs/components/Title/title.css.ts b/packages/canon/docs/components/Title/title.css.ts
new file mode 100644
index 0000000000..6618ad80be
--- /dev/null
+++ b/packages/canon/docs/components/Title/title.css.ts
@@ -0,0 +1,48 @@
+/*
+ * 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 { recipe } from '@vanilla-extract/recipes';
+
+export const titleStyles = recipe({
+ base: {
+ fontFamily: '"Geist", sans-serif',
+ margin: '0',
+ fontWeight: 500,
+ border: 'none',
+ },
+ variants: {
+ type: {
+ h1: {
+ fontSize: '36px',
+ lineHeight: '44px',
+ marginBottom: '8px',
+ marginTop: '0px',
+ },
+ h2: {
+ fontSize: '24px',
+ lineHeight: '32px',
+ marginBottom: '12px',
+ marginTop: '52px',
+ },
+ h3: {
+ fontSize: '20px',
+ lineHeight: '28px',
+ marginBottom: '12px',
+ marginTop: '40px',
+ },
+ },
+ },
+});
diff --git a/packages/canon/docs/components/index.ts b/packages/canon/docs/components/index.ts
new file mode 100644
index 0000000000..7ad07bec6a
--- /dev/null
+++ b/packages/canon/docs/components/index.ts
@@ -0,0 +1,26 @@
+/*
+ * 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 * from './Chip';
+export * from './Table';
+export * from './Title';
+export * from './Text';
+export * from './Columns';
+export * from './ComponentStatus';
+export * from './LayoutComponents';
+export * from './Banner';
+export * from './IconLibrary';
+export * from './Roadmap';
diff --git a/packages/canon/docs/components/styles.css b/packages/canon/docs/components/styles.css
new file mode 100644
index 0000000000..698085ad19
--- /dev/null
+++ b/packages/canon/docs/components/styles.css
@@ -0,0 +1,2 @@
+@import './IconLibrary/styles.css';
+@import './Roadmap/styles.css';
diff --git a/packages/canon/docs/utils/argTypes.ts b/packages/canon/docs/utils/argTypes.ts
new file mode 100644
index 0000000000..e6a68008f8
--- /dev/null
+++ b/packages/canon/docs/utils/argTypes.ts
@@ -0,0 +1,69 @@
+/*
+ * 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 { boxProperties } from '../../src/components/Box/sprinkles.css';
+import {
+ colorProperties,
+ spacingProperties,
+} from '../../src/layout/sprinkles.css';
+
+export const listResponsiveValues = (
+ value: keyof typeof boxProperties.styles,
+) => {
+ const values = boxProperties.styles[value];
+
+ if (!values) {
+ console.warn(`Value "${value}" not found in boxProperties.styles`);
+ return [];
+ }
+
+ if ('values' in values) {
+ return Object.keys(values.values);
+ }
+
+ return [];
+};
+
+export const listColorValues = (value: keyof typeof colorProperties.styles) => {
+ const values = colorProperties.styles[value];
+
+ if ('values' in values) {
+ return Object.keys(values.values);
+ }
+
+ return [];
+};
+
+export const argTypesSpacing = Object.keys(spacingProperties.styles).reduce<
+ Record
+>((acc, n) => {
+ acc[n] = {
+ control: 'inline-radio',
+ options: ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'],
+ };
+ return acc;
+}, {});
+
+export const argTypesColor = Object.keys(colorProperties.styles).reduce<
+ Record
+>((acc, n) => {
+ acc[n as keyof typeof colorProperties.styles] = {
+ control: 'select',
+ options: Object.keys(
+ colorProperties.styles[n as keyof typeof colorProperties.styles].values,
+ ),
+ };
+ return acc;
+}, {});
diff --git a/packages/canon/header.png b/packages/canon/header.png
new file mode 100644
index 0000000000..507bd05ca7
Binary files /dev/null and b/packages/canon/header.png differ
diff --git a/packages/canon/package.json b/packages/canon/package.json
new file mode 100644
index 0000000000..c8a8f79a6f
--- /dev/null
+++ b/packages/canon/package.json
@@ -0,0 +1,84 @@
+{
+ "name": "@backstage/canon",
+ "version": "0.0.0",
+ "backstage": {
+ "role": "web-library"
+ },
+ "publishConfig": {
+ "access": "public",
+ "main": "dist/index.esm.js",
+ "types": "dist/index.d.ts"
+ },
+ "private": true,
+ "keywords": [
+ "backstage"
+ ],
+ "homepage": "https://backstage.io",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/backstage/backstage",
+ "directory": "packages/canon"
+ },
+ "license": "Apache-2.0",
+ "sideEffects": false,
+ "main": "src/index.ts",
+ "types": "src/index.ts",
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "build": "backstage-cli package build",
+ "build-storybook": "storybook build",
+ "clean": "backstage-cli package clean",
+ "lint": "backstage-cli package lint",
+ "prepack": "backstage-cli package prepack",
+ "postpack": "backstage-cli package postpack",
+ "start": "storybook dev -p 6006",
+ "test": "backstage-cli package test"
+ },
+ "dependencies": {
+ "@base_ui/react": "^1.0.0-alpha.3",
+ "@remixicon/react": "^4.5.0",
+ "@vanilla-extract/css": "^1.16.0",
+ "@vanilla-extract/dynamic": "^2.1.2",
+ "@vanilla-extract/recipes": "^0.5.5",
+ "@vanilla-extract/sprinkles": "^1.6.3"
+ },
+ "devDependencies": {
+ "@backstage/cli": "workspace:^",
+ "@chromatic-com/storybook": "^3.2.2",
+ "@storybook/addon-essentials": "^8.4.6",
+ "@storybook/addon-interactions": "^8.4.6",
+ "@storybook/addon-styling-webpack": "^1.0.1",
+ "@storybook/addon-themes": "^8.4.6",
+ "@storybook/addon-webpack5-compiler-swc": "^1.0.5",
+ "@storybook/blocks": "^8.4.6",
+ "@storybook/react": "^8.4.6",
+ "@storybook/react-webpack5": "^8.4.6",
+ "@storybook/test": "^8.4.6",
+ "@testing-library/jest-dom": "^6.0.0",
+ "@types/react": "^18.0.0",
+ "@types/react-dom": "^18.0.0",
+ "@vanilla-extract/rollup-plugin": "^1.3.10",
+ "@vanilla-extract/webpack-plugin": "^2.3.14",
+ "eslint-plugin-storybook": "^0.11.1",
+ "globals": "^15.11.0",
+ "mini-css-extract-plugin": "^2.9.2",
+ "react": "^18.0.2",
+ "react-dom": "^18.0.2",
+ "react-router-dom": "^6.3.0",
+ "storybook": "^8.4.6",
+ "webpack-merge": "^6.0.1"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0",
+ "react": "^16.13.1 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0",
+ "react-router-dom": "6.0.0-beta.0 || ^6.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+}
diff --git a/packages/canon/report.api.md b/packages/canon/report.api.md
new file mode 100644
index 0000000000..c27b8da09b
--- /dev/null
+++ b/packages/canon/report.api.md
@@ -0,0 +1,439 @@
+## API Report File for "@backstage/canon"
+
+> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
+
+```ts
+///
+
+import { ForwardRefExoticComponent } from 'react';
+import { default as React_2 } from 'react';
+import { RefAttributes } from 'react';
+
+// @public (undocumented)
+export type AlignItemsProps =
+ | 'stretch'
+ | 'flex-start'
+ | 'center'
+ | 'flex-end'
+ | Partial<
+ Record
+ >;
+
+// @public (undocumented)
+export type AsProps =
+ | 'div'
+ | 'span'
+ | 'p'
+ | 'article'
+ | 'section'
+ | 'main'
+ | 'nav'
+ | 'aside'
+ | 'ul'
+ | 'ol'
+ | 'li'
+ | 'details'
+ | 'summary'
+ | 'dd'
+ | 'dl'
+ | 'dt';
+
+// @public (undocumented)
+export type Background =
+ | 'background'
+ | 'elevation1'
+ | 'elevation2'
+ | 'transparent'
+ | Partial<
+ Record
+ >;
+
+// @public (undocumented)
+export type BorderRadiusProps =
+ | 'none'
+ | 'small'
+ | 'medium'
+ | 'full'
+ | Partial>;
+
+// @public (undocumented)
+export const Box: ForwardRefExoticComponent<
+ BoxProps & RefAttributes
+>;
+
+// @public (undocumented)
+export interface BoxProps extends SpaceProps, ColorProps {
+ // (undocumented)
+ alignItems?: AlignItemsProps;
+ // (undocumented)
+ as?: keyof JSX.IntrinsicElements;
+ // (undocumented)
+ borderRadius?: BorderRadiusProps;
+ // (undocumented)
+ children?: React.ReactNode;
+ // (undocumented)
+ className?: string;
+ // (undocumented)
+ display?: DisplayProps;
+ // (undocumented)
+ flexDirection?: FlexDirectionProps;
+ // (undocumented)
+ flexWrap?: FlexWrapProps;
+ // (undocumented)
+ justifyContent?: JustifyContentProps;
+ // (undocumented)
+ style?: React.CSSProperties;
+}
+
+// @public (undocumented)
+export type Breakpoint = keyof typeof breakpoints;
+
+// @public (undocumented)
+export const breakpoints: {
+ xs: {};
+ sm: {
+ '@media': string;
+ };
+ md: {
+ '@media': string;
+ };
+ lg: {
+ '@media': string;
+ };
+ xl: {
+ '@media': string;
+ };
+ '2xl': {
+ '@media': string;
+ };
+};
+
+// @public (undocumented)
+export const Button: React_2.ForwardRefExoticComponent<
+ ButtonProps & React_2.RefAttributes
+>;
+
+// @public
+export interface ButtonProps {
+ // (undocumented)
+ children: React_2.ReactNode;
+ // (undocumented)
+ disabled?: boolean;
+ // (undocumented)
+ iconEnd?: IconNames;
+ // (undocumented)
+ iconStart?: IconNames;
+ // (undocumented)
+ size?: 'small' | 'medium';
+ // (undocumented)
+ variant?: 'primary' | 'secondary' | 'tertiary';
+}
+
+// @public (undocumented)
+export type Color =
+ | 'primary'
+ | 'secondary'
+ | 'error'
+ | Partial>;
+
+// @public (undocumented)
+export interface ColorProps {
+ // (undocumented)
+ background?: Background;
+ // (undocumented)
+ color?: Color;
+}
+
+// @public (undocumented)
+export type Columns = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;
+
+// @public (undocumented)
+export const Container: React_2.ForwardRefExoticComponent<
+ ContainerProps & React_2.RefAttributes
+>;
+
+// @public (undocumented)
+export interface ContainerProps
+ extends Omit<
+ SpaceProps,
+ | 'padding'
+ | 'paddingLeft'
+ | 'paddingRight'
+ | 'paddingX'
+ | 'margin'
+ | 'marginLeft'
+ | 'marginRight'
+ | 'marginX'
+ | 'gap'
+ > {
+ // (undocumented)
+ children?: React.ReactNode;
+ // (undocumented)
+ className?: string;
+ // (undocumented)
+ style?: React.CSSProperties;
+}
+
+// @public (undocumented)
+export type DisplayProps =
+ | 'flex'
+ | 'none'
+ | 'inline'
+ | 'block'
+ | Partial>;
+
+// @public (undocumented)
+export type FlexDirectionProps =
+ | 'row'
+ | 'column'
+ | Partial>;
+
+// @public (undocumented)
+export type FlexWrapProps =
+ | 'wrap'
+ | 'nowrap'
+ | Partial>;
+
+// @public (undocumented)
+export type Gap = Space | Partial>;
+
+// @public (undocumented)
+export const Grid: ForwardRefExoticComponent<
+ GridProps & RefAttributes
+> & {
+ Item: ForwardRefExoticComponent<
+ GridItemProps & RefAttributes
+ >;
+};
+
+// @public (undocumented)
+export interface GridItemProps {
+ // (undocumented)
+ children: React.ReactNode;
+ // (undocumented)
+ className?: string;
+ // (undocumented)
+ colSpan?: Columns | 'full';
+ // (undocumented)
+ end?: Columns | 'auto';
+ // (undocumented)
+ rowSpan?: Columns | 'full';
+ // (undocumented)
+ start?: Columns | 'auto';
+ // (undocumented)
+ style?: React.CSSProperties;
+}
+
+// @public (undocumented)
+export interface GridProps extends SpaceProps, ColorProps {
+ // (undocumented)
+ children?: React.ReactNode;
+ // (undocumented)
+ className?: string;
+ // (undocumented)
+ columns?: Columns | Partial>;
+ // (undocumented)
+ style?: React.CSSProperties;
+}
+
+// @public (undocumented)
+export const Icon: ({ name }: { name: IconNames }) => React_2.JSX.Element;
+
+// @public (undocumented)
+export type IconMap = Partial>;
+
+// @public (undocumented)
+export type IconNames =
+ | 'arrowDown'
+ | 'arrowLeft'
+ | 'arrowRight'
+ | 'arrowUp'
+ | 'arrowDownCircle'
+ | 'arrowLeftCircle'
+ | 'arrowRightCircle'
+ | 'arrowUpCircle'
+ | 'chevronDown'
+ | 'chevronLeft'
+ | 'chevronRight'
+ | 'chevronUp'
+ | 'cloud'
+ | 'heart'
+ | 'plus'
+ | 'trash';
+
+// @public (undocumented)
+export const Inline: ForwardRefExoticComponent<
+ InlineProps & RefAttributes
+>;
+
+// @public (undocumented)
+export interface InlineProps extends SpaceProps, ColorProps {
+ // (undocumented)
+ align?:
+ | 'left'
+ | 'center'
+ | 'right'
+ | Partial>;
+ // (undocumented)
+ alignY?:
+ | 'top'
+ | 'center'
+ | 'bottom'
+ | Partial>;
+ // (undocumented)
+ as?: AsProps;
+ // (undocumented)
+ children: React.ReactNode;
+ // (undocumented)
+ className?: string;
+ // (undocumented)
+ style?: React.CSSProperties;
+}
+
+// @public (undocumented)
+export type JustifyContentProps =
+ | 'stretch'
+ | 'flex-start'
+ | 'center'
+ | 'flex-end'
+ | 'space-around'
+ | 'space-between'
+ | Partial<
+ Record<
+ Breakpoint,
+ | 'stretch'
+ | 'flex-start'
+ | 'center'
+ | 'flex-end'
+ | 'space-around'
+ | 'space-between'
+ >
+ >;
+
+// @public (undocumented)
+export type Margin = Space | Partial>;
+
+// @public (undocumented)
+export type MarginBottom = Space | Partial>;
+
+// @public (undocumented)
+export type MarginLeft = Space | Partial>;
+
+// @public (undocumented)
+export type MarginRight = Space | Partial>;
+
+// @public (undocumented)
+export type MarginTop = Space | Partial>;
+
+// @public (undocumented)
+export type MarginX = Space | Partial>;
+
+// @public (undocumented)
+export type MarginY = Space | Partial>;
+
+// @public (undocumented)
+export type Padding = Space | Partial>;
+
+// @public (undocumented)
+export type PaddingBottom = Space | Partial>;
+
+// @public (undocumented)
+export type PaddingLeft = Space | Partial>;
+
+// @public (undocumented)
+export type PaddingRight = Space | Partial>;
+
+// @public (undocumented)
+export type PaddingTop = Space | Partial>;
+
+// @public (undocumented)
+export type PaddingX = Space | Partial>;
+
+// @public (undocumented)
+export type PaddingY = Space | Partial>;
+
+// @public (undocumented)
+export type Space = keyof typeof space;
+
+// @public (undocumented)
+export const space: {
+ none: number;
+ '2xs': string;
+ xs: string;
+ sm: string;
+ md: string;
+ lg: string;
+ xl: string;
+ '2xl': string;
+};
+
+// @public (undocumented)
+export interface SpaceProps {
+ // (undocumented)
+ gap?: Gap;
+ // (undocumented)
+ margin?: Margin;
+ // (undocumented)
+ marginBottom?: MarginBottom;
+ // (undocumented)
+ marginLeft?: MarginLeft;
+ // (undocumented)
+ marginRight?: MarginRight;
+ // (undocumented)
+ marginTop?: MarginTop;
+ // (undocumented)
+ marginX?: MarginX;
+ // (undocumented)
+ marginY?: MarginY;
+ // (undocumented)
+ padding?: Padding;
+ // (undocumented)
+ paddingBottom?: PaddingBottom;
+ // (undocumented)
+ paddingLeft?: PaddingLeft;
+ // (undocumented)
+ paddingRight?: PaddingRight;
+ // (undocumented)
+ paddingTop?: PaddingTop;
+ // (undocumented)
+ paddingX?: PaddingX;
+ // (undocumented)
+ paddingY?: PaddingY;
+}
+
+// @public (undocumented)
+export const Stack: ForwardRefExoticComponent<
+ StackProps & RefAttributes
+>;
+
+// @public (undocumented)
+export interface StackProps extends SpaceProps, ColorProps {
+ // (undocumented)
+ align?:
+ | 'left'
+ | 'center'
+ | 'right'
+ | Partial>;
+ // (undocumented)
+ as?: AsProps;
+ // (undocumented)
+ children: React.ReactNode;
+ // (undocumented)
+ className?: string;
+ // (undocumented)
+ style?: React.CSSProperties;
+}
+
+// @public (undocumented)
+export type Theme = keyof typeof themes;
+
+// @public (undocumented)
+export const themes: {
+ light: {
+ selector: string;
+ };
+ dark: {
+ selector: string;
+ };
+};
+```
diff --git a/packages/canon/src/components/Box/Box.stories.tsx b/packages/canon/src/components/Box/Box.stories.tsx
new file mode 100644
index 0000000000..6f15d984e1
--- /dev/null
+++ b/packages/canon/src/components/Box/Box.stories.tsx
@@ -0,0 +1,183 @@
+/*
+ * 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 React from 'react';
+import type { Meta, StoryObj } from '@storybook/react';
+import { Box } from './Box';
+import {
+ listResponsiveValues,
+ argTypesSpacing,
+ argTypesColor,
+} from '../../../docs/utils/argTypes';
+import { boxProperties } from './sprinkles.css';
+
+const argTypesBox = Object.keys(boxProperties.styles).reduce<
+ Record
+>((acc, n) => {
+ acc[n] = {
+ control: 'select',
+ options: listResponsiveValues(n as keyof typeof boxProperties.styles),
+ };
+ return acc;
+}, {});
+
+const meta = {
+ title: 'Components/Box',
+ component: Box,
+ parameters: {
+ layout: 'centered',
+ },
+ argTypes: {
+ ...argTypesSpacing,
+ ...argTypesColor,
+ ...argTypesBox,
+ as: {
+ control: { type: 'select' },
+ options: ['div', 'span', 'article', 'section'],
+ },
+ children: {
+ control: false,
+ },
+ },
+ args: {
+ as: 'div',
+ background: 'elevation1',
+ borderRadius: 'small',
+ children: 'Basic Box',
+ display: 'block',
+ padding: 'sm',
+ },
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Basic: Story = {
+ args: {},
+};
+
+export const Responsive: Story = {
+ render: () => (
+
+ Responsive Box
+
+ ),
+};
+
+export const FlexContainer: Story = {
+ render: () => (
+
+
+ Item 1
+
+
+ Item 2
+
+
+ Item 3
+
+
+ ),
+};
+
+export const Nested: Story = {
+ render: () => (
+
+
+ Header
+
+
+
+ Sidebar
+
+
+ Main Content
+
+
+
+ Footer
+
+
+ ),
+};
+
+export const Alignment: Story = {
+ render: () => (
+
+
+ Centered Content
+
+
+ ),
+};
+
+// Example showing different spacing combinations
+export const Spacing: Story = {
+ render: () => (
+
+
+ Small Padding
+
+
+ Medium Padding
+
+
+ Large Padding
+
+
+ Mixed Padding
+
+
+ ),
+};
+
+// Example showing different display values
+export const DisplayVariants: Story = {
+ render: () => (
+
+
+ Display Block
+
+
+ Display Flex
+
+
+ Display Inline
+
+
+ ),
+};
diff --git a/packages/canon/src/components/Box/Box.tsx b/packages/canon/src/components/Box/Box.tsx
new file mode 100644
index 0000000000..a470c0584d
--- /dev/null
+++ b/packages/canon/src/components/Box/Box.tsx
@@ -0,0 +1,40 @@
+/*
+ * 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 { createElement, forwardRef } from 'react';
+import { boxSprinkles } from './sprinkles.css';
+import { base } from './box.css';
+import { BoxProps } from './types';
+
+/** @public */
+export const Box = forwardRef((props, ref) => {
+ const { as = 'div', className, style, children, ...restProps } = props;
+
+ // Generate the list of class names
+ const sprinklesClassName = boxSprinkles(restProps);
+
+ // Combine the base class name, the sprinkles class name, and any additional class names
+ const classNames = [base, sprinklesClassName, className]
+ .filter(Boolean)
+ .join(' ');
+
+ return createElement(as, {
+ ref,
+ className: classNames,
+ style,
+ children,
+ });
+});
diff --git a/packages/canon/src/components/Box/Docs.mdx b/packages/canon/src/components/Box/Docs.mdx
new file mode 100644
index 0000000000..11cc53b148
--- /dev/null
+++ b/packages/canon/src/components/Box/Docs.mdx
@@ -0,0 +1,80 @@
+import { Meta, Unstyled, Source } from '@storybook/blocks';
+import * as BoxStories from './Box.stories';
+import { Title, Text } from '../../../docs/components';
+import { Padding } from './docs/padding';
+import { PropsTable, getBoxProps } from '../../../docs/components/PropsTable';
+import { boxProperties } from './sprinkles.css';
+import { spacingProperties } from '../../layout/sprinkles.css';
+
+
+
+
+
+Box
+
+ Box is the lowest-level component in Canon. We use it internally to build all
+ of our components. It provides a consistent API for styling and layout.
+
+
+Installation
+
+
+API reference
+
+Box
+
+ This is the Box component, our lowest-level component. Here are all the
+ available properties.
+
+
+
+
+
+ Padding and margin are used to create space around your component using our
+ predefined spacing tokens. We would recommend to use padding over margin to
+ avoid collapsing margins but both are available.
+
+
+
+
+
+
+Examples
+Here are some examples of how you can use the Box component.
+
+Simple example
+A simple example of how to use the Box component.
+Hello World`}
+ language="tsx"
+ dark
+/>
+
+Responsive
+
+ Most of the values can be defined per breakpoint, making it easy to create
+ responsive designs.
+
+Hello World`}
+ language="tsx"
+ dark
+/>
+
+
diff --git a/packages/canon/src/components/Box/box.css.ts b/packages/canon/src/components/Box/box.css.ts
new file mode 100644
index 0000000000..a3e49162fd
--- /dev/null
+++ b/packages/canon/src/components/Box/box.css.ts
@@ -0,0 +1,22 @@
+/*
+ * 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 { style } from '@vanilla-extract/css';
+
+export const base = style({
+ fontFamily: 'var(--canon-font-regular)',
+ color: 'var(--canon-text-primary)',
+});
diff --git a/packages/canon/src/components/Box/docs/padding.tsx b/packages/canon/src/components/Box/docs/padding.tsx
new file mode 100644
index 0000000000..86a7c801a2
--- /dev/null
+++ b/packages/canon/src/components/Box/docs/padding.tsx
@@ -0,0 +1,107 @@
+/*
+ * 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 React from 'react';
+import { Inline } from '../../Inline';
+import { Box } from '../Box';
+
+const FakeBox = ({ children }: { children: string }) => (
+
+ {children}
+
+);
+
+export const Padding = () => {
+ return (
+
+
+
+ padding
+
+
+ paddingX
+
+
+ paddingY
+
+
+
+
+ paddingTop
+
+
+ paddingBottom
+
+
+ paddingLeft
+
+
+ paddingRight
+
+
+
+ );
+};
diff --git a/packages/canon/src/components/Box/index.tsx b/packages/canon/src/components/Box/index.tsx
new file mode 100644
index 0000000000..e4f1867edc
--- /dev/null
+++ b/packages/canon/src/components/Box/index.tsx
@@ -0,0 +1,18 @@
+/*
+ * 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 { Box } from './Box';
+export type * from './types';
+export { breakpoints, space, themes } from '../../layout/properties';
diff --git a/packages/canon/src/components/Box/sprinkles.css.ts b/packages/canon/src/components/Box/sprinkles.css.ts
new file mode 100644
index 0000000000..df5664029b
--- /dev/null
+++ b/packages/canon/src/components/Box/sprinkles.css.ts
@@ -0,0 +1,61 @@
+/*
+ * 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 { defineProperties, createSprinkles } from '@vanilla-extract/sprinkles';
+import { breakpoints } from '../../layout/properties';
+import { colorProperties, spacingProperties } from '../../layout/sprinkles.css';
+
+export const boxProperties = defineProperties({
+ conditions: breakpoints,
+ defaultCondition: 'xs',
+ responsiveArray: ['xs', 'sm', 'md', 'lg', 'xl', '2xl'],
+ properties: {
+ flexDirection: ['row', 'column'],
+ justifyContent: [
+ 'stretch',
+ 'flex-start',
+ 'center',
+ 'flex-end',
+ 'space-around',
+ 'space-between',
+ ],
+ alignItems: ['stretch', 'flex-start', 'center', 'flex-end'],
+ borderRadius: {
+ none: 0,
+ small: '4px',
+ medium: '8px',
+ full: '9999px',
+ },
+ boxShadow: {
+ small: 'var(--canon-box-shadow-small)',
+ medium: 'var(--canon-box-shadow-medium)',
+ large: 'var(--canon-box-shadow-large)',
+ },
+ border: {
+ none: 'none',
+ thin: '1px solid var(--canon-outline)',
+ error: '1px solid var(--canon-error)',
+ },
+ display: ['none', 'flex', 'block', 'inline'],
+ flexWrap: ['wrap', 'nowrap'],
+ },
+});
+
+export const boxSprinkles = createSprinkles(
+ spacingProperties,
+ boxProperties,
+ colorProperties,
+);
diff --git a/packages/canon/src/components/Box/types.ts b/packages/canon/src/components/Box/types.ts
new file mode 100644
index 0000000000..2ba5929fdd
--- /dev/null
+++ b/packages/canon/src/components/Box/types.ts
@@ -0,0 +1,89 @@
+/*
+ * 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 { Breakpoint, SpaceProps, ColorProps } from '../../layout/types';
+
+/** @public */
+export type DisplayProps =
+ | 'flex'
+ | 'none'
+ | 'inline'
+ | 'block'
+ | Partial>;
+
+/** @public */
+export type FlexDirectionProps =
+ | 'row'
+ | 'column'
+ | Partial>;
+
+/** @public */
+export type FlexWrapProps =
+ | 'wrap'
+ | 'nowrap'
+ | Partial>;
+
+/** @public */
+export type JustifyContentProps =
+ | 'stretch'
+ | 'flex-start'
+ | 'center'
+ | 'flex-end'
+ | 'space-around'
+ | 'space-between'
+ | Partial<
+ Record<
+ Breakpoint,
+ | 'stretch'
+ | 'flex-start'
+ | 'center'
+ | 'flex-end'
+ | 'space-around'
+ | 'space-between'
+ >
+ >;
+
+/** @public */
+export type AlignItemsProps =
+ | 'stretch'
+ | 'flex-start'
+ | 'center'
+ | 'flex-end'
+ | Partial<
+ Record
+ >;
+
+/** @public */
+export type BorderRadiusProps =
+ | 'none'
+ | 'small'
+ | 'medium'
+ | 'full'
+ | Partial>;
+
+/** @public */
+export interface BoxProps extends SpaceProps, ColorProps {
+ as?: keyof JSX.IntrinsicElements;
+ children?: React.ReactNode;
+ display?: DisplayProps;
+ flexDirection?: FlexDirectionProps;
+ flexWrap?: FlexWrapProps;
+ justifyContent?: JustifyContentProps;
+ alignItems?: AlignItemsProps;
+ borderRadius?: BorderRadiusProps;
+ className?: string;
+ style?: React.CSSProperties;
+}
diff --git a/packages/canon/src/components/Button/Button.stories.tsx b/packages/canon/src/components/Button/Button.stories.tsx
new file mode 100644
index 0000000000..fe3b1d58f6
--- /dev/null
+++ b/packages/canon/src/components/Button/Button.stories.tsx
@@ -0,0 +1,107 @@
+/*
+ * 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 React from 'react';
+import type { Meta, StoryObj } from '@storybook/react';
+import { Button } from './Button';
+import { Inline } from '../Inline';
+import { Stack } from '../Stack';
+
+const meta = {
+ title: 'Components/Button',
+ component: Button,
+ parameters: {
+ layout: 'centered',
+ },
+ tags: ['autodocs'],
+ argTypes: {
+ size: {
+ control: 'select',
+ options: ['small', 'medium'],
+ },
+ },
+ args: {
+ size: 'medium',
+ },
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Primary: Story = {
+ args: {
+ children: 'Primary button',
+ },
+};
+
+export const Secondary: Story = {
+ args: {
+ children: 'Secondary button',
+ variant: 'secondary',
+ },
+};
+
+export const Tertiary: Story = {
+ args: {
+ children: 'Tertiary button',
+ variant: 'tertiary',
+ },
+};
+
+export const Sizes: Story = {
+ args: {
+ children: 'Button',
+ },
+ render: args => (
+
+
+
+
+ ),
+};
+
+export const WithIcons: Story = {
+ args: {
+ children: 'Button',
+ },
+ render: args => (
+
+
+
+
+
+ ),
+};
+
+export const FullWidth: Story = {
+ args: {
+ children: 'Button',
+ },
+ render: args => (
+
+
+
+
+
+ ),
+};
+
+export const Disabled: Story = {
+ args: {
+ children: 'Button',
+ disabled: true,
+ },
+};
diff --git a/packages/canon/src/components/Button/Button.tsx b/packages/canon/src/components/Button/Button.tsx
new file mode 100644
index 0000000000..b168705952
--- /dev/null
+++ b/packages/canon/src/components/Button/Button.tsx
@@ -0,0 +1,68 @@
+/*
+ * 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 React, { forwardRef } from 'react';
+import { Icon } from '../Icon';
+import type { IconNames } from '../Icon/types';
+
+/**
+ * Properties for {@link Button}
+ *
+ * @public
+ */
+export interface ButtonProps {
+ size?: 'small' | 'medium';
+ variant?: 'primary' | 'secondary' | 'tertiary';
+ children: React.ReactNode;
+ disabled?: boolean;
+ iconStart?: IconNames;
+ iconEnd?: IconNames;
+}
+
+/** @public */
+export const Button = forwardRef(
+ (props: ButtonProps, ref) => {
+ const {
+ size = 'medium',
+ variant = 'primary',
+ disabled,
+ iconStart,
+ iconEnd,
+ children,
+ } = props;
+
+ return (
+
+ );
+ },
+);
+
+export default Button;
diff --git a/packages/canon/src/components/Button/index.tsx b/packages/canon/src/components/Button/index.tsx
new file mode 100644
index 0000000000..bc6714754d
--- /dev/null
+++ b/packages/canon/src/components/Button/index.tsx
@@ -0,0 +1,17 @@
+/*
+ * 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 { Button } from './Button';
+export type { ButtonProps } from './Button';
diff --git a/packages/canon/src/components/Button/styles.css b/packages/canon/src/components/Button/styles.css
new file mode 100644
index 0000000000..aaf1cae8bf
--- /dev/null
+++ b/packages/canon/src/components/Button/styles.css
@@ -0,0 +1,82 @@
+/*
+ * 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.
+ */
+
+.button {
+ all: unset;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ user-select: none;
+ font-family: var(--canon-font-regular);
+ font-weight: var(--canon-font-bold);
+ font-size: var(--canon-font-sizes-md);
+ padding: 0;
+ transition: all 150ms ease;
+ cursor: pointer;
+ border-radius: 8px;
+}
+
+.button.primary {
+ background-color: var(--canon-accent);
+ color: var(--canon-text-primary-on-accent);
+}
+
+.button.primary:hover {
+ background-color: transparent;
+ box-shadow: 0 0 0 1px var(--canon-outline-focus);
+ color: var(--canon-text-primary);
+}
+
+.button.secondary {
+ background-color: transparent;
+ box-shadow: 0 0 0 1px var(--canon-outline);
+ color: var(--canon-text-primary);
+}
+
+.button.secondary:hover {
+ box-shadow: 0 0 0 1px var(--canon-outline-hover);
+}
+
+.button.tertiary {
+ background-color: transparent;
+ color: var(--canon-text-primary);
+}
+
+.button.tertiary:hover {
+ color: var(--canon-text-secondary);
+}
+
+.button.small {
+ padding-left: 6px;
+ padding-right: 6px;
+ height: 32px;
+}
+
+.button.medium {
+ padding-left: 8px;
+ padding-right: 8px;
+ height: 40px;
+}
+
+.button-content {
+ display: flex;
+ align-items: center;
+ gap: var(--canon-spacing-xs);
+}
+
+.button-content.icon-both {
+ flex: 1;
+}
diff --git a/packages/canon/src/components/Container/Container.stories.tsx b/packages/canon/src/components/Container/Container.stories.tsx
new file mode 100644
index 0000000000..bedf96ec9e
--- /dev/null
+++ b/packages/canon/src/components/Container/Container.stories.tsx
@@ -0,0 +1,68 @@
+/*
+ * 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 React from 'react';
+import type { Meta, StoryObj } from '@storybook/react';
+import { Box } from '../Box/Box';
+import { argTypesSpacing } from '../../../docs/utils/argTypes';
+import { Container } from './Container';
+
+const argTypesSpacingWithoutLeftAndRight = { ...argTypesSpacing };
+delete argTypesSpacingWithoutLeftAndRight.padding;
+delete argTypesSpacingWithoutLeftAndRight.paddingLeft;
+delete argTypesSpacingWithoutLeftAndRight.paddingRight;
+delete argTypesSpacingWithoutLeftAndRight.paddingX;
+delete argTypesSpacingWithoutLeftAndRight.margin;
+delete argTypesSpacingWithoutLeftAndRight.marginLeft;
+delete argTypesSpacingWithoutLeftAndRight.marginRight;
+delete argTypesSpacingWithoutLeftAndRight.marginX;
+delete argTypesSpacingWithoutLeftAndRight.gap;
+
+const meta = {
+ title: 'Components/Container',
+ component: Container,
+ argTypes: {
+ ...argTypesSpacingWithoutLeftAndRight,
+ children: {
+ control: false,
+ },
+ className: {
+ control: 'text',
+ },
+ },
+ parameters: {
+ layout: 'fullscreen',
+ },
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+const FakeBox = () => (
+
+);
+
+export const Default: Story = {
+ args: {},
+ render: args => (
+
+
+
+ ),
+};
diff --git a/packages/canon/src/components/Container/Container.tsx b/packages/canon/src/components/Container/Container.tsx
new file mode 100644
index 0000000000..b27775e116
--- /dev/null
+++ b/packages/canon/src/components/Container/Container.tsx
@@ -0,0 +1,37 @@
+/*
+ * 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 React, { forwardRef } from 'react';
+import { containerSprinkles } from './sprinkles.css';
+import { ContainerProps } from './types';
+
+/** @public */
+export const Container = forwardRef(
+ (props, ref) => {
+ const { children, className, style, ...restProps } = props;
+
+ const containerClassName = containerSprinkles(restProps);
+
+ return (
+
+ {children}
+
+ );
+ },
+);
diff --git a/packages/canon/src/components/Container/Docs.mdx b/packages/canon/src/components/Container/Docs.mdx
new file mode 100644
index 0000000000..733dbae637
--- /dev/null
+++ b/packages/canon/src/components/Container/Docs.mdx
@@ -0,0 +1,78 @@
+import { Meta, Unstyled, Source } from '@storybook/blocks';
+import * as ContainerStories from './Container.stories';
+import { Title, Text } from '../../../docs/components';
+import { PropsTable, getBoxProps } from '../../../docs/components/PropsTable';
+import { spacingProperties } from '../../layout/sprinkles.css';
+import { containerProperties } from './sprinkles.css';
+
+
+
+
+
+Container
+
+
+ The container component let you use our default max-width and center the
+ content on the page.
+
+
+Installation
+
+
+
+ API reference
+
+
+
+
+Examples
+
+Simple
+A simple example of how to use the Container component.
+
+
+ Hello World
+ Hello World
+ Hello World
+`}
+ language="tsx"
+ dark
+/>
+
+Responsive padding & margin
+
+ The Container component also supports responsive values, making it easy to
+ create responsive designs.
+
+
+ Hello World
+ Hello World
+ Hello World
+`}
+ language="tsx"
+ dark
+/>
+
+
diff --git a/packages/canon/src/components/Container/index.tsx b/packages/canon/src/components/Container/index.tsx
new file mode 100644
index 0000000000..81614c352d
--- /dev/null
+++ b/packages/canon/src/components/Container/index.tsx
@@ -0,0 +1,17 @@
+/*
+ * 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 { Container } from './Container';
+export type { ContainerProps } from './types';
diff --git a/packages/canon/src/components/Container/sprinkles.css.ts b/packages/canon/src/components/Container/sprinkles.css.ts
new file mode 100644
index 0000000000..989e369433
--- /dev/null
+++ b/packages/canon/src/components/Container/sprinkles.css.ts
@@ -0,0 +1,40 @@
+/*
+ * 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 { defineProperties, createSprinkles } from '@vanilla-extract/sprinkles';
+import { breakpoints, space } from '../../layout/properties';
+import { colorProperties, spacingProperties } from '../../layout/sprinkles.css';
+
+export const containerProperties = defineProperties({
+ conditions: breakpoints,
+ defaultCondition: 'xs',
+ properties: {
+ paddingTop: space,
+ paddingBottom: space,
+ marginTop: space,
+ marginBottom: space,
+ },
+ shorthands: {
+ paddingY: ['paddingTop', 'paddingBottom'],
+ marginY: ['marginTop', 'marginBottom'],
+ },
+});
+
+export const containerSprinkles = createSprinkles(
+ spacingProperties,
+ colorProperties,
+ containerProperties,
+);
diff --git a/packages/canon/src/components/Container/styles.css b/packages/canon/src/components/Container/styles.css
new file mode 100644
index 0000000000..4da813623f
--- /dev/null
+++ b/packages/canon/src/components/Container/styles.css
@@ -0,0 +1,5 @@
+.container {
+ max-width: var(--canon-container-max-width);
+ margin: 0 auto;
+ padding: 0 var(--canon-container-padding);
+}
diff --git a/packages/canon/src/components/Container/types.ts b/packages/canon/src/components/Container/types.ts
new file mode 100644
index 0000000000..b1f414cf30
--- /dev/null
+++ b/packages/canon/src/components/Container/types.ts
@@ -0,0 +1,35 @@
+/*
+ * 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 { SpaceProps } from '../../layout/types';
+
+/** @public */
+export interface ContainerProps
+ extends Omit<
+ SpaceProps,
+ | 'padding'
+ | 'paddingLeft'
+ | 'paddingRight'
+ | 'paddingX'
+ | 'margin'
+ | 'marginLeft'
+ | 'marginRight'
+ | 'marginX'
+ | 'gap'
+ > {
+ children?: React.ReactNode;
+ className?: string;
+ style?: React.CSSProperties;
+}
diff --git a/packages/canon/src/components/Grid/Docs.mdx b/packages/canon/src/components/Grid/Docs.mdx
new file mode 100644
index 0000000000..4a3d64d06f
--- /dev/null
+++ b/packages/canon/src/components/Grid/Docs.mdx
@@ -0,0 +1,211 @@
+import { Canvas, Meta, Unstyled, Source } from '@storybook/blocks';
+import * as GridStories from './Grid.stories';
+import { Title, Text } from '../../../docs/components';
+import { PropsTable, getBoxProps } from '../../../docs/components/PropsTable';
+import { spacingProperties } from '../../layout/sprinkles.css';
+
+
+
+
+
+Grid
+
+ A layout component that helps to create simple column-based layouts as well as
+ more complex ones.
+
+
+Installation
+
+
+Anatomy
+
+ The grid component is made of two parts: the grid container and the grid item. Import all parts and piece them together.
+
+ (
+
+
+
+);`}
+ language="tsx"
+ dark
+/>
+
+API reference
+
+Grid
+
+ 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
+This is a simple grid with 3 columns and a gap of md.
+
+ Hello World
+ Hello World
+ Hello World
+
+`}
+ language="tsx"
+ dark
+/>
+
+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.
+
+
+
+
+ Hello World
+
+
+ Hello World
+
+
+`}
+ language="tsx"
+ dark
+/>
+
+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.
+
+
+
+
+ Hello World
+
+
+ Hello World
+
+
+ Hello World
+
+
+`}
+ language="tsx"
+ dark
+/>
+
+Responsive
+
+ The grid component also supports responsive values. In this example the grid
+ will have 1 column on small screens and 3 on large screens, with a gap of xs
+ on small screens and md on large screens.
+
+
+
+ Hello World
+
+
+ Hello World
+
+
+`}
+ language="tsx"
+ dark
+/>
+
+Start and End
+
+ The start and end props can be used to position the item in the grid.
+
+
+
+ Hello World
+
+
+`}
+ language="tsx"
+ dark
+/>
+
+
diff --git a/packages/canon/src/components/Grid/Grid.stories.tsx b/packages/canon/src/components/Grid/Grid.stories.tsx
new file mode 100644
index 0000000000..bf1bcecfd7
--- /dev/null
+++ b/packages/canon/src/components/Grid/Grid.stories.tsx
@@ -0,0 +1,121 @@
+/*
+ * 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 React from 'react';
+import type { Meta, StoryObj } from '@storybook/react';
+import { Grid } from './Grid';
+import type { GridItemProps } from './types';
+import { Box } from '../Box/Box';
+import { argTypesSpacing, argTypesColor } from '../../../docs/utils/argTypes';
+import { Stack } from '../Stack';
+
+const meta = {
+ title: 'Components/Grid',
+ component: Grid,
+ argTypes: {
+ ...argTypesSpacing,
+ ...argTypesColor,
+ children: {
+ control: false,
+ },
+ className: {
+ control: 'text',
+ },
+ },
+ args: {
+ gap: 'xs',
+ },
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+const FakeBox = () => (
+
+);
+
+export const Default: Story = {
+ args: {},
+ render: args => (
+
+
+
+
+
+ ),
+};
+
+export const LargeGap: Story = {
+ args: {
+ gap: 'lg',
+ },
+ render: args => (
+
+
+
+
+
+ ),
+};
+
+export const ColumnSizes: Story = {
+ args: {
+ columns: 12,
+ gap: 'md',
+ },
+ render: args => (
+
+ {Array.from({ length: 11 }, (_, i) => (
+
+
+
+
+
+
+
+
+ ))}
+
+ ),
+};
+
+export const RowAndColumns: Story = {
+ args: {
+ columns: 12,
+ gap: 'md',
+ },
+ render: args => (
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ),
+};
diff --git a/packages/canon/src/components/Grid/Grid.tsx b/packages/canon/src/components/Grid/Grid.tsx
new file mode 100644
index 0000000000..2b61d1d3d4
--- /dev/null
+++ b/packages/canon/src/components/Grid/Grid.tsx
@@ -0,0 +1,78 @@
+/*
+ * 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 { createElement, forwardRef } from 'react';
+import { GridItemProps, GridProps } from './types';
+import { gridItemSprinkles, gridSprinkles } from './sprinkles.css';
+
+const GridBase = forwardRef((props, ref) => {
+ const {
+ children,
+ columns,
+ gap = 'xs',
+ className,
+ style,
+ ...restProps
+ } = props;
+
+ const sprinklesClassName = gridSprinkles({
+ ...restProps,
+ gap,
+ gridTemplateColumns: columns ? columns : 'auto',
+ });
+
+ const classNames = ['grid', sprinklesClassName, className]
+ .filter(Boolean)
+ .join(' ');
+
+ return createElement(
+ 'div',
+ {
+ ref,
+ className: classNames,
+ style,
+ },
+ children,
+ );
+});
+
+const GridItem = forwardRef((props, ref) => {
+ const { children, rowSpan, colSpan, start, end, className, style } = props;
+
+ const sprinklesClassName = gridItemSprinkles({
+ rowSpan,
+ colSpan,
+ start,
+ end,
+ });
+
+ const classNames = ['grid-item', sprinklesClassName, className]
+ .filter(Boolean)
+ .join(' ');
+
+ return createElement(
+ 'div',
+ {
+ ref,
+ className: classNames,
+ style,
+ },
+ children,
+ );
+});
+
+/** @public */
+export const Grid = Object.assign(GridBase, { Item: GridItem });
diff --git a/packages/canon/src/components/Grid/index.ts b/packages/canon/src/components/Grid/index.ts
new file mode 100644
index 0000000000..b07249241c
--- /dev/null
+++ b/packages/canon/src/components/Grid/index.ts
@@ -0,0 +1,17 @@
+/*
+ * 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 { Grid } from './Grid';
+export type { GridProps, GridItemProps, Columns } from './types';
diff --git a/packages/canon/src/components/Grid/sprinkles.css.ts b/packages/canon/src/components/Grid/sprinkles.css.ts
new file mode 100644
index 0000000000..aff5a340ed
--- /dev/null
+++ b/packages/canon/src/components/Grid/sprinkles.css.ts
@@ -0,0 +1,130 @@
+/*
+ * 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 { defineProperties, createSprinkles } from '@vanilla-extract/sprinkles';
+import { breakpoints } from '../../layout/properties';
+import { colorProperties, spacingProperties } from '../../layout/sprinkles.css';
+
+const gridProperties = defineProperties({
+ conditions: breakpoints,
+ defaultCondition: 'xs',
+ properties: {
+ gridTemplateColumns: {
+ 1: 'repeat(1, minmax(0, 1fr))',
+ 2: 'repeat(2, minmax(0, 1fr))',
+ 3: 'repeat(3, minmax(0, 1fr))',
+ 4: 'repeat(4, minmax(0, 1fr))',
+ 5: 'repeat(5, minmax(0, 1fr))',
+ 6: 'repeat(6, minmax(0, 1fr))',
+ 7: 'repeat(7, minmax(0, 1fr))',
+ 8: 'repeat(8, minmax(0, 1fr))',
+ 9: 'repeat(9, minmax(0, 1fr))',
+ 10: 'repeat(10, minmax(0, 1fr))',
+ 11: 'repeat(11, minmax(0, 1fr))',
+ 12: 'repeat(12, minmax(0, 1fr))',
+ auto: 'repeat(auto-fit, minmax(0, 1fr))',
+ },
+ },
+ shorthands: {
+ columns: ['gridTemplateColumns'],
+ },
+});
+
+export const gridSprinkles = createSprinkles(
+ spacingProperties,
+ colorProperties,
+ gridProperties,
+);
+
+const gridItemProperties = defineProperties({
+ conditions: breakpoints,
+ defaultCondition: 'xs',
+ properties: {
+ gridColumn: {
+ 1: 'span 1 / span 1',
+ 2: 'span 2 / span 2',
+ 3: 'span 3 / span 3',
+ 4: 'span 4 / span 4',
+ 5: 'span 5 / span 5',
+ 6: 'span 6 / span 6',
+ 7: 'span 7 / span 7',
+ 8: 'span 8 / span 8',
+ 9: 'span 9 / span 9',
+ 10: 'span 10 / span 10',
+ 11: 'span 11 / span 11',
+ 12: 'span 12 / span 12',
+ full: '1 / -1',
+ },
+ gridRow: {
+ 1: 'span 1 / span 1',
+ 2: 'span 2 / span 2',
+ 3: 'span 3 / span 3',
+ 4: 'span 4 / span 4',
+ 5: 'span 5 / span 5',
+ 6: 'span 6 / span 6',
+ 7: 'span 7 / span 7',
+ 8: 'span 8 / span 8',
+ 9: 'span 9 / span 9',
+ 10: 'span 10 / span 10',
+ 11: 'span 11 / span 11',
+ 12: 'span 12 / span 12',
+ full: '1 / -1',
+ },
+ gridColumnStart: {
+ 1: '1',
+ 2: '2',
+ 3: '3',
+ 4: '4',
+ 5: '5',
+ 6: '6',
+ 7: '7',
+ 8: '8',
+ 9: '9',
+ 10: '10',
+ 11: '11',
+ 12: '12',
+ 13: '13',
+ auto: 'auto',
+ },
+ gridColumnEnd: {
+ 1: '1',
+ 2: '2',
+ 3: '3',
+ 4: '4',
+ 5: '5',
+ 6: '6',
+ 7: '7',
+ 8: '8',
+ 9: '9',
+ 10: '10',
+ 11: '11',
+ 12: '12',
+ 13: '13',
+ auto: 'auto',
+ },
+ },
+ shorthands: {
+ colSpan: ['gridColumn'],
+ rowSpan: ['gridRow'],
+ start: ['gridColumnStart'],
+ end: ['gridColumnEnd'],
+ },
+});
+
+export const gridItemSprinkles = createSprinkles(
+ colorProperties,
+ gridItemProperties,
+);
diff --git a/packages/canon/src/components/Grid/styles.css b/packages/canon/src/components/Grid/styles.css
new file mode 100644
index 0000000000..81f8d5471d
--- /dev/null
+++ b/packages/canon/src/components/Grid/styles.css
@@ -0,0 +1,3 @@
+.grid {
+ display: grid;
+}
diff --git a/packages/canon/src/components/Grid/types.ts b/packages/canon/src/components/Grid/types.ts
new file mode 100644
index 0000000000..87edbd75bf
--- /dev/null
+++ b/packages/canon/src/components/Grid/types.ts
@@ -0,0 +1,39 @@
+/*
+ * 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 { Breakpoint, ColorProps } from '../../layout/types';
+import { SpaceProps } from '../../layout/types';
+
+/** @public */
+export type Columns = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;
+
+/** @public */
+export interface GridProps extends SpaceProps, ColorProps {
+ children?: React.ReactNode;
+ columns?: Columns | Partial>;
+ className?: string;
+ style?: React.CSSProperties;
+}
+
+/** @public */
+export interface GridItemProps {
+ children: React.ReactNode;
+ rowSpan?: Columns | 'full';
+ colSpan?: Columns | 'full';
+ start?: Columns | 'auto';
+ end?: Columns | 'auto';
+ className?: string;
+ style?: React.CSSProperties;
+}
diff --git a/packages/canon/src/components/Icon/Icon.stories.tsx b/packages/canon/src/components/Icon/Icon.stories.tsx
new file mode 100644
index 0000000000..61e837c5ed
--- /dev/null
+++ b/packages/canon/src/components/Icon/Icon.stories.tsx
@@ -0,0 +1,60 @@
+/*
+ * 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 React from 'react';
+import { Meta, StoryObj } from '@storybook/react';
+import { Icon } from './Icon';
+import { ThemeProvider } from '../../theme/context';
+import { defaultIcons } from './icons';
+
+const meta = {
+ title: 'Components/Icon',
+ component: Icon,
+ parameters: {
+ layout: 'centered',
+ },
+ argTypes: {
+ name: {
+ control: 'select',
+ options: Object.keys(defaultIcons),
+ },
+ },
+ args: {
+ name: 'heart',
+ },
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Primary: Story = {
+ args: {
+ name: 'heart',
+ },
+};
+
+export const WithCustomIcon: Story = {
+ args: {
+ name: 'arrowDown',
+ },
+ decorators: [
+ Story => (
+
Custom Icon
}}>
+
+
+ ),
+ ],
+};
diff --git a/packages/canon/src/components/Icon/Icon.tsx b/packages/canon/src/components/Icon/Icon.tsx
new file mode 100644
index 0000000000..d7891c23cf
--- /dev/null
+++ b/packages/canon/src/components/Icon/Icon.tsx
@@ -0,0 +1,33 @@
+/*
+ * 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 React from 'react';
+import { useTheme } from '../../theme/context';
+import type { IconNames } from './types';
+
+/** @public */
+export const Icon = ({ name }: { name: IconNames }) => {
+ const { icons } = useTheme();
+
+ const RemixIcon = icons[name];
+
+ if (!RemixIcon) {
+ console.error(`Icon "${name}" not found.`);
+ return ; // Return default icon perhaps?
+ }
+
+ return ;
+};
diff --git a/packages/canon/src/components/Icon/icons.ts b/packages/canon/src/components/Icon/icons.ts
new file mode 100644
index 0000000000..7fe2bf0056
--- /dev/null
+++ b/packages/canon/src/components/Icon/icons.ts
@@ -0,0 +1,57 @@
+/*
+ * 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.
+ */
+
+// We can add custom icons to the list outside of Remix
+
+import type { IconMap } from './types';
+import {
+ RiHeartFill,
+ RiArrowDownFill,
+ RiCloudFill,
+ RiArrowLeftFill,
+ RiArrowRightFill,
+ RiArrowUpFill,
+ RiDeleteBin6Line,
+ RiAddLine,
+ RiArrowDownSLine,
+ RiArrowUpSLine,
+ RiArrowLeftSLine,
+ RiArrowRightSLine,
+ RiArrowDownCircleLine,
+ RiArrowLeftCircleLine,
+ RiArrowRightCircleLine,
+ RiArrowUpCircleLine,
+} from '@remixicon/react';
+
+// List of default icons
+export const defaultIcons: IconMap = {
+ arrowDown: RiArrowDownFill,
+ arrowLeft: RiArrowLeftFill,
+ arrowRight: RiArrowRightFill,
+ arrowUp: RiArrowUpFill,
+ arrowDownCircle: RiArrowDownCircleLine,
+ arrowLeftCircle: RiArrowLeftCircleLine,
+ arrowRightCircle: RiArrowRightCircleLine,
+ arrowUpCircle: RiArrowUpCircleLine,
+ chevronDown: RiArrowDownSLine,
+ chevronUp: RiArrowUpSLine,
+ chevronLeft: RiArrowLeftSLine,
+ chevronRight: RiArrowRightSLine,
+ cloud: RiCloudFill,
+ heart: RiHeartFill,
+ plus: RiAddLine,
+ trash: RiDeleteBin6Line,
+};
diff --git a/packages/canon/src/components/Icon/index.tsx b/packages/canon/src/components/Icon/index.tsx
new file mode 100644
index 0000000000..3e7564c77e
--- /dev/null
+++ b/packages/canon/src/components/Icon/index.tsx
@@ -0,0 +1,18 @@
+/*
+ * 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 * from './Icon';
+export type * from './types';
diff --git a/packages/canon/src/components/Icon/types.ts b/packages/canon/src/components/Icon/types.ts
new file mode 100644
index 0000000000..d60eaca020
--- /dev/null
+++ b/packages/canon/src/components/Icon/types.ts
@@ -0,0 +1,37 @@
+/*
+ * 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.
+ */
+
+/** @public */
+export type IconNames =
+ | 'arrowDown'
+ | 'arrowLeft'
+ | 'arrowRight'
+ | 'arrowUp'
+ | 'arrowDownCircle'
+ | 'arrowLeftCircle'
+ | 'arrowRightCircle'
+ | 'arrowUpCircle'
+ | 'chevronDown'
+ | 'chevronLeft'
+ | 'chevronRight'
+ | 'chevronUp'
+ | 'cloud'
+ | 'heart'
+ | 'plus'
+ | 'trash';
+
+/** @public */
+export type IconMap = Partial>;
diff --git a/packages/canon/src/components/Inline/Docs.mdx b/packages/canon/src/components/Inline/Docs.mdx
new file mode 100644
index 0000000000..0469ff0860
--- /dev/null
+++ b/packages/canon/src/components/Inline/Docs.mdx
@@ -0,0 +1,122 @@
+import { Meta, Unstyled, Source } from '@storybook/blocks';
+import * as InlineStories from './Inline.stories';
+import { Title, Text } from '../../../docs/components';
+import { PropsTable, getBoxProps } from '../../../docs/components/PropsTable';
+import { spacingProperties } from '../../layout/sprinkles.css';
+import { inlineProperties } from './sprinkles.css';
+
+
+
+
+
+Inline
+
+
+ The Inline component is used to create a horizontal layout of elements. By
+ default it uses flex and flexWrap to make sure that your content always flows
+ responsively.
+
+
+Installation
+
+
+
+ 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 Inline component.
+
+
+ Hello World
+ Hello World
+ Hello World
+`}
+ language="tsx"
+ dark
+/>
+
+Responsive
+
+ The Inline component also supports responsive values, making it easy to create
+ responsive designs.
+
+
+ Hello World
+ Hello World
+ Hello World
+`}
+ language="tsx"
+ dark
+/>
+
+Align
+
+ The Inline component also supports responsive alignment, making it easy to
+ create responsive designs.
+
+
+ Hello World
+ Hello World
+ Hello World
+`}
+ language="tsx"
+ dark
+/>
+
+Align vertically
+
+ The Inline component also supports responsive vertical alignment, making it
+ easy to create responsive designs.
+
+
+ Hello World
+ Hello World
+ Hello World
+`}
+ language="tsx"
+ dark
+/>
+
+
diff --git a/packages/canon/src/components/Inline/Inline.stories.tsx b/packages/canon/src/components/Inline/Inline.stories.tsx
new file mode 100644
index 0000000000..613fd68c68
--- /dev/null
+++ b/packages/canon/src/components/Inline/Inline.stories.tsx
@@ -0,0 +1,128 @@
+/*
+ * 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 React from 'react';
+import type { Meta, StoryObj } from '@storybook/react';
+import { Inline } from './Inline';
+import { Box } from '../Box/Box';
+import { argTypesSpacing, argTypesColor } from '../../../docs/utils/argTypes';
+
+const meta = {
+ title: 'Components/Inline',
+ component: Inline,
+ argTypes: {
+ ...argTypesSpacing,
+ ...argTypesColor,
+ align: {
+ control: 'inline-radio',
+ options: ['left', 'center', 'right'],
+ },
+ alignY: {
+ control: 'inline-radio',
+ options: ['top', 'center', 'bottom'],
+ },
+ children: {
+ control: false,
+ },
+ as: {
+ control: false,
+ },
+ className: {
+ control: 'text',
+ },
+ },
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+const FakeBox = ({
+ width = 120,
+ height = 80,
+}: {
+ width?: number;
+ height?: number;
+}) => (
+
+);
+
+export const Default: Story = {
+ args: {
+ children: (
+ <>
+ {Array.from({ length: 32 }).map((_, index) => (
+
+ ))}
+ >
+ ),
+ },
+};
+
+export const AlignLeft: Story = {
+ args: {
+ ...Default.args,
+ align: 'left',
+ },
+};
+
+export const AlignCenter: Story = {
+ args: {
+ ...Default.args,
+ align: 'center',
+ },
+};
+
+export const AlignRight: Story = {
+ args: {
+ ...Default.args,
+ align: 'right',
+ },
+};
+
+export const VerticalAlignTop: Story = {
+ args: {
+ ...Default.args,
+ alignY: 'top',
+ },
+};
+
+export const VerticalAlignCenter: Story = {
+ args: {
+ ...Default.args,
+ alignY: 'center',
+ },
+};
+
+export const VerticalAlignBottom: Story = {
+ args: {
+ ...Default.args,
+ alignY: 'bottom',
+ },
+};
+
+export const LargeGap: Story = {
+ args: {
+ ...Default.args,
+ gap: 'xl',
+ },
+};
diff --git a/packages/canon/src/components/Inline/Inline.tsx b/packages/canon/src/components/Inline/Inline.tsx
new file mode 100644
index 0000000000..b583b2ae08
--- /dev/null
+++ b/packages/canon/src/components/Inline/Inline.tsx
@@ -0,0 +1,67 @@
+/*
+ * 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 { createElement, forwardRef } from 'react';
+import { inlineSprinkles } from './sprinkles.css';
+import type { InlineProps } from './types';
+
+const alignYToFlexAlign = (alignY: InlineProps['alignY']) => {
+ if (alignY === 'top') return 'flex-start';
+ if (alignY === 'center') return 'center';
+ if (alignY === 'bottom') return 'flex-end';
+ return undefined;
+};
+
+const alignToFlexAlignY = (align: InlineProps['align']) => {
+ if (align === 'left') return 'flex-start';
+ if (align === 'center') return 'center';
+ if (align === 'right') return 'flex-end';
+ return undefined;
+};
+
+/** @public */
+export const Inline = forwardRef((props, ref) => {
+ const {
+ as = 'div',
+ children,
+ align = 'left',
+ alignY = 'top',
+ gap = 'xs',
+ className,
+ style,
+ ...restProps
+ } = props;
+
+ // Generate the list of class names
+ const sprinklesClassName = inlineSprinkles({
+ ...restProps,
+ gap,
+ alignItems: alignYToFlexAlign(alignY),
+ justifyContent: alignToFlexAlignY(align),
+ });
+
+ // Combine the base class name, the sprinkles class name, and any additional class names
+ const classNames = ['inline', sprinklesClassName, className]
+ .filter(Boolean)
+ .join(' ');
+
+ return createElement(as, {
+ ref,
+ className: classNames,
+ style,
+ children,
+ });
+});
diff --git a/packages/canon/src/components/Inline/index.ts b/packages/canon/src/components/Inline/index.ts
new file mode 100644
index 0000000000..2cc100c02a
--- /dev/null
+++ b/packages/canon/src/components/Inline/index.ts
@@ -0,0 +1,17 @@
+/*
+ * 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 { Inline } from './Inline';
+export type { InlineProps } from './types';
diff --git a/packages/canon/src/components/Inline/sprinkles.css.ts b/packages/canon/src/components/Inline/sprinkles.css.ts
new file mode 100644
index 0000000000..ccd4126608
--- /dev/null
+++ b/packages/canon/src/components/Inline/sprinkles.css.ts
@@ -0,0 +1,34 @@
+/*
+ * 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 { defineProperties, createSprinkles } from '@vanilla-extract/sprinkles';
+import { breakpoints } from '../../layout/properties';
+import { colorProperties, spacingProperties } from '../../layout/sprinkles.css';
+
+export const inlineProperties = defineProperties({
+ conditions: breakpoints,
+ defaultCondition: 'xs',
+ properties: {
+ alignItems: ['flex-start', 'center', 'flex-end'],
+ justifyContent: ['flex-start', 'center', 'flex-end'],
+ },
+});
+
+export const inlineSprinkles = createSprinkles(
+ spacingProperties,
+ colorProperties,
+ inlineProperties,
+);
diff --git a/packages/canon/src/components/Inline/styles.css b/packages/canon/src/components/Inline/styles.css
new file mode 100644
index 0000000000..fb9b1c3825
--- /dev/null
+++ b/packages/canon/src/components/Inline/styles.css
@@ -0,0 +1,4 @@
+.inline {
+ display: flex;
+ flex-wrap: wrap;
+}
diff --git a/packages/canon/src/components/Inline/types.ts b/packages/canon/src/components/Inline/types.ts
new file mode 100644
index 0000000000..3d981d0d31
--- /dev/null
+++ b/packages/canon/src/components/Inline/types.ts
@@ -0,0 +1,36 @@
+/*
+ * 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 { AsProps, Breakpoint, ColorProps } from '../../layout/types';
+import { SpaceProps } from '../../layout/types';
+
+/** @public */
+export interface InlineProps extends SpaceProps, ColorProps {
+ children: React.ReactNode;
+ as?: AsProps;
+ align?:
+ | 'left'
+ | 'center'
+ | 'right'
+ | Partial>;
+ alignY?:
+ | 'top'
+ | 'center'
+ | 'bottom'
+ | Partial>;
+ className?: string;
+ style?: React.CSSProperties;
+}
diff --git a/packages/canon/src/components/Stack/Docs.mdx b/packages/canon/src/components/Stack/Docs.mdx
new file mode 100644
index 0000000000..5ec864937b
--- /dev/null
+++ b/packages/canon/src/components/Stack/Docs.mdx
@@ -0,0 +1,123 @@
+import { Meta, Unstyled, Source } from '@storybook/blocks';
+import * as StackStories from './Stack.stories';
+import { Title, Text } from '../../../docs/components';
+import { PropsTable, getBoxProps } from '../../../docs/components/PropsTable';
+import { spacingProperties } from '../../layout/sprinkles.css';
+
+
+
+
+
+Stack
+
+
+ This is the stack 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.
+
+
+Installation
+
+
+
+ API reference
+
+
+
+
+
+ The grid component also accepts all the spacing props from the Box component.
+
+
+
+
+Common questions
+
+Can I stack horizontally?
+
+ The Stack component only allows for stacking elements vertically. If you want
+ to create a column layout, please use the Grid component.
+
+
+
+ Hello World
+ Hello World
+ Hello World
+
+`}
+ language="tsx"
+ dark
+/>
+
+Examples
+
+Simple
+
+ A simple example of how to use the Stack component with a medium gap.
+
+
+
+ Hello World
+ Hello World
+ Hello World
+`}
+ language="tsx"
+ dark
+/>
+
+Responsive
+
+ The Stack component also supports responsive values, making it easy to create
+ responsive designs.
+
+
+ Hello World
+ Hello World
+ Hello World
+`}
+ language="tsx"
+ dark
+/>
+
+Align
+
+ The Stack component also supports responsive alignment, making it easy to
+ create responsive designs.
+
+
+ Hello World
+ Hello World
+ Hello World
+`}
+ language="tsx"
+ dark
+/>
+
+
diff --git a/packages/canon/src/components/Stack/Stack.stories.tsx b/packages/canon/src/components/Stack/Stack.stories.tsx
new file mode 100644
index 0000000000..331c2ee1e1
--- /dev/null
+++ b/packages/canon/src/components/Stack/Stack.stories.tsx
@@ -0,0 +1,123 @@
+/*
+ * 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 React from 'react';
+import type { Meta, StoryObj } from '@storybook/react';
+import { Stack } from './Stack';
+import { Box } from '../Box/Box';
+import { argTypesSpacing, argTypesColor } from '../../../docs/utils/argTypes';
+
+const meta = {
+ title: 'Components/Stack',
+ component: Stack,
+ argTypes: {
+ ...argTypesSpacing,
+ ...argTypesColor,
+ align: {
+ control: 'inline-radio',
+ options: ['left', 'center', 'right'],
+ },
+ children: {
+ control: false,
+ },
+ as: {
+ control: false,
+ },
+ className: {
+ control: 'text',
+ },
+ },
+ args: {
+ align: 'left',
+ gap: 'xs',
+ },
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+const FakeBox = () => (
+
+ Fake Box
+
+);
+
+export const Default: Story = {
+ args: {
+ children: (
+ <>
+
+
+
+ >
+ ),
+ },
+};
+
+export const AlignLeft: Story = {
+ args: {
+ ...Default.args,
+ align: 'left',
+ },
+};
+
+export const AlignCenter: Story = {
+ args: {
+ ...Default.args,
+ align: 'center',
+ },
+};
+
+export const AlignRight: Story = {
+ args: {
+ ...Default.args,
+ align: 'right',
+ },
+};
+
+export const ResponsiveAlign: Story = {
+ args: {
+ ...Default.args,
+ align: {
+ xs: 'left',
+ md: 'center',
+ lg: 'right',
+ },
+ },
+};
+
+export const ResponsiveGap: Story = {
+ args: {
+ ...Default.args,
+ gap: {
+ xs: 'xs',
+ md: 'md',
+ lg: '2xl',
+ },
+ },
+};
+
+export const LargeGap: Story = {
+ args: {
+ ...Default.args,
+ gap: 'xl',
+ },
+};
diff --git a/packages/canon/src/components/Stack/Stack.tsx b/packages/canon/src/components/Stack/Stack.tsx
new file mode 100644
index 0000000000..e0c36f2043
--- /dev/null
+++ b/packages/canon/src/components/Stack/Stack.tsx
@@ -0,0 +1,61 @@
+/*
+ * 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 { createElement, forwardRef } from 'react';
+import { StackProps } from './types';
+import { stackSprinkles } from './sprinkles.css';
+
+const alignToFlexAlign = (align: StackProps['align']) => {
+ if (align === 'left') return 'stretch';
+ if (align === 'center') return 'center';
+ if (align === 'right') return 'flex-end';
+ return undefined;
+};
+
+/** @public */
+export const Stack = forwardRef((props, ref) => {
+ const {
+ as = 'div',
+ children,
+ align = 'left',
+ gap = 'xs',
+ className,
+ style,
+ ...restProps
+ } = props;
+
+ // Transform the align prop
+ const flexAlign = alignToFlexAlign(align);
+
+ // Generate the list of class names
+ const sprinklesClassName = stackSprinkles({
+ ...restProps,
+ gap,
+ alignItems: flexAlign,
+ });
+
+ // Combine the base class name, the sprinkles class name, and any additional class names
+ const classNames = ['stack', sprinklesClassName, className]
+ .filter(Boolean)
+ .join(' ');
+
+ return createElement(as, {
+ ref,
+ className: classNames,
+ style,
+ children,
+ });
+});
diff --git a/packages/canon/src/components/Stack/index.ts b/packages/canon/src/components/Stack/index.ts
new file mode 100644
index 0000000000..7abbc3f439
--- /dev/null
+++ b/packages/canon/src/components/Stack/index.ts
@@ -0,0 +1,17 @@
+/*
+ * 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 { Stack } from './Stack';
+export type { StackProps } from './types';
diff --git a/packages/canon/src/components/Stack/sprinkles.css.ts b/packages/canon/src/components/Stack/sprinkles.css.ts
new file mode 100644
index 0000000000..85c8f83a71
--- /dev/null
+++ b/packages/canon/src/components/Stack/sprinkles.css.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { defineProperties, createSprinkles } from '@vanilla-extract/sprinkles';
+import { breakpoints } from '../../layout/properties';
+import { colorProperties, spacingProperties } from '../../layout/sprinkles.css';
+
+const stackProperties = defineProperties({
+ conditions: breakpoints,
+ defaultCondition: 'xs',
+ properties: {
+ alignItems: ['stretch', 'flex-start', 'center', 'flex-end'],
+ },
+});
+
+export const stackSprinkles = createSprinkles(
+ spacingProperties,
+ colorProperties,
+ stackProperties,
+);
diff --git a/packages/canon/src/components/Stack/styles.css b/packages/canon/src/components/Stack/styles.css
new file mode 100644
index 0000000000..784fd3b1ab
--- /dev/null
+++ b/packages/canon/src/components/Stack/styles.css
@@ -0,0 +1,4 @@
+.stack {
+ display: flex;
+ flex-direction: column;
+}
diff --git a/packages/canon/src/components/Stack/types.ts b/packages/canon/src/components/Stack/types.ts
new file mode 100644
index 0000000000..529e92d1bd
--- /dev/null
+++ b/packages/canon/src/components/Stack/types.ts
@@ -0,0 +1,30 @@
+/*
+ * 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 { AsProps, Breakpoint, ColorProps } from '../../layout/types';
+import { SpaceProps } from '../../layout/types';
+
+/** @public */
+export interface StackProps extends SpaceProps, ColorProps {
+ children: React.ReactNode;
+ as?: AsProps;
+ align?:
+ | 'left'
+ | 'center'
+ | 'right'
+ | Partial>;
+ className?: string;
+ style?: React.CSSProperties;
+}
diff --git a/packages/canon/src/index.ts b/packages/canon/src/index.ts
new file mode 100644
index 0000000000..6497be2945
--- /dev/null
+++ b/packages/canon/src/index.ts
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ */
+
+/**
+ * Components used by Backstage plugins and apps
+ *
+ * @packageDocumentation
+ */
+
+// Layout types
+export * from './layout/types';
+
+// Layout components
+export * from './components/Box';
+export * from './components/Grid';
+export * from './components/Stack';
+export * from './components/Inline';
+export * from './components/Container';
+
+// UI components
+export * from './components/Button';
+export * from './components/Icon';
diff --git a/packages/canon/src/layout/properties.ts b/packages/canon/src/layout/properties.ts
new file mode 100644
index 0000000000..d41bbddbeb
--- /dev/null
+++ b/packages/canon/src/layout/properties.ts
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+
+/** @public */
+export const breakpoints = {
+ xs: {},
+ sm: { '@media': 'screen and (min-width: 640px)' },
+ md: { '@media': 'screen and (min-width: 768px)' },
+ lg: { '@media': 'screen and (min-width: 1024px)' },
+ xl: { '@media': 'screen and (min-width: 1280px)' },
+ '2xl': { '@media': 'screen and (min-width: 1536px)' },
+};
+
+/** @public */
+export const themes = {
+ light: { selector: '[data-theme="light"] &' },
+ dark: { selector: '[data-theme="dark"] &' },
+};
+
+/** @public */
+export const space = {
+ none: 0,
+ '2xs': 'var(--canon-spacing-2xs)',
+ xs: 'var(--canon-spacing-xs)',
+ sm: 'var(--canon-spacing-sm)',
+ md: 'var(--canon-spacing-md)',
+ lg: 'var(--canon-spacing-lg)',
+ xl: 'var(--canon-spacing-xl)',
+ '2xl': 'var(--canon-spacing-2xl)',
+};
diff --git a/packages/canon/src/layout/sprinkles.css.ts b/packages/canon/src/layout/sprinkles.css.ts
new file mode 100644
index 0000000000..7e85487fe3
--- /dev/null
+++ b/packages/canon/src/layout/sprinkles.css.ts
@@ -0,0 +1,63 @@
+/*
+ * 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 { defineProperties } from '@vanilla-extract/sprinkles';
+import { breakpoints, space } from './properties';
+
+export const spacingProperties = defineProperties({
+ conditions: breakpoints,
+ defaultCondition: 'xs',
+ responsiveArray: ['xs', 'sm', 'md', 'lg', 'xl', '2xl'],
+ properties: {
+ paddingTop: space,
+ paddingBottom: space,
+ paddingLeft: space,
+ paddingRight: space,
+ marginTop: space,
+ marginBottom: space,
+ marginLeft: space,
+ marginRight: space,
+ gap: space,
+ },
+ shorthands: {
+ padding: ['paddingTop', 'paddingBottom', 'paddingLeft', 'paddingRight'],
+ paddingX: ['paddingLeft', 'paddingRight'],
+ paddingY: ['paddingTop', 'paddingBottom'],
+ margin: ['marginTop', 'marginBottom', 'marginLeft', 'marginRight'],
+ marginX: ['marginLeft', 'marginRight'],
+ marginY: ['marginTop', 'marginBottom'],
+ },
+});
+
+export const colorProperties = defineProperties({
+ conditions: {
+ light: { selector: '[data-theme="light"] &' },
+ dark: { selector: '[data-theme="dark"] &' },
+ },
+ defaultCondition: ['light', 'dark'],
+ properties: {
+ color: {
+ primary: 'var(--canon-text-primary)',
+ secondary: 'var(--canon-text-secondary)',
+ error: 'var(--canon-error)',
+ },
+ background: {
+ background: 'var(--canon-background)',
+ elevation1: 'var(--canon-surface-1)',
+ elevation2: 'var(--canon-surface-2)',
+ transparent: 'transparent',
+ },
+ },
+});
diff --git a/packages/canon/src/layout/types.ts b/packages/canon/src/layout/types.ts
new file mode 100644
index 0000000000..c051dacb44
--- /dev/null
+++ b/packages/canon/src/layout/types.ts
@@ -0,0 +1,131 @@
+/*
+ * 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 { breakpoints, space, themes } from './properties';
+
+/** @public */
+export type Breakpoint = keyof typeof breakpoints;
+
+/** @public */
+export type Space = keyof typeof space;
+
+/** @public */
+export type Theme = keyof typeof themes;
+
+/** @public */
+export type Gap = Space | Partial>;
+
+/** @public */
+export type PaddingLeft = Space | Partial>;
+
+/** @public */
+export type PaddingRight = Space | Partial>;
+
+/** @public */
+export type PaddingTop = Space | Partial>;
+
+/** @public */
+export type PaddingBottom = Space | Partial>;
+
+/** @public */
+export type Padding = Space | Partial>;
+
+/** @public */
+export type PaddingX = Space | Partial>;
+
+/** @public */
+export type PaddingY = Space | Partial>;
+
+/** @public */
+export type MarginLeft = Space | Partial>;
+
+/** @public */
+export type MarginRight = Space | Partial>;
+
+/** @public */
+export type MarginTop = Space | Partial>;
+
+/** @public */
+export type MarginBottom = Space | Partial>;
+
+/** @public */
+export type Margin = Space | Partial>;
+
+/** @public */
+export type MarginX = Space | Partial>;
+
+/** @public */
+export type MarginY = Space | Partial>;
+
+/** @public */
+export interface SpaceProps {
+ gap?: Gap;
+ padding?: Padding;
+ paddingLeft?: PaddingLeft;
+ paddingRight?: PaddingRight;
+ paddingTop?: PaddingTop;
+ paddingBottom?: PaddingBottom;
+ paddingX?: PaddingX;
+ paddingY?: PaddingY;
+ margin?: Margin;
+ marginLeft?: MarginLeft;
+ marginRight?: MarginRight;
+ marginTop?: MarginTop;
+ marginBottom?: MarginBottom;
+ marginX?: MarginX;
+ marginY?: MarginY;
+}
+
+/** @public */
+export type Background =
+ | 'background'
+ | 'elevation1'
+ | 'elevation2'
+ | 'transparent'
+ | Partial<
+ Record
+ >;
+
+/** @public */
+export type Color =
+ | 'primary'
+ | 'secondary'
+ | 'error'
+ | Partial>;
+
+/** @public */
+export type AsProps =
+ | 'div'
+ | 'span'
+ | 'p'
+ | 'article'
+ | 'section'
+ | 'main'
+ | 'nav'
+ | 'aside'
+ | 'ul'
+ | 'ol'
+ | 'li'
+ | 'details'
+ | 'summary'
+ | 'dd'
+ | 'dl'
+ | 'dt';
+
+/** @public */
+export interface ColorProps {
+ color?: Color;
+ background?: Background;
+}
diff --git a/packages/canon/src/theme/context.tsx b/packages/canon/src/theme/context.tsx
new file mode 100644
index 0000000000..77f43927f2
--- /dev/null
+++ b/packages/canon/src/theme/context.tsx
@@ -0,0 +1,48 @@
+/*
+ * 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 React, { createContext, useContext, ReactNode } from 'react';
+import { IconMap, IconNames } from '../components/Icon/types';
+import { defaultIcons } from '../components/Icon/icons';
+
+interface ThemeContextProps {
+ icons: IconMap;
+}
+
+const ThemeContext = createContext({
+ icons: defaultIcons,
+});
+
+/** @public */
+export const ThemeProvider = ({
+ children,
+ overrides,
+}: {
+ children: ReactNode;
+ overrides: Partial>;
+}) => {
+ // Merge provided overrides with default icons
+ const combinedIcons = { ...defaultIcons, ...overrides };
+
+ return (
+
+ {children}
+
+ );
+};
+
+/** @public */
+export const useTheme = () => useContext(ThemeContext);
diff --git a/packages/canon/src/theme/styles.css b/packages/canon/src/theme/styles.css
new file mode 100644
index 0000000000..ad2433ef74
--- /dev/null
+++ b/packages/canon/src/theme/styles.css
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+
+/* Geist font */
+@import url('https://fonts.googleapis.com/css2?family=Geist:wght@100..900&display=swap');
+@import url('https://fonts.googleapis.com/css2?family=Geist+Mono:wght@100..900&family=Geist:wght@100..900&display=swap');
+
+/* Theme */
+@import './theme.css';
+
+/* Components */
+@import '../components/Button/styles.css';
+@import '../components/Stack/styles.css';
+@import '../components/Inline/styles.css';
+@import '../components/Grid/styles.css';
+@import '../components/Container/styles.css';
diff --git a/packages/canon/src/theme/theme.css b/packages/canon/src/theme/theme.css
new file mode 100644
index 0000000000..ef78b2221a
--- /dev/null
+++ b/packages/canon/src/theme/theme.css
@@ -0,0 +1,103 @@
+/*
+ * 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.
+ */
+
+/* Light theme */
+:root {
+ /* Colors */
+ --canon-accent: #000;
+ --canon-background: #f8f8f8;
+ --canon-surface-1: #fff;
+ --canon-surface-2: #f4f4f4;
+
+ /* Outlines */
+ --canon-outline: rgba(0, 0, 0, 0.1);
+ --canon-outline-hover: rgba(0, 0, 0, 0.2);
+ --canon-outline-focus: #000;
+
+ /* States - Add more states */
+ --canon-error: #f50000;
+
+ /* Text colors */
+ --canon-text-primary: #000;
+ --canon-text-primary-on-accent: #fff;
+ --canon-text-secondary: #646464;
+
+ /* Box shadows */
+ --canon-box-shadow-small: 0 0 0 1px rgba(0, 0, 0, 0.05);
+ --canon-box-shadow-medium: 0 0 0 1px rgba(0, 0, 0, 0.1);
+ --canon-box-shadow-large: 0 0 0 1px rgba(0, 0, 0, 0.2);
+
+ /* Font families */
+ --canon-font-regular: 'Geist', serif;
+ --canon-font-monospace: 'Monospace', monospace;
+ --canon-font-emoji: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
+ 'Noto Color Emoji';
+
+ /* Font weights */
+ --canon-font-normal: 400;
+ --canon-font-bold: 600;
+
+ /* Font sizes */
+ --canon-font-sizes-2xs: 0.625rem;
+ --canon-font-sizes-xs: 0.75rem;
+ --canon-font-sizes-sm: 0.875rem;
+ --canon-font-sizes-md: 1rem;
+ --canon-font-sizes-lg: 1.125rem;
+ --canon-font-sizes-xl: 1.25rem;
+ --canon-font-sizes-2xl: 1.5rem;
+ --canon-font-sizes-3xl: 1.875rem;
+ --canon-font-sizes-4xl: 2.25rem;
+ --canon-font-sizes-5xl: 3rem;
+ --canon-font-sizes-6xl: 3.75rem;
+ --canon-font-sizes-7xl: 4.5rem;
+ --canon-font-sizes-8xl: 6rem;
+ --canon-font-sizes-9xl: 8rem;
+
+ /* Spacing */
+ --canon-spacing-2xs: 0.25rem;
+ --canon-spacing-xs: 0.5rem;
+ --canon-spacing-sm: 0.75rem;
+ --canon-spacing-md: 1.25rem;
+ --canon-spacing-lg: 2rem;
+ --canon-spacing-xl: 3.25rem;
+ --canon-spacing-2xl: 5.25rem;
+
+ /* Container */
+ --canon-container-max-width: 1200px;
+ --canon-container-padding: 1rem;
+}
+
+/* Dark theme */
+[data-theme='dark'] {
+ /* Colors */
+ --canon-accent: #fff;
+ --canon-background: #000;
+ --canon-surface-1: #121212;
+ --canon-surface-2: #1a1a1a;
+
+ /* Outlines */
+ --canon-outline: rgba(255, 255, 255, 0.1);
+ --canon-outline-hover: rgba(255, 255, 255, 0.2);
+ --canon-outline-focus: #fff;
+
+ /* States - Add more states */
+ --canon-error: #f50000;
+
+ /* Text colors */
+ --canon-text-primary: #fff;
+ --canon-text-primary-on-accent: #000;
+ --canon-text-secondary: #b3b3b3;
+}
diff --git a/packages/canon/static/CNAME b/packages/canon/static/CNAME
new file mode 100644
index 0000000000..a07d95935a
--- /dev/null
+++ b/packages/canon/static/CNAME
@@ -0,0 +1 @@
+canon.backstage.io
diff --git a/packages/canon/static/favicon.svg b/packages/canon/static/favicon.svg
new file mode 100644
index 0000000000..12cad81e95
--- /dev/null
+++ b/packages/canon/static/favicon.svg
@@ -0,0 +1,4 @@
+
diff --git a/packages/canon/static/header.png b/packages/canon/static/header.png
new file mode 100644
index 0000000000..507bd05ca7
Binary files /dev/null and b/packages/canon/static/header.png differ
diff --git a/packages/canon/static/logo.svg b/packages/canon/static/logo.svg
new file mode 100644
index 0000000000..eb2b8aeaf2
--- /dev/null
+++ b/packages/canon/static/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/catalog-client/CHANGELOG.md b/packages/catalog-client/CHANGELOG.md
index 3326f2a5f7..cdf5e80818 100644
--- a/packages/catalog-client/CHANGELOG.md
+++ b/packages/catalog-client/CHANGELOG.md
@@ -1,5 +1,40 @@
# @backstage/catalog-client
+## 1.9.0-next.1
+
+### Minor Changes
+
+- 384e494: Internal updates to generated code.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+
+## 1.8.1-next.0
+
+### Patch Changes
+
+- d7e7836: Fixed a bug in the `queryEntities` method where errors were not being handled properly.
+- Updated dependencies
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+
+## 1.8.0
+
+### Minor Changes
+
+- 656d1ef: Internal update to use the updated generated code from `backstage-cli package schema openapi generate --client-package ...`.
+- 31c4fe0: The client now automatically splits up very large `getEntitiesByRefs` calls into several smaller requests behind the scenes when needed. This ensures that each individual request does not exceed common Express.js request body limits or overload the server.
+
+### Patch Changes
+
+- 873f89a: Fix for certain filter fields in the `catalogApiMock` being case sensitive.
+- Updated dependencies
+ - @backstage/catalog-model@1.7.1
+ - @backstage/errors@1.2.5
+
## 1.8.0-next.1
### Minor Changes
diff --git a/packages/catalog-client/package.json b/packages/catalog-client/package.json
index 6e193132f0..db66b541c7 100644
--- a/packages/catalog-client/package.json
+++ b/packages/catalog-client/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/catalog-client",
- "version": "1.8.0-next.1",
+ "version": "1.9.0-next.1",
"description": "An isomorphic client for the catalog backend",
"backstage": {
"role": "common-library"
diff --git a/packages/catalog-client/src/CatalogClient.test.ts b/packages/catalog-client/src/CatalogClient.test.ts
index ce44b93b59..ea61634a8b 100644
--- a/packages/catalog-client/src/CatalogClient.test.ts
+++ b/packages/catalog-client/src/CatalogClient.test.ts
@@ -525,6 +525,18 @@ describe('CatalogClient', () => {
'?cursor=prevcursor',
);
});
+
+ it('should handle errors', async () => {
+ const mockedEndpoint = jest
+ .fn()
+ .mockImplementation((_req, res, ctx) => res(ctx.status(401)));
+
+ server.use(rest.get(`${mockBaseUrl}/entities/by-query`, mockedEndpoint));
+
+ await expect(() => client.queryEntities()).rejects.toThrow(
+ /Request failed with 401 Unauthorized/,
+ );
+ });
});
describe('getEntityByRef', () => {
diff --git a/packages/catalog-client/src/CatalogClient.ts b/packages/catalog-client/src/CatalogClient.ts
index 8054063c0b..e820716945 100644
--- a/packages/catalog-client/src/CatalogClient.ts
+++ b/packages/catalog-client/src/CatalogClient.ts
@@ -237,9 +237,9 @@ export class CatalogClient implements CatalogApi {
}
}
- return this.apiClient
- .getEntitiesByQuery({ query: params }, options)
- .then(r => r.json());
+ return this.requestRequired(
+ await this.apiClient.getEntitiesByQuery({ query: params }, options),
+ );
}
/**
diff --git a/packages/catalog-client/src/schema/openapi/generated/apis/DefaultApi.client.ts b/packages/catalog-client/src/schema/openapi/generated/apis/Api.client.ts
similarity index 99%
rename from packages/catalog-client/src/schema/openapi/generated/apis/DefaultApi.client.ts
rename to packages/catalog-client/src/schema/openapi/generated/apis/Api.client.ts
index 11fa561e19..1bf554672c 100644
--- a/packages/catalog-client/src/schema/openapi/generated/apis/DefaultApi.client.ts
+++ b/packages/catalog-client/src/schema/openapi/generated/apis/Api.client.ts
@@ -22,7 +22,6 @@ import { FetchApi } from '../types/fetch';
import crossFetch from 'cross-fetch';
import { pluginId } from '../pluginId';
import * as parser from 'uri-template';
-
import { AnalyzeLocationRequest } from '../models/AnalyzeLocationRequest.model';
import { AnalyzeLocationResponse } from '../models/AnalyzeLocationResponse.model';
import { CreateLocation201Response } from '../models/CreateLocation201Response.model';
@@ -55,7 +54,6 @@ export type TypedResponse = Omit & {
export interface RequestOptions {
token?: string;
}
-
/**
* @public
*/
@@ -197,7 +195,6 @@ export type ValidateEntity = {
};
/**
- * no description
* @public
*/
export class DefaultApiClient {
diff --git a/packages/catalog-client/src/schema/openapi/generated/apis/index.ts b/packages/catalog-client/src/schema/openapi/generated/apis/index.ts
index 51dcca33fe..af52f9db46 100644
--- a/packages/catalog-client/src/schema/openapi/generated/apis/index.ts
+++ b/packages/catalog-client/src/schema/openapi/generated/apis/index.ts
@@ -14,4 +14,4 @@
* limitations under the License.
*/
-export * from './DefaultApi.client';
+export * from './Api.client';
diff --git a/packages/catalog-model/CHANGELOG.md b/packages/catalog-model/CHANGELOG.md
index 005fd75e58..b9e7addea6 100644
--- a/packages/catalog-model/CHANGELOG.md
+++ b/packages/catalog-model/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/catalog-model
+## 1.7.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/errors@1.2.5
+
## 1.7.0
### Minor Changes
diff --git a/packages/catalog-model/package.json b/packages/catalog-model/package.json
index 6e26a011d9..61a3159ed2 100644
--- a/packages/catalog-model/package.json
+++ b/packages/catalog-model/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/catalog-model",
- "version": "1.7.0",
+ "version": "1.7.1",
"description": "Types and validators that help describe the model of a Backstage Catalog",
"backstage": {
"role": "common-library"
diff --git a/packages/cli-common/CHANGELOG.md b/packages/cli-common/CHANGELOG.md
index a47cb36949..4a7880688d 100644
--- a/packages/cli-common/CHANGELOG.md
+++ b/packages/cli-common/CHANGELOG.md
@@ -1,5 +1,11 @@
# @backstage/cli-common
+## 0.1.15
+
+### Patch Changes
+
+- 702f41d: Bumped dev dependencies `@types/node`
+
## 0.1.15-next.0
### Patch Changes
diff --git a/packages/cli-common/package.json b/packages/cli-common/package.json
index 7d406f87b0..d8242fd325 100644
--- a/packages/cli-common/package.json
+++ b/packages/cli-common/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/cli-common",
- "version": "0.1.15-next.0",
+ "version": "0.1.15",
"description": "Common functionality used by cli, backend, and create-app",
"backstage": {
"role": "node-library"
diff --git a/packages/cli-node/CHANGELOG.md b/packages/cli-node/CHANGELOG.md
index cc1383a375..5cbe2cb6e2 100644
--- a/packages/cli-node/CHANGELOG.md
+++ b/packages/cli-node/CHANGELOG.md
@@ -1,5 +1,25 @@
# @backstage/cli-node
+## 0.2.11-next.0
+
+### Patch Changes
+
+- af665ea: add PackageManager and Lockfile interfaces for future use
+- cbfc69e: Internal refactor
+- Updated dependencies
+ - @backstage/cli-common@0.1.15
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+
+## 0.2.10
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/cli-common@0.1.15
+ - @backstage/errors@1.2.5
+
## 0.2.10-next.0
### Patch Changes
diff --git a/packages/cli-node/package.json b/packages/cli-node/package.json
index ca40403cf5..01538d2e61 100644
--- a/packages/cli-node/package.json
+++ b/packages/cli-node/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/cli-node",
- "version": "0.2.10-next.0",
+ "version": "0.2.11-next.0",
"description": "Node.js library for Backstage CLIs",
"backstage": {
"role": "node-library"
@@ -42,6 +42,7 @@
},
"devDependencies": {
"@backstage/backend-test-utils": "workspace:^",
- "@backstage/cli": "workspace:^"
+ "@backstage/cli": "workspace:^",
+ "@backstage/test-utils": "workspace:^"
}
}
diff --git a/packages/cli-node/src/errors.ts b/packages/cli-node/src/errors.ts
new file mode 100644
index 0000000000..8be5faeb4f
--- /dev/null
+++ b/packages/cli-node/src/errors.ts
@@ -0,0 +1,32 @@
+/*
+ * 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 { CustomErrorBase } from '@backstage/errors';
+
+export class ExitCodeError extends CustomErrorBase {
+ readonly code: number;
+
+ constructor(code: number, command?: string) {
+ super(
+ command
+ ? `Command '${command}' exited with code ${code}`
+ : `Child exited with code ${code}`,
+ );
+ this.code = code;
+ }
+}
+
+export class NotFoundError extends CustomErrorBase {}
diff --git a/packages/cli-node/src/git/GitUtils.ts b/packages/cli-node/src/git/GitUtils.ts
index df04b1c6a2..7b87487c56 100644
--- a/packages/cli-node/src/git/GitUtils.ts
+++ b/packages/cli-node/src/git/GitUtils.ts
@@ -15,8 +15,7 @@
*/
import { assertError, ForwardedError } from '@backstage/errors';
-import { paths } from '../paths';
-import { execFile } from '../run';
+import { execFile, paths } from '../util';
/**
* Run a git command, trimming the output splitting it into lines.
diff --git a/packages/cli-node/src/monorepo/PackageGraph.test.ts b/packages/cli-node/src/monorepo/PackageGraph.test.ts
index 9bc9cbf72b..e2378b91c0 100644
--- a/packages/cli-node/src/monorepo/PackageGraph.test.ts
+++ b/packages/cli-node/src/monorepo/PackageGraph.test.ts
@@ -23,7 +23,7 @@ import { GitUtils } from '../git';
const mockListChangedFiles = jest.spyOn(GitUtils, 'listChangedFiles');
const mockReadFileAtRef = jest.spyOn(GitUtils, 'readFileAtRef');
-jest.mock('../paths', () => ({
+jest.mock('../util', () => ({
paths: {
targetRoot: '/',
resolveTargetRoot: (...paths: string[]) => resolvePath('/', ...paths),
diff --git a/packages/cli-node/src/monorepo/PackageGraph.ts b/packages/cli-node/src/monorepo/PackageGraph.ts
index 69ec99c2dd..721aa79e50 100644
--- a/packages/cli-node/src/monorepo/PackageGraph.ts
+++ b/packages/cli-node/src/monorepo/PackageGraph.ts
@@ -16,7 +16,7 @@
import path from 'path';
import { getPackages, Package } from '@manypkg/get-packages';
-import { paths } from '../paths';
+import { paths } from '../util';
import { PackageRole } from '../roles';
import { GitUtils } from '../git';
import { Lockfile } from './Lockfile';
diff --git a/packages/cli-node/src/monorepo/isMonoRepo.ts b/packages/cli-node/src/monorepo/isMonoRepo.ts
index da78c8dd53..f47ac4b9ad 100644
--- a/packages/cli-node/src/monorepo/isMonoRepo.ts
+++ b/packages/cli-node/src/monorepo/isMonoRepo.ts
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-import { paths } from '../paths';
+import { paths } from '../util';
import fs from 'fs-extra';
/**
diff --git a/packages/cli-node/src/monorepo/isMonorepo.test.ts b/packages/cli-node/src/monorepo/isMonorepo.test.ts
index de0dae0893..30c2d3ccbc 100644
--- a/packages/cli-node/src/monorepo/isMonorepo.test.ts
+++ b/packages/cli-node/src/monorepo/isMonorepo.test.ts
@@ -19,7 +19,7 @@ import { createMockDirectory } from '@backstage/backend-test-utils';
const mockDir = createMockDirectory();
-jest.mock('../paths', () => ({
+jest.mock('../util', () => ({
paths: { resolveTargetRoot: (...args: string[]) => mockDir.resolve(...args) },
}));
diff --git a/packages/cli-node/src/pacman/Lockfile.ts b/packages/cli-node/src/pacman/Lockfile.ts
new file mode 100644
index 0000000000..51ba07827b
--- /dev/null
+++ b/packages/cli-node/src/pacman/Lockfile.ts
@@ -0,0 +1,77 @@
+/*
+ * 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.
+ */
+
+/**
+ * An entry for a single package in a {@link Lockfile}.
+ *
+ * @public
+ */
+export type LockfileEntry = {
+ range: string;
+ version: string;
+};
+
+/**
+ * An entry for a single difference between two {@link Lockfile}s.
+ *
+ * @public
+ */
+export type LockfileDiffEntry = {
+ name: string;
+ range: string;
+};
+
+/**
+ * Represents the difference between two {@link Lockfile}s.
+ *
+ * @public
+ */
+export type LockfileDiff = {
+ added: LockfileDiffEntry[];
+ changed: LockfileDiffEntry[];
+ removed: LockfileDiffEntry[];
+};
+
+/**
+ * Represents the lockfile for a package manager.
+ *
+ * @public
+ */
+export interface Lockfile {
+ /** Get the entries for a single package in the lockfile */
+ get(name: string): LockfileEntry[] | undefined;
+
+ /** Returns the names of all packages available in the lockfile */
+ keys(): IterableIterator;
+
+ /**
+ * Creates a simplified dependency graph from the lockfile data, where each
+ * key is a package, and the value is a set of all packages that it depends on
+ * across all versions.
+ */
+ createSimplifiedDependencyGraph(): Map>;
+
+ /**
+ * Diff with another lockfile, returning entries that have been
+ * added, changed, and removed compared to the other lockfile.
+ */
+ diff(otherLockfile: Lockfile): LockfileDiff;
+
+ /**
+ * Generates a sha1 hex hash of the dependency graph for a package.
+ */
+ getDependencyTreeHash(startName: string): string;
+}
diff --git a/packages/cli-node/src/pacman/PackageManager.test.ts b/packages/cli-node/src/pacman/PackageManager.test.ts
new file mode 100644
index 0000000000..3997da554c
--- /dev/null
+++ b/packages/cli-node/src/pacman/PackageManager.test.ts
@@ -0,0 +1,114 @@
+/*
+ * 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 { createMockDirectory } from '@backstage/backend-test-utils';
+import { detectPackageManager } from './PackageManager';
+import { Yarn } from './yarn';
+import { withLogCollector } from '@backstage/test-utils';
+
+const mockDir = createMockDirectory();
+
+jest.mock('../util', () => ({
+ ...jest.requireActual('../util'),
+ paths: { resolveTargetRoot: (...args: string[]) => mockDir.resolve(...args) },
+}));
+
+const mockYarnCreate = jest.spyOn(Yarn, 'create');
+
+describe('PackageManager', () => {
+ describe('detectPackageManager', () => {
+ describe('yarn', () => {
+ afterEach(() => {
+ jest.resetAllMocks();
+ });
+
+ it('should detect via yarn.lock', async () => {
+ mockDir.setContent({
+ 'yarn.lock': 'just needs to exist',
+ });
+ await detectPackageManager();
+ expect(mockYarnCreate).toHaveBeenCalled();
+ });
+
+ it('should detect via root package.json workspaces', async () => {
+ mockDir.setContent({
+ 'package.json': JSON.stringify({
+ name: 'foo',
+ workspaces: {
+ packages: [],
+ },
+ }),
+ });
+ await detectPackageManager();
+ expect(mockYarnCreate).toHaveBeenCalled();
+ });
+
+ it('should detect via root package.json packageManager', async () => {
+ mockDir.setContent({
+ 'package.json': JSON.stringify({
+ name: 'foo',
+ packageManager: 'yarn@1.0.0',
+ }),
+ });
+ await detectPackageManager();
+ expect(mockYarnCreate).toHaveBeenCalled();
+ });
+
+ it('should fall back to yarn when root package.json packageManager field is unrecognized', async () => {
+ mockDir.setContent({
+ 'package.json': JSON.stringify({
+ name: 'foo',
+ packageManager: 'something-else@1.0.0',
+ }),
+ });
+
+ const { log } = await withLogCollector(async () => {
+ await detectPackageManager();
+ });
+
+ expect(mockYarnCreate).toHaveBeenCalledTimes(1);
+ expect(log).toHaveLength(1);
+ });
+
+ it('should fall back to yarn with available detection methods', async () => {
+ mockDir.setContent({
+ 'package.json': JSON.stringify({
+ name: 'foo',
+ }),
+ });
+
+ const { log } = await withLogCollector(async () => {
+ await detectPackageManager();
+ });
+
+ expect(mockYarnCreate).toHaveBeenCalledTimes(1);
+ expect(log).toHaveLength(1);
+ });
+
+ it('should fall back to yarn with no package.json at all', async () => {
+ mockDir.setContent({});
+
+ const { log } = await withLogCollector(async () => {
+ await detectPackageManager();
+ });
+
+ expect(mockYarnCreate).toHaveBeenCalledTimes(1);
+ // extra log for the error reading package.json
+ expect(log).toHaveLength(2);
+ });
+ });
+ });
+});
diff --git a/packages/cli-node/src/pacman/PackageManager.ts b/packages/cli-node/src/pacman/PackageManager.ts
new file mode 100644
index 0000000000..fc0aaa2c97
--- /dev/null
+++ b/packages/cli-node/src/pacman/PackageManager.ts
@@ -0,0 +1,137 @@
+/*
+ * 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 { Yarn } from './yarn';
+import { Lockfile } from './Lockfile';
+import { SpawnOptionsPartialEnv, paths } from '../util';
+import fs from 'fs-extra';
+
+/**
+ * Package info retrieved from the package manager, usually from NPM.
+ *
+ * @public
+ */
+export type PackageInfo = {
+ name: string;
+ 'dist-tags': Record;
+ versions: string[];
+ time: { [version: string]: string };
+};
+
+/**
+ * Represents the package manager in use by this instance of Backstage. This
+ * interface allows Backstage adopters to change the package manager used by
+ * their repo and still use the Backstage CLI, and it's helpful tooling.
+ *
+ * @public
+ */
+export interface PackageManager {
+ /** The name of the package manager. */
+ name(): string;
+
+ /** The self-reported version of the package manager. */
+ version(): string;
+
+ /** The file name of the lockfile used by the package manager. */
+ lockfileName(): string;
+
+ /**
+ * If this repo is a monorepo, returns the patterns specified by the package
+ * manager's monorepo configuration. Does not attempt to resolve any globs.
+ */
+ getMonorepoPackages(): Promise;
+
+ /** Uses the package manager to run a command in the repo. */
+ run(args: string[], options?: SpawnOptionsPartialEnv): Promise;
+
+ /**
+ * Executes the package manager's pack command to bundle the repo into an
+ * archive.
+ */
+ pack(output: string, packageDir: string): Promise;
+
+ /** Fetches information about the given package, usually from NPM. */
+ fetchPackageInfo(name: string): Promise;
+
+ /** Reads the lockfile from the repo. See {@link Lockfile} */
+ loadLockfile(): Promise;
+
+ /** Parses the given string as a {@link Lockfile}. */
+ parseLockfile(contents: string): Promise;
+
+ /**
+ * Whether the package manager supports the 'backstage:^' version protocol.
+ */
+ supportsBackstageVersionProtocol(): Promise;
+
+ /** A string representation of the package manager. */
+ toString(): string;
+}
+
+/**
+ * Uses several mechanisms to detect the currently used package manager. The
+ * detection methods are intended to be ordered roughly from fastest to slowest
+ * in order to make this method as fast as possible.
+ *
+ * @public
+ */
+export async function detectPackageManager(): Promise {
+ const hasYarnLockfile = await fileExists(
+ paths.resolveTargetRoot('yarn.lock'),
+ );
+ if (hasYarnLockfile) {
+ return await Yarn.create();
+ }
+
+ try {
+ const packageJson = await fs.readJson(
+ paths.resolveTargetRoot('package.json'),
+ );
+ if (packageJson.workspaces) {
+ // technically this could be NPM as well
+ return await Yarn.create();
+ }
+
+ const declaredPacman = packageJson.packageManager;
+ if (declaredPacman) {
+ const [name, _version] = declaredPacman.split('@');
+ switch (name) {
+ case 'yarn':
+ return await Yarn.create();
+ default:
+ console.log(`Detected unsupported package manager: ${name}.`);
+ return await Yarn.create();
+ }
+ }
+ } catch (error) {
+ console.log(`Error during package manager detection: ${error}`);
+ }
+
+ // currently yarn is the only package manager supported so just log an error and use it anyway
+ console.log(
+ 'Yarn was not detected, but is the only supported package manager.',
+ );
+ return await Yarn.create();
+}
+
+async function fileExists(filePath: string): Promise {
+ try {
+ await fs.access(filePath);
+ return true;
+ } catch (error) {
+ return false;
+ }
+}
diff --git a/packages/cli-node/src/pacman/index.ts b/packages/cli-node/src/pacman/index.ts
new file mode 100644
index 0000000000..4e8974d5f8
--- /dev/null
+++ b/packages/cli-node/src/pacman/index.ts
@@ -0,0 +1,24 @@
+/*
+ * 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 type { PackageManager, PackageInfo } from './PackageManager';
+export type {
+ Lockfile,
+ LockfileEntry,
+ LockfileDiff,
+ LockfileDiffEntry,
+} from './Lockfile';
+
+export { detectPackageManager } from './PackageManager';
diff --git a/packages/cli-node/src/pacman/yarn/Yarn.test.ts b/packages/cli-node/src/pacman/yarn/Yarn.test.ts
new file mode 100644
index 0000000000..9584ef54b2
--- /dev/null
+++ b/packages/cli-node/src/pacman/yarn/Yarn.test.ts
@@ -0,0 +1,59 @@
+/*
+ * 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 { createMockDirectory } from '@backstage/backend-test-utils';
+import { Yarn } from './Yarn';
+
+const mockDir = createMockDirectory();
+
+jest.mock('../../util', () => ({
+ ...jest.requireActual('../../util'),
+ paths: { resolveTargetRoot: (...args: string[]) => mockDir.resolve(...args) },
+}));
+
+const yarnClassic = new Yarn({ version: '1.0.0', codename: 'classic' });
+const yarnBerry = new Yarn({ version: '3.0.0', codename: 'berry' });
+const allYarnVersions = [yarnClassic, yarnBerry];
+
+describe('Yarn', () => {
+ describe.each(allYarnVersions)('%s.getMonorepoPackages', yarn => {
+ it('should detect a monorepo', async () => {
+ mockDir.setContent({
+ 'package.json': JSON.stringify({
+ name: 'foo',
+ workspaces: {
+ packages: ['packages/*'],
+ },
+ }),
+ });
+ await expect(yarn.getMonorepoPackages()).resolves.toEqual(['packages/*']);
+ });
+
+ it('should detect a non-monorepo', async () => {
+ mockDir.setContent({
+ 'package.json': JSON.stringify({
+ name: 'foo',
+ }),
+ });
+ await expect(yarn.getMonorepoPackages()).resolves.toEqual([]);
+ });
+
+ it('should return false if package.json is missing', async () => {
+ mockDir.setContent({});
+ await expect(yarn.getMonorepoPackages()).resolves.toEqual([]);
+ });
+ });
+});
diff --git a/packages/cli-node/src/pacman/yarn/Yarn.ts b/packages/cli-node/src/pacman/yarn/Yarn.ts
new file mode 100644
index 0000000000..0a2b8d55ea
--- /dev/null
+++ b/packages/cli-node/src/pacman/yarn/Yarn.ts
@@ -0,0 +1,121 @@
+/*
+ * 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 {
+ assertError,
+ ForwardedError,
+ NotImplementedError,
+} from '@backstage/errors';
+import { PackageInfo, PackageManager } from '../PackageManager';
+import { Lockfile } from '../Lockfile';
+import { YarnVersion } from './types';
+import fs from 'fs-extra';
+import { paths, run, execFile, SpawnOptionsPartialEnv } from '../../util';
+
+export class Yarn implements PackageManager {
+ constructor(private readonly yarnVersion: YarnVersion) {}
+
+ static async create(dir?: string): Promise {
+ const yarnVersion = await detectYarnVersion(dir);
+ return new Yarn(yarnVersion);
+ }
+
+ name() {
+ return 'yarn';
+ }
+
+ version() {
+ return this.yarnVersion.version;
+ }
+
+ lockfileName(): string {
+ return 'yarn.lock';
+ }
+
+ async getMonorepoPackages() {
+ const rootPackageJsonPath = paths.resolveTargetRoot('package.json');
+ try {
+ const pkg = await fs.readJson(rootPackageJsonPath);
+ return pkg?.workspaces?.packages || [];
+ } catch (error) {
+ return [];
+ }
+ }
+
+ async pack(out: string, packageDir: string) {
+ const outArg =
+ this.yarnVersion.codename === 'classic' ? '--filename' : '--out';
+ await this.run(['pack', outArg, out], {
+ cwd: packageDir,
+ });
+ }
+
+ async run(args: string[], options?: SpawnOptionsPartialEnv) {
+ await run('yarn', args, options);
+ }
+
+ async fetchPackageInfo(): Promise {
+ throw new NotImplementedError();
+ }
+
+ async loadLockfile(): Promise {
+ throw new NotImplementedError();
+ }
+
+ async parseLockfile(): Promise {
+ throw new NotImplementedError();
+ }
+
+ async supportsBackstageVersionProtocol(): Promise {
+ throw new NotImplementedError();
+ }
+
+ toString(): string {
+ return `${this.name()}@${this.yarnVersion.version}`;
+ }
+}
+
+const versions = new Map>();
+
+function detectYarnVersion(dir?: string): Promise {
+ const cwd = dir ?? process.cwd();
+ if (versions.has(cwd)) {
+ return versions.get(cwd)!;
+ }
+
+ const promise = Promise.resolve().then(async () => {
+ try {
+ const { stdout } = await execFile('yarn', ['--version'], {
+ shell: true,
+ cwd,
+ });
+ const versionString = stdout.trim();
+ const codename: 'classic' | 'berry' = versionString.startsWith('1.')
+ ? 'classic'
+ : 'berry';
+ return { version: versionString, codename };
+ } catch (error) {
+ assertError(error);
+ if ('stderr' in error) {
+ process.stderr.write(error.stderr as Buffer);
+ }
+ throw new ForwardedError('Failed to determine yarn version', error);
+ }
+ });
+
+ versions.set(cwd, promise);
+ return promise;
+}
diff --git a/packages/cli-node/src/pacman/yarn/index.ts b/packages/cli-node/src/pacman/yarn/index.ts
new file mode 100644
index 0000000000..a0998d50c4
--- /dev/null
+++ b/packages/cli-node/src/pacman/yarn/index.ts
@@ -0,0 +1,17 @@
+/*
+ * 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 { Yarn } from './Yarn';
diff --git a/packages/cli-node/src/pacman/yarn/types.ts b/packages/cli-node/src/pacman/yarn/types.ts
new file mode 100644
index 0000000000..f7ba98f706
--- /dev/null
+++ b/packages/cli-node/src/pacman/yarn/types.ts
@@ -0,0 +1,19 @@
+/*
+ * 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 type YarnVersion = {
+ codename: 'classic' | 'berry';
+ version: string;
+};
diff --git a/packages/cli-node/src/util.ts b/packages/cli-node/src/util.ts
new file mode 100644
index 0000000000..eaf05855b1
--- /dev/null
+++ b/packages/cli-node/src/util.ts
@@ -0,0 +1,109 @@
+/*
+ * 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 {
+ ChildProcess,
+ execFile as execFileCb,
+ spawn,
+ SpawnOptions,
+} from 'child_process';
+import { promisify } from 'util';
+import { findPaths } from '@backstage/cli-common';
+import { ExitCodeError } from './errors';
+
+export const execFile = promisify(execFileCb);
+
+/* eslint-disable-next-line no-restricted-syntax */
+export const paths = findPaths(__dirname);
+
+/**
+ * A function that can be used to log data from a child process
+ *
+ * @public
+ */
+export type LogFunc = (data: Buffer) => void;
+
+/**
+ * Options for running a child process
+ *
+ * @public
+ */
+export type SpawnOptionsPartialEnv = Omit & {
+ env?: Partial;
+ // Pipe stdout to this log function
+ stdoutLogFunc?: LogFunc;
+ // Pipe stderr to this log function
+ stderrLogFunc?: LogFunc;
+};
+
+// Runs a child command, returning a promise that is only resolved if the child exits with code 0.
+export async function run(
+ name: string,
+ args: string[] = [],
+ options: SpawnOptionsPartialEnv = {},
+) {
+ const { stdoutLogFunc, stderrLogFunc } = options;
+ const env: NodeJS.ProcessEnv = {
+ ...process.env,
+ FORCE_COLOR: 'true',
+ ...(options.env ?? {}),
+ };
+
+ const stdio = [
+ 'inherit',
+ stdoutLogFunc ? 'pipe' : 'inherit',
+ stderrLogFunc ? 'pipe' : 'inherit',
+ ] as ('inherit' | 'pipe')[];
+
+ const child = spawn(name, args, {
+ stdio,
+ shell: true,
+ ...options,
+ env,
+ });
+
+ if (stdoutLogFunc && child.stdout) {
+ child.stdout.on('data', stdoutLogFunc);
+ }
+ if (stderrLogFunc && child.stderr) {
+ child.stderr.on('data', stderrLogFunc);
+ }
+
+ await waitForExit(child, name);
+}
+
+async function waitForExit(
+ child: ChildProcess & { exitCode: number | null },
+ name?: string,
+): Promise {
+ if (typeof child.exitCode === 'number') {
+ if (child.exitCode) {
+ throw new ExitCodeError(child.exitCode, name);
+ }
+ return;
+ }
+
+ await new Promise((resolve, reject) => {
+ child.once('error', error => reject(error));
+ child.once('exit', code => {
+ if (code) {
+ reject(new ExitCodeError(code, name));
+ } else {
+ resolve();
+ }
+ });
+ });
+}
diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md
index 32a5eaf164..5fae59d357 100644
--- a/packages/cli/CHANGELOG.md
+++ b/packages/cli/CHANGELOG.md
@@ -1,5 +1,118 @@
# @backstage/cli
+## 0.29.3-next.1
+
+### Patch Changes
+
+- a49030a: Add support for `--output-file` option from ESLint to `package lint` and `repo lint` commands.
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/config-loader@1.9.3-next.0
+ - @backstage/release-manifests@0.0.12-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/cli-node@0.2.11-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/eslint-plugin@0.1.10
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/types@1.2.0
+
+## 0.29.3-next.0
+
+### Patch Changes
+
+- 2b6c1ea: If the Backstage yarn plugin is installed, it will now be automatically updated as part of `versions:bump`.
+- 7dcff85: Remove special-casing for `@types` packages when generating dependency entries
+ during templating
+- 0aff006: Bumped the version range for `html-webpack-plugin` to fix the `htmlPluginExports.getCompilationHooks is not a function` error when using experimental Rspack.
+- 583f3d4: Added `@backstage/cli/config/prettier` as a replacement for `@spotify/prettier-config`, but with the same configuration.
+- 5f04976: Update `rollup` to avoid issues with build output when running `backstage-cli package build`.
+- 5f04976: Fixed a bug that caused missing code in published packages.
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/release-manifests@0.0.12-next.0
+ - @backstage/cli-node@0.2.11-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.0
+ - @backstage/config-loader@1.9.2
+ - @backstage/errors@1.2.5
+ - @backstage/eslint-plugin@0.1.10
+ - @backstage/types@1.2.0
+
+## 0.29.0
+
+### Minor Changes
+
+- bc47b17: **BREAKING**: Updates ESLint config to ignore all generated source code under `src/**/generated/**/*.ts`.
+- 6819f8c: Added a new optimization to the `repo test` command that will filter out unused packages in watch mode if all provide filters are paths that point from the repo root. This significantly speeds up running individual tests from the repo root in a large workspace, for example:
+
+ ```sh
+ yarn test packages/app/src/App.test.tsx
+ ```
+
+- d849865: The package packing now populates `typesVersions` for additional entry points rather than using additional `package.json` files for type resolution. This improves auto completion of separate entry points when consuming published packages.
+- bc71665: **BREAKING**: The `LEGACY_BACKEND_START` flag has been removed, along with support for `src/run.ts` as the development entry point.
+
+### Patch Changes
+
+- 4046d53: Fixed an issue where the `--successCache` option for the `repo test` and `repo lint` commands would be include the workspace path in generated cache keys. This previously broke caching in environments where the workspace path varies across builds.
+- 4a378d3: Fix dev server reloads of plugin discovery for new frontend system.
+- 28b60ad: The check for `react-dom/client` in the Jest configuration will now properly always run from the target directory.
+- 6b2888c: Fixed an issue with the `--successCache` flag for `repo test` where the tree hash for the wrong package directory would sometimes be used to generate the cache key.
+- e30b65d: Added `--alwaysPack` as a replacement for the now hidden `--alwaysYarnPack` flag for the `build-workspace` command.
+- be0278e: Removed circular import
+- a7f97e4: Added a new `"rejectFrontendNetworkRequests"` configuration flag that can be set in the `"jest"` field in the root `package.json`:
+
+ ```json
+ {
+ "jest": {
+ "rejectFrontendNetworkRequests": true
+ }
+ }
+ ```
+
+ This flag causes rejection of any form of network requests that are attempted to be made in frontend or common package tests. This flag can only be set in the root `package.json` and can not be overridden in individual package configurations.
+
+- 6c48ebd: Add `--max-warnings -1` support to `backstage-cli package lint`
+- 04297a0: The `--successCache` option for the `repo test` and `repo lint` commands now use an additive store that keeps old entries around for a week before they are cleaned up automatically.
+- a2f0559: When using the experimental Rspack flag the app build and dev server now injects configuration via a `` tag in `index.html` rather than the `process.env.APP_CONFIG` definition, which will now be defined as an empty array instead.
+
+ This requires the app to be using the config loader from the 1.31 release of Backstage. Make sure your app is using at least that version if you are upgrading to this version of the CLI.
+
+ If you have copied the implementation of the `defaultConfigLoader`, make sure to update it to the new implementation. In particular the config loader needs to be able to read configuration from `script` tags with the type `backstage.io/config`.
+
+- b4627f2: Fixed an issue where the `raw-loader` for loading HTML templates was not resolved from the context of the CLI package.
+- cd1ef2b: Updated dependency `vite` to `^5.0.0`.
+- 23f1da2: Updated dependency `ts-morph` to `^24.0.0`.
+- b533056: Updated dependency `css-loader` to `^7.0.0`.
+- be008c3: Updated dependency `@module-federation/enhanced` to `^0.7.0`.
+- 6266ed3: Updated dependency `del` to `^8.0.0`.
+- 4046d53: Fixed an issue with the `repo lint` command where the cache key for the `--successCache` option would not properly ignore files that should be ignored according to `.eslintignore`s.
+- e19c53c: Fix for the `--link` flag for `package start` to deduplicate `react-router` and `react-router-dom`.
+- 17850a5: Update upgrade-helper link in `versions:bump` command to include `yarnPlugin` parameter when the yarn plugin is installed
+- 09ea093: Fixed an issue where `.css` style injection would fail for published packages.
+- 702f41d: Bumped dev dependencies `@types/node`
+- 5d74716: Remove unused backend-common dependency
+- b084f5a: Bump the Webpack dependency range to `^5.94.0`, as our current configuration is not compatible with some older versions.
+- e565f73: Added support for `.webp` files in the frontend tooling.
+- 946fa34: Added a new `--link ` option for frontend builds that allow you to override module resolution to link in an external workspace at runtime.
+
+ As part of this change the Webpack linked workspace resolution plugin for frontend builds has been removed. It was in place to support the old workspace linking where it was done by Yarn, which is no longer a working option.
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/config-loader@1.9.2
+ - @backstage/cli-common@0.1.15
+ - @backstage/catalog-model@1.7.1
+ - @backstage/cli-node@0.2.10
+ - @backstage/errors@1.2.5
+ - @backstage/eslint-plugin@0.1.10
+ - @backstage/integration@1.15.2
+ - @backstage/release-manifests@0.0.11
+
## 0.29.0-next.3
### Minor Changes
diff --git a/packages/cli-node/src/run.ts b/packages/cli/bin/backstage-cli-alpha
old mode 100644
new mode 100755
similarity index 81%
rename from packages/cli-node/src/run.ts
rename to packages/cli/bin/backstage-cli-alpha
index e924b5c5b8..38a2df3319
--- a/packages/cli-node/src/run.ts
+++ b/packages/cli/bin/backstage-cli-alpha
@@ -1,3 +1,4 @@
+#!/usr/bin/env node
/*
* Copyright 2020 The Backstage Authors
*
@@ -14,7 +15,5 @@
* limitations under the License.
*/
-import { execFile as execFileCb } from 'child_process';
-import { promisify } from 'util';
-
-export const execFile = promisify(execFileCb);
+require('@backstage/cli/config/nodeTransform.cjs');
+require('../src/alpha');
diff --git a/packages/cli/cli-report.md b/packages/cli/cli-report.md
index 3fa7198eba..d9fec4db22 100644
--- a/packages/cli/cli-report.md
+++ b/packages/cli/cli-report.md
@@ -236,6 +236,7 @@ Usage: backstage-cli package lint [options] [directories...]
Options:
--format
+ --output-file
--fix
--max-warnings
-h, --help
@@ -446,6 +447,7 @@ Usage: backstage-cli repo lint [options]
Options:
--format
+ --output-file
--since
--successCache
--successCacheDir
diff --git a/packages/cli/config/prettier.json b/packages/cli/config/prettier.json
new file mode 100644
index 0000000000..5393aaf2da
--- /dev/null
+++ b/packages/cli/config/prettier.json
@@ -0,0 +1,5 @@
+{
+ "singleQuote": true,
+ "trailingComma": "all",
+ "arrowParens": "avoid"
+}
diff --git a/packages/cli/package.json b/packages/cli/package.json
index bc4d0dda29..bb338388a3 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/cli",
- "version": "0.29.0-next.3",
+ "version": "0.29.3-next.1",
"description": "CLI for developing Backstage plugins and apps",
"backstage": {
"role": "cli"
@@ -111,7 +111,7 @@
"global-agent": "^3.0.0",
"globby": "^11.1.0",
"handlebars": "^4.7.3",
- "html-webpack-plugin": "^5.3.1",
+ "html-webpack-plugin": "^5.6.3",
"inquirer": "^8.2.0",
"jest": "^29.7.0",
"jest-cli": "^29.7.0",
@@ -122,7 +122,6 @@
"lodash": "^4.17.21",
"mini-css-extract-plugin": "^2.4.2",
"minimatch": "^9.0.0",
- "node-fetch": "^2.7.0",
"node-libs-browser": "^2.2.1",
"npm-packlist": "^5.0.0",
"ora": "^5.3.0",
@@ -136,7 +135,7 @@
"react-refresh": "^0.14.0",
"recursive-readdir": "^2.2.2",
"replace-in-file": "^7.1.0",
- "rollup": "^4.0.0",
+ "rollup": "^4.27.3",
"rollup-plugin-dts": "^6.1.0",
"rollup-plugin-esbuild": "^6.1.1",
"rollup-plugin-postcss": "^4.0.0",
diff --git a/packages/cli/src/alpha.ts b/packages/cli/src/alpha.ts
new file mode 100644
index 0000000000..4b2cfa4842
--- /dev/null
+++ b/packages/cli/src/alpha.ts
@@ -0,0 +1,29 @@
+/*
+ * 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 { CliInitializer } from './wiring/CliInitializer';
+import chalk from 'chalk';
+
+(async () => {
+ console.warn(
+ chalk.yellow(
+ 'THIS ENTRYPOINT IS IN ALPHA AND MAY CHANGE IN THE FUTURE - DO NOT USE THIS FOR NORMAL DEVELOPMENT',
+ ),
+ );
+ const initializer = new CliInitializer();
+ initializer.add(import('./modules/config/alpha').then(m => m.default));
+ await initializer.run();
+})();
diff --git a/packages/cli/src/commands/build/buildFrontend.ts b/packages/cli/src/commands/build/buildFrontend.ts
index 59f3225738..0ba0669c32 100644
--- a/packages/cli/src/commands/build/buildFrontend.ts
+++ b/packages/cli/src/commands/build/buildFrontend.ts
@@ -18,7 +18,7 @@ import fs from 'fs-extra';
import { resolve as resolvePath } from 'path';
import { buildBundle, getModuleFederationOptions } from '../../lib/bundler';
import { getEnvironmentParallelism } from '../../lib/parallel';
-import { loadCliConfig } from '../../lib/config';
+import { loadCliConfig } from '../../modules/config/lib/config';
interface BuildAppOptions {
targetDir: string;
diff --git a/packages/cli/src/commands/create-github-app/index.ts b/packages/cli/src/commands/create-github-app/index.ts
index 681b471c91..105a6b4c24 100644
--- a/packages/cli/src/commands/create-github-app/index.ts
+++ b/packages/cli/src/commands/create-github-app/index.ts
@@ -20,7 +20,6 @@ import { stringify as stringifyYaml } from 'yaml';
import inquirer, { Question, Answers } from 'inquirer';
import { paths } from '../../lib/paths';
import { GithubCreateAppServer } from './GithubCreateAppServer';
-import fetch from 'node-fetch';
import openBrowser from 'react-dev-utils/openBrowser';
// This is an experimental command that at this point does not support GitHub Enterprise
diff --git a/packages/cli/src/commands/index.ts b/packages/cli/src/commands/index.ts
index 2a77d527c1..0f38fc1e8a 100644
--- a/packages/cli/src/commands/index.ts
+++ b/packages/cli/src/commands/index.ts
@@ -15,15 +15,11 @@
*/
import { Command, Option } from 'commander';
-import { assertError } from '@backstage/errors';
-import { exitWithError } from '../lib/errors';
-
-const configOption = [
- '--config ',
- 'Config files to load instead of app-config.yaml',
- (opt: string, opts: string[]) => (opts ? [...opts, opt] : [opt]),
- Array(),
-] as const;
+import { lazy } from '../lib/lazy';
+import {
+ configOption,
+ registerCommands as registerConfigCommands,
+} from '../modules/config';
export function registerRepoCommand(program: Command) {
const command = program
@@ -57,6 +53,10 @@ export function registerRepoCommand(program: Command) {
'Lint report output format',
'eslint-formatter-friendly',
)
+ .option(
+ '--output-file ',
+ 'Write the lint report to a file instead of stdout',
+ )
.option(
'--since ',
'Only lint packages that changed since the specified ref',
@@ -172,6 +172,10 @@ export function registerScriptCommand(program: Command) {
'Lint report output format',
'eslint-formatter-friendly',
)
+ .option(
+ '--output-file ',
+ 'Write the lint report to a file instead of stdout',
+ )
.option('--fix', 'Attempt to automatically fix violations')
.option(
'--max-warnings ',
@@ -279,66 +283,7 @@ export function registerCommands(program: Command) {
.option('--no-private', 'Do not mark new packages as private')
.action(lazy(() => import('./new/new').then(m => m.default)));
- program
- .command('config:docs')
- .option(
- '--package ',
- 'Only include the schema that applies to the given package',
- )
- .description('Browse the configuration reference documentation')
- .action(lazy(() => import('./config/docs').then(m => m.default)));
-
- program
- .command('config:print')
- .option(
- '--package ',
- 'Only load config schema that applies to the given package',
- )
- .option('--lax', 'Do not require environment variables to be set')
- .option('--frontend', 'Print only the frontend configuration')
- .option('--with-secrets', 'Include secrets in the printed configuration')
- .option(
- '--format ',
- 'Format to print the configuration in, either json or yaml [yaml]',
- )
- .option(...configOption)
- .description('Print the app configuration for the current package')
- .action(lazy(() => import('./config/print').then(m => m.default)));
-
- program
- .command('config:check')
- .option(
- '--package ',
- 'Only load config schema that applies to the given package',
- )
- .option('--lax', 'Do not require environment variables to be set')
- .option('--frontend', 'Only validate the frontend configuration')
- .option('--deprecated', 'Output deprecated configuration settings')
- .option(
- '--strict',
- 'Enable strict config validation, forbidding errors and unknown keys',
- )
- .option(...configOption)
- .description(
- 'Validate that the given configuration loads and matches schema',
- )
- .action(lazy(() => import('./config/validate').then(m => m.default)));
-
- program
- .command('config:schema')
- .option(
- '--package ',
- 'Only output config schema that applies to the given package',
- )
- .option(
- '--format ',
- 'Format to print the schema in, either json or yaml [yaml]',
- )
- .option('--merge', 'Print the config schemas merged', true)
- .option('--no-merge', 'Print the config schemas not merged')
- .description('Print configuration schema')
- .action(lazy(() => import('./config/schema').then(m => m.default)));
-
+ registerConfigCommands(program);
registerRepoCommand(program);
registerScriptCommand(program);
registerMigrateCommand(program);
@@ -444,20 +389,3 @@ function removed(message?: string) {
process.exit(1);
};
}
-
-// Wraps an action function so that it always exits and handles errors
-function lazy(
- getActionFunc: () => Promise<(...args: any[]) => Promise>,
-): (...args: any[]) => Promise {
- return async (...args: any[]) => {
- try {
- const actionFunc = await getActionFunc();
- await actionFunc(...args);
-
- process.exit(0);
- } catch (error) {
- assertError(error);
- exitWithError(error);
- }
- };
-}
diff --git a/packages/cli/src/commands/lint.ts b/packages/cli/src/commands/lint.ts
index 0c67d84c86..8c8877c19c 100644
--- a/packages/cli/src/commands/lint.ts
+++ b/packages/cli/src/commands/lint.ts
@@ -14,6 +14,7 @@
* limitations under the License.
*/
+import fs from 'fs-extra';
import { OptionValues } from 'commander';
import { paths } from '../lib/paths';
import { ESLint } from 'eslint';
@@ -49,10 +50,14 @@ export default async (directories: string[], opts: OptionValues) => {
process.chdir(paths.targetRoot);
}
- const resultText = formatter.format(results);
+ const resultText = await formatter.format(results);
if (resultText) {
- console.log(resultText);
+ if (opts.outputFile) {
+ await fs.writeFile(paths.resolveTarget(opts.outputFile), resultText);
+ } else {
+ console.log(resultText);
+ }
}
if (failed) {
diff --git a/packages/cli/src/commands/repo/lint.ts b/packages/cli/src/commands/repo/lint.ts
index 7be021f8dd..f78b51ea5d 100644
--- a/packages/cli/src/commands/repo/lint.ts
+++ b/packages/cli/src/commands/repo/lint.ts
@@ -15,6 +15,7 @@
*/
import chalk from 'chalk';
+import fs from 'fs-extra';
import { Command, OptionValues } from 'commander';
import { createHash } from 'crypto';
import { relative as relativePath } from 'path';
@@ -220,6 +221,8 @@ export async function command(opts: OptionValues, cmd: Command): Promise {
const outputSuccessCache = [];
+ let errorOutput = '';
+
let failed = false;
for (const {
relativeDir,
@@ -234,14 +237,22 @@ export async function command(opts: OptionValues, cmd: Command): Promise {
// When doing repo lint, only list the results if the lint failed to avoid a log
// dump of all warnings that might be irrelevant
if (resultText) {
- console.log();
- console.log(resultText.trimStart());
+ if (opts.outputFile) {
+ errorOutput += `${resultText}\n`;
+ } else {
+ console.log();
+ console.log(resultText.trimStart());
+ }
}
} else if (sha) {
outputSuccessCache.push(sha);
}
}
+ if (opts.outputFile && errorOutput) {
+ await fs.writeFile(paths.resolveTargetRoot(opts.outputFile), errorOutput);
+ }
+
if (cacheContext) {
await cache.write(outputSuccessCache);
}
diff --git a/packages/cli/src/commands/versions/bump.test.ts b/packages/cli/src/commands/versions/bump.test.ts
index cc48b91fd8..96e8de517b 100644
--- a/packages/cli/src/commands/versions/bump.test.ts
+++ b/packages/cli/src/commands/versions/bump.test.ts
@@ -33,6 +33,7 @@ jest.mock('global-agent/bootstrap', () => {});
// Remove log coloring to simplify log matching
jest.mock('chalk', () => ({
+ bold: (str: string) => str,
red: (str: string) => str,
blue: (str: string) => str,
cyan: (str: string) => str,
@@ -90,6 +91,12 @@ const REGISTRY_VERSIONS: { [name: string]: string } = {
'@backstage/create-app': '1.0.0',
};
+const yarnRcMock = `plugins:
+ - checksum: cafedead
+ path: .yarn/plugins/@yarnpkg/plugin-backstage.cjs
+ spec: 'https://versions.backstage.io/v1/releases/0.0.0/yarn-plugin'
+`;
+
const HEADER = `# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
@@ -435,6 +442,117 @@ describe('bump', () => {
});
});
+ it('should use backstage:^ versions for packages in the release manifest when the yarn plugin is installed', async () => {
+ mockDir.setContent({
+ '.yarnrc.yml': yarnRcMock,
+ 'yarn.lock': lockfileMock,
+ 'package.json': JSON.stringify({
+ workspaces: {
+ packages: ['packages/*'],
+ },
+ }),
+ packages: {
+ a: {
+ 'package.json': JSON.stringify({
+ name: 'a',
+ dependencies: {
+ '@backstage/core': '^1.0.5',
+ },
+ }),
+ },
+ b: {
+ 'package.json': JSON.stringify({
+ name: 'b',
+ dependencies: {
+ '@backstage/core': '^1.0.3',
+ '@backstage/theme': '^1.0.0',
+ },
+ }),
+ },
+ },
+ });
+
+ jest.spyOn(runObj, 'run').mockResolvedValue(undefined);
+ worker.use(
+ rest.get(
+ 'https://versions.backstage.io/v1/tags/main/manifest.json',
+ (_, res, ctx) =>
+ res(
+ ctx.status(200),
+ ctx.json({
+ releaseVersion: '0.0.1',
+ packages: [
+ {
+ name: '@backstage/theme',
+ version: '5.0.0',
+ },
+ {
+ name: '@backstage/create-app',
+ version: '3.0.0',
+ },
+ ],
+ }),
+ ),
+ ),
+ );
+ const { log: logs } = await withLogCollector(['log', 'warn'], async () => {
+ await bump({ pattern: null, release: 'main' } as unknown as Command);
+ });
+ expectLogsToMatch(logs, [
+ 'Using default pattern glob @backstage/*',
+ 'Checking for updates of @backstage/core',
+ 'Checking for updates of @backstage/theme',
+ 'NOTE: this bump used backstage:^ versions in package.json files, since the Backstage yarn plugin was detected in the repository. To migrate back to explicit npm versions, remove the plugin by running "yarn plugin remove @yarnpkg/plugin-backstage", then repeat this command.',
+ 'Some packages are outdated, updating',
+ 'bumping @backstage/theme in b to ^5.0.0',
+ 'bumping @backstage/core in b to ^1.0.6',
+ 'bumping @backstage/core in a to ^1.0.6',
+ 'Updating yarn plugin to v0.0.1...',
+ 'Your project is now at version 0.0.1, which has been written to backstage.json',
+ 'Running yarn install to install new versions',
+ 'Checking for moved packages to the @backstage-community namespace...',
+ '⚠️ The following packages may have breaking changes:',
+ ' @backstage/theme : 1.0.0 ~> 5.0.0',
+ ' https://github.com/backstage/backstage/blob/master/packages/theme/CHANGELOG.md',
+ 'Version bump complete!',
+ ]);
+
+ expect(mockFetchPackageInfo).toHaveBeenCalledTimes(1);
+ expect(mockFetchPackageInfo).toHaveBeenCalledWith('@backstage/core');
+
+ expect(runObj.run).toHaveBeenCalledTimes(2);
+ expect(runObj.run).toHaveBeenCalledWith('yarn', [
+ 'plugin',
+ 'import',
+ 'https://versions.backstage.io/v1/releases/0.0.1/yarn-plugin',
+ ]);
+ expect(runObj.run).toHaveBeenCalledWith(
+ 'yarn',
+ ['install'],
+ expect.any(Object),
+ );
+
+ const packageA = await fs.readJson(
+ mockDir.resolve('packages/a/package.json'),
+ );
+ expect(packageA).toEqual({
+ name: 'a',
+ dependencies: {
+ '@backstage/core': '^1.0.6',
+ },
+ });
+ const packageB = await fs.readJson(
+ mockDir.resolve('packages/b/package.json'),
+ );
+ expect(packageB).toEqual({
+ name: 'b',
+ dependencies: {
+ '@backstage/core': '^1.0.6',
+ '@backstage/theme': 'backstage:^',
+ },
+ });
+ });
+
it('should only bump packages in the manifest when a specific release is specified', async () => {
mockDir.setContent({
'yarn.lock': lockfileMock,
diff --git a/packages/cli/src/commands/versions/bump.ts b/packages/cli/src/commands/versions/bump.ts
index 8d43f38967..76e6092140 100644
--- a/packages/cli/src/commands/versions/bump.ts
+++ b/packages/cli/src/commands/versions/bump.ts
@@ -22,14 +22,12 @@ if (shouldUseGlobalAgent()) {
import fs from 'fs-extra';
import chalk from 'chalk';
-import ora from 'ora';
import semver from 'semver';
import { OptionValues } from 'commander';
import yaml from 'yaml';
import z from 'zod';
import { isError, NotFoundError } from '@backstage/errors';
import { resolve as resolvePath } from 'path';
-import { run } from '../../lib/run';
import { paths } from '../../lib/paths';
import {
mapDependencies,
@@ -45,6 +43,8 @@ import {
ReleaseManifest,
} from '@backstage/release-manifests';
import { migrateMovedPackages } from './migrate';
+import { runYarnInstall } from './utils';
+import { run } from '../../lib/run';
function shouldUseGlobalAgent(): boolean {
// see https://www.npmjs.com/package/global-agent
@@ -121,6 +121,20 @@ export default async (opts: OptionValues) => {
});
}
+ if (hasYarnPlugin) {
+ console.log();
+ console.log(
+ `Updating yarn plugin to v${releaseManifest.releaseVersion}...`,
+ );
+ console.log();
+ await run('yarn', [
+ 'plugin',
+ 'import',
+ `https://versions.backstage.io/v1/releases/${releaseManifest.releaseVersion}/yarn-plugin`,
+ ]);
+ console.log();
+ }
+
// First we discover all Backstage dependencies within our own repo
const dependencyMap = await mapDependencies(paths.targetDir, pattern);
@@ -508,35 +522,3 @@ async function getHasYarnPlugin() {
plugin => plugin.path === '.yarn/plugins/@yarnpkg/plugin-backstage.cjs',
);
}
-
-export async function runYarnInstall() {
- const spinner = ora({
- prefixText: `Running ${chalk.blue('yarn install')} to install new versions`,
- spinner: 'arc',
- color: 'green',
- }).start();
-
- const installOutput = new Array();
- try {
- await run('yarn', ['install'], {
- env: {
- FORCE_COLOR: 'true',
- // We filter out all of the npm_* environment variables that are added when
- // executing through yarn. This works around an issue where these variables
- // incorrectly override local yarn or npm config in the project directory.
- ...Object.fromEntries(
- Object.entries(process.env).map(([name, value]) =>
- name.startsWith('npm_') ? [name, undefined] : [name, value],
- ),
- ),
- },
- stdoutLogFunc: data => installOutput.push(data),
- stderrLogFunc: data => installOutput.push(data),
- });
- spinner.succeed();
- } catch (error) {
- spinner.fail();
- process.stdout.write(Buffer.concat(installOutput));
- throw error;
- }
-}
diff --git a/packages/cli/src/commands/versions/migrate.ts b/packages/cli/src/commands/versions/migrate.ts
index 321a78ef9f..8415de0f57 100644
--- a/packages/cli/src/commands/versions/migrate.ts
+++ b/packages/cli/src/commands/versions/migrate.ts
@@ -19,7 +19,7 @@ import { resolve as resolvePath, join as joinPath } from 'path';
import { OptionValues } from 'commander';
import { readJson, writeJson } from 'fs-extra';
import { minimatch } from 'minimatch';
-import { runYarnInstall } from './bump';
+import { runYarnInstall } from './utils';
import replace from 'replace-in-file';
declare module 'replace-in-file' {
diff --git a/packages/cli/src/commands/versions/utils.ts b/packages/cli/src/commands/versions/utils.ts
new file mode 100644
index 0000000000..22c5f0c028
--- /dev/null
+++ b/packages/cli/src/commands/versions/utils.ts
@@ -0,0 +1,51 @@
+/*
+ * 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 ora from 'ora';
+import chalk from 'chalk';
+import { run } from '../../lib/run';
+
+export async function runYarnInstall() {
+ const spinner = ora({
+ prefixText: `Running ${chalk.blue('yarn install')} to install new versions`,
+ spinner: 'arc',
+ color: 'green',
+ }).start();
+
+ const installOutput = new Array();
+ try {
+ await run('yarn', ['install'], {
+ env: {
+ FORCE_COLOR: 'true',
+ // We filter out all of the npm_* environment variables that are added when
+ // executing through yarn. This works around an issue where these variables
+ // incorrectly override local yarn or npm config in the project directory.
+ ...Object.fromEntries(
+ Object.entries(process.env).map(([name, value]) =>
+ name.startsWith('npm_') ? [name, undefined] : [name, value],
+ ),
+ ),
+ },
+ stdoutLogFunc: data => installOutput.push(data),
+ stderrLogFunc: data => installOutput.push(data),
+ });
+ spinner.succeed();
+ } catch (error) {
+ spinner.fail();
+ process.stdout.write(Buffer.concat(installOutput));
+ throw error;
+ }
+}
diff --git a/packages/cli/src/lib/bundler/server.ts b/packages/cli/src/lib/bundler/server.ts
index f8d259f467..dc16a4577d 100644
--- a/packages/cli/src/lib/bundler/server.ts
+++ b/packages/cli/src/lib/bundler/server.ts
@@ -22,7 +22,7 @@ import webpack from 'webpack';
import WebpackDevServer from 'webpack-dev-server';
import { paths as libPaths } from '../../lib/paths';
-import { loadCliConfig } from '../config';
+import { loadCliConfig } from '../../modules/config/lib/config';
import { createConfig, resolveBaseUrl, resolveEndpoint } from './config';
import { createDetectedModulesEntryPoint } from './packageDetection';
import { resolveBundlingPaths, resolveOptionalBundlingPaths } from './paths';
diff --git a/packages/cli/src/lib/lazy.ts b/packages/cli/src/lib/lazy.ts
new file mode 100644
index 0000000000..6d2cb1cd4f
--- /dev/null
+++ b/packages/cli/src/lib/lazy.ts
@@ -0,0 +1,35 @@
+/*
+ * 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 { assertError } from '@backstage/errors';
+import { exitWithError } from '../lib/errors';
+
+// Wraps an action function so that it always exits and handles errors
+export function lazy(
+ getActionFunc: () => Promise<(...args: any[]) => Promise>,
+): (...args: any[]) => Promise {
+ return async (...args: any[]) => {
+ try {
+ const actionFunc = await getActionFunc();
+ await actionFunc(...args);
+
+ process.exit(0);
+ } catch (error) {
+ assertError(error);
+ exitWithError(error);
+ }
+ };
+}
diff --git a/packages/cli/src/lib/version.test.ts b/packages/cli/src/lib/version.test.ts
index 6b1aa391d5..744874d7e9 100644
--- a/packages/cli/src/lib/version.test.ts
+++ b/packages/cli/src/lib/version.test.ts
@@ -66,6 +66,10 @@ describe('createPackageVersionProvider', () => {
expect(provider('c', '0.3.0-rc1')).toBe('0.3.0-rc1');
expect(provider('c', '0.3.0')).toBe('^0.3.0');
expect(provider('c', '0.3.6')).toBe('^0.3.4');
+
+ // No special handling for @types packages.
+ expect(provider('@types/t', '1.4.2')).toBe('^1.2.3');
+
const cliVersion = packageVersions['@backstage/cli'];
expect(provider('@backstage/cli')).toBe(
// If we're currently in pre-release we expect that to be picked instead
@@ -74,6 +78,5 @@ describe('createPackageVersionProvider', () => {
expect(provider('@backstage/core-plugin-api')).toBe(
`^${corePluginApiPkg.version}`,
);
- expect(provider('@types/t', '1.4.2')).toBe('*');
});
});
diff --git a/packages/cli/src/lib/version.ts b/packages/cli/src/lib/version.ts
index 51826ef681..f267dadfeb 100644
--- a/packages/cli/src/lib/version.ts
+++ b/packages/cli/src/lib/version.ts
@@ -90,12 +90,6 @@ export function createPackageVersionProvider(lockfile?: Lockfile) {
}
const lockfileEntries = lockfile?.get(name);
- if (
- name.startsWith('@types/') &&
- lockfileEntries?.some(entry => entry.range === '*')
- ) {
- return '*';
- }
for (const specifier of ['^', '~', '*']) {
const range = `workspace:${specifier}`;
diff --git a/packages/cli/src/modules/config/alpha.ts b/packages/cli/src/modules/config/alpha.ts
new file mode 100644
index 0000000000..c32982086a
--- /dev/null
+++ b/packages/cli/src/modules/config/alpha.ts
@@ -0,0 +1,98 @@
+/*
+ * 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 { createCliPlugin } from '../../wiring/factory';
+import yargs from 'yargs';
+import { Command } from 'commander';
+import { lazy } from '../../lib/lazy';
+
+export default createCliPlugin({
+ pluginId: 'config',
+ init: async reg => {
+ reg.addCommand({
+ path: ['config:docs'],
+ description: 'Browse the configuration reference documentation',
+ execute: async ({ args }) => {
+ const command = new Command();
+ const defaultCommand = command
+ .option(
+ '--package ',
+ 'Only include the schema that applies to the given package',
+ )
+ .description('Browse the configuration reference documentation')
+ .action(lazy(() => import('./commands/docs').then(m => m.default)));
+
+ await defaultCommand.parseAsync(args, { from: 'user' });
+ },
+ });
+ reg.addCommand({
+ path: ['config', 'docs'],
+ description: 'Browse the configuration reference documentation',
+ execute: async ({ args }) => {
+ const argv = await yargs
+ .options({
+ package: { type: 'string' },
+ })
+ .help()
+ .parse(args);
+ const m = await import('./commands/docs');
+ await m.default(argv);
+ },
+ });
+ reg.addCommand({
+ path: ['config:print'],
+ description: 'Print the app configuration for the current package',
+ execute: async ({ args }) => {
+ const argv = await yargs
+ .options({
+ package: { type: 'string' },
+ lax: { type: 'boolean' },
+ frontend: { type: 'boolean' },
+ 'with-secrets': { type: 'boolean' },
+ format: { type: 'string' },
+ config: { type: 'string', array: true },
+ })
+ .help()
+ .parse(args);
+ const m = await import('./commands/print');
+ await m.default(argv);
+ },
+ });
+ reg.addCommand({
+ path: ['config:check'],
+ description:
+ 'Validate that the given configuration loads and matches schema',
+ execute: async ({ args }) => {
+ const argv = await yargs
+ .options({
+ package: { type: 'string' },
+ lax: { type: 'boolean' },
+ frontend: { type: 'boolean' },
+ deprecated: { type: 'boolean' },
+ strict: { type: 'boolean', required: true },
+ config: {
+ type: 'string',
+ array: true,
+ default: [],
+ },
+ })
+ .help()
+ .parse(args);
+ const m = await import('./commands/validate');
+ await m.default(argv);
+ },
+ });
+ },
+});
diff --git a/packages/cli/src/commands/config/docs.ts b/packages/cli/src/modules/config/commands/docs.ts
similarity index 96%
rename from packages/cli/src/commands/config/docs.ts
rename to packages/cli/src/modules/config/commands/docs.ts
index 98e683e87c..25e3a864f4 100644
--- a/packages/cli/src/commands/config/docs.ts
+++ b/packages/cli/src/modules/config/commands/docs.ts
@@ -19,7 +19,7 @@ import { mergeConfigSchemas } from '@backstage/config-loader';
import { OptionValues } from 'commander';
import { JSONSchema7 as JSONSchema } from 'json-schema';
import openBrowser from 'react-dev-utils/openBrowser';
-import { loadCliConfig } from '../../lib/config';
+import { loadCliConfig } from '../lib/config';
const DOCS_URL = 'https://config.backstage.io';
diff --git a/packages/cli/src/commands/config/print.ts b/packages/cli/src/modules/config/commands/print.ts
similarity index 97%
rename from packages/cli/src/commands/config/print.ts
rename to packages/cli/src/modules/config/commands/print.ts
index 9ef725ebf8..98833a7946 100644
--- a/packages/cli/src/commands/config/print.ts
+++ b/packages/cli/src/modules/config/commands/print.ts
@@ -17,7 +17,7 @@
import { OptionValues } from 'commander';
import { stringify as stringifyYaml } from 'yaml';
import { AppConfig, ConfigReader } from '@backstage/config';
-import { loadCliConfig } from '../../lib/config';
+import { loadCliConfig } from '../lib/config';
import { ConfigSchema, ConfigVisibility } from '@backstage/config-loader';
export default async (opts: OptionValues) => {
diff --git a/packages/cli/src/commands/config/schema.ts b/packages/cli/src/modules/config/commands/schema.ts
similarity index 97%
rename from packages/cli/src/commands/config/schema.ts
rename to packages/cli/src/modules/config/commands/schema.ts
index 08bc46d1cc..73eb487d60 100644
--- a/packages/cli/src/commands/config/schema.ts
+++ b/packages/cli/src/modules/config/commands/schema.ts
@@ -17,7 +17,7 @@
import { OptionValues } from 'commander';
import { JSONSchema7 as JSONSchema } from 'json-schema';
import { stringify as stringifyYaml } from 'yaml';
-import { loadCliConfig } from '../../lib/config';
+import { loadCliConfig } from '../lib/config';
import { JsonObject } from '@backstage/types';
import { mergeConfigSchemas } from '@backstage/config-loader';
diff --git a/packages/cli/src/commands/config/validate.ts b/packages/cli/src/modules/config/commands/validate.ts
similarity index 94%
rename from packages/cli/src/commands/config/validate.ts
rename to packages/cli/src/modules/config/commands/validate.ts
index c81d82832e..ac0b9d15e0 100644
--- a/packages/cli/src/commands/config/validate.ts
+++ b/packages/cli/src/modules/config/commands/validate.ts
@@ -15,7 +15,7 @@
*/
import { OptionValues } from 'commander';
-import { loadCliConfig } from '../../lib/config';
+import { loadCliConfig } from '../lib/config';
export default async (opts: OptionValues) => {
await loadCliConfig({
diff --git a/packages/cli/src/modules/config/index.ts b/packages/cli/src/modules/config/index.ts
new file mode 100644
index 0000000000..0c6a79577d
--- /dev/null
+++ b/packages/cli/src/modules/config/index.ts
@@ -0,0 +1,87 @@
+/*
+ * 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 { Command } from 'commander';
+import { lazy } from '../../lib/lazy';
+
+export const configOption = [
+ '--config ',
+ 'Config files to load instead of app-config.yaml',
+ (opt: string, opts: string[]) => (opts ? [...opts, opt] : [opt]),
+ Array(),
+] as const;
+
+export function registerCommands(program: Command) {
+ program
+ .command('config:docs')
+ .option(
+ '--package ',
+ 'Only include the schema that applies to the given package',
+ )
+ .description('Browse the configuration reference documentation')
+ .action(lazy(() => import('./commands/docs').then(m => m.default)));
+
+ program
+ .command('config:print')
+ .option(
+ '--package ',
+ 'Only load config schema that applies to the given package',
+ )
+ .option('--lax', 'Do not require environment variables to be set')
+ .option('--frontend', 'Print only the frontend configuration')
+ .option('--with-secrets', 'Include secrets in the printed configuration')
+ .option(
+ '--format ',
+ 'Format to print the configuration in, either json or yaml [yaml]',
+ )
+ .option(...configOption)
+ .description('Print the app configuration for the current package')
+ .action(lazy(() => import('./commands/print').then(m => m.default)));
+
+ program
+ .command('config:check')
+ .option(
+ '--package ',
+ 'Only load config schema that applies to the given package',
+ )
+ .option('--lax', 'Do not require environment variables to be set')
+ .option('--frontend', 'Only validate the frontend configuration')
+ .option('--deprecated', 'Output deprecated configuration settings')
+ .option(
+ '--strict',
+ 'Enable strict config validation, forbidding errors and unknown keys',
+ )
+ .option(...configOption)
+ .description(
+ 'Validate that the given configuration loads and matches schema',
+ )
+ .action(lazy(() => import('./commands/validate').then(m => m.default)));
+
+ program
+ .command('config:schema')
+ .option(
+ '--package ',
+ 'Only output config schema that applies to the given package',
+ )
+ .option(
+ '--format ',
+ 'Format to print the schema in, either json or yaml [yaml]',
+ )
+ .option('--merge', 'Print the config schemas merged', true)
+ .option('--no-merge', 'Print the config schemas not merged')
+ .description('Print configuration schema')
+ .action(lazy(() => import('./commands/schema').then(m => m.default)));
+}
diff --git a/packages/cli/src/lib/config.ts b/packages/cli/src/modules/config/lib/config.ts
similarity index 99%
rename from packages/cli/src/lib/config.ts
rename to packages/cli/src/modules/config/lib/config.ts
index aab16a8670..afed53af6f 100644
--- a/packages/cli/src/lib/config.ts
+++ b/packages/cli/src/modules/config/lib/config.ts
@@ -16,7 +16,7 @@
import { ConfigSources, loadConfigSchema } from '@backstage/config-loader';
import { AppConfig, ConfigReader } from '@backstage/config';
-import { paths } from './paths';
+import { paths } from '../../../lib/paths';
import { getPackages } from '@manypkg/get-packages';
import { PackageGraph } from '@backstage/cli-node';
diff --git a/packages/cli/src/wiring/CliInitializer.ts b/packages/cli/src/wiring/CliInitializer.ts
new file mode 100644
index 0000000000..9fe8bb8084
--- /dev/null
+++ b/packages/cli/src/wiring/CliInitializer.ts
@@ -0,0 +1,138 @@
+/*
+ * 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 { CommandGraph } from './CommandGraph';
+import { CliFeature, InternalCliFeature, InternalCliPlugin } from './types';
+import { CommandRegistry } from './CommandRegistry';
+import { program } from 'commander';
+import { version } from '../lib/version';
+import chalk from 'chalk';
+import { exitWithError } from '../lib/errors';
+import { assertError } from '@backstage/errors';
+
+type UninitializedFeature = CliFeature | Promise;
+
+export class CliInitializer {
+ private graph = new CommandGraph();
+ private commandRegistry = new CommandRegistry(this.graph);
+ #uninitiazedFeatures: Promise[] = [];
+
+ add(module: UninitializedFeature) {
+ this.#uninitiazedFeatures.push(Promise.resolve(module));
+ }
+
+ async #register(feature: CliFeature) {
+ if (isCliPlugin(feature)) {
+ await feature.init(this.commandRegistry);
+ } else {
+ throw new Error(`Unsupported feature type: ${feature.$$type}`);
+ }
+ }
+
+ async #doInit() {
+ const features = await Promise.all(this.#uninitiazedFeatures);
+ for (const feature of features) {
+ await this.#register(feature);
+ }
+ }
+
+ /**
+ * Actually parse argv and pass it to the command.
+ */
+ async run() {
+ await this.#doInit();
+ program
+ .name('backstage-cli')
+ .version(version)
+ .allowUnknownOption(true)
+ .allowExcessArguments(true);
+
+ const queue = this.graph.atDepth(0).map(node => ({
+ node,
+ argParser: program,
+ }));
+ while (queue.length) {
+ const { node, argParser } = queue.shift()!;
+ if (node.$$type === '@tree/root') {
+ const treeParser = argParser
+ .command(`${node.name} [command]`)
+ .description(node.name);
+
+ queue.push(
+ ...node.children.map(child => ({
+ node: child,
+ argParser: treeParser,
+ })),
+ );
+ } else {
+ argParser
+ .command(node.name)
+ .description(node.command.description)
+ .helpOption(false)
+ .allowUnknownOption(true)
+ .allowExcessArguments(true)
+ .action(async () => {
+ try {
+ await node.command.execute({
+ args: program.parseOptions(process.argv).unknown,
+ });
+ process.exit(0);
+ } catch (error) {
+ assertError(error);
+ exitWithError(error);
+ }
+ });
+ }
+ }
+ program.on('command:*', () => {
+ console.log();
+ console.log(chalk.red(`Invalid command: ${program.args.join(' ')}`));
+ console.log();
+ program.outputHelp();
+ process.exit(1);
+ });
+
+ process.on('unhandledRejection', rejection => {
+ if (rejection instanceof Error) {
+ exitWithError(rejection);
+ } else {
+ exitWithError(new Error(`Unknown rejection: '${rejection}'`));
+ }
+ });
+
+ program.parse(process.argv);
+ }
+}
+
+function toInternalCliFeature(feature: CliFeature): InternalCliFeature {
+ if (feature.$$type !== '@backstage/CliFeature') {
+ throw new Error(`Invalid CliFeature, bad type '${feature.$$type}'`);
+ }
+ const internal = feature as InternalCliFeature;
+ if (internal.version !== 'v1') {
+ throw new Error(`Invalid CliFeature, bad version '${internal.version}'`);
+ }
+ return internal;
+}
+
+function isCliPlugin(feature: CliFeature): feature is InternalCliPlugin {
+ const internal = toInternalCliFeature(feature);
+ if (internal.featureType === 'plugin') {
+ return true;
+ }
+ // Backwards compatibility for v1 registrations that use duck typing
+ return 'plugin' in internal;
+}
diff --git a/packages/cli/src/wiring/CommandGraph.ts b/packages/cli/src/wiring/CommandGraph.ts
new file mode 100644
index 0000000000..a0a2de3305
--- /dev/null
+++ b/packages/cli/src/wiring/CommandGraph.ts
@@ -0,0 +1,103 @@
+/*
+ * 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 { BackstageCommand } from './types';
+
+type Node = TreeNode | LeafNode;
+
+interface TreeNode {
+ $$type: '@tree/root';
+ name: string;
+ children: TreeNode[];
+}
+
+interface LeafNode {
+ $$type: '@tree/leaf';
+ name: string;
+ command: BackstageCommand;
+}
+
+/**
+ * A sparse graph of commands.
+ */
+export class CommandGraph {
+ private graph: Node[] = [];
+
+ /**
+ * Adds a command to the graph. The graph is sparse, so we use the path to determine the nodes
+ * to traverse. Only leaf nodes should have a command/action.
+ */
+ add(command: BackstageCommand) {
+ const path = command.path;
+ let current = this.graph;
+ for (let i = 0; i < path.length - 1; i++) {
+ const name = path[i];
+ let next = current.find(n => n.name === name);
+ if (!next) {
+ next = { $$type: '@tree/root', name, children: [] };
+ current.push(next);
+ } else if (next.$$type === '@tree/leaf') {
+ throw new Error(
+ `Command already exists at path: "${path.slice(0, i).join(' ')}"`,
+ );
+ }
+ current = next.children;
+ }
+ const last = current.find(n => n.name === path[path.length - 1]);
+ if (last && last.$$type === '@tree/leaf') {
+ throw new Error(
+ `Command already exists at path: "${path.slice(0, -1).join(' ')}"`,
+ );
+ } else {
+ current.push({
+ $$type: '@tree/leaf',
+ name: path[path.length - 1],
+ command,
+ });
+ }
+ }
+
+ /**
+ * Given a path, try to find a command that matches it.
+ */
+ find(path: string[]): BackstageCommand | undefined {
+ let current = this.graph;
+ for (let i = 0; i < path.length - 1; i++) {
+ const name = path[i];
+ const next = current.find(n => n.name === name);
+ if (!next) {
+ return undefined;
+ } else if (next.$$type === '@tree/leaf') {
+ return undefined;
+ }
+ current = next.children;
+ }
+ const last = current.find(n => n.name === path[path.length - 1]);
+ if (!last || last.$$type === '@tree/root') {
+ return undefined;
+ }
+ return last?.command;
+ }
+
+ atDepth(depth: number): Node[] {
+ let current = this.graph;
+ for (let i = 0; i < depth; i++) {
+ current = current.flatMap(n =>
+ n.$$type === '@tree/root' ? n.children : [],
+ );
+ }
+ return current;
+ }
+}
diff --git a/packages/cli/src/wiring/CommandRegistry.ts b/packages/cli/src/wiring/CommandRegistry.ts
new file mode 100644
index 0000000000..9e8ff9646c
--- /dev/null
+++ b/packages/cli/src/wiring/CommandRegistry.ts
@@ -0,0 +1,28 @@
+/*
+ * 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 { CommandGraph } from './CommandGraph';
+import { BackstageCommand } from './types';
+
+export class CommandRegistry {
+ private graph: CommandGraph;
+ constructor(graph: CommandGraph) {
+ this.graph = graph;
+ }
+
+ addCommand(command: BackstageCommand) {
+ this.graph.add(command);
+ }
+}
diff --git a/packages/cli/src/wiring/factory.ts b/packages/cli/src/wiring/factory.ts
new file mode 100644
index 0000000000..eec058e180
--- /dev/null
+++ b/packages/cli/src/wiring/factory.ts
@@ -0,0 +1,32 @@
+/*
+ * 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 { CommandRegistry } from './CommandRegistry';
+import { InternalCliPlugin } from './types';
+
+export function createCliPlugin(options: {
+ pluginId: string;
+ init: (registry: CommandRegistry) => Promise;
+}): InternalCliPlugin {
+ return {
+ id: options.pluginId,
+ init: options.init,
+ $$type: '@backstage/CliFeature',
+ version: 'v1',
+ featureType: 'plugin',
+ description: 'A Backstage CLI plugin',
+ };
+}
diff --git a/packages/cli/src/wiring/types.ts b/packages/cli/src/wiring/types.ts
new file mode 100644
index 0000000000..d9237a4c3a
--- /dev/null
+++ b/packages/cli/src/wiring/types.ts
@@ -0,0 +1,46 @@
+/*
+ * 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 { CommandRegistry } from './CommandRegistry';
+
+export interface BackstageCommand {
+ path: string[];
+ description: string;
+ execute: (options: { args: string[] }) => Promise;
+}
+
+export interface CliFeature {
+ $$type: '@backstage/CliFeature';
+}
+
+export interface CliPlugin {
+ id: string;
+ init: (registry: CommandRegistry) => Promise;
+ $$type: '@backstage/CliFeature';
+}
+
+/**
+ * @public
+ */
+export interface InternalCliPlugin extends CliFeature {
+ version: 'v1';
+ featureType: 'plugin';
+ description: string;
+ id: string;
+ init: (registry: CommandRegistry) => Promise;
+}
+
+/** @internal */
+export type InternalCliFeature = InternalCliPlugin;
diff --git a/packages/codemods/CHANGELOG.md b/packages/codemods/CHANGELOG.md
index 99bdd90002..89c2f0ecfa 100644
--- a/packages/codemods/CHANGELOG.md
+++ b/packages/codemods/CHANGELOG.md
@@ -1,5 +1,13 @@
# @backstage/codemods
+## 0.1.52
+
+### Patch Changes
+
+- 702f41d: Bumped dev dependencies `@types/node`
+- Updated dependencies
+ - @backstage/cli-common@0.1.15
+
## 0.1.52-next.0
### Patch Changes
diff --git a/packages/codemods/package.json b/packages/codemods/package.json
index 3a188de891..92b3dc7042 100644
--- a/packages/codemods/package.json
+++ b/packages/codemods/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/codemods",
- "version": "0.1.52-next.0",
+ "version": "0.1.52",
"description": "A collection of codemods for Backstage projects",
"backstage": {
"role": "cli"
diff --git a/packages/config-loader/CHANGELOG.md b/packages/config-loader/CHANGELOG.md
index 8dbf62734e..8f3bb87bce 100644
--- a/packages/config-loader/CHANGELOG.md
+++ b/packages/config-loader/CHANGELOG.md
@@ -1,5 +1,27 @@
# @backstage/config-loader
+## 1.9.3-next.0
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/cli-common@0.1.15
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/types@1.2.0
+
+## 1.9.2
+
+### Patch Changes
+
+- c5e39e7: Internal refactor to use the deferred from the types package
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/cli-common@0.1.15
+ - @backstage/errors@1.2.5
+
## 1.9.2-next.0
### Patch Changes
diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json
index 1f9558794b..336df8b1c0 100644
--- a/packages/config-loader/package.json
+++ b/packages/config-loader/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/config-loader",
- "version": "1.9.2-next.0",
+ "version": "1.9.3-next.0",
"description": "Config loading functionality used by Backstage backend, and CLI",
"backstage": {
"role": "node-library"
@@ -49,7 +49,6 @@
"json-schema-traverse": "^1.0.0",
"lodash": "^4.17.21",
"minimist": "^1.2.5",
- "node-fetch": "^2.7.0",
"typescript-json-schema": "^0.65.0",
"yaml": "^2.0.0"
},
diff --git a/packages/config-loader/src/sources/RemoteConfigSource.ts b/packages/config-loader/src/sources/RemoteConfigSource.ts
index 1492cd4d28..d8fa07d708 100644
--- a/packages/config-loader/src/sources/RemoteConfigSource.ts
+++ b/packages/config-loader/src/sources/RemoteConfigSource.ts
@@ -21,7 +21,6 @@ import {
durationToMilliseconds,
} from '@backstage/types';
import isEqual from 'lodash/isEqual';
-import fetch from 'node-fetch';
import { ConfigTransformer, createConfigTransformer } from './transform';
import {
AsyncConfigSourceGenerator,
@@ -137,7 +136,7 @@ export class RemoteConfigSource implements ConfigSource {
async #load(signal?: AbortSignal): Promise {
const res = await fetch(this.#url, {
- signal: signal as import('node-fetch').RequestInit['signal'],
+ signal: signal as RequestInit['signal'],
});
if (!res.ok) {
throw await ResponseError.fromResponse(res);
diff --git a/packages/config/CHANGELOG.md b/packages/config/CHANGELOG.md
index 43cc91fd34..e7ed06f626 100644
--- a/packages/config/CHANGELOG.md
+++ b/packages/config/CHANGELOG.md
@@ -1,5 +1,17 @@
# @backstage/config
+## 1.3.0
+
+### Minor Changes
+
+- d52d7f9: Make `readDurationFromConfig` support both ISO and ms formats as well, to make it easier to enter time as an end user
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/errors@1.2.5
+
## 1.2.0
### Minor Changes
diff --git a/packages/config/package.json b/packages/config/package.json
index fa53350b97..b3130dcab5 100644
--- a/packages/config/package.json
+++ b/packages/config/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/config",
- "version": "1.2.0",
+ "version": "1.3.0",
"description": "Config API used by Backstage core, backend, and CLI",
"backstage": {
"role": "common-library"
diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md
index d5836eb341..ecb3781525 100644
--- a/packages/core-app-api/CHANGELOG.md
+++ b/packages/core-app-api/CHANGELOG.md
@@ -1,5 +1,28 @@
# @backstage/core-app-api
+## 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
diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json
index 88edc6ccfd..a7b64e5218 100644
--- a/packages/core-app-api/package.json
+++ b/packages/core-app-api/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/core-app-api",
- "version": "1.15.1",
+ "version": "1.15.3-next.0",
"description": "Core app API used by Backstage apps",
"backstage": {
"role": "web-library"
diff --git a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts
index dbad031652..4963330724 100644
--- a/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts
+++ b/packages/core-app-api/src/apis/implementations/auth/oauth2/OAuth2.ts
@@ -148,7 +148,7 @@ export default class OAuth2
(session.backstageIdentity.expiresAt.getTime() - Date.now()) / 1000,
);
}
- return min < 60 * 5;
+ return min < 60 * 3;
},
});
diff --git a/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.test.ts b/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.test.ts
index e26934f393..88000638e6 100644
--- a/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.test.ts
+++ b/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.test.ts
@@ -165,4 +165,107 @@ describe('RefreshingAuthSessionManager', () => {
expect(removeSession).toHaveBeenCalled();
expect(await manager.getSession({ optional: true })).toBe(undefined);
});
+
+ it('should handle two simultaneous session refreshes with same scopes', async () => {
+ const createSession = jest.fn();
+ const refreshSession = jest.fn(async (scopes?: Set) => ({
+ scopes: scopes ?? new Set(),
+ expired: false,
+ }));
+ const manager = new RefreshingAuthSessionManager({
+ connector: { createSession, refreshSession },
+ ...defaultOptions,
+ } as any);
+
+ const sessionPromise1 = manager.getSession({ scopes: new Set(['a']) });
+ const sessionPromise2 = manager.getSession({ scopes: new Set(['a']) });
+
+ const [session1, session2] = await Promise.all([
+ sessionPromise1,
+ sessionPromise2,
+ ]);
+
+ expect(session1).toEqual({ scopes: new Set(['a']), expired: false });
+ expect(session2).toEqual({ scopes: new Set(['a']), expired: false });
+ expect(refreshSession).toHaveBeenCalledTimes(1);
+ });
+
+ it('should handle two simultaneous session refreshes with different scopes', async () => {
+ const createSession = jest.fn();
+ const refreshSession = jest.fn(async (scopes?: Set) => ({
+ scopes: scopes ?? new Set(),
+ expired: false,
+ }));
+ const manager = new RefreshingAuthSessionManager({
+ connector: { createSession, refreshSession },
+ ...defaultOptions,
+ } as any);
+
+ const sessionPromise1 = manager.getSession({ scopes: new Set(['a']) });
+ const sessionPromise2 = manager.getSession({ scopes: new Set(['b']) });
+
+ const [session1, session2] = await Promise.all([
+ sessionPromise1,
+ sessionPromise2,
+ ]);
+
+ expect(session1).toEqual({ scopes: new Set(['a']), expired: false });
+ expect(session2).toEqual({ scopes: new Set(['a', 'b']), expired: false });
+ expect(refreshSession).toHaveBeenCalledTimes(2);
+ });
+
+ it('should handle multiple simultaneous session refreshes with different scopes', async () => {
+ const createSession = jest.fn();
+ const refreshSession = jest.fn(async (scopes?: Set) => ({
+ scopes: scopes ?? new Set(),
+ expired: false,
+ }));
+ const manager = new RefreshingAuthSessionManager({
+ connector: { createSession, refreshSession },
+ ...defaultOptions,
+ } as any);
+
+ const sessionPromise1 = manager.getSession({ scopes: new Set(['a']) });
+ const sessionPromise2 = manager.getSession({ scopes: new Set(['a', 'b']) });
+ const sessionPromise3 = manager.getSession({ scopes: new Set(['b', 'c']) });
+ const sessionPromise4 = manager.getSession({ scopes: new Set(['a', 'c']) });
+
+ const [session1, session2, session3, session4] = await Promise.all([
+ sessionPromise1,
+ sessionPromise2,
+ sessionPromise3,
+ sessionPromise4,
+ ]);
+
+ expect(session1).toEqual({ scopes: new Set(['a']), expired: false });
+ expect(session2).toEqual({ scopes: new Set(['a', 'b']), expired: false });
+ expect(session3).toEqual({
+ scopes: new Set(['a', 'b', 'c']),
+ expired: false,
+ });
+ expect(session4).toEqual({
+ scopes: new Set(['a', 'b', 'c']),
+ expired: false,
+ });
+ expect(refreshSession).toHaveBeenCalledTimes(3);
+ });
+
+ it("should fall back to create a new session if refresh doesn't provide the correct scopes", async () => {
+ const createSession = jest
+ .fn()
+ .mockResolvedValue({ scopes: new Set(['c']), expired: false });
+ const refreshSession = jest
+ .fn()
+ .mockResolvedValue({ scopes: new Set(['b']), expired: false });
+ const manager = new RefreshingAuthSessionManager({
+ connector: { createSession, refreshSession },
+ ...defaultOptions,
+ } as any);
+
+ const session = await manager.getSession({ scopes: new Set(['a']) });
+
+ expect(session).toEqual({ scopes: new Set(['c']), expired: false });
+ expect(refreshSession).toHaveBeenCalledTimes(1);
+ expect(createSession).toHaveBeenCalledTimes(1);
+ });
});
diff --git a/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.ts b/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.ts
index c92fe9fb20..414743ba9d 100644
--- a/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.ts
+++ b/packages/core-app-api/src/lib/AuthSessionManager/RefreshingAuthSessionManager.ts
@@ -97,7 +97,7 @@ export class RefreshingAuthSessionManager implements SessionManager {
// stay in a synchronous call stack from the user interaction. The downside
// is that the user will sometimes be requested to log in even if they
// already had an existing session.
- if (!this.currentSession && !options.instantPopup) {
+ if (!options.instantPopup) {
try {
const newSession = await this.collapsedSessionRefresh(options.scopes);
this.currentSession = newSession;
@@ -143,6 +143,11 @@ export class RefreshingAuthSessionManager implements SessionManager {
try {
const session = await this.refreshPromise;
+ if (!this.helper.sessionExistsAndHasScope(session, scopes)) {
+ throw new Error(
+ 'Refreshed session did not receive the required scopes',
+ );
+ }
this.stateTracker.setIsSignedIn(true);
return session;
} finally {
diff --git a/packages/core-compat-api/CHANGELOG.md b/packages/core-compat-api/CHANGELOG.md
index 029e6840cb..bcb2a1828c 100644
--- a/packages/core-compat-api/CHANGELOG.md
+++ b/packages/core-compat-api/CHANGELOG.md
@@ -1,5 +1,32 @@
# @backstage/core-compat-api
+## 0.3.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/version-bridge@1.0.10
+
+## 0.3.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/version-bridge@1.0.10
+
+## 0.3.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/version-bridge@1.0.10
+
## 0.3.2-next.2
### Patch Changes
diff --git a/packages/core-compat-api/package.json b/packages/core-compat-api/package.json
index b33931706b..101484b70b 100644
--- a/packages/core-compat-api/package.json
+++ b/packages/core-compat-api/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/core-compat-api",
- "version": "0.3.2-next.2",
+ "version": "0.3.4-next.1",
"backstage": {
"role": "web-library"
},
diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md
index ed125d815a..7650f9b2b5 100644
--- a/packages/core-components/CHANGELOG.md
+++ b/packages/core-components/CHANGELOG.md
@@ -1,5 +1,62 @@
# @backstage/core-components
+## 0.16.2-next.1
+
+### Patch Changes
+
+- e47be38: Added data-testid to placeholder rendered by Progress component to simplify assertions in tests
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/version-bridge@1.0.10
+
+## 0.16.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/config@1.3.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/version-bridge@1.0.10
+
+## 0.16.0
+
+### Minor Changes
+
+- dc409c5: The SupportButton component will now be hidden if no support config is specified in app-config
+
+### Patch Changes
+
+- 0f18340: Change core component Table tool bar search box to the a appropriate Search icon and text
+- af9097e: Adds the ability to mock a media query per break point and to change the active break point during a test. Usage example:
+
+ ```ts
+ const { set } = mockBreakpoint({
+ initialBreakpoint: 'md',
+ queryBreakpointMap: {
+ '(min-width:1500px)': 'xl',
+ '(min-width:1000px)': 'lg',
+ '(min-width:700px)': 'md',
+ '(min-width:400px)': 'sm',
+ '(min-width:0px)': 'xs',
+ },
+ });
+ // assertions for when the active break point is "md"
+ set('lg');
+ // assertions for when the active break point is "lg"
+ ```
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/theme@0.6.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/version-bridge@1.0.10
+
## 0.16.0-next.2
### Patch Changes
diff --git a/packages/core-components/package.json b/packages/core-components/package.json
index c4bc3d7b6a..ec9fd07e76 100644
--- a/packages/core-components/package.json
+++ b/packages/core-components/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/core-components",
- "version": "0.16.0-next.2",
+ "version": "0.16.2-next.1",
"description": "Core components used by Backstage plugins and apps",
"backstage": {
"role": "web-library"
diff --git a/packages/core-components/src/components/MarkdownContent/MarkdownContent.test.tsx b/packages/core-components/src/components/MarkdownContent/MarkdownContent.test.tsx
index d9d82437e4..21b576dd9f 100644
--- a/packages/core-components/src/components/MarkdownContent/MarkdownContent.test.tsx
+++ b/packages/core-components/src/components/MarkdownContent/MarkdownContent.test.tsx
@@ -120,6 +120,23 @@ describe('', () => {
);
});
+ it('render MarkdownContent component with link target set to _blank', async () => {
+ await renderInTestApp(
+ ,
+ );
+ const readme = screen.getByText('README', {
+ selector: 'a',
+ });
+ expect(readme).toBeInTheDocument();
+ expect(readme.getAttribute('href')).toEqual(
+ 'https://github.com/backstage/backstage/blob/master/README.md',
+ );
+ expect(readme.getAttribute('target')).toEqual('_blank');
+ });
+
it('render MarkdownContent component with headings given proper ids', async () => {
await renderInTestApp(
', () => {
it('renders without exploding', async () => {
- jest.useFakeTimers();
- const { getByTestId, queryByTestId } = await renderInTestApp();
- expect(queryByTestId('progress')).not.toBeInTheDocument();
- act(() => {
- jest.advanceTimersByTime(250);
- });
- expect(getByTestId('progress')).toBeInTheDocument();
- jest.useRealTimers();
+ const { queryByTestId } = await renderInTestApp();
+ expect(queryByTestId('progress')).toBeInTheDocument();
});
});
diff --git a/packages/core-components/src/components/Progress/Progress.tsx b/packages/core-components/src/components/Progress/Progress.tsx
index 6d1281edd5..865c4673b8 100644
--- a/packages/core-components/src/components/Progress/Progress.tsx
+++ b/packages/core-components/src/components/Progress/Progress.tsx
@@ -36,6 +36,6 @@ export function Progress(props: PropsWithChildren) {
return isVisible ? (
) : (
-
+
);
}
diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md
index 0c5c3f0780..2ddb6333c7 100644
--- a/packages/core-plugin-api/CHANGELOG.md
+++ b/packages/core-plugin-api/CHANGELOG.md
@@ -1,5 +1,15 @@
# @backstage/core-plugin-api
+## 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
diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json
index 0e54f32ff4..176f6014b6 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.10.0",
+ "version": "1.10.1",
"description": "Core API used by Backstage plugins",
"backstage": {
"role": "web-library"
diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md
index 25f308c1cd..ce9aa221b0 100644
--- a/packages/create-app/CHANGELOG.md
+++ b/packages/create-app/CHANGELOG.md
@@ -1,5 +1,35 @@
# @backstage/create-app
+## 0.5.23-next.1
+
+### Patch Changes
+
+- 5c9cc05: Use native fetch instead of node-fetch
+- Updated dependencies
+ - @backstage/cli-common@0.1.15
+
+## 0.5.23-next.0
+
+### Patch Changes
+
+- 5819f8d: Updated Dockerfile to include `backstage.json` file
+- 583f3d4: Updated the template to use `@backstage/cli/config/prettier` instead of `@spotify/prettier-config`.
+- Updated dependencies
+ - @backstage/cli-common@0.1.15
+
+## 0.5.22
+
+### Patch Changes
+
+- 7907e3b: Bumped create-app version.
+- 42386c2: Bumped create-app version.
+- 702f41d: Updated engines to support Node 20 or 22
+- a917f86: This update adds the @backstage/repo-tools package to the versions.ts file, enabling proper version resolution for templates. The {{version '@backstage/repo-tools'}} placeholder now works as expected in the create-app process.
+- 5872964: Use the main entrypoint for `create-app` installs
+- 702f41d: Bumped dev dependencies `@types/node`
+- Updated dependencies
+ - @backstage/cli-common@0.1.15
+
## 0.5.22-next.3
### Patch Changes
diff --git a/packages/create-app/package.json b/packages/create-app/package.json
index 2acc972a91..c852cadb7f 100644
--- a/packages/create-app/package.json
+++ b/packages/create-app/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/create-app",
- "version": "0.5.22-next.3",
+ "version": "0.5.23-next.1",
"description": "A CLI that helps you create your own Backstage app",
"backstage": {
"role": "cli"
@@ -49,7 +49,6 @@
"fs-extra": "^11.2.0",
"handlebars": "^4.7.3",
"inquirer": "^8.2.0",
- "node-fetch": "^2.7.0",
"ora": "^5.3.0",
"recursive-readdir": "^2.2.2"
},
@@ -61,7 +60,7 @@
"@types/inquirer": "^8.1.3",
"@types/node": "^20.16.0",
"@types/recursive-readdir": "^2.2.0",
- "msw": "^1.0.0",
+ "msw": "^2.0.0",
"nodemon": "^3.0.1"
}
}
diff --git a/packages/create-app/src/lib/tasks.test.ts b/packages/create-app/src/lib/tasks.test.ts
index 41c20854be..27c5765a12 100644
--- a/packages/create-app/src/lib/tasks.test.ts
+++ b/packages/create-app/src/lib/tasks.test.ts
@@ -33,7 +33,7 @@ import {
createMockDirectory,
registerMswTestHooks,
} from '@backstage/backend-test-utils';
-import { rest } from 'msw';
+import { http, HttpResponse, delay } from 'msw';
import { setupServer } from 'msw/node';
jest.spyOn(Task, 'log').mockReturnValue(undefined);
@@ -402,12 +402,10 @@ describe('tasks', () => {
it('should fetch the yarn.lock seed file', async () => {
worker.use(
- rest.get(
+ http.get(
'https://raw.githubusercontent.com/backstage/backstage/master/packages/create-app/seed-yarn.lock',
- (_, res, ctx) =>
- res(
- ctx.status(200),
- ctx.text(`# the-lockfile-header
+ () =>
+ HttpResponse.text(`# the-lockfile-header
// some comments
// in the file
@@ -418,7 +416,6 @@ describe('tasks', () => {
"@backstage/cli@1.0.0":
some info
`),
- ),
),
);
@@ -438,9 +435,9 @@ describe('tasks', () => {
it('should fail gracefully', async () => {
worker.use(
- rest.get(
+ http.get(
'https://raw.githubusercontent.com/backstage/backstage/master/packages/create-app/seed-yarn.lock',
- (_, res, ctx) => res(ctx.status(404)),
+ () => new HttpResponse(null, { status: 404 }),
),
);
@@ -453,9 +450,9 @@ describe('tasks', () => {
it('should time out if it takes too long to fetch', async () => {
worker.use(
- rest.get(
+ http.get(
'https://raw.githubusercontent.com/backstage/backstage/master/packages/create-app/seed-yarn.lock',
- (_, res, ctx) => res(ctx.delay(5000)),
+ () => delay(5000),
),
);
diff --git a/packages/create-app/src/lib/tasks.ts b/packages/create-app/src/lib/tasks.ts
index a47f5f2cb9..51308275a6 100644
--- a/packages/create-app/src/lib/tasks.ts
+++ b/packages/create-app/src/lib/tasks.ts
@@ -25,7 +25,6 @@ import {
resolve as resolvePath,
relative as relativePath,
} from 'path';
-import fetch from 'node-fetch';
import { exec as execCb } from 'child_process';
import { packageVersions } from './versions';
import { promisify } from 'util';
diff --git a/packages/create-app/templates/default-app/package.json.hbs b/packages/create-app/templates/default-app/package.json.hbs
index 73f97484f9..21bdd41bdf 100644
--- a/packages/create-app/templates/default-app/package.json.hbs
+++ b/packages/create-app/templates/default-app/package.json.hbs
@@ -34,7 +34,6 @@
"@backstage/cli": "^{{version '@backstage/cli'}}",
"@backstage/e2e-test-utils": "^{{version '@backstage/e2e-test-utils'}}",
"@playwright/test": "^1.32.3",
- "@spotify/prettier-config": "^12.0.0",
"node-gyp": "^10.0.0",
"prettier": "^2.3.2",
"typescript": "~5.4.0"
@@ -43,7 +42,7 @@
"@types/react": "^18",
"@types/react-dom": "^18"
},
- "prettier": "@spotify/prettier-config",
+ "prettier": "@backstage/cli/config/prettier",
"lint-staged": {
"*.{js,jsx,ts,tsx,mjs,cjs}": [
"eslint --fix",
diff --git a/packages/create-app/templates/default-app/packages/backend/Dockerfile b/packages/create-app/templates/default-app/packages/backend/Dockerfile
index 6a4c257afb..13ff70d961 100644
--- a/packages/create-app/templates/default-app/packages/backend/Dockerfile
+++ b/packages/create-app/templates/default-app/packages/backend/Dockerfile
@@ -40,6 +40,7 @@ WORKDIR /app
# Copy files needed by Yarn
COPY --chown=node:node .yarn ./.yarn
COPY --chown=node:node .yarnrc.yml ./
+COPY --chown=node:node backstage.json ./
# This switches many Node.js dependencies to production mode.
ENV NODE_ENV=production
diff --git a/packages/dev-utils/CHANGELOG.md b/packages/dev-utils/CHANGELOG.md
index b28f82806d..d97bb0c44b 100644
--- a/packages/dev-utils/CHANGELOG.md
+++ b/packages/dev-utils/CHANGELOG.md
@@ -1,5 +1,47 @@
# @backstage/dev-utils
+## 1.1.5-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-catalog-react@1.14.3-next.1
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/app-defaults@1.5.15-next.1
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/integration-react@1.2.2-next.0
+ - @backstage/theme@0.6.3-next.0
+
+## 1.1.5-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/plugin-catalog-react@1.14.3-next.0
+ - @backstage/theme@0.6.3-next.0
+ - @backstage/app-defaults@1.5.15-next.0
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/integration-react@1.2.2-next.0
+
+## 1.1.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/theme@0.6.1
+ - @backstage/plugin-catalog-react@1.14.1
+ - @backstage/core-components@0.16.0
+ - @backstage/core-app-api@1.15.2
+ - @backstage/app-defaults@1.5.13
+ - @backstage/catalog-model@1.7.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/integration-react@1.2.1
+
## 1.1.3-next.3
### Patch Changes
diff --git a/packages/dev-utils/package.json b/packages/dev-utils/package.json
index dd7c88f57e..ef1b92b954 100644
--- a/packages/dev-utils/package.json
+++ b/packages/dev-utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/dev-utils",
- "version": "1.1.3-next.3",
+ "version": "1.1.5-next.1",
"description": "Utilities for developing Backstage plugins.",
"backstage": {
"role": "web-library"
diff --git a/packages/e2e-test/CHANGELOG.md b/packages/e2e-test/CHANGELOG.md
index 96fe6c9d82..90c72dfdef 100644
--- a/packages/e2e-test/CHANGELOG.md
+++ b/packages/e2e-test/CHANGELOG.md
@@ -1,5 +1,32 @@
# e2e-test
+## 0.2.23-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/create-app@0.5.23-next.1
+ - @backstage/cli-common@0.1.15
+ - @backstage/errors@1.2.5
+
+## 0.2.23-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/create-app@0.5.23-next.0
+ - @backstage/cli-common@0.1.15
+ - @backstage/errors@1.2.5
+
+## 0.2.22
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/create-app@0.5.22
+ - @backstage/cli-common@0.1.15
+ - @backstage/errors@1.2.5
+
## 0.2.22-next.3
### Patch Changes
diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json
index 0d6b782f07..c3c5457405 100644
--- a/packages/e2e-test/package.json
+++ b/packages/e2e-test/package.json
@@ -1,6 +1,6 @@
{
"name": "e2e-test",
- "version": "0.2.22-next.3",
+ "version": "0.2.23-next.1",
"description": "E2E test for verifying Backstage packages",
"backstage": {
"role": "cli"
diff --git a/packages/errors/CHANGELOG.md b/packages/errors/CHANGELOG.md
index 5cdaa834fd..f1a0ec7a5d 100644
--- a/packages/errors/CHANGELOG.md
+++ b/packages/errors/CHANGELOG.md
@@ -1,5 +1,12 @@
# @backstage/errors
+## 1.2.5
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+
## 1.2.4
### Patch Changes
diff --git a/packages/errors/package.json b/packages/errors/package.json
index dcc46ac51e..45ec6d3816 100644
--- a/packages/errors/package.json
+++ b/packages/errors/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/errors",
- "version": "1.2.4",
+ "version": "1.2.5",
"description": "Common utilities for error handling within Backstage",
"backstage": {
"role": "common-library"
diff --git a/packages/errors/src/serialization/error.test.ts b/packages/errors/src/serialization/error.test.ts
index a07d11749a..6418170f98 100644
--- a/packages/errors/src/serialization/error.test.ts
+++ b/packages/errors/src/serialization/error.test.ts
@@ -63,6 +63,20 @@ describe('serialization', () => {
expect(withoutStack2.stack).not.toBeDefined();
});
+ it('serializes stack traces only when allowed with error cause', () => {
+ const before = new CustomError('m');
+ before.cause = new Error('cause');
+ const withStack: any = serializeError(before, { includeStack: true });
+ const withoutStack1: any = serializeError(before, { includeStack: false });
+ const withoutStack2: any = serializeError(before);
+ expect(withStack.stack).toEqual(before.stack);
+ expect(withStack.cause.stack).toEqual(withStack.cause.stack);
+ expect(withoutStack1.stack).not.toBeDefined();
+ expect(withoutStack2.stack).not.toBeDefined();
+ expect(withoutStack1.cause.stack).not.toBeDefined();
+ expect(withoutStack2.cause.stack).not.toBeDefined();
+ });
+
it('stringifies all supported forms', () => {
expect(stringifyError({})).toEqual("unknown error '[object Object]'");
expect(
diff --git a/packages/errors/src/serialization/error.ts b/packages/errors/src/serialization/error.ts
index e48309f1e7..abdd7bf3d4 100644
--- a/packages/errors/src/serialization/error.ts
+++ b/packages/errors/src/serialization/error.ts
@@ -60,6 +60,14 @@ export function serializeError(
if (!options?.includeStack) {
delete result.stack;
+
+ if (
+ result.cause &&
+ typeof result.cause === 'object' &&
+ 'stack' in result.cause
+ ) {
+ delete result.cause.stack;
+ }
}
return result;
diff --git a/packages/frontend-app-api/CHANGELOG.md b/packages/frontend-app-api/CHANGELOG.md
index 4f23c09ec3..c4a5354119 100644
--- a/packages/frontend-app-api/CHANGELOG.md
+++ b/packages/frontend-app-api/CHANGELOG.md
@@ -1,5 +1,47 @@
# @backstage/frontend-app-api
+## 0.10.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-defaults@0.1.4-next.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+
+## 0.10.3-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-app-api@1.15.3-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/config@1.3.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-defaults@0.1.4-next.0
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+
+## 0.10.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/core-app-api@1.15.2
+ - @backstage/frontend-defaults@0.1.2
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/version-bridge@1.0.10
+
## 0.10.1-next.2
### Patch Changes
diff --git a/packages/frontend-app-api/package.json b/packages/frontend-app-api/package.json
index 6ee3857320..a75dd2b09d 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.10.1-next.2",
+ "version": "0.10.3-next.1",
"backstage": {
"role": "web-library"
},
diff --git a/packages/frontend-defaults/CHANGELOG.md b/packages/frontend-defaults/CHANGELOG.md
index ca769208b6..7601acc7e0 100644
--- a/packages/frontend-defaults/CHANGELOG.md
+++ b/packages/frontend-defaults/CHANGELOG.md
@@ -1,5 +1,39 @@
# @backstage/frontend-defaults
+## 0.1.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-app-api@0.10.3-next.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/plugin-app@0.1.4-next.1
+
+## 0.1.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-app@0.1.4-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+ - @backstage/frontend-app-api@0.10.3-next.0
+
+## 0.1.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/errors@1.2.5
+ - @backstage/frontend-app-api@0.10.1
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/plugin-app@0.1.2
+
## 0.1.2-next.2
### Patch Changes
diff --git a/packages/frontend-defaults/package.json b/packages/frontend-defaults/package.json
index 61603140bf..f8c63c5afb 100644
--- a/packages/frontend-defaults/package.json
+++ b/packages/frontend-defaults/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/frontend-defaults",
- "version": "0.1.2-next.2",
+ "version": "0.1.4-next.1",
"backstage": {
"role": "web-library"
},
diff --git a/packages/frontend-internal/CHANGELOG.md b/packages/frontend-internal/CHANGELOG.md
index 4ad77bcb30..c3cbeb7b76 100644
--- a/packages/frontend-internal/CHANGELOG.md
+++ b/packages/frontend-internal/CHANGELOG.md
@@ -1,5 +1,32 @@
# @internal/frontend
+## 0.0.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+
+## 0.0.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+
+## 0.0.3
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/version-bridge@1.0.10
+
## 0.0.3-next.2
### Patch Changes
diff --git a/packages/frontend-internal/package.json b/packages/frontend-internal/package.json
index f80bc9a9f0..817e8f0812 100644
--- a/packages/frontend-internal/package.json
+++ b/packages/frontend-internal/package.json
@@ -1,6 +1,6 @@
{
"name": "@internal/frontend",
- "version": "0.0.3-next.2",
+ "version": "0.0.4-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 b058260ec0..b5471f63d6 100644
--- a/packages/frontend-plugin-api/CHANGELOG.md
+++ b/packages/frontend-plugin-api/CHANGELOG.md
@@ -1,5 +1,36 @@
# @backstage/frontend-plugin-api
+## 0.9.3-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.1
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+
+## 0.9.3-next.0
+
+### Patch Changes
+
+- 5f04976: Fixed a bug that caused missing code in published packages.
+- Updated dependencies
+ - @backstage/core-components@0.16.2-next.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+
+## 0.9.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/types@1.2.0
+ - @backstage/core-components@0.16.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/version-bridge@1.0.10
+
## 0.9.1-next.2
### Patch Changes
diff --git a/packages/frontend-plugin-api/package.json b/packages/frontend-plugin-api/package.json
index 7818d8210c..74822f2b91 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.9.1-next.2",
+ "version": "0.9.3-next.1",
"backstage": {
"role": "web-library"
},
diff --git a/packages/frontend-test-utils/CHANGELOG.md b/packages/frontend-test-utils/CHANGELOG.md
index bc74f59702..29ad36435e 100644
--- a/packages/frontend-test-utils/CHANGELOG.md
+++ b/packages/frontend-test-utils/CHANGELOG.md
@@ -1,5 +1,44 @@
# @backstage/frontend-test-utils
+## 0.2.4-next.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/frontend-app-api@0.10.3-next.1
+ - @backstage/frontend-plugin-api@0.9.3-next.1
+ - @backstage/test-utils@1.7.3-next.0
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+ - @backstage/plugin-app@0.1.4-next.1
+
+## 0.2.4-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/plugin-app@0.1.4-next.0
+ - @backstage/frontend-plugin-api@0.9.3-next.0
+ - @backstage/config@1.3.0
+ - @backstage/frontend-app-api@0.10.3-next.0
+ - @backstage/test-utils@1.7.3-next.0
+ - @backstage/types@1.2.0
+ - @backstage/version-bridge@1.0.10
+
+## 0.2.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/types@1.2.0
+ - @backstage/frontend-app-api@0.10.1
+ - @backstage/frontend-plugin-api@0.9.1
+ - @backstage/test-utils@1.7.1
+ - @backstage/version-bridge@1.0.10
+ - @backstage/plugin-app@0.1.2
+
## 0.2.2-next.2
### Patch Changes
diff --git a/packages/frontend-test-utils/package.json b/packages/frontend-test-utils/package.json
index f8e285b625..793d67b500 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.2.2-next.2",
+ "version": "0.2.4-next.1",
"backstage": {
"role": "web-library"
},
diff --git a/packages/integration-aws-node/CHANGELOG.md b/packages/integration-aws-node/CHANGELOG.md
index 01357679be..26f65cf239 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.13
+
+### Patch Changes
+
+- 52ae92d: The `getDefaultCredentialsChain` function now accepts and applies a `region` parameter, preventing it from defaulting to `us-east-1` when no region is specified.
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+
## 0.1.13-next.0
### Patch Changes
diff --git a/packages/integration-aws-node/package.json b/packages/integration-aws-node/package.json
index 107b99f9bb..a75ace7986 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.13-next.0",
+ "version": "0.1.13",
"description": "Helpers for fetching AWS account credentials",
"backstage": {
"role": "node-library"
diff --git a/packages/integration-react/CHANGELOG.md b/packages/integration-react/CHANGELOG.md
index 2b686905ab..e447dd21af 100644
--- a/packages/integration-react/CHANGELOG.md
+++ b/packages/integration-react/CHANGELOG.md
@@ -1,5 +1,23 @@
# @backstage/integration-react
+## 1.2.2-next.0
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/integration@1.16.0-next.0
+ - @backstage/config@1.3.0
+ - @backstage/core-plugin-api@1.10.1
+
+## 1.2.1
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/core-plugin-api@1.10.1
+ - @backstage/integration@1.15.2
+
## 1.2.0
### Minor Changes
diff --git a/packages/integration-react/package.json b/packages/integration-react/package.json
index c524d82d31..052f84a736 100644
--- a/packages/integration-react/package.json
+++ b/packages/integration-react/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/integration-react",
- "version": "1.2.0",
+ "version": "1.2.2-next.0",
"description": "Frontend package for managing integrations towards external systems",
"backstage": {
"role": "web-library"
diff --git a/packages/integration-react/src/api/ScmIntegrationsApi.test.ts b/packages/integration-react/src/api/ScmIntegrationsApi.test.ts
index fb53bbdb12..0a1f1b1b8f 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(6); // The default ones
+ expect(i.list().length).toBe(7); // The default ones
});
});
diff --git a/packages/integration/CHANGELOG.md b/packages/integration/CHANGELOG.md
index 5b5165bd53..6c09d51df5 100644
--- a/packages/integration/CHANGELOG.md
+++ b/packages/integration/CHANGELOG.md
@@ -1,5 +1,25 @@
# @backstage/integration
+## 1.16.0-next.0
+
+### Minor Changes
+
+- 277092a: Add the integration for Azure blob storage to read the credentials to access the storage account and provide the default credential provider.
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+
+## 1.15.2
+
+### Patch Changes
+
+- Updated dependencies
+ - @backstage/config@1.3.0
+ - @backstage/errors@1.2.5
+
## 1.15.1
### Patch Changes
diff --git a/packages/integration/package.json b/packages/integration/package.json
index d41ffa501d..4fddb1bdbb 100644
--- a/packages/integration/package.json
+++ b/packages/integration/package.json
@@ -1,6 +1,6 @@
{
"name": "@backstage/integration",
- "version": "1.15.1",
+ "version": "1.16.0-next.0",
"description": "Helpers for managing integrations towards external systems",
"backstage": {
"role": "common-library"
@@ -38,6 +38,7 @@
},
"dependencies": {
"@azure/identity": "^4.0.0",
+ "@azure/storage-blob": "^12.5.0",
"@backstage/config": "workspace:^",
"@backstage/errors": "workspace:^",
"@octokit/auth-app": "^4.0.0",
diff --git a/packages/integration/report.api.md b/packages/integration/report.api.md
index e9b67bb6c1..5129dbb7c2 100644
--- a/packages/integration/report.api.md
+++ b/packages/integration/report.api.md
@@ -3,9 +3,12 @@
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
```ts
+import { AnonymousCredential } from '@azure/storage-blob';
import { Config } from '@backstage/config';
import { ConsumedResponse } from '@backstage/errors';
import { RestEndpointMethodTypes } from '@octokit/rest';
+import { StorageSharedKeyCredential } from '@azure/storage-blob';
+import { TokenCredential } from '@azure/identity';
// @public
export class AwsCodeCommitIntegration implements ScmIntegration {
@@ -70,6 +73,43 @@ export type AwsS3IntegrationConfig = {
externalId?: string;
};
+// @public
+export type AzureBlobStorageIntegrationConfig = {
+ accountName?: string;
+ accountKey?: string;
+ sasToken?: string;
+ connectionString?: string;
+ endpointSuffix?: string;
+ host: string;
+ endpoint?: string;
+ aadCredential?: {
+ clientId: string;
+ tenantId: string;
+ clientSecret: string;
+ };
+};
+
+// @public
+export class AzureBlobStorageIntergation implements ScmIntegration {
+ constructor(integrationConfig: AzureBlobStorageIntegrationConfig);
+ // (undocumented)
+ get config(): AzureBlobStorageIntegrationConfig;
+ // (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 AzureClientSecretCredential = AzureCredentialBase & {
kind: 'ClientSecret';
@@ -84,6 +124,16 @@ export type AzureCredentialBase = {
organizations?: string[];
};
+// @public
+export interface AzureCredentialsManager {
+ // (undocumented)
+ getCredentials(
+ accountName: string,
+ ): Promise<
+ TokenCredential | StorageSharedKeyCredential | AnonymousCredential
+ >;
+}
+
// @public
export type AzureDevOpsCredential =
| AzureClientSecretCredential
@@ -257,6 +307,15 @@ export function buildGerritGitilesArchiveUrl(
filePath: string,
): string;
+// @public
+export class DefaultAzureCredentialsManager implements AzureCredentialsManager {
+ static fromIntegrations(
+ integrations: ScmIntegrationRegistry,
+ ): DefaultAzureCredentialsManager;
+ // (undocumented)
+ getCredentials(accountName: string): Promise;
+}
+
// @public
export class DefaultAzureDevOpsCredentialsProvider
implements AzureDevOpsCredentialsProvider
@@ -723,6 +782,8 @@ export interface IntegrationsByType {
awsS3: ScmIntegrationsGroup;
// (undocumented)
azure: ScmIntegrationsGroup;
+ // (undocumented)
+ azureBlobStorage: ScmIntegrationsGroup;
// @deprecated (undocumented)
bitbucket: ScmIntegrationsGroup;
// (undocumented)
@@ -826,6 +887,16 @@ export function readAwsS3IntegrationConfigs(
configs: Config[],
): AwsS3IntegrationConfig[];
+// @public
+export function readAzureBlobStorageIntegrationConfig(
+ config: Config,
+): AzureBlobStorageIntegrationConfig;
+
+// @public
+export function readAzureBlobStorageIntegrationConfigs(
+ configs: Config[],
+): AzureBlobStorageIntegrationConfig[];
+
// @public
export function readAzureIntegrationConfig(
config: Config,
@@ -940,6 +1011,8 @@ export interface ScmIntegrationRegistry
awsS3: ScmIntegrationsGroup;
// (undocumented)
azure: ScmIntegrationsGroup;
+ // (undocumented)
+ azureBlobStorage: ScmIntegrationsGroup;
// @deprecated (undocumented)
bitbucket: ScmIntegrationsGroup;
// (undocumented)
@@ -973,6 +1046,8 @@ export class ScmIntegrations implements ScmIntegrationRegistry {
get awsS3(): ScmIntegrationsGroup;
// (undocumented)
get azure(): ScmIntegrationsGroup;
+ // (undocumented)
+ get azureBlobStorage(): ScmIntegrationsGroup;
// @deprecated (undocumented)
get bitbucket(): ScmIntegrationsGroup;
// (undocumented)
diff --git a/packages/integration/src/ScmIntegrations.test.ts b/packages/integration/src/ScmIntegrations.test.ts
index c758816c03..0e0c181861 100644
--- a/packages/integration/src/ScmIntegrations.test.ts
+++ b/packages/integration/src/ScmIntegrations.test.ts
@@ -39,6 +39,10 @@ import { GiteaIntegration, GiteaIntegrationConfig } from './gitea';
import { AwsCodeCommitIntegration } from './awsCodeCommit/AwsCodeCommitIntegration';
import { AwsCodeCommitIntegrationConfig } from './awsCodeCommit';
import { HarnessIntegration, HarnessIntegrationConfig } from './harness';
+import {
+ AzureBlobStorageIntegrationConfig,
+ AzureBlobStorageIntergation,
+} from './azureBlobStorage';
describe('ScmIntegrations', () => {
const awsS3 = new AwsS3Integration({
@@ -53,6 +57,10 @@ describe('ScmIntegrations', () => {
host: 'azure.local',
} as AzureIntegrationConfig);
+ const azureBlob = new AzureBlobStorageIntergation({
+ host: 'azureblobstorage.local',
+ } as AzureBlobStorageIntegrationConfig);
+
const bitbucket = new BitbucketIntegration({
host: 'bitbucket.local',
} as BitbucketIntegrationConfig);
@@ -89,6 +97,7 @@ describe('ScmIntegrations', () => {
awsS3: basicIntegrations([awsS3], item => item.config.host),
awsCodeCommit: basicIntegrations([awsCodeCommit], item => item.config.host),
azure: basicIntegrations([azure], item => item.config.host),
+ azureBlobStorage: basicIntegrations([azureBlob], item => item.config.host),
bitbucket: basicIntegrations([bitbucket], item => item.config.host),
bitbucketCloud: basicIntegrations([bitbucketCloud], item => item.title),
bitbucketServer: basicIntegrations(
@@ -108,6 +117,9 @@ describe('ScmIntegrations', () => {
awsCodeCommit,
);
expect(i.azure.byUrl('https://azure.local')).toBe(azure);
+ expect(i.azureBlobStorage.byUrl('https://azureblobstorage.local')).toBe(
+ azureBlob,
+ );
expect(i.bitbucket.byUrl('https://bitbucket.local')).toBe(bitbucket);
expect(i.bitbucketCloud.byUrl('https://bitbucket.org')).toBe(
bitbucketCloud,
@@ -128,6 +140,7 @@ describe('ScmIntegrations', () => {
awsS3,
awsCodeCommit,
azure,
+ azureBlob,
bitbucket,
bitbucketCloud,
bitbucketServer,
@@ -144,6 +157,9 @@ describe('ScmIntegrations', () => {
expect(i.byUrl('https://awss3.local')).toBe(awsS3);
expect(i.byUrl('https://awscodecommit.local')).toBe(awsCodeCommit);
expect(i.byUrl('https://azure.local')).toBe(azure);
+ expect(i.azureBlobStorage.byUrl('https://azureblobstorage.local')).toBe(
+ azureBlob,
+ );
expect(i.byUrl('https://bitbucket.local')).toBe(bitbucket);
expect(i.byUrl('https://bitbucket.org')).toBe(bitbucketCloud);
expect(i.byUrl('https://bitbucket-server.local')).toBe(bitbucketServer);
@@ -156,6 +172,7 @@ describe('ScmIntegrations', () => {
expect(i.byHost('awss3.local')).toBe(awsS3);
expect(i.byHost('awscodecommit.local')).toBe(awsCodeCommit);
expect(i.byHost('azure.local')).toBe(azure);
+ expect(i.byHost('azureblobstorage.local')).toBe(azureBlob);
expect(i.byHost('bitbucket.local')).toBe(bitbucket);
expect(i.byHost('bitbucket.org')).toBe(bitbucketCloud);
expect(i.byHost('bitbucket-server.local')).toBe(bitbucketServer);
diff --git a/packages/integration/src/ScmIntegrations.ts b/packages/integration/src/ScmIntegrations.ts
index e0d430d834..f11cb3c17e 100644
--- a/packages/integration/src/ScmIntegrations.ts
+++ b/packages/integration/src/ScmIntegrations.ts
@@ -29,6 +29,7 @@ import { ScmIntegration, ScmIntegrationsGroup } from './types';
import { ScmIntegrationRegistry } from './registry';
import { GiteaIntegration } from './gitea';
import { HarnessIntegration } from './harness/HarnessIntegration';
+import { AzureBlobStorageIntergation } from './azureBlobStorage';
/**
* The set of supported integrations.
@@ -38,6 +39,7 @@ import { HarnessIntegration } from './harness/HarnessIntegration';
export interface IntegrationsByType {
awsS3: ScmIntegrationsGroup;
awsCodeCommit: ScmIntegrationsGroup;
+ azureBlobStorage: ScmIntegrationsGroup;
azure: ScmIntegrationsGroup;
/**
* @deprecated in favor of `bitbucketCloud` and `bitbucketServer`
@@ -64,6 +66,7 @@ export class ScmIntegrations implements ScmIntegrationRegistry {
return new ScmIntegrations({
awsS3: AwsS3Integration.factory({ config }),
awsCodeCommit: AwsCodeCommitIntegration.factory({ config }),
+ azureBlobStorage: AzureBlobStorageIntergation.factory({ config }),
azure: AzureIntegration.factory({ config }),
bitbucket: BitbucketIntegration.factory({ config }),
bitbucketCloud: BitbucketCloudIntegration.factory({ config }),
@@ -88,6 +91,10 @@ export class ScmIntegrations implements ScmIntegrationRegistry {
return this.byType.awsCodeCommit;
}
+ get azureBlobStorage(): ScmIntegrationsGroup {
+ return this.byType.azureBlobStorage;
+ }
+
get azure(): ScmIntegrationsGroup {
return this.byType.azure;
}
diff --git a/packages/integration/src/azureBlobStorage/AzureBlobStorageIntegration.test.ts b/packages/integration/src/azureBlobStorage/AzureBlobStorageIntegration.test.ts
new file mode 100644
index 0000000000..e7f7703be9
--- /dev/null
+++ b/packages/integration/src/azureBlobStorage/AzureBlobStorageIntegration.test.ts
@@ -0,0 +1,78 @@
+/*
+ * 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 { ConfigReader } from '@backstage/config';
+import { AzureBlobStorageIntergation } from './AzureBlobStorageIntegration';
+
+describe('AzureBlobStorageIntegration', () => {
+ it('has a working factory', () => {
+ const integrations = AzureBlobStorageIntergation.factory({
+ config: new ConfigReader({
+ integrations: {
+ azureBlobStorage: [
+ {
+ endpoint: 'https://myaccount.blob.core.windows.net',
+ accountName: 'myaccount',
+ accountKey: 'someAccountKey',
+ },
+ ],
+ },
+ }),
+ });
+ expect(integrations.list().length).toBe(2); // including default
+ expect(integrations.list()[0].config.host).toBe(
+ 'myaccount.blob.core.windows.net',
+ );
+ expect(integrations.list()[1].config.host).toBe('blob.core.windows.net'); // default integration
+ });
+
+ it('returns the basics', () => {
+ const integration = new AzureBlobStorageIntergation({
+ host: 'myaccount.blob.core.windows.net',
+ } as any);
+ expect(integration.type).toBe('azureBlobStorage');
+ expect(integration.title).toBe('myaccount.blob.core.windows.net');
+ });
+
+ describe('resolveUrl', () => {
+ it('works for valid URLs', () => {
+ const integration = new AzureBlobStorageIntergation({
+ host: 'blob.core.windows.net',
+ } as any);
+
+ expect(
+ integration.resolveUrl({
+ url: 'https://myaccount.blob.core.windows.net/container/file.yaml',
+ base: 'https://myaccount.blob.core.windows.net/container/file.yaml',
+ }),
+ ).toBe('https://myaccount.blob.core.windows.net/container/file.yaml');
+ });
+ });
+
+ it('resolve edit URL', () => {
+ const integration = new AzureBlobStorageIntergation({
+ host: 'myaccount.blob.core.windows.net',
+ } as any);
+
+ // TODO: The Azure Blob Storage integration doesn't support resolving an edit URL,
+ // instead we keep the input URL.
+ expect(
+ integration.resolveEditUrl(
+ 'https://myaccount.blob.core.windows.net/container/file.yaml',
+ ),
+ ).toBe('https://myaccount.blob.core.windows.net/container/file.yaml');
+ });
+});
diff --git a/packages/integration/src/azureBlobStorage/AzureBlobStorageIntegration.ts b/packages/integration/src/azureBlobStorage/AzureBlobStorageIntegration.ts
new file mode 100644
index 0000000000..27061f7d9d
--- /dev/null
+++ b/packages/integration/src/azureBlobStorage/AzureBlobStorageIntegration.ts
@@ -0,0 +1,71 @@
+/*
+ * 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 { basicIntegrations, defaultScmResolveUrl } from '../helpers';
+import { ScmIntegration, ScmIntegrationsFactory } from '../types';
+import {
+ AzureBlobStorageIntegrationConfig,
+ readAzureBlobStorageIntegrationConfigs,
+} from './config';
+
+/**
+ * Microsoft Azure Blob storage based integration.
+ *
+ * @public
+ */
+export class AzureBlobStorageIntergation implements ScmIntegration {
+ static factory: ScmIntegrationsFactory = ({
+ config,
+ }) => {
+ const configs = readAzureBlobStorageIntegrationConfigs(
+ config.getOptionalConfigArray('integrations.azureBlobStorage') ?? [],
+ );
+ return basicIntegrations(
+ configs.map(c => new AzureBlobStorageIntergation(c)),
+ i => i.config.host,
+ );
+ };
+
+ get type(): string {
+ return 'azureBlobStorage';
+ }
+
+ get title(): string {
+ return this.integrationConfig.host;
+ }
+
+ get config(): AzureBlobStorageIntegrationConfig {
+ return this.integrationConfig;
+ }
+
+ constructor(
+ private readonly integrationConfig: AzureBlobStorageIntegrationConfig,
+ ) {}
+
+ resolveUrl(options: {
+ url: string;
+ base: string;
+ lineNumber?: number | undefined;
+ }): string {
+ const resolved = defaultScmResolveUrl(options);
+ return resolved;
+ }
+
+ resolveEditUrl(url: string): string {
+ // TODO: Implement edit URL for azureBlobStorage
+ return url;
+ }
+}
diff --git a/packages/integration/src/azureBlobStorage/DefaultAzureCredentialsManager.test.ts b/packages/integration/src/azureBlobStorage/DefaultAzureCredentialsManager.test.ts
new file mode 100644
index 0000000000..d8e8be2919
--- /dev/null
+++ b/packages/integration/src/azureBlobStorage/DefaultAzureCredentialsManager.test.ts
@@ -0,0 +1,149 @@
+/*
+ * 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 {
+ AccessToken,
+ ClientSecretCredential,
+ DefaultAzureCredential,
+} from '@azure/identity';
+import { ScmIntegrationRegistry } from '../registry';
+import { ConfigReader } from '@backstage/config';
+import { DefaultAzureCredentialsManager } from './DefaultAzureCredentialsProvider';
+import { ScmIntegrations } from '../ScmIntegrations';
+import { DateTime } from 'luxon';
+
+const MockedClientSecretCredential = ClientSecretCredential as jest.MockedClass<
+ typeof ClientSecretCredential
+>;
+
+jest.mock('@azure/identity');
+
+describe('DefaultAzureCredentialsManager', () => {
+ let mockIntegration: ScmIntegrationRegistry;
+
+ const buildProvider = (azureIntegrations: any[]) =>
+ DefaultAzureCredentialsManager.fromIntegrations(
+ ScmIntegrations.fromConfig(
+ new ConfigReader({
+ integrations: {
+ azureBlobStorage: azureIntegrations,
+ },
+ }),
+ ),
+ );
+
+ beforeEach(() => {
+ mockIntegration = {
+ azureBlobStorage: {
+ list: jest.fn().mockReturnValue([
+ {
+ config: {
+ accountName: 'testaccount',
+ aadCredential: {
+ clientId: 'someClientId',
+ tenantId: 'someTenantId',
+ clientSecret: 'someClientSecret',
+ },
+ },
+ },
+ ]),
+ },
+ } as unknown as ScmIntegrationRegistry;
+
+ MockedClientSecretCredential.prototype.getToken.mockImplementation(() =>
+ Promise.resolve({
+ expiresOnTimestamp: DateTime.local().plus({ days: 1 }).toSeconds(),
+ token: 'fake-client-secret-token',
+ } as AccessToken),
+ );
+ });
+
+ it('should create an instance from ScmIntegrationRegistry', () => {
+ const manager =
+ DefaultAzureCredentialsManager.fromIntegrations(mockIntegration);
+ expect(manager).toBeInstanceOf(DefaultAzureCredentialsManager);
+ });
+
+ it('should return cached credentials if available', async () => {
+ const manager = buildProvider([
+ {
+ accountName: 'testaccount',
+ aadCredential: {
+ clientId: 'someClientId',
+ tenantId: 'someTenantId',
+ clientSecret: 'someClientSecret',
+ },
+ },
+ ]);
+
+ const mockCredential = new MockedClientSecretCredential(
+ 'someTenantId',
+ 'someClientId',
+ 'someClientSecret',
+ );
+
+ const credential = await manager.getCredentials('testaccount');
+
+ const scopes = ['https://storage.azure.com/.default'];
+
+ const expectedToken = await mockCredential.getToken(scopes);
+ const receivedToken = await credential.getToken(scopes);
+
+ expect(receivedToken?.token).toEqual(expectedToken.token);
+ });
+
+ it('should use Azure AD credentials if aadCredential is provided', async () => {
+ const manager = buildProvider([
+ {
+ accountName: 'testaccount',
+ aadCredential: {
+ clientId: 'someClientId',
+ tenantId: 'someTenantId',
+ clientSecret: 'someClientSecret',
+ },
+ },
+ ]);
+
+ const credential = await manager.getCredentials('testaccount');
+
+ expect(credential).toBeInstanceOf(ClientSecretCredential);
+ });
+
+ it('should use DefaultAzureCredential if no aadCredential is provided', async () => {
+ const manager = buildProvider([
+ {
+ accountName: 'testaccount',
+ },
+ ]);
+
+ const credential = await manager.getCredentials('testaccount');
+
+ expect(credential).toBeInstanceOf(DefaultAzureCredential);
+ });
+
+ it('should cache credentials after first retrieval', async () => {
+ const manager = buildProvider([
+ {
+ accountName: 'testaccount',
+ },
+ ]);
+
+ const credential = await manager.getCredentials('testaccount');
+
+ const cachedCredential = await manager.getCredentials('testaccount');
+ expect(cachedCredential).toBe(credential);
+ });
+});
diff --git a/packages/integration/src/azureBlobStorage/DefaultAzureCredentialsProvider.ts b/packages/integration/src/azureBlobStorage/DefaultAzureCredentialsProvider.ts
new file mode 100644
index 0000000000..3861329300
--- /dev/null
+++ b/packages/integration/src/azureBlobStorage/DefaultAzureCredentialsProvider.ts
@@ -0,0 +1,97 @@
+/*
+ * 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 {
+ DefaultAzureCredential,
+ ClientSecretCredential,
+ TokenCredential,
+} from '@azure/identity';
+import { AzureBlobStorageIntegrationConfig } from './config';
+import { AzureCredentialsManager } from './types';
+import { ScmIntegrationRegistry } from '../registry';
+
+/**
+ * Default implementation of AzureCredentialsManager that supports multiple Azure Blob Storage integrations.
+ * @public
+ */
+export class DefaultAzureCredentialsManager implements AzureCredentialsManager {
+ private cachedCredentials: Map;
+
+ private constructor(
+ private readonly configProviders: Map<
+ string,
+ AzureBlobStorageIntegrationConfig
+ >,
+ ) {
+ this.cachedCredentials = new Map();
+ }
+
+ /**
+ * Creates an instance of DefaultAzureCredentialsManager from a Backstage integration registry.
+ */
+ static fromIntegrations(
+ integrations: ScmIntegrationRegistry,
+ ): DefaultAzureCredentialsManager {
+ const configProviders = integrations.azureBlobStorage
+ .list()
+ .reduce((acc, integration) => {
+ acc.set(
+ integration.config.accountName || 'default',
+ integration.config,
+ );
+ return acc;
+ }, new Map());
+
+ return new DefaultAzureCredentialsManager(configProviders);
+ }
+
+ private createCredential(
+ config: AzureBlobStorageIntegrationConfig,
+ ): TokenCredential {
+ if (
+ config.aadCredential &&
+ config.aadCredential.clientId &&
+ config.aadCredential.clientSecret &&
+ config.aadCredential.tenantId
+ ) {
+ return new ClientSecretCredential(
+ config.aadCredential.tenantId,
+ config.aadCredential.clientId,
+ config.aadCredential.clientSecret,
+ );
+ }
+
+ return new DefaultAzureCredential();
+ }
+
+ async getCredentials(accountName: string): Promise